146
117
router = orig_node_get_router(orig_node);
148
119
if (router != neigh_node)
149
update_route(bat_priv, orig_node, neigh_node,
150
tt_buff, tt_buff_len);
151
/* may be just TT changed */
153
update_TT(bat_priv, orig_node, tt_buff, tt_buff_len);
120
_update_route(bat_priv, orig_node, neigh_node);
157
124
neigh_node_free_ref(router);
160
static int is_bidirectional_neigh(struct orig_node *orig_node,
161
struct orig_node *orig_neigh_node,
162
struct batman_packet *batman_packet,
163
struct hard_iface *if_incoming)
165
struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
166
struct neigh_node *neigh_node = NULL, *tmp_neigh_node;
167
struct hlist_node *node;
168
unsigned char total_count;
169
uint8_t orig_eq_count, neigh_rq_count, tq_own;
170
int tq_asym_penalty, ret = 0;
172
/* find corresponding one hop neighbor */
174
hlist_for_each_entry_rcu(tmp_neigh_node, node,
175
&orig_neigh_node->neigh_list, list) {
177
if (!compare_eth(tmp_neigh_node->addr, orig_neigh_node->orig))
180
if (tmp_neigh_node->if_incoming != if_incoming)
183
if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
186
neigh_node = tmp_neigh_node;
192
neigh_node = create_neighbor(orig_neigh_node,
194
orig_neigh_node->orig,
200
/* if orig_node is direct neighbour update neigh_node last_valid */
201
if (orig_node == orig_neigh_node)
202
neigh_node->last_valid = jiffies;
204
orig_node->last_valid = jiffies;
206
/* find packet count of corresponding one hop neighbor */
207
spin_lock_bh(&orig_node->ogm_cnt_lock);
208
orig_eq_count = orig_neigh_node->bcast_own_sum[if_incoming->if_num];
209
neigh_rq_count = neigh_node->real_packet_count;
210
spin_unlock_bh(&orig_node->ogm_cnt_lock);
212
/* pay attention to not get a value bigger than 100 % */
213
total_count = (orig_eq_count > neigh_rq_count ?
214
neigh_rq_count : orig_eq_count);
216
/* if we have too few packets (too less data) we set tq_own to zero */
217
/* if we receive too few packets it is not considered bidirectional */
218
if ((total_count < TQ_LOCAL_BIDRECT_SEND_MINIMUM) ||
219
(neigh_rq_count < TQ_LOCAL_BIDRECT_RECV_MINIMUM))
222
/* neigh_node->real_packet_count is never zero as we
223
* only purge old information when getting new
225
tq_own = (TQ_MAX_VALUE * total_count) / neigh_rq_count;
228
* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
229
* affect the nearly-symmetric links only a little, but
230
* punishes asymmetric links more. This will give a value
231
* between 0 and TQ_MAX_VALUE
233
tq_asym_penalty = TQ_MAX_VALUE - (TQ_MAX_VALUE *
234
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) *
235
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) *
236
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count)) /
237
(TQ_LOCAL_WINDOW_SIZE *
238
TQ_LOCAL_WINDOW_SIZE *
239
TQ_LOCAL_WINDOW_SIZE);
241
batman_packet->tq = ((batman_packet->tq * tq_own * tq_asym_penalty) /
242
(TQ_MAX_VALUE * TQ_MAX_VALUE));
244
bat_dbg(DBG_BATMAN, bat_priv,
246
"orig = %-15pM neigh = %-15pM => own_bcast = %2i, "
247
"real recv = %2i, local tq: %3i, asym_penalty: %3i, "
249
orig_node->orig, orig_neigh_node->orig, total_count,
250
neigh_rq_count, tq_own, tq_asym_penalty, batman_packet->tq);
252
/* if link has the minimum required transmission quality
253
* consider it bidirectional */
254
if (batman_packet->tq >= TQ_TOTAL_BIDRECT_LIMIT)
259
neigh_node_free_ref(neigh_node);
263
127
/* caller must hold the neigh_list_lock */
264
128
void bonding_candidate_del(struct orig_node *orig_node,
265
129
struct neigh_node *neigh_node)
350
214
/* copy primary address for bonding */
351
static void bonding_save_primary(struct orig_node *orig_node,
352
struct orig_node *orig_neigh_node,
353
struct batman_packet *batman_packet)
215
void bonding_save_primary(const struct orig_node *orig_node,
216
struct orig_node *orig_neigh_node,
217
const struct batman_ogm_packet *batman_ogm_packet)
355
if (!(batman_packet->flags & PRIMARIES_FIRST_HOP))
219
if (!(batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
358
222
memcpy(orig_neigh_node->primary_addr, orig_node->orig, ETH_ALEN);
361
static void update_orig(struct bat_priv *bat_priv,
362
struct orig_node *orig_node,
363
struct ethhdr *ethhdr,
364
struct batman_packet *batman_packet,
365
struct hard_iface *if_incoming,
366
unsigned char *tt_buff, int tt_buff_len,
369
struct neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL;
370
struct neigh_node *router = NULL;
371
struct orig_node *orig_node_tmp;
372
struct hlist_node *node;
374
uint8_t bcast_own_sum_orig, bcast_own_sum_neigh;
376
bat_dbg(DBG_BATMAN, bat_priv, "update_originator(): "
377
"Searching and updating originator entry of received packet\n");
380
hlist_for_each_entry_rcu(tmp_neigh_node, node,
381
&orig_node->neigh_list, list) {
382
if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) &&
383
(tmp_neigh_node->if_incoming == if_incoming) &&
384
atomic_inc_not_zero(&tmp_neigh_node->refcount)) {
386
neigh_node_free_ref(neigh_node);
387
neigh_node = tmp_neigh_node;
394
spin_lock_bh(&tmp_neigh_node->tq_lock);
395
ring_buffer_set(tmp_neigh_node->tq_recv,
396
&tmp_neigh_node->tq_index, 0);
397
tmp_neigh_node->tq_avg =
398
ring_buffer_avg(tmp_neigh_node->tq_recv);
399
spin_unlock_bh(&tmp_neigh_node->tq_lock);
403
struct orig_node *orig_tmp;
405
orig_tmp = get_orig_node(bat_priv, ethhdr->h_source);
409
neigh_node = create_neighbor(orig_node, orig_tmp,
410
ethhdr->h_source, if_incoming);
412
orig_node_free_ref(orig_tmp);
416
bat_dbg(DBG_BATMAN, bat_priv,
417
"Updating existing last-hop neighbor of originator\n");
421
orig_node->flags = batman_packet->flags;
422
neigh_node->last_valid = jiffies;
424
spin_lock_bh(&neigh_node->tq_lock);
425
ring_buffer_set(neigh_node->tq_recv,
426
&neigh_node->tq_index,
428
neigh_node->tq_avg = ring_buffer_avg(neigh_node->tq_recv);
429
spin_unlock_bh(&neigh_node->tq_lock);
432
orig_node->last_ttl = batman_packet->ttl;
433
neigh_node->last_ttl = batman_packet->ttl;
436
bonding_candidate_add(orig_node, neigh_node);
438
tmp_tt_buff_len = (tt_buff_len > batman_packet->num_tt * ETH_ALEN ?
439
batman_packet->num_tt * ETH_ALEN : tt_buff_len);
441
/* if this neighbor already is our next hop there is nothing
443
router = orig_node_get_router(orig_node);
444
if (router == neigh_node)
447
/* if this neighbor does not offer a better TQ we won't consider it */
448
if (router && (router->tq_avg > neigh_node->tq_avg))
451
/* if the TQ is the same and the link not more symetric we
452
* won't consider it either */
453
if (router && (neigh_node->tq_avg == router->tq_avg)) {
454
orig_node_tmp = router->orig_node;
455
spin_lock_bh(&orig_node_tmp->ogm_cnt_lock);
457
orig_node_tmp->bcast_own_sum[if_incoming->if_num];
458
spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock);
460
orig_node_tmp = neigh_node->orig_node;
461
spin_lock_bh(&orig_node_tmp->ogm_cnt_lock);
462
bcast_own_sum_neigh =
463
orig_node_tmp->bcast_own_sum[if_incoming->if_num];
464
spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock);
466
if (bcast_own_sum_orig >= bcast_own_sum_neigh)
470
update_routes(bat_priv, orig_node, neigh_node,
471
tt_buff, tmp_tt_buff_len);
475
update_routes(bat_priv, orig_node, router,
476
tt_buff, tmp_tt_buff_len);
479
if (orig_node->gw_flags != batman_packet->gw_flags)
480
gw_node_update(bat_priv, orig_node, batman_packet->gw_flags);
482
orig_node->gw_flags = batman_packet->gw_flags;
484
/* restart gateway selection if fast or late switching was enabled */
485
if ((orig_node->gw_flags) &&
486
(atomic_read(&bat_priv->gw_mode) == GW_MODE_CLIENT) &&
487
(atomic_read(&bat_priv->gw_sel_class) > 2))
488
gw_check_election(bat_priv, orig_node);
496
neigh_node_free_ref(neigh_node);
498
neigh_node_free_ref(router);
501
225
/* checks whether the host restarted and is in the protection time.
503
227
* 0 if the packet is to be accepted
504
228
* 1 if the packet is to be ignored.
506
static int window_protected(struct bat_priv *bat_priv,
507
int32_t seq_num_diff,
508
unsigned long *last_reset)
230
int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
231
unsigned long *last_reset)
510
233
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE)
511
234
|| (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
526
/* processes a batman packet for all interfaces, adjusts the sequence number and
527
* finds out whether it is a duplicate.
529
* 1 the packet is a duplicate
530
* 0 the packet has not yet been received
531
* -1 the packet is old and has been received while the seqno window
532
* was protected. Caller should drop it.
534
static char count_real_packets(struct ethhdr *ethhdr,
535
struct batman_packet *batman_packet,
536
struct hard_iface *if_incoming)
538
struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
539
struct orig_node *orig_node;
540
struct neigh_node *tmp_neigh_node;
541
struct hlist_node *node;
542
char is_duplicate = 0;
545
int set_mark, ret = -1;
547
orig_node = get_orig_node(bat_priv, batman_packet->orig);
551
spin_lock_bh(&orig_node->ogm_cnt_lock);
552
seq_diff = batman_packet->seqno - orig_node->last_real_seqno;
554
/* signalize caller that the packet is to be dropped. */
555
if (window_protected(bat_priv, seq_diff,
556
&orig_node->batman_seqno_reset))
560
hlist_for_each_entry_rcu(tmp_neigh_node, node,
561
&orig_node->neigh_list, list) {
563
is_duplicate |= get_bit_status(tmp_neigh_node->real_bits,
564
orig_node->last_real_seqno,
565
batman_packet->seqno);
567
if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) &&
568
(tmp_neigh_node->if_incoming == if_incoming))
573
/* if the window moved, set the update flag. */
574
need_update |= bit_get_packet(bat_priv,
575
tmp_neigh_node->real_bits,
578
tmp_neigh_node->real_packet_count =
579
bit_packet_count(tmp_neigh_node->real_bits);
584
bat_dbg(DBG_BATMAN, bat_priv,
585
"updating last_seqno: old %d, new %d\n",
586
orig_node->last_real_seqno, batman_packet->seqno);
587
orig_node->last_real_seqno = batman_packet->seqno;
593
spin_unlock_bh(&orig_node->ogm_cnt_lock);
594
orig_node_free_ref(orig_node);
598
void receive_bat_packet(struct ethhdr *ethhdr,
599
struct batman_packet *batman_packet,
600
unsigned char *tt_buff, int tt_buff_len,
601
struct hard_iface *if_incoming)
603
struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
604
struct hard_iface *hard_iface;
605
struct orig_node *orig_neigh_node, *orig_node;
606
struct neigh_node *router = NULL, *router_router = NULL;
607
struct neigh_node *orig_neigh_router = NULL;
608
char has_directlink_flag;
609
char is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0;
610
char is_broadcast = 0, is_bidirectional, is_single_hop_neigh;
612
uint32_t if_incoming_seqno;
614
/* Silently drop when the batman packet is actually not a
617
* This might happen if a packet is padded (e.g. Ethernet has a
618
* minimum frame length of 64 byte) and the aggregation interprets
619
* it as an additional length.
621
* TODO: A more sane solution would be to have a bit in the
622
* batman_packet to detect whether the packet is the last
623
* packet in an aggregation. Here we expect that the padding
624
* is always zero (or not 0x01)
626
if (batman_packet->packet_type != BAT_PACKET)
629
/* could be changed by schedule_own_packet() */
630
if_incoming_seqno = atomic_read(&if_incoming->seqno);
632
has_directlink_flag = (batman_packet->flags & DIRECTLINK ? 1 : 0);
634
is_single_hop_neigh = (compare_eth(ethhdr->h_source,
635
batman_packet->orig) ? 1 : 0);
637
bat_dbg(DBG_BATMAN, bat_priv,
638
"Received BATMAN packet via NB: %pM, IF: %s [%pM] "
639
"(from OG: %pM, via prev OG: %pM, seqno %d, tq %d, "
640
"TTL %d, V %d, IDF %d)\n",
641
ethhdr->h_source, if_incoming->net_dev->name,
642
if_incoming->net_dev->dev_addr, batman_packet->orig,
643
batman_packet->prev_sender, batman_packet->seqno,
644
batman_packet->tq, batman_packet->ttl, batman_packet->version,
645
has_directlink_flag);
648
list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
649
if (hard_iface->if_status != IF_ACTIVE)
652
if (hard_iface->soft_iface != if_incoming->soft_iface)
655
if (compare_eth(ethhdr->h_source,
656
hard_iface->net_dev->dev_addr))
659
if (compare_eth(batman_packet->orig,
660
hard_iface->net_dev->dev_addr))
663
if (compare_eth(batman_packet->prev_sender,
664
hard_iface->net_dev->dev_addr))
667
if (compare_eth(ethhdr->h_source, broadcast_addr))
672
if (batman_packet->version != COMPAT_VERSION) {
673
bat_dbg(DBG_BATMAN, bat_priv,
674
"Drop packet: incompatible batman version (%i)\n",
675
batman_packet->version);
680
bat_dbg(DBG_BATMAN, bat_priv,
681
"Drop packet: received my own broadcast (sender: %pM"
688
bat_dbg(DBG_BATMAN, bat_priv, "Drop packet: "
689
"ignoring all packets with broadcast source addr (sender: %pM"
690
")\n", ethhdr->h_source);
698
orig_neigh_node = get_orig_node(bat_priv, ethhdr->h_source);
699
if (!orig_neigh_node)
702
/* neighbor has to indicate direct link and it has to
703
* come via the corresponding interface */
704
/* if received seqno equals last send seqno save new
705
* seqno for bidirectional check */
706
if (has_directlink_flag &&
707
compare_eth(if_incoming->net_dev->dev_addr,
708
batman_packet->orig) &&
709
(batman_packet->seqno - if_incoming_seqno + 2 == 0)) {
710
offset = if_incoming->if_num * NUM_WORDS;
712
spin_lock_bh(&orig_neigh_node->ogm_cnt_lock);
713
word = &(orig_neigh_node->bcast_own[offset]);
715
orig_neigh_node->bcast_own_sum[if_incoming->if_num] =
716
bit_packet_count(word);
717
spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock);
720
bat_dbg(DBG_BATMAN, bat_priv, "Drop packet: "
721
"originator packet from myself (via neighbor)\n");
722
orig_node_free_ref(orig_neigh_node);
727
bat_dbg(DBG_BATMAN, bat_priv,
728
"Drop packet: ignoring all rebroadcast echos (sender: "
729
"%pM)\n", ethhdr->h_source);
733
orig_node = get_orig_node(bat_priv, batman_packet->orig);
737
is_duplicate = count_real_packets(ethhdr, batman_packet, if_incoming);
739
if (is_duplicate == -1) {
740
bat_dbg(DBG_BATMAN, bat_priv,
741
"Drop packet: packet within seqno protection time "
742
"(sender: %pM)\n", ethhdr->h_source);
746
if (batman_packet->tq == 0) {
747
bat_dbg(DBG_BATMAN, bat_priv,
748
"Drop packet: originator packet with tq equal 0\n");
752
router = orig_node_get_router(orig_node);
754
router_router = orig_node_get_router(router->orig_node);
756
/* avoid temporary routing loops */
757
if (router && router_router &&
758
(compare_eth(router->addr, batman_packet->prev_sender)) &&
759
!(compare_eth(batman_packet->orig, batman_packet->prev_sender)) &&
760
(compare_eth(router->addr, router_router->addr))) {
761
bat_dbg(DBG_BATMAN, bat_priv,
762
"Drop packet: ignoring all rebroadcast packets that "
763
"may make me loop (sender: %pM)\n", ethhdr->h_source);
767
/* if sender is a direct neighbor the sender mac equals
769
orig_neigh_node = (is_single_hop_neigh ?
771
get_orig_node(bat_priv, ethhdr->h_source));
772
if (!orig_neigh_node)
775
orig_neigh_router = orig_node_get_router(orig_neigh_node);
777
/* drop packet if sender is not a direct neighbor and if we
778
* don't route towards it */
779
if (!is_single_hop_neigh && (!orig_neigh_router)) {
780
bat_dbg(DBG_BATMAN, bat_priv,
781
"Drop packet: OGM via unknown neighbor!\n");
785
is_bidirectional = is_bidirectional_neigh(orig_node, orig_neigh_node,
786
batman_packet, if_incoming);
788
bonding_save_primary(orig_node, orig_neigh_node, batman_packet);
790
/* update ranking if it is not a duplicate or has the same
791
* seqno and similar ttl as the non-duplicate */
792
if (is_bidirectional &&
794
((orig_node->last_real_seqno == batman_packet->seqno) &&
795
(orig_node->last_ttl - 3 <= batman_packet->ttl))))
796
update_orig(bat_priv, orig_node, ethhdr, batman_packet,
797
if_incoming, tt_buff, tt_buff_len, is_duplicate);
799
/* is single hop (direct) neighbor */
800
if (is_single_hop_neigh) {
802
/* mark direct link on incoming interface */
803
schedule_forward_packet(orig_node, ethhdr, batman_packet,
804
1, tt_buff_len, if_incoming);
806
bat_dbg(DBG_BATMAN, bat_priv, "Forwarding packet: "
807
"rebroadcast neighbor packet with direct link flag\n");
811
/* multihop originator */
812
if (!is_bidirectional) {
813
bat_dbg(DBG_BATMAN, bat_priv,
814
"Drop packet: not received via bidirectional link\n");
819
bat_dbg(DBG_BATMAN, bat_priv,
820
"Drop packet: duplicate packet received\n");
824
bat_dbg(DBG_BATMAN, bat_priv,
825
"Forwarding packet: rebroadcast originator packet\n");
826
schedule_forward_packet(orig_node, ethhdr, batman_packet,
827
0, tt_buff_len, if_incoming);
830
if ((orig_neigh_node) && (!is_single_hop_neigh))
831
orig_node_free_ref(orig_neigh_node);
834
neigh_node_free_ref(router);
836
neigh_node_free_ref(router_router);
837
if (orig_neigh_router)
838
neigh_node_free_ref(orig_neigh_router);
840
orig_node_free_ref(orig_node);
843
int recv_bat_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
249
int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
845
251
struct ethhdr *ethhdr;
847
253
/* drop packet if it has not necessary minimum size */
848
if (unlikely(!pskb_may_pull(skb, sizeof(struct batman_packet))))
254
if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_LEN)))
849
255
return NET_RX_DROP;
851
257
ethhdr = (struct ethhdr *)skb_mac_header(skb);
577
int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
579
struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
580
struct tt_query_packet *tt_query;
581
struct ethhdr *ethhdr;
583
/* drop packet if it has not necessary minimum size */
584
if (unlikely(!pskb_may_pull(skb, sizeof(struct tt_query_packet))))
587
/* I could need to modify it */
588
if (skb_cow(skb, sizeof(struct tt_query_packet)) < 0)
591
ethhdr = (struct ethhdr *)skb_mac_header(skb);
593
/* packet with unicast indication but broadcast recipient */
594
if (is_broadcast_ether_addr(ethhdr->h_dest))
597
/* packet with broadcast sender address */
598
if (is_broadcast_ether_addr(ethhdr->h_source))
601
tt_query = (struct tt_query_packet *)skb->data;
603
tt_query->tt_data = ntohs(tt_query->tt_data);
605
switch (tt_query->flags & TT_QUERY_TYPE_MASK) {
607
/* If we cannot provide an answer the tt_request is
609
if (!send_tt_response(bat_priv, tt_query)) {
610
bat_dbg(DBG_TT, bat_priv,
611
"Routing TT_REQUEST to %pM [%c]\n",
613
(tt_query->flags & TT_FULL_TABLE ? 'F' : '.'));
614
tt_query->tt_data = htons(tt_query->tt_data);
615
return route_unicast_packet(skb, recv_if);
619
/* packet needs to be linearized to access the TT changes */
620
if (skb_linearize(skb) < 0)
623
if (is_my_mac(tt_query->dst))
624
handle_tt_response(bat_priv, tt_query);
626
bat_dbg(DBG_TT, bat_priv,
627
"Routing TT_RESPONSE to %pM [%c]\n",
629
(tt_query->flags & TT_FULL_TABLE ? 'F' : '.'));
630
tt_query->tt_data = htons(tt_query->tt_data);
631
return route_unicast_packet(skb, recv_if);
637
/* returning NET_RX_DROP will make the caller function kfree the skb */
641
int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if)
643
struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
644
struct roam_adv_packet *roam_adv_packet;
645
struct orig_node *orig_node;
646
struct ethhdr *ethhdr;
648
/* drop packet if it has not necessary minimum size */
649
if (unlikely(!pskb_may_pull(skb, sizeof(struct roam_adv_packet))))
652
ethhdr = (struct ethhdr *)skb_mac_header(skb);
654
/* packet with unicast indication but broadcast recipient */
655
if (is_broadcast_ether_addr(ethhdr->h_dest))
658
/* packet with broadcast sender address */
659
if (is_broadcast_ether_addr(ethhdr->h_source))
662
roam_adv_packet = (struct roam_adv_packet *)skb->data;
664
if (!is_my_mac(roam_adv_packet->dst))
665
return route_unicast_packet(skb, recv_if);
667
orig_node = orig_hash_find(bat_priv, roam_adv_packet->src);
671
bat_dbg(DBG_TT, bat_priv, "Received ROAMING_ADV from %pM "
672
"(client %pM)\n", roam_adv_packet->src,
673
roam_adv_packet->client);
675
tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
676
atomic_read(&orig_node->last_ttvn) + 1, true, false);
678
/* Roaming phase starts: I have new information but the ttvn has not
679
* been incremented yet. This flag will make me check all the incoming
680
* packets for the correct destination. */
681
bat_priv->tt_poss_change = true;
683
orig_node_free_ref(orig_node);
685
/* returning NET_RX_DROP will make the caller function kfree the skb */
1174
689
/* find a suitable router for this originator, and use
1175
690
* bonding if possible. increases the found neighbors
1177
692
struct neigh_node *find_router(struct bat_priv *bat_priv,
1178
693
struct orig_node *orig_node,
1179
struct hard_iface *recv_if)
694
const struct hard_iface *recv_if)
1181
696
struct orig_node *primary_orig_node;
1182
697
struct orig_node *router_orig;
875
static int check_unicast_ttvn(struct bat_priv *bat_priv,
876
struct sk_buff *skb) {
878
struct orig_node *orig_node;
879
struct ethhdr *ethhdr;
880
struct hard_iface *primary_if;
881
struct unicast_packet *unicast_packet;
884
/* I could need to modify it */
885
if (skb_cow(skb, sizeof(struct unicast_packet)) < 0)
888
unicast_packet = (struct unicast_packet *)skb->data;
890
if (is_my_mac(unicast_packet->dest)) {
891
tt_poss_change = bat_priv->tt_poss_change;
892
curr_ttvn = (uint8_t)atomic_read(&bat_priv->ttvn);
894
orig_node = orig_hash_find(bat_priv, unicast_packet->dest);
899
curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
900
tt_poss_change = orig_node->tt_poss_change;
901
orig_node_free_ref(orig_node);
904
/* Check whether I have to reroute the packet */
905
if (seq_before(unicast_packet->ttvn, curr_ttvn) || tt_poss_change) {
906
/* Linearize the skb before accessing it */
907
if (skb_linearize(skb) < 0)
910
ethhdr = (struct ethhdr *)(skb->data +
911
sizeof(struct unicast_packet));
912
orig_node = transtable_search(bat_priv, NULL, ethhdr->h_dest);
915
if (!is_my_client(bat_priv, ethhdr->h_dest))
917
primary_if = primary_if_get_selected(bat_priv);
920
memcpy(unicast_packet->dest,
921
primary_if->net_dev->dev_addr, ETH_ALEN);
922
hardif_free_ref(primary_if);
924
memcpy(unicast_packet->dest, orig_node->orig,
926
curr_ttvn = (uint8_t)
927
atomic_read(&orig_node->last_ttvn);
928
orig_node_free_ref(orig_node);
931
bat_dbg(DBG_ROUTES, bat_priv, "TTVN mismatch (old_ttvn %u "
932
"new_ttvn %u)! Rerouting unicast packet (for %pM) to "
933
"%pM\n", unicast_packet->ttvn, curr_ttvn,
934
ethhdr->h_dest, unicast_packet->dest);
936
unicast_packet->ttvn = curr_ttvn;
1357
941
int recv_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
943
struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1359
944
struct unicast_packet *unicast_packet;
1360
int hdr_size = sizeof(struct unicast_packet);
945
int hdr_size = sizeof(*unicast_packet);
1362
947
if (check_unicast_packet(skb, hdr_size) < 0)
1363
948
return NET_RX_DROP;
950
if (!check_unicast_ttvn(bat_priv, skb))
1365
953
unicast_packet = (struct unicast_packet *)skb->data;
1367
955
/* packet for me */