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