b3fd61c90f3268df427a8fe0a81715de5ac83cac
[firefly-linux-kernel-4.4.55.git] / net / batman-adv / routing.c
1 /* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
2  *
3  * Marek Lindner, Simon Wunderlich
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA
18  */
19
20 #include "main.h"
21 #include "routing.h"
22 #include "send.h"
23 #include "soft-interface.h"
24 #include "hard-interface.h"
25 #include "icmp_socket.h"
26 #include "translation-table.h"
27 #include "originator.h"
28 #include "vis.h"
29 #include "unicast.h"
30 #include "bridge_loop_avoidance.h"
31
32 static int batadv_route_unicast_packet(struct sk_buff *skb,
33                                        struct hard_iface *recv_if);
34
35 void batadv_slide_own_bcast_window(struct hard_iface *hard_iface)
36 {
37         struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
38         struct hashtable_t *hash = bat_priv->orig_hash;
39         struct hlist_node *node;
40         struct hlist_head *head;
41         struct orig_node *orig_node;
42         unsigned long *word;
43         uint32_t i;
44         size_t word_index;
45         uint8_t *w;
46
47         for (i = 0; i < hash->size; i++) {
48                 head = &hash->table[i];
49
50                 rcu_read_lock();
51                 hlist_for_each_entry_rcu(orig_node, node, head, hash_entry) {
52                         spin_lock_bh(&orig_node->ogm_cnt_lock);
53                         word_index = hard_iface->if_num * BATADV_NUM_WORDS;
54                         word = &(orig_node->bcast_own[word_index]);
55
56                         batadv_bit_get_packet(bat_priv, word, 1, 0);
57                         w = &orig_node->bcast_own_sum[hard_iface->if_num];
58                         *w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
59                         spin_unlock_bh(&orig_node->ogm_cnt_lock);
60                 }
61                 rcu_read_unlock();
62         }
63 }
64
65 static void _batadv_update_route(struct bat_priv *bat_priv,
66                                  struct orig_node *orig_node,
67                                  struct neigh_node *neigh_node)
68 {
69         struct neigh_node *curr_router;
70
71         curr_router = batadv_orig_node_get_router(orig_node);
72
73         /* route deleted */
74         if ((curr_router) && (!neigh_node)) {
75                 batadv_dbg(DBG_ROUTES, bat_priv, "Deleting route towards: %pM\n",
76                            orig_node->orig);
77                 batadv_tt_global_del_orig(bat_priv, orig_node,
78                                           "Deleted route towards originator");
79
80         /* route added */
81         } else if ((!curr_router) && (neigh_node)) {
82
83                 batadv_dbg(DBG_ROUTES, bat_priv,
84                            "Adding route towards: %pM (via %pM)\n",
85                            orig_node->orig, neigh_node->addr);
86         /* route changed */
87         } else if (neigh_node && curr_router) {
88                 batadv_dbg(DBG_ROUTES, bat_priv,
89                            "Changing route towards: %pM (now via %pM - was via %pM)\n",
90                            orig_node->orig, neigh_node->addr,
91                            curr_router->addr);
92         }
93
94         if (curr_router)
95                 batadv_neigh_node_free_ref(curr_router);
96
97         /* increase refcount of new best neighbor */
98         if (neigh_node && !atomic_inc_not_zero(&neigh_node->refcount))
99                 neigh_node = NULL;
100
101         spin_lock_bh(&orig_node->neigh_list_lock);
102         rcu_assign_pointer(orig_node->router, neigh_node);
103         spin_unlock_bh(&orig_node->neigh_list_lock);
104
105         /* decrease refcount of previous best neighbor */
106         if (curr_router)
107                 batadv_neigh_node_free_ref(curr_router);
108 }
109
110 void batadv_update_route(struct bat_priv *bat_priv, struct orig_node *orig_node,
111                          struct neigh_node *neigh_node)
112 {
113         struct neigh_node *router = NULL;
114
115         if (!orig_node)
116                 goto out;
117
118         router = batadv_orig_node_get_router(orig_node);
119
120         if (router != neigh_node)
121                 _batadv_update_route(bat_priv, orig_node, neigh_node);
122
123 out:
124         if (router)
125                 batadv_neigh_node_free_ref(router);
126 }
127
128 /* caller must hold the neigh_list_lock */
129 void batadv_bonding_candidate_del(struct orig_node *orig_node,
130                                   struct neigh_node *neigh_node)
131 {
132         /* this neighbor is not part of our candidate list */
133         if (list_empty(&neigh_node->bonding_list))
134                 goto out;
135
136         list_del_rcu(&neigh_node->bonding_list);
137         INIT_LIST_HEAD(&neigh_node->bonding_list);
138         batadv_neigh_node_free_ref(neigh_node);
139         atomic_dec(&orig_node->bond_candidates);
140
141 out:
142         return;
143 }
144
145 void batadv_bonding_candidate_add(struct orig_node *orig_node,
146                                   struct neigh_node *neigh_node)
147 {
148         struct hlist_node *node;
149         struct neigh_node *tmp_neigh_node, *router = NULL;
150         uint8_t interference_candidate = 0;
151
152         spin_lock_bh(&orig_node->neigh_list_lock);
153
154         /* only consider if it has the same primary address ...  */
155         if (!batadv_compare_eth(orig_node->orig,
156                                 neigh_node->orig_node->primary_addr))
157                 goto candidate_del;
158
159         router = batadv_orig_node_get_router(orig_node);
160         if (!router)
161                 goto candidate_del;
162
163         /* ... and is good enough to be considered */
164         if (neigh_node->tq_avg < router->tq_avg - BATADV_BONDING_TQ_THRESHOLD)
165                 goto candidate_del;
166
167         /* check if we have another candidate with the same mac address or
168          * interface. If we do, we won't select this candidate because of
169          * possible interference.
170          */
171         hlist_for_each_entry_rcu(tmp_neigh_node, node,
172                                  &orig_node->neigh_list, list) {
173
174                 if (tmp_neigh_node == neigh_node)
175                         continue;
176
177                 /* we only care if the other candidate is even
178                  * considered as candidate.
179                  */
180                 if (list_empty(&tmp_neigh_node->bonding_list))
181                         continue;
182
183                 if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
184                     (batadv_compare_eth(neigh_node->addr,
185                                         tmp_neigh_node->addr))) {
186                         interference_candidate = 1;
187                         break;
188                 }
189         }
190
191         /* don't care further if it is an interference candidate */
192         if (interference_candidate)
193                 goto candidate_del;
194
195         /* this neighbor already is part of our candidate list */
196         if (!list_empty(&neigh_node->bonding_list))
197                 goto out;
198
199         if (!atomic_inc_not_zero(&neigh_node->refcount))
200                 goto out;
201
202         list_add_rcu(&neigh_node->bonding_list, &orig_node->bond_list);
203         atomic_inc(&orig_node->bond_candidates);
204         goto out;
205
206 candidate_del:
207         batadv_bonding_candidate_del(orig_node, neigh_node);
208
209 out:
210         spin_unlock_bh(&orig_node->neigh_list_lock);
211
212         if (router)
213                 batadv_neigh_node_free_ref(router);
214 }
215
216 /* copy primary address for bonding */
217 void
218 batadv_bonding_save_primary(const struct orig_node *orig_node,
219                             struct orig_node *orig_neigh_node,
220                             const struct batman_ogm_packet *batman_ogm_packet)
221 {
222         if (!(batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
223                 return;
224
225         memcpy(orig_neigh_node->primary_addr, orig_node->orig, ETH_ALEN);
226 }
227
228 /* checks whether the host restarted and is in the protection time.
229  * returns:
230  *  0 if the packet is to be accepted
231  *  1 if the packet is to be ignored.
232  */
233 int batadv_window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
234                             unsigned long *last_reset)
235 {
236         if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
237             seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
238                 if (!batadv_has_timed_out(*last_reset,
239                                           BATADV_RESET_PROTECTION_MS))
240                         return 1;
241
242                 *last_reset = jiffies;
243                 batadv_dbg(DBG_BATMAN, bat_priv,
244                            "old packet received, start protection\n");
245         }
246
247         return 0;
248 }
249
250 bool batadv_check_management_packet(struct sk_buff *skb,
251                                     struct hard_iface *hard_iface,
252                                     int header_len)
253 {
254         struct ethhdr *ethhdr;
255
256         /* drop packet if it has not necessary minimum size */
257         if (unlikely(!pskb_may_pull(skb, header_len)))
258                 return false;
259
260         ethhdr = (struct ethhdr *)skb_mac_header(skb);
261
262         /* packet with broadcast indication but unicast recipient */
263         if (!is_broadcast_ether_addr(ethhdr->h_dest))
264                 return false;
265
266         /* packet with broadcast sender address */
267         if (is_broadcast_ether_addr(ethhdr->h_source))
268                 return false;
269
270         /* create a copy of the skb, if needed, to modify it. */
271         if (skb_cow(skb, 0) < 0)
272                 return false;
273
274         /* keep skb linear */
275         if (skb_linearize(skb) < 0)
276                 return false;
277
278         return true;
279 }
280
281 static int batadv_recv_my_icmp_packet(struct bat_priv *bat_priv,
282                                       struct sk_buff *skb, size_t icmp_len)
283 {
284         struct hard_iface *primary_if = NULL;
285         struct orig_node *orig_node = NULL;
286         struct neigh_node *router = NULL;
287         struct icmp_packet_rr *icmp_packet;
288         int ret = NET_RX_DROP;
289
290         icmp_packet = (struct icmp_packet_rr *)skb->data;
291
292         /* add data to device queue */
293         if (icmp_packet->msg_type != ECHO_REQUEST) {
294                 batadv_socket_receive_packet(icmp_packet, icmp_len);
295                 goto out;
296         }
297
298         primary_if = batadv_primary_if_get_selected(bat_priv);
299         if (!primary_if)
300                 goto out;
301
302         /* answer echo request (ping) */
303         /* get routing information */
304         orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
305         if (!orig_node)
306                 goto out;
307
308         router = batadv_orig_node_get_router(orig_node);
309         if (!router)
310                 goto out;
311
312         /* create a copy of the skb, if needed, to modify it. */
313         if (skb_cow(skb, ETH_HLEN) < 0)
314                 goto out;
315
316         icmp_packet = (struct icmp_packet_rr *)skb->data;
317
318         memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
319         memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
320         icmp_packet->msg_type = ECHO_REPLY;
321         icmp_packet->header.ttl = BATADV_TTL;
322
323         batadv_send_skb_packet(skb, router->if_incoming, router->addr);
324         ret = NET_RX_SUCCESS;
325
326 out:
327         if (primary_if)
328                 batadv_hardif_free_ref(primary_if);
329         if (router)
330                 batadv_neigh_node_free_ref(router);
331         if (orig_node)
332                 batadv_orig_node_free_ref(orig_node);
333         return ret;
334 }
335
336 static int batadv_recv_icmp_ttl_exceeded(struct bat_priv *bat_priv,
337                                          struct sk_buff *skb)
338 {
339         struct hard_iface *primary_if = NULL;
340         struct orig_node *orig_node = NULL;
341         struct neigh_node *router = NULL;
342         struct icmp_packet *icmp_packet;
343         int ret = NET_RX_DROP;
344
345         icmp_packet = (struct icmp_packet *)skb->data;
346
347         /* send TTL exceeded if packet is an echo request (traceroute) */
348         if (icmp_packet->msg_type != ECHO_REQUEST) {
349                 pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
350                          icmp_packet->orig, icmp_packet->dst);
351                 goto out;
352         }
353
354         primary_if = batadv_primary_if_get_selected(bat_priv);
355         if (!primary_if)
356                 goto out;
357
358         /* get routing information */
359         orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
360         if (!orig_node)
361                 goto out;
362
363         router = batadv_orig_node_get_router(orig_node);
364         if (!router)
365                 goto out;
366
367         /* create a copy of the skb, if needed, to modify it. */
368         if (skb_cow(skb, ETH_HLEN) < 0)
369                 goto out;
370
371         icmp_packet = (struct icmp_packet *)skb->data;
372
373         memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
374         memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
375         icmp_packet->msg_type = TTL_EXCEEDED;
376         icmp_packet->header.ttl = BATADV_TTL;
377
378         batadv_send_skb_packet(skb, router->if_incoming, router->addr);
379         ret = NET_RX_SUCCESS;
380
381 out:
382         if (primary_if)
383                 batadv_hardif_free_ref(primary_if);
384         if (router)
385                 batadv_neigh_node_free_ref(router);
386         if (orig_node)
387                 batadv_orig_node_free_ref(orig_node);
388         return ret;
389 }
390
391
392 int batadv_recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
393 {
394         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
395         struct icmp_packet_rr *icmp_packet;
396         struct ethhdr *ethhdr;
397         struct orig_node *orig_node = NULL;
398         struct neigh_node *router = NULL;
399         int hdr_size = sizeof(struct icmp_packet);
400         int ret = NET_RX_DROP;
401
402         /* we truncate all incoming icmp packets if they don't match our size */
403         if (skb->len >= sizeof(struct icmp_packet_rr))
404                 hdr_size = sizeof(struct icmp_packet_rr);
405
406         /* drop packet if it has not necessary minimum size */
407         if (unlikely(!pskb_may_pull(skb, hdr_size)))
408                 goto out;
409
410         ethhdr = (struct ethhdr *)skb_mac_header(skb);
411
412         /* packet with unicast indication but broadcast recipient */
413         if (is_broadcast_ether_addr(ethhdr->h_dest))
414                 goto out;
415
416         /* packet with broadcast sender address */
417         if (is_broadcast_ether_addr(ethhdr->h_source))
418                 goto out;
419
420         /* not for me */
421         if (!batadv_is_my_mac(ethhdr->h_dest))
422                 goto out;
423
424         icmp_packet = (struct icmp_packet_rr *)skb->data;
425
426         /* add record route information if not full */
427         if ((hdr_size == sizeof(struct icmp_packet_rr)) &&
428             (icmp_packet->rr_cur < BATADV_RR_LEN)) {
429                 memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
430                        ethhdr->h_dest, ETH_ALEN);
431                 icmp_packet->rr_cur++;
432         }
433
434         /* packet for me */
435         if (batadv_is_my_mac(icmp_packet->dst))
436                 return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
437
438         /* TTL exceeded */
439         if (icmp_packet->header.ttl < 2)
440                 return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
441
442         /* get routing information */
443         orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->dst);
444         if (!orig_node)
445                 goto out;
446
447         router = batadv_orig_node_get_router(orig_node);
448         if (!router)
449                 goto out;
450
451         /* create a copy of the skb, if needed, to modify it. */
452         if (skb_cow(skb, ETH_HLEN) < 0)
453                 goto out;
454
455         icmp_packet = (struct icmp_packet_rr *)skb->data;
456
457         /* decrement ttl */
458         icmp_packet->header.ttl--;
459
460         /* route it */
461         batadv_send_skb_packet(skb, router->if_incoming, router->addr);
462         ret = NET_RX_SUCCESS;
463
464 out:
465         if (router)
466                 batadv_neigh_node_free_ref(router);
467         if (orig_node)
468                 batadv_orig_node_free_ref(orig_node);
469         return ret;
470 }
471
472 /* In the bonding case, send the packets in a round
473  * robin fashion over the remaining interfaces.
474  *
475  * This method rotates the bonding list and increases the
476  * returned router's refcount.
477  */
478 static struct neigh_node *
479 batadv_find_bond_router(struct orig_node *primary_orig,
480                         const struct hard_iface *recv_if)
481 {
482         struct neigh_node *tmp_neigh_node;
483         struct neigh_node *router = NULL, *first_candidate = NULL;
484
485         rcu_read_lock();
486         list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
487                                 bonding_list) {
488                 if (!first_candidate)
489                         first_candidate = tmp_neigh_node;
490
491                 /* recv_if == NULL on the first node. */
492                 if (tmp_neigh_node->if_incoming == recv_if)
493                         continue;
494
495                 if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
496                         continue;
497
498                 router = tmp_neigh_node;
499                 break;
500         }
501
502         /* use the first candidate if nothing was found. */
503         if (!router && first_candidate &&
504             atomic_inc_not_zero(&first_candidate->refcount))
505                 router = first_candidate;
506
507         if (!router)
508                 goto out;
509
510         /* selected should point to the next element
511          * after the current router
512          */
513         spin_lock_bh(&primary_orig->neigh_list_lock);
514         /* this is a list_move(), which unfortunately
515          * does not exist as rcu version
516          */
517         list_del_rcu(&primary_orig->bond_list);
518         list_add_rcu(&primary_orig->bond_list,
519                      &router->bonding_list);
520         spin_unlock_bh(&primary_orig->neigh_list_lock);
521
522 out:
523         rcu_read_unlock();
524         return router;
525 }
526
527 /* Interface Alternating: Use the best of the
528  * remaining candidates which are not using
529  * this interface.
530  *
531  * Increases the returned router's refcount
532  */
533 static struct neigh_node *
534 batadv_find_ifalter_router(struct orig_node *primary_orig,
535                            const struct hard_iface *recv_if)
536 {
537         struct neigh_node *tmp_neigh_node;
538         struct neigh_node *router = NULL, *first_candidate = NULL;
539
540         rcu_read_lock();
541         list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
542                                 bonding_list) {
543                 if (!first_candidate)
544                         first_candidate = tmp_neigh_node;
545
546                 /* recv_if == NULL on the first node. */
547                 if (tmp_neigh_node->if_incoming == recv_if)
548                         continue;
549
550                 if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
551                         continue;
552
553                 /* if we don't have a router yet
554                  * or this one is better, choose it.
555                  */
556                 if ((!router) ||
557                     (tmp_neigh_node->tq_avg > router->tq_avg)) {
558                         /* decrement refcount of
559                          * previously selected router
560                          */
561                         if (router)
562                                 batadv_neigh_node_free_ref(router);
563
564                         router = tmp_neigh_node;
565                         atomic_inc_not_zero(&router->refcount);
566                 }
567
568                 batadv_neigh_node_free_ref(tmp_neigh_node);
569         }
570
571         /* use the first candidate if nothing was found. */
572         if (!router && first_candidate &&
573             atomic_inc_not_zero(&first_candidate->refcount))
574                 router = first_candidate;
575
576         rcu_read_unlock();
577         return router;
578 }
579
580 int batadv_recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
581 {
582         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
583         struct tt_query_packet *tt_query;
584         uint16_t tt_size;
585         struct ethhdr *ethhdr;
586         char tt_flag;
587
588         /* drop packet if it has not necessary minimum size */
589         if (unlikely(!pskb_may_pull(skb, sizeof(struct tt_query_packet))))
590                 goto out;
591
592         /* I could need to modify it */
593         if (skb_cow(skb, sizeof(struct tt_query_packet)) < 0)
594                 goto out;
595
596         ethhdr = (struct ethhdr *)skb_mac_header(skb);
597
598         /* packet with unicast indication but broadcast recipient */
599         if (is_broadcast_ether_addr(ethhdr->h_dest))
600                 goto out;
601
602         /* packet with broadcast sender address */
603         if (is_broadcast_ether_addr(ethhdr->h_source))
604                 goto out;
605
606         tt_query = (struct tt_query_packet *)skb->data;
607
608         switch (tt_query->flags & BATADV_TT_QUERY_TYPE_MASK) {
609         case TT_REQUEST:
610                 batadv_inc_counter(bat_priv, BAT_CNT_TT_REQUEST_RX);
611
612                 /* If we cannot provide an answer the tt_request is
613                  * forwarded
614                  */
615                 if (!batadv_send_tt_response(bat_priv, tt_query)) {
616                         tt_flag = tt_query->flags & TT_FULL_TABLE ? 'F' : '.';
617                         batadv_dbg(DBG_TT, bat_priv,
618                                    "Routing TT_REQUEST to %pM [%c]\n",
619                                    tt_query->dst,
620                                    tt_flag);
621                         return batadv_route_unicast_packet(skb, recv_if);
622                 }
623                 break;
624         case TT_RESPONSE:
625                 batadv_inc_counter(bat_priv, BAT_CNT_TT_RESPONSE_RX);
626
627                 if (batadv_is_my_mac(tt_query->dst)) {
628                         /* packet needs to be linearized to access the TT
629                          * changes
630                          */
631                         if (skb_linearize(skb) < 0)
632                                 goto out;
633                         /* skb_linearize() possibly changed skb->data */
634                         tt_query = (struct tt_query_packet *)skb->data;
635
636                         tt_size = batadv_tt_len(ntohs(tt_query->tt_data));
637
638                         /* Ensure we have all the claimed data */
639                         if (unlikely(skb_headlen(skb) <
640                                      sizeof(struct tt_query_packet) + tt_size))
641                                 goto out;
642
643                         batadv_handle_tt_response(bat_priv, tt_query);
644                 } else {
645                         tt_flag = tt_query->flags & TT_FULL_TABLE ? 'F' : '.';
646                         batadv_dbg(DBG_TT, bat_priv,
647                                    "Routing TT_RESPONSE to %pM [%c]\n",
648                                    tt_query->dst,
649                                    tt_flag);
650                         return batadv_route_unicast_packet(skb, recv_if);
651                 }
652                 break;
653         }
654
655 out:
656         /* returning NET_RX_DROP will make the caller function kfree the skb */
657         return NET_RX_DROP;
658 }
659
660 int batadv_recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if)
661 {
662         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
663         struct roam_adv_packet *roam_adv_packet;
664         struct orig_node *orig_node;
665         struct ethhdr *ethhdr;
666
667         /* drop packet if it has not necessary minimum size */
668         if (unlikely(!pskb_may_pull(skb, sizeof(struct roam_adv_packet))))
669                 goto out;
670
671         ethhdr = (struct ethhdr *)skb_mac_header(skb);
672
673         /* packet with unicast indication but broadcast recipient */
674         if (is_broadcast_ether_addr(ethhdr->h_dest))
675                 goto out;
676
677         /* packet with broadcast sender address */
678         if (is_broadcast_ether_addr(ethhdr->h_source))
679                 goto out;
680
681         batadv_inc_counter(bat_priv, BAT_CNT_TT_ROAM_ADV_RX);
682
683         roam_adv_packet = (struct roam_adv_packet *)skb->data;
684
685         if (!batadv_is_my_mac(roam_adv_packet->dst))
686                 return batadv_route_unicast_packet(skb, recv_if);
687
688         /* check if it is a backbone gateway. we don't accept
689          * roaming advertisement from it, as it has the same
690          * entries as we have.
691          */
692         if (batadv_bla_is_backbone_gw_orig(bat_priv, roam_adv_packet->src))
693                 goto out;
694
695         orig_node = batadv_orig_hash_find(bat_priv, roam_adv_packet->src);
696         if (!orig_node)
697                 goto out;
698
699         batadv_dbg(DBG_TT, bat_priv,
700                    "Received ROAMING_ADV from %pM (client %pM)\n",
701                    roam_adv_packet->src, roam_adv_packet->client);
702
703         batadv_tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
704                              TT_CLIENT_ROAM,
705                              atomic_read(&orig_node->last_ttvn) + 1);
706
707         /* Roaming phase starts: I have new information but the ttvn has not
708          * been incremented yet. This flag will make me check all the incoming
709          * packets for the correct destination.
710          */
711         bat_priv->tt_poss_change = true;
712
713         batadv_orig_node_free_ref(orig_node);
714 out:
715         /* returning NET_RX_DROP will make the caller function kfree the skb */
716         return NET_RX_DROP;
717 }
718
719 /* find a suitable router for this originator, and use
720  * bonding if possible. increases the found neighbors
721  * refcount.
722  */
723 struct neigh_node *batadv_find_router(struct bat_priv *bat_priv,
724                                       struct orig_node *orig_node,
725                                       const struct hard_iface *recv_if)
726 {
727         struct orig_node *primary_orig_node;
728         struct orig_node *router_orig;
729         struct neigh_node *router;
730         static uint8_t zero_mac[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
731         int bonding_enabled;
732         uint8_t *primary_addr;
733
734         if (!orig_node)
735                 return NULL;
736
737         router = batadv_orig_node_get_router(orig_node);
738         if (!router)
739                 goto err;
740
741         /* without bonding, the first node should
742          * always choose the default router.
743          */
744         bonding_enabled = atomic_read(&bat_priv->bonding);
745
746         rcu_read_lock();
747         /* select default router to output */
748         router_orig = router->orig_node;
749         if (!router_orig)
750                 goto err_unlock;
751
752         if ((!recv_if) && (!bonding_enabled))
753                 goto return_router;
754
755         primary_addr = router_orig->primary_addr;
756
757         /* if we have something in the primary_addr, we can search
758          * for a potential bonding candidate.
759          */
760         if (batadv_compare_eth(primary_addr, zero_mac))
761                 goto return_router;
762
763         /* find the orig_node which has the primary interface. might
764          * even be the same as our router_orig in many cases
765          */
766         if (batadv_compare_eth(primary_addr, router_orig->orig)) {
767                 primary_orig_node = router_orig;
768         } else {
769                 primary_orig_node = batadv_orig_hash_find(bat_priv,
770                                                           primary_addr);
771                 if (!primary_orig_node)
772                         goto return_router;
773
774                 batadv_orig_node_free_ref(primary_orig_node);
775         }
776
777         /* with less than 2 candidates, we can't do any
778          * bonding and prefer the original router.
779          */
780         if (atomic_read(&primary_orig_node->bond_candidates) < 2)
781                 goto return_router;
782
783         /* all nodes between should choose a candidate which
784          * is is not on the interface where the packet came
785          * in.
786          */
787         batadv_neigh_node_free_ref(router);
788
789         if (bonding_enabled)
790                 router = batadv_find_bond_router(primary_orig_node, recv_if);
791         else
792                 router = batadv_find_ifalter_router(primary_orig_node, recv_if);
793
794 return_router:
795         if (router && router->if_incoming->if_status != IF_ACTIVE)
796                 goto err_unlock;
797
798         rcu_read_unlock();
799         return router;
800 err_unlock:
801         rcu_read_unlock();
802 err:
803         if (router)
804                 batadv_neigh_node_free_ref(router);
805         return NULL;
806 }
807
808 static int batadv_check_unicast_packet(struct sk_buff *skb, int hdr_size)
809 {
810         struct ethhdr *ethhdr;
811
812         /* drop packet if it has not necessary minimum size */
813         if (unlikely(!pskb_may_pull(skb, hdr_size)))
814                 return -1;
815
816         ethhdr = (struct ethhdr *)skb_mac_header(skb);
817
818         /* packet with unicast indication but broadcast recipient */
819         if (is_broadcast_ether_addr(ethhdr->h_dest))
820                 return -1;
821
822         /* packet with broadcast sender address */
823         if (is_broadcast_ether_addr(ethhdr->h_source))
824                 return -1;
825
826         /* not for me */
827         if (!batadv_is_my_mac(ethhdr->h_dest))
828                 return -1;
829
830         return 0;
831 }
832
833 static int batadv_route_unicast_packet(struct sk_buff *skb,
834                                        struct hard_iface *recv_if)
835 {
836         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
837         struct orig_node *orig_node = NULL;
838         struct neigh_node *neigh_node = NULL;
839         struct unicast_packet *unicast_packet;
840         struct ethhdr *ethhdr = (struct ethhdr *)skb_mac_header(skb);
841         int ret = NET_RX_DROP;
842         struct sk_buff *new_skb;
843
844         unicast_packet = (struct unicast_packet *)skb->data;
845
846         /* TTL exceeded */
847         if (unicast_packet->header.ttl < 2) {
848                 pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
849                          ethhdr->h_source, unicast_packet->dest);
850                 goto out;
851         }
852
853         /* get routing information */
854         orig_node = batadv_orig_hash_find(bat_priv, unicast_packet->dest);
855
856         if (!orig_node)
857                 goto out;
858
859         /* find_router() increases neigh_nodes refcount if found. */
860         neigh_node = batadv_find_router(bat_priv, orig_node, recv_if);
861
862         if (!neigh_node)
863                 goto out;
864
865         /* create a copy of the skb, if needed, to modify it. */
866         if (skb_cow(skb, ETH_HLEN) < 0)
867                 goto out;
868
869         unicast_packet = (struct unicast_packet *)skb->data;
870
871         if (unicast_packet->header.packet_type == BAT_UNICAST &&
872             atomic_read(&bat_priv->fragmentation) &&
873             skb->len > neigh_node->if_incoming->net_dev->mtu) {
874                 ret = batadv_frag_send_skb(skb, bat_priv,
875                                            neigh_node->if_incoming,
876                                            neigh_node->addr);
877                 goto out;
878         }
879
880         if (unicast_packet->header.packet_type == BAT_UNICAST_FRAG &&
881             batadv_frag_can_reassemble(skb,
882                                        neigh_node->if_incoming->net_dev->mtu)) {
883
884                 ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
885
886                 if (ret == NET_RX_DROP)
887                         goto out;
888
889                 /* packet was buffered for late merge */
890                 if (!new_skb) {
891                         ret = NET_RX_SUCCESS;
892                         goto out;
893                 }
894
895                 skb = new_skb;
896                 unicast_packet = (struct unicast_packet *)skb->data;
897         }
898
899         /* decrement ttl */
900         unicast_packet->header.ttl--;
901
902         /* Update stats counter */
903         batadv_inc_counter(bat_priv, BAT_CNT_FORWARD);
904         batadv_add_counter(bat_priv, BAT_CNT_FORWARD_BYTES,
905                            skb->len + ETH_HLEN);
906
907         /* route it */
908         batadv_send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
909         ret = NET_RX_SUCCESS;
910
911 out:
912         if (neigh_node)
913                 batadv_neigh_node_free_ref(neigh_node);
914         if (orig_node)
915                 batadv_orig_node_free_ref(orig_node);
916         return ret;
917 }
918
919 static int batadv_check_unicast_ttvn(struct bat_priv *bat_priv,
920                                      struct sk_buff *skb) {
921         uint8_t curr_ttvn;
922         struct orig_node *orig_node;
923         struct ethhdr *ethhdr;
924         struct hard_iface *primary_if;
925         struct unicast_packet *unicast_packet;
926         bool tt_poss_change;
927         int is_old_ttvn;
928
929         /* I could need to modify it */
930         if (skb_cow(skb, sizeof(struct unicast_packet)) < 0)
931                 return 0;
932
933         unicast_packet = (struct unicast_packet *)skb->data;
934
935         if (batadv_is_my_mac(unicast_packet->dest)) {
936                 tt_poss_change = bat_priv->tt_poss_change;
937                 curr_ttvn = (uint8_t)atomic_read(&bat_priv->ttvn);
938         } else {
939                 orig_node = batadv_orig_hash_find(bat_priv,
940                                                   unicast_packet->dest);
941
942                 if (!orig_node)
943                         return 0;
944
945                 curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
946                 tt_poss_change = orig_node->tt_poss_change;
947                 batadv_orig_node_free_ref(orig_node);
948         }
949
950         /* Check whether I have to reroute the packet */
951         is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
952         if (is_old_ttvn || tt_poss_change) {
953                 /* check if there is enough data before accessing it */
954                 if (pskb_may_pull(skb, sizeof(struct unicast_packet) +
955                                   ETH_HLEN) < 0)
956                         return 0;
957
958                 ethhdr = (struct ethhdr *)(skb->data +
959                         sizeof(struct unicast_packet));
960
961                 /* we don't have an updated route for this client, so we should
962                  * not try to reroute the packet!!
963                  */
964                 if (batadv_tt_global_client_is_roaming(bat_priv,
965                                                        ethhdr->h_dest))
966                         return 1;
967
968                 orig_node = batadv_transtable_search(bat_priv, NULL,
969                                                      ethhdr->h_dest);
970
971                 if (!orig_node) {
972                         if (!batadv_is_my_client(bat_priv, ethhdr->h_dest))
973                                 return 0;
974                         primary_if = batadv_primary_if_get_selected(bat_priv);
975                         if (!primary_if)
976                                 return 0;
977                         memcpy(unicast_packet->dest,
978                                primary_if->net_dev->dev_addr, ETH_ALEN);
979                         batadv_hardif_free_ref(primary_if);
980                 } else {
981                         memcpy(unicast_packet->dest, orig_node->orig,
982                                ETH_ALEN);
983                         curr_ttvn = (uint8_t)
984                                 atomic_read(&orig_node->last_ttvn);
985                         batadv_orig_node_free_ref(orig_node);
986                 }
987
988                 batadv_dbg(DBG_ROUTES, bat_priv,
989                            "TTVN mismatch (old_ttvn %u new_ttvn %u)! Rerouting unicast packet (for %pM) to %pM\n",
990                            unicast_packet->ttvn, curr_ttvn, ethhdr->h_dest,
991                            unicast_packet->dest);
992
993                 unicast_packet->ttvn = curr_ttvn;
994         }
995         return 1;
996 }
997
998 int batadv_recv_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
999 {
1000         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1001         struct unicast_packet *unicast_packet;
1002         int hdr_size = sizeof(*unicast_packet);
1003
1004         if (batadv_check_unicast_packet(skb, hdr_size) < 0)
1005                 return NET_RX_DROP;
1006
1007         if (!batadv_check_unicast_ttvn(bat_priv, skb))
1008                 return NET_RX_DROP;
1009
1010         unicast_packet = (struct unicast_packet *)skb->data;
1011
1012         /* packet for me */
1013         if (batadv_is_my_mac(unicast_packet->dest)) {
1014                 batadv_interface_rx(recv_if->soft_iface, skb, recv_if,
1015                                     hdr_size);
1016                 return NET_RX_SUCCESS;
1017         }
1018
1019         return batadv_route_unicast_packet(skb, recv_if);
1020 }
1021
1022 int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
1023                                   struct hard_iface *recv_if)
1024 {
1025         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1026         struct unicast_frag_packet *unicast_packet;
1027         int hdr_size = sizeof(*unicast_packet);
1028         struct sk_buff *new_skb = NULL;
1029         int ret;
1030
1031         if (batadv_check_unicast_packet(skb, hdr_size) < 0)
1032                 return NET_RX_DROP;
1033
1034         if (!batadv_check_unicast_ttvn(bat_priv, skb))
1035                 return NET_RX_DROP;
1036
1037         unicast_packet = (struct unicast_frag_packet *)skb->data;
1038
1039         /* packet for me */
1040         if (batadv_is_my_mac(unicast_packet->dest)) {
1041
1042                 ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
1043
1044                 if (ret == NET_RX_DROP)
1045                         return NET_RX_DROP;
1046
1047                 /* packet was buffered for late merge */
1048                 if (!new_skb)
1049                         return NET_RX_SUCCESS;
1050
1051                 batadv_interface_rx(recv_if->soft_iface, new_skb, recv_if,
1052                                     sizeof(struct unicast_packet));
1053                 return NET_RX_SUCCESS;
1054         }
1055
1056         return batadv_route_unicast_packet(skb, recv_if);
1057 }
1058
1059
1060 int batadv_recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1061 {
1062         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1063         struct orig_node *orig_node = NULL;
1064         struct bcast_packet *bcast_packet;
1065         struct ethhdr *ethhdr;
1066         int hdr_size = sizeof(*bcast_packet);
1067         int ret = NET_RX_DROP;
1068         int32_t seq_diff;
1069
1070         /* drop packet if it has not necessary minimum size */
1071         if (unlikely(!pskb_may_pull(skb, hdr_size)))
1072                 goto out;
1073
1074         ethhdr = (struct ethhdr *)skb_mac_header(skb);
1075
1076         /* packet with broadcast indication but unicast recipient */
1077         if (!is_broadcast_ether_addr(ethhdr->h_dest))
1078                 goto out;
1079
1080         /* packet with broadcast sender address */
1081         if (is_broadcast_ether_addr(ethhdr->h_source))
1082                 goto out;
1083
1084         /* ignore broadcasts sent by myself */
1085         if (batadv_is_my_mac(ethhdr->h_source))
1086                 goto out;
1087
1088         bcast_packet = (struct bcast_packet *)skb->data;
1089
1090         /* ignore broadcasts originated by myself */
1091         if (batadv_is_my_mac(bcast_packet->orig))
1092                 goto out;
1093
1094         if (bcast_packet->header.ttl < 2)
1095                 goto out;
1096
1097         orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1098
1099         if (!orig_node)
1100                 goto out;
1101
1102         spin_lock_bh(&orig_node->bcast_seqno_lock);
1103
1104         /* check whether the packet is a duplicate */
1105         if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
1106                             ntohl(bcast_packet->seqno)))
1107                 goto spin_unlock;
1108
1109         seq_diff = ntohl(bcast_packet->seqno) - orig_node->last_bcast_seqno;
1110
1111         /* check whether the packet is old and the host just restarted. */
1112         if (batadv_window_protected(bat_priv, seq_diff,
1113                                     &orig_node->bcast_seqno_reset))
1114                 goto spin_unlock;
1115
1116         /* mark broadcast in flood history, update window position
1117          * if required.
1118          */
1119         if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1120                 orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);
1121
1122         spin_unlock_bh(&orig_node->bcast_seqno_lock);
1123
1124         /* check whether this has been sent by another originator before */
1125         if (batadv_bla_check_bcast_duplist(bat_priv, bcast_packet, hdr_size))
1126                 goto out;
1127
1128         /* rebroadcast packet */
1129         batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1130
1131         /* don't hand the broadcast up if it is from an originator
1132          * from the same backbone.
1133          */
1134         if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1135                 goto out;
1136
1137         /* broadcast for me */
1138         batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size);
1139         ret = NET_RX_SUCCESS;
1140         goto out;
1141
1142 spin_unlock:
1143         spin_unlock_bh(&orig_node->bcast_seqno_lock);
1144 out:
1145         if (orig_node)
1146                 batadv_orig_node_free_ref(orig_node);
1147         return ret;
1148 }
1149
1150 int batadv_recv_vis_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1151 {
1152         struct vis_packet *vis_packet;
1153         struct ethhdr *ethhdr;
1154         struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1155         int hdr_size = sizeof(*vis_packet);
1156
1157         /* keep skb linear */
1158         if (skb_linearize(skb) < 0)
1159                 return NET_RX_DROP;
1160
1161         if (unlikely(!pskb_may_pull(skb, hdr_size)))
1162                 return NET_RX_DROP;
1163
1164         vis_packet = (struct vis_packet *)skb->data;
1165         ethhdr = (struct ethhdr *)skb_mac_header(skb);
1166
1167         /* not for me */
1168         if (!batadv_is_my_mac(ethhdr->h_dest))
1169                 return NET_RX_DROP;
1170
1171         /* ignore own packets */
1172         if (batadv_is_my_mac(vis_packet->vis_orig))
1173                 return NET_RX_DROP;
1174
1175         if (batadv_is_my_mac(vis_packet->sender_orig))
1176                 return NET_RX_DROP;
1177
1178         switch (vis_packet->vis_type) {
1179         case VIS_TYPE_SERVER_SYNC:
1180                 batadv_receive_server_sync_packet(bat_priv, vis_packet,
1181                                                   skb_headlen(skb));
1182                 break;
1183
1184         case VIS_TYPE_CLIENT_UPDATE:
1185                 batadv_receive_client_update_packet(bat_priv, vis_packet,
1186                                                     skb_headlen(skb));
1187                 break;
1188
1189         default:        /* ignore unknown packet */
1190                 break;
1191         }
1192
1193         /* We take a copy of the data in the packet, so we should
1194          * always free the skbuf.
1195          */
1196         return NET_RX_DROP;
1197 }