GNU Linux-libre 4.19.264-gnu1
[releases.git] / net / batman-adv / hard-interface.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
3  *
4  * Marek Lindner, Simon Wunderlich
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "hard-interface.h"
20 #include "main.h"
21
22 #include <linux/atomic.h>
23 #include <linux/byteorder/generic.h>
24 #include <linux/errno.h>
25 #include <linux/gfp.h>
26 #include <linux/if.h>
27 #include <linux/if_arp.h>
28 #include <linux/if_ether.h>
29 #include <linux/kernel.h>
30 #include <linux/kref.h>
31 #include <linux/list.h>
32 #include <linux/mutex.h>
33 #include <linux/netdevice.h>
34 #include <linux/printk.h>
35 #include <linux/rculist.h>
36 #include <linux/rtnetlink.h>
37 #include <linux/slab.h>
38 #include <linux/spinlock.h>
39 #include <net/net_namespace.h>
40 #include <net/rtnetlink.h>
41 #include <uapi/linux/batadv_packet.h>
42
43 #include "bat_v.h"
44 #include "bridge_loop_avoidance.h"
45 #include "debugfs.h"
46 #include "distributed-arp-table.h"
47 #include "gateway_client.h"
48 #include "log.h"
49 #include "originator.h"
50 #include "send.h"
51 #include "soft-interface.h"
52 #include "sysfs.h"
53 #include "translation-table.h"
54
55 /**
56  * batadv_hardif_release() - release hard interface from lists and queue for
57  *  free after rcu grace period
58  * @ref: kref pointer of the hard interface
59  */
60 void batadv_hardif_release(struct kref *ref)
61 {
62         struct batadv_hard_iface *hard_iface;
63
64         hard_iface = container_of(ref, struct batadv_hard_iface, refcount);
65         dev_put(hard_iface->net_dev);
66
67         kfree_rcu(hard_iface, rcu);
68 }
69
70 /**
71  * batadv_hardif_get_by_netdev() - Get hard interface object of a net_device
72  * @net_dev: net_device to search for
73  *
74  * Return: batadv_hard_iface of net_dev (with increased refcnt), NULL on errors
75  */
76 struct batadv_hard_iface *
77 batadv_hardif_get_by_netdev(const struct net_device *net_dev)
78 {
79         struct batadv_hard_iface *hard_iface;
80
81         rcu_read_lock();
82         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
83                 if (hard_iface->net_dev == net_dev &&
84                     kref_get_unless_zero(&hard_iface->refcount))
85                         goto out;
86         }
87
88         hard_iface = NULL;
89
90 out:
91         rcu_read_unlock();
92         return hard_iface;
93 }
94
95 /**
96  * batadv_getlink_net() - return link net namespace (of use fallback)
97  * @netdev: net_device to check
98  * @fallback_net: return in case get_link_net is not available for @netdev
99  *
100  * Return: result of rtnl_link_ops->get_link_net or @fallback_net
101  */
102 static struct net *batadv_getlink_net(const struct net_device *netdev,
103                                       struct net *fallback_net)
104 {
105         if (!netdev->rtnl_link_ops)
106                 return fallback_net;
107
108         if (!netdev->rtnl_link_ops->get_link_net)
109                 return fallback_net;
110
111         return netdev->rtnl_link_ops->get_link_net(netdev);
112 }
113
114 /**
115  * batadv_mutual_parents() - check if two devices are each others parent
116  * @dev1: 1st net dev
117  * @net1: 1st devices netns
118  * @dev2: 2nd net dev
119  * @net2: 2nd devices netns
120  *
121  * veth devices come in pairs and each is the parent of the other!
122  *
123  * Return: true if the devices are each others parent, otherwise false
124  */
125 static bool batadv_mutual_parents(const struct net_device *dev1,
126                                   struct net *net1,
127                                   const struct net_device *dev2,
128                                   struct net *net2)
129 {
130         int dev1_parent_iflink = dev_get_iflink(dev1);
131         int dev2_parent_iflink = dev_get_iflink(dev2);
132         const struct net *dev1_parent_net;
133         const struct net *dev2_parent_net;
134
135         dev1_parent_net = batadv_getlink_net(dev1, net1);
136         dev2_parent_net = batadv_getlink_net(dev2, net2);
137
138         if (!dev1_parent_iflink || !dev2_parent_iflink)
139                 return false;
140
141         return (dev1_parent_iflink == dev2->ifindex) &&
142                (dev2_parent_iflink == dev1->ifindex) &&
143                net_eq(dev1_parent_net, net2) &&
144                net_eq(dev2_parent_net, net1);
145 }
146
147 /**
148  * batadv_is_on_batman_iface() - check if a device is a batman iface descendant
149  * @net_dev: the device to check
150  *
151  * If the user creates any virtual device on top of a batman-adv interface, it
152  * is important to prevent this new interface to be used to create a new mesh
153  * network (this behaviour would lead to a batman-over-batman configuration).
154  * This function recursively checks all the fathers of the device passed as
155  * argument looking for a batman-adv soft interface.
156  *
157  * Return: true if the device is descendant of a batman-adv mesh interface (or
158  * if it is a batman-adv interface itself), false otherwise
159  */
160 static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
161 {
162         struct net *net = dev_net(net_dev);
163         struct net_device *parent_dev;
164         struct net *parent_net;
165         int iflink;
166         bool ret;
167
168         /* check if this is a batman-adv mesh interface */
169         if (batadv_softif_is_valid(net_dev))
170                 return true;
171
172         iflink = dev_get_iflink(net_dev);
173         if (iflink == 0)
174                 return false;
175
176         parent_net = batadv_getlink_net(net_dev, net);
177
178         /* iflink to itself, most likely physical device */
179         if (net == parent_net && iflink == net_dev->ifindex)
180                 return false;
181
182         /* recurse over the parent device */
183         parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
184         /* if we got a NULL parent_dev there is something broken.. */
185         if (!parent_dev) {
186                 pr_err("Cannot find parent device\n");
187                 return false;
188         }
189
190         if (batadv_mutual_parents(net_dev, net, parent_dev, parent_net))
191                 return false;
192
193         ret = batadv_is_on_batman_iface(parent_dev);
194
195         return ret;
196 }
197
198 static bool batadv_is_valid_iface(const struct net_device *net_dev)
199 {
200         if (net_dev->flags & IFF_LOOPBACK)
201                 return false;
202
203         if (net_dev->type != ARPHRD_ETHER)
204                 return false;
205
206         if (net_dev->addr_len != ETH_ALEN)
207                 return false;
208
209         /* no batman over batman */
210         if (batadv_is_on_batman_iface(net_dev))
211                 return false;
212
213         return true;
214 }
215
216 /**
217  * batadv_get_real_netdevice() - check if the given netdev struct is a virtual
218  *  interface on top of another 'real' interface
219  * @netdev: the device to check
220  *
221  * Callers must hold the rtnl semaphore. You may want batadv_get_real_netdev()
222  * instead of this.
223  *
224  * Return: the 'real' net device or the original net device and NULL in case
225  *  of an error.
226  */
227 static struct net_device *batadv_get_real_netdevice(struct net_device *netdev)
228 {
229         struct batadv_hard_iface *hard_iface = NULL;
230         struct net_device *real_netdev = NULL;
231         struct net *real_net;
232         struct net *net;
233         int iflink;
234
235         ASSERT_RTNL();
236
237         if (!netdev)
238                 return NULL;
239
240         iflink = dev_get_iflink(netdev);
241         if (iflink == 0) {
242                 dev_hold(netdev);
243                 return netdev;
244         }
245
246         hard_iface = batadv_hardif_get_by_netdev(netdev);
247         if (!hard_iface || !hard_iface->soft_iface)
248                 goto out;
249
250         net = dev_net(hard_iface->soft_iface);
251         real_net = batadv_getlink_net(netdev, net);
252
253         /* iflink to itself, most likely physical device */
254         if (net == real_net && netdev->ifindex == iflink) {
255                 real_netdev = netdev;
256                 dev_hold(real_netdev);
257                 goto out;
258         }
259
260         real_netdev = dev_get_by_index(real_net, iflink);
261
262 out:
263         if (hard_iface)
264                 batadv_hardif_put(hard_iface);
265         return real_netdev;
266 }
267
268 /**
269  * batadv_get_real_netdev() - check if the given net_device struct is a virtual
270  *  interface on top of another 'real' interface
271  * @net_device: the device to check
272  *
273  * Return: the 'real' net device or the original net device and NULL in case
274  *  of an error.
275  */
276 struct net_device *batadv_get_real_netdev(struct net_device *net_device)
277 {
278         struct net_device *real_netdev;
279
280         rtnl_lock();
281         real_netdev = batadv_get_real_netdevice(net_device);
282         rtnl_unlock();
283
284         return real_netdev;
285 }
286
287 /**
288  * batadv_is_wext_netdev() - check if the given net_device struct is a
289  *  wext wifi interface
290  * @net_device: the device to check
291  *
292  * Return: true if the net device is a wext wireless device, false
293  *  otherwise.
294  */
295 static bool batadv_is_wext_netdev(struct net_device *net_device)
296 {
297         if (!net_device)
298                 return false;
299
300 #ifdef CONFIG_WIRELESS_EXT
301         /* pre-cfg80211 drivers have to implement WEXT, so it is possible to
302          * check for wireless_handlers != NULL
303          */
304         if (net_device->wireless_handlers)
305                 return true;
306 #endif
307
308         return false;
309 }
310
311 /**
312  * batadv_is_cfg80211_netdev() - check if the given net_device struct is a
313  *  cfg80211 wifi interface
314  * @net_device: the device to check
315  *
316  * Return: true if the net device is a cfg80211 wireless device, false
317  *  otherwise.
318  */
319 static bool batadv_is_cfg80211_netdev(struct net_device *net_device)
320 {
321         if (!net_device)
322                 return false;
323
324         /* cfg80211 drivers have to set ieee80211_ptr */
325         if (net_device->ieee80211_ptr)
326                 return true;
327
328         return false;
329 }
330
331 /**
332  * batadv_wifi_flags_evaluate() - calculate wifi flags for net_device
333  * @net_device: the device to check
334  *
335  * Return: batadv_hard_iface_wifi_flags flags of the device
336  */
337 static u32 batadv_wifi_flags_evaluate(struct net_device *net_device)
338 {
339         u32 wifi_flags = 0;
340         struct net_device *real_netdev;
341
342         if (batadv_is_wext_netdev(net_device))
343                 wifi_flags |= BATADV_HARDIF_WIFI_WEXT_DIRECT;
344
345         if (batadv_is_cfg80211_netdev(net_device))
346                 wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_DIRECT;
347
348         real_netdev = batadv_get_real_netdevice(net_device);
349         if (!real_netdev)
350                 return wifi_flags;
351
352         if (real_netdev == net_device)
353                 goto out;
354
355         if (batadv_is_wext_netdev(real_netdev))
356                 wifi_flags |= BATADV_HARDIF_WIFI_WEXT_INDIRECT;
357
358         if (batadv_is_cfg80211_netdev(real_netdev))
359                 wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_INDIRECT;
360
361 out:
362         dev_put(real_netdev);
363         return wifi_flags;
364 }
365
366 /**
367  * batadv_is_cfg80211_hardif() - check if the given hardif is a cfg80211 wifi
368  *  interface
369  * @hard_iface: the device to check
370  *
371  * Return: true if the net device is a cfg80211 wireless device, false
372  *  otherwise.
373  */
374 bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface)
375 {
376         u32 allowed_flags = 0;
377
378         allowed_flags |= BATADV_HARDIF_WIFI_CFG80211_DIRECT;
379         allowed_flags |= BATADV_HARDIF_WIFI_CFG80211_INDIRECT;
380
381         return !!(hard_iface->wifi_flags & allowed_flags);
382 }
383
384 /**
385  * batadv_is_wifi_hardif() - check if the given hardif is a wifi interface
386  * @hard_iface: the device to check
387  *
388  * Return: true if the net device is a 802.11 wireless device, false otherwise.
389  */
390 bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface)
391 {
392         if (!hard_iface)
393                 return false;
394
395         return hard_iface->wifi_flags != 0;
396 }
397
398 /**
399  * batadv_hardif_no_broadcast() - check whether (re)broadcast is necessary
400  * @if_outgoing: the outgoing interface checked and considered for (re)broadcast
401  * @orig_addr: the originator of this packet
402  * @orig_neigh: originator address of the forwarder we just got the packet from
403  *  (NULL if we originated)
404  *
405  * Checks whether a packet needs to be (re)broadcasted on the given interface.
406  *
407  * Return:
408  *      BATADV_HARDIF_BCAST_NORECIPIENT: No neighbor on interface
409  *      BATADV_HARDIF_BCAST_DUPFWD: Just one neighbor, but it is the forwarder
410  *      BATADV_HARDIF_BCAST_DUPORIG: Just one neighbor, but it is the originator
411  *      BATADV_HARDIF_BCAST_OK: Several neighbors, must broadcast
412  */
413 int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
414                                u8 *orig_addr, u8 *orig_neigh)
415 {
416         struct batadv_hardif_neigh_node *hardif_neigh;
417         struct hlist_node *first;
418         int ret = BATADV_HARDIF_BCAST_OK;
419
420         rcu_read_lock();
421
422         /* 0 neighbors -> no (re)broadcast */
423         first = rcu_dereference(hlist_first_rcu(&if_outgoing->neigh_list));
424         if (!first) {
425                 ret = BATADV_HARDIF_BCAST_NORECIPIENT;
426                 goto out;
427         }
428
429         /* >1 neighbors -> (re)brodcast */
430         if (rcu_dereference(hlist_next_rcu(first)))
431                 goto out;
432
433         hardif_neigh = hlist_entry(first, struct batadv_hardif_neigh_node,
434                                    list);
435
436         /* 1 neighbor, is the originator -> no rebroadcast */
437         if (orig_addr && batadv_compare_eth(hardif_neigh->orig, orig_addr)) {
438                 ret = BATADV_HARDIF_BCAST_DUPORIG;
439         /* 1 neighbor, is the one we received from -> no rebroadcast */
440         } else if (orig_neigh &&
441                    batadv_compare_eth(hardif_neigh->orig, orig_neigh)) {
442                 ret = BATADV_HARDIF_BCAST_DUPFWD;
443         }
444
445 out:
446         rcu_read_unlock();
447         return ret;
448 }
449
450 static struct batadv_hard_iface *
451 batadv_hardif_get_active(const struct net_device *soft_iface)
452 {
453         struct batadv_hard_iface *hard_iface;
454
455         rcu_read_lock();
456         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
457                 if (hard_iface->soft_iface != soft_iface)
458                         continue;
459
460                 if (hard_iface->if_status == BATADV_IF_ACTIVE &&
461                     kref_get_unless_zero(&hard_iface->refcount))
462                         goto out;
463         }
464
465         hard_iface = NULL;
466
467 out:
468         rcu_read_unlock();
469         return hard_iface;
470 }
471
472 static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv,
473                                           struct batadv_hard_iface *oldif)
474 {
475         struct batadv_hard_iface *primary_if;
476
477         primary_if = batadv_primary_if_get_selected(bat_priv);
478         if (!primary_if)
479                 goto out;
480
481         batadv_dat_init_own_addr(bat_priv, primary_if);
482         batadv_bla_update_orig_address(bat_priv, primary_if, oldif);
483 out:
484         if (primary_if)
485                 batadv_hardif_put(primary_if);
486 }
487
488 static void batadv_primary_if_select(struct batadv_priv *bat_priv,
489                                      struct batadv_hard_iface *new_hard_iface)
490 {
491         struct batadv_hard_iface *curr_hard_iface;
492
493         ASSERT_RTNL();
494
495         if (new_hard_iface)
496                 kref_get(&new_hard_iface->refcount);
497
498         curr_hard_iface = rcu_dereference_protected(bat_priv->primary_if, 1);
499         rcu_assign_pointer(bat_priv->primary_if, new_hard_iface);
500
501         if (!new_hard_iface)
502                 goto out;
503
504         bat_priv->algo_ops->iface.primary_set(new_hard_iface);
505         batadv_primary_if_update_addr(bat_priv, curr_hard_iface);
506
507 out:
508         if (curr_hard_iface)
509                 batadv_hardif_put(curr_hard_iface);
510 }
511
512 static bool
513 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface)
514 {
515         if (hard_iface->net_dev->flags & IFF_UP)
516                 return true;
517
518         return false;
519 }
520
521 static void batadv_check_known_mac_addr(const struct net_device *net_dev)
522 {
523         const struct batadv_hard_iface *hard_iface;
524
525         rcu_read_lock();
526         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
527                 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
528                     hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
529                         continue;
530
531                 if (hard_iface->net_dev == net_dev)
532                         continue;
533
534                 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr,
535                                         net_dev->dev_addr))
536                         continue;
537
538                 pr_warn("The newly added mac address (%pM) already exists on: %s\n",
539                         net_dev->dev_addr, hard_iface->net_dev->name);
540                 pr_warn("It is strongly recommended to keep mac addresses unique to avoid problems!\n");
541         }
542         rcu_read_unlock();
543 }
544
545 /**
546  * batadv_hardif_recalc_extra_skbroom() - Recalculate skbuff extra head/tailroom
547  * @soft_iface: netdev struct of the mesh interface
548  */
549 static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface)
550 {
551         const struct batadv_hard_iface *hard_iface;
552         unsigned short lower_header_len = ETH_HLEN;
553         unsigned short lower_headroom = 0;
554         unsigned short lower_tailroom = 0;
555         unsigned short needed_headroom;
556
557         rcu_read_lock();
558         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
559                 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
560                         continue;
561
562                 if (hard_iface->soft_iface != soft_iface)
563                         continue;
564
565                 lower_header_len = max_t(unsigned short, lower_header_len,
566                                          hard_iface->net_dev->hard_header_len);
567
568                 lower_headroom = max_t(unsigned short, lower_headroom,
569                                        hard_iface->net_dev->needed_headroom);
570
571                 lower_tailroom = max_t(unsigned short, lower_tailroom,
572                                        hard_iface->net_dev->needed_tailroom);
573         }
574         rcu_read_unlock();
575
576         needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
577         needed_headroom += batadv_max_header_len();
578
579         /* fragmentation headers don't strip the unicast/... header */
580         needed_headroom += sizeof(struct batadv_frag_packet);
581
582         soft_iface->needed_headroom = needed_headroom;
583         soft_iface->needed_tailroom = lower_tailroom;
584 }
585
586 /**
587  * batadv_hardif_min_mtu() - Calculate maximum MTU for soft interface
588  * @soft_iface: netdev struct of the soft interface
589  *
590  * Return: MTU for the soft-interface (limited by the minimal MTU of all active
591  *  slave interfaces)
592  */
593 int batadv_hardif_min_mtu(struct net_device *soft_iface)
594 {
595         struct batadv_priv *bat_priv = netdev_priv(soft_iface);
596         const struct batadv_hard_iface *hard_iface;
597         int min_mtu = INT_MAX;
598
599         rcu_read_lock();
600         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
601                 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
602                     hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
603                         continue;
604
605                 if (hard_iface->soft_iface != soft_iface)
606                         continue;
607
608                 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu);
609         }
610         rcu_read_unlock();
611
612         if (atomic_read(&bat_priv->fragmentation) == 0)
613                 goto out;
614
615         /* with fragmentation enabled the maximum size of internally generated
616          * packets such as translation table exchanges or tvlv containers, etc
617          * has to be calculated
618          */
619         min_mtu = min_t(int, min_mtu, BATADV_FRAG_MAX_FRAG_SIZE);
620         min_mtu -= sizeof(struct batadv_frag_packet);
621         min_mtu *= BATADV_FRAG_MAX_FRAGMENTS;
622
623 out:
624         /* report to the other components the maximum amount of bytes that
625          * batman-adv can send over the wire (without considering the payload
626          * overhead). For example, this value is used by TT to compute the
627          * maximum local table table size
628          */
629         atomic_set(&bat_priv->packet_size_max, min_mtu);
630
631         /* the real soft-interface MTU is computed by removing the payload
632          * overhead from the maximum amount of bytes that was just computed.
633          *
634          * However batman-adv does not support MTUs bigger than ETH_DATA_LEN
635          */
636         return min_t(int, min_mtu - batadv_max_header_len(), ETH_DATA_LEN);
637 }
638
639 /**
640  * batadv_update_min_mtu() - Adjusts the MTU if a new interface with a smaller
641  *  MTU appeared
642  * @soft_iface: netdev struct of the soft interface
643  */
644 void batadv_update_min_mtu(struct net_device *soft_iface)
645 {
646         soft_iface->mtu = batadv_hardif_min_mtu(soft_iface);
647
648         /* Check if the local translate table should be cleaned up to match a
649          * new (and smaller) MTU.
650          */
651         batadv_tt_local_resize_to_mtu(soft_iface);
652 }
653
654 static void
655 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface)
656 {
657         struct batadv_priv *bat_priv;
658         struct batadv_hard_iface *primary_if = NULL;
659
660         if (hard_iface->if_status != BATADV_IF_INACTIVE)
661                 goto out;
662
663         bat_priv = netdev_priv(hard_iface->soft_iface);
664
665         bat_priv->algo_ops->iface.update_mac(hard_iface);
666         hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED;
667
668         /* the first active interface becomes our primary interface or
669          * the next active interface after the old primary interface was removed
670          */
671         primary_if = batadv_primary_if_get_selected(bat_priv);
672         if (!primary_if)
673                 batadv_primary_if_select(bat_priv, hard_iface);
674
675         batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
676                     hard_iface->net_dev->name);
677
678         batadv_update_min_mtu(hard_iface->soft_iface);
679
680         if (bat_priv->algo_ops->iface.activate)
681                 bat_priv->algo_ops->iface.activate(hard_iface);
682
683 out:
684         if (primary_if)
685                 batadv_hardif_put(primary_if);
686 }
687
688 static void
689 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface)
690 {
691         if (hard_iface->if_status != BATADV_IF_ACTIVE &&
692             hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
693                 return;
694
695         hard_iface->if_status = BATADV_IF_INACTIVE;
696
697         batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
698                     hard_iface->net_dev->name);
699
700         batadv_update_min_mtu(hard_iface->soft_iface);
701 }
702
703 /**
704  * batadv_master_del_slave() - remove hard_iface from the current master iface
705  * @slave: the interface enslaved in another master
706  * @master: the master from which slave has to be removed
707  *
708  * Invoke ndo_del_slave on master passing slave as argument. In this way slave
709  * is free'd and master can correctly change its internal state.
710  *
711  * Return: 0 on success, a negative value representing the error otherwise
712  */
713 static int batadv_master_del_slave(struct batadv_hard_iface *slave,
714                                    struct net_device *master)
715 {
716         int ret;
717
718         if (!master)
719                 return 0;
720
721         ret = -EBUSY;
722         if (master->netdev_ops->ndo_del_slave)
723                 ret = master->netdev_ops->ndo_del_slave(master, slave->net_dev);
724
725         return ret;
726 }
727
728 /**
729  * batadv_hardif_enable_interface() - Enslave hard interface to soft interface
730  * @hard_iface: hard interface to add to soft interface
731  * @net: the applicable net namespace
732  * @iface_name: name of the soft interface
733  *
734  * Return: 0 on success or negative error number in case of failure
735  */
736 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
737                                    struct net *net, const char *iface_name)
738 {
739         struct batadv_priv *bat_priv;
740         struct net_device *soft_iface, *master;
741         __be16 ethertype = htons(ETH_P_BATMAN);
742         int max_header_len = batadv_max_header_len();
743         int ret;
744
745         if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
746                 goto out;
747
748         kref_get(&hard_iface->refcount);
749
750         soft_iface = dev_get_by_name(net, iface_name);
751
752         if (!soft_iface) {
753                 soft_iface = batadv_softif_create(net, iface_name);
754
755                 if (!soft_iface) {
756                         ret = -ENOMEM;
757                         goto err;
758                 }
759
760                 /* dev_get_by_name() increases the reference counter for us */
761                 dev_hold(soft_iface);
762         }
763
764         if (!batadv_softif_is_valid(soft_iface)) {
765                 pr_err("Can't create batman mesh interface %s: already exists as regular interface\n",
766                        soft_iface->name);
767                 ret = -EINVAL;
768                 goto err_dev;
769         }
770
771         /* check if the interface is enslaved in another virtual one and
772          * in that case unlink it first
773          */
774         master = netdev_master_upper_dev_get(hard_iface->net_dev);
775         ret = batadv_master_del_slave(hard_iface, master);
776         if (ret)
777                 goto err_dev;
778
779         hard_iface->soft_iface = soft_iface;
780         bat_priv = netdev_priv(hard_iface->soft_iface);
781
782         if (bat_priv->num_ifaces >= UINT_MAX) {
783                 ret = -ENOSPC;
784                 goto err_dev;
785         }
786
787         ret = netdev_master_upper_dev_link(hard_iface->net_dev,
788                                            soft_iface, NULL, NULL, NULL);
789         if (ret)
790                 goto err_dev;
791
792         ret = bat_priv->algo_ops->iface.enable(hard_iface);
793         if (ret < 0)
794                 goto err_upper;
795
796         hard_iface->if_num = bat_priv->num_ifaces;
797         bat_priv->num_ifaces++;
798         hard_iface->if_status = BATADV_IF_INACTIVE;
799         ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces);
800         if (ret < 0) {
801                 bat_priv->algo_ops->iface.disable(hard_iface);
802                 bat_priv->num_ifaces--;
803                 hard_iface->if_status = BATADV_IF_NOT_IN_USE;
804                 goto err_upper;
805         }
806
807         kref_get(&hard_iface->refcount);
808         hard_iface->batman_adv_ptype.type = ethertype;
809         hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv;
810         hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
811         dev_add_pack(&hard_iface->batman_adv_ptype);
812
813         batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
814                     hard_iface->net_dev->name);
815
816         if (atomic_read(&bat_priv->fragmentation) &&
817             hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
818                 batadv_info(hard_iface->soft_iface,
819                             "The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to %i would solve the problem.\n",
820                             hard_iface->net_dev->name, hard_iface->net_dev->mtu,
821                             ETH_DATA_LEN + max_header_len);
822
823         if (!atomic_read(&bat_priv->fragmentation) &&
824             hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
825                 batadv_info(hard_iface->soft_iface,
826                             "The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. If you experience problems getting traffic through try increasing the MTU to %i.\n",
827                             hard_iface->net_dev->name, hard_iface->net_dev->mtu,
828                             ETH_DATA_LEN + max_header_len);
829
830         if (batadv_hardif_is_iface_up(hard_iface))
831                 batadv_hardif_activate_interface(hard_iface);
832         else
833                 batadv_err(hard_iface->soft_iface,
834                            "Not using interface %s (retrying later): interface not active\n",
835                            hard_iface->net_dev->name);
836
837         batadv_hardif_recalc_extra_skbroom(soft_iface);
838
839         if (bat_priv->algo_ops->iface.enabled)
840                 bat_priv->algo_ops->iface.enabled(hard_iface);
841
842 out:
843         return 0;
844
845 err_upper:
846         netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface);
847 err_dev:
848         hard_iface->soft_iface = NULL;
849         dev_put(soft_iface);
850 err:
851         batadv_hardif_put(hard_iface);
852         return ret;
853 }
854
855 /**
856  * batadv_hardif_disable_interface() - Remove hard interface from soft interface
857  * @hard_iface: hard interface to be removed
858  * @autodel: whether to delete soft interface when it doesn't contain any other
859  *  slave interfaces
860  */
861 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
862                                      enum batadv_hard_if_cleanup autodel)
863 {
864         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
865         struct batadv_hard_iface *primary_if = NULL;
866
867         batadv_hardif_deactivate_interface(hard_iface);
868
869         if (hard_iface->if_status != BATADV_IF_INACTIVE)
870                 goto out;
871
872         batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
873                     hard_iface->net_dev->name);
874         dev_remove_pack(&hard_iface->batman_adv_ptype);
875         batadv_hardif_put(hard_iface);
876
877         bat_priv->num_ifaces--;
878         batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces);
879
880         primary_if = batadv_primary_if_get_selected(bat_priv);
881         if (hard_iface == primary_if) {
882                 struct batadv_hard_iface *new_if;
883
884                 new_if = batadv_hardif_get_active(hard_iface->soft_iface);
885                 batadv_primary_if_select(bat_priv, new_if);
886
887                 if (new_if)
888                         batadv_hardif_put(new_if);
889         }
890
891         bat_priv->algo_ops->iface.disable(hard_iface);
892         hard_iface->if_status = BATADV_IF_NOT_IN_USE;
893
894         /* delete all references to this hard_iface */
895         batadv_purge_orig_ref(bat_priv);
896         batadv_purge_outstanding_packets(bat_priv, hard_iface);
897         dev_put(hard_iface->soft_iface);
898
899         netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
900         batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
901
902         /* nobody uses this interface anymore */
903         if (bat_priv->num_ifaces == 0) {
904                 batadv_gw_check_client_stop(bat_priv);
905
906                 if (autodel == BATADV_IF_CLEANUP_AUTO)
907                         batadv_softif_destroy_sysfs(hard_iface->soft_iface);
908         }
909
910         hard_iface->soft_iface = NULL;
911         batadv_hardif_put(hard_iface);
912
913 out:
914         if (primary_if)
915                 batadv_hardif_put(primary_if);
916 }
917
918 static struct batadv_hard_iface *
919 batadv_hardif_add_interface(struct net_device *net_dev)
920 {
921         struct batadv_hard_iface *hard_iface;
922         int ret;
923
924         ASSERT_RTNL();
925
926         if (!batadv_is_valid_iface(net_dev))
927                 goto out;
928
929         dev_hold(net_dev);
930
931         hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC);
932         if (!hard_iface)
933                 goto release_dev;
934
935         ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
936         if (ret)
937                 goto free_if;
938
939         hard_iface->if_num = 0;
940         hard_iface->net_dev = net_dev;
941         hard_iface->soft_iface = NULL;
942         hard_iface->if_status = BATADV_IF_NOT_IN_USE;
943
944         ret = batadv_debugfs_add_hardif(hard_iface);
945         if (ret)
946                 goto free_sysfs;
947
948         INIT_LIST_HEAD(&hard_iface->list);
949         INIT_HLIST_HEAD(&hard_iface->neigh_list);
950
951         mutex_init(&hard_iface->bat_iv.ogm_buff_mutex);
952         spin_lock_init(&hard_iface->neigh_list_lock);
953         kref_init(&hard_iface->refcount);
954
955         hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
956         hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
957         if (batadv_is_wifi_hardif(hard_iface))
958                 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
959
960         batadv_v_hardif_init(hard_iface);
961
962         batadv_check_known_mac_addr(hard_iface->net_dev);
963         kref_get(&hard_iface->refcount);
964         list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
965
966         return hard_iface;
967
968 free_sysfs:
969         batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
970 free_if:
971         kfree(hard_iface);
972 release_dev:
973         dev_put(net_dev);
974 out:
975         return NULL;
976 }
977
978 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
979 {
980         ASSERT_RTNL();
981
982         /* first deactivate interface */
983         if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
984                 batadv_hardif_disable_interface(hard_iface,
985                                                 BATADV_IF_CLEANUP_KEEP);
986
987         if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
988                 return;
989
990         hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
991         batadv_debugfs_del_hardif(hard_iface);
992         batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
993         batadv_hardif_put(hard_iface);
994 }
995
996 /**
997  * batadv_hardif_remove_interfaces() - Remove all hard interfaces
998  */
999 void batadv_hardif_remove_interfaces(void)
1000 {
1001         struct batadv_hard_iface *hard_iface, *hard_iface_tmp;
1002
1003         rtnl_lock();
1004         list_for_each_entry_safe(hard_iface, hard_iface_tmp,
1005                                  &batadv_hardif_list, list) {
1006                 list_del_rcu(&hard_iface->list);
1007                 batadv_hardif_remove_interface(hard_iface);
1008         }
1009         rtnl_unlock();
1010 }
1011
1012 /**
1013  * batadv_hard_if_event_softif() - Handle events for soft interfaces
1014  * @event: NETDEV_* event to handle
1015  * @net_dev: net_device which generated an event
1016  *
1017  * Return: NOTIFY_* result
1018  */
1019 static int batadv_hard_if_event_softif(unsigned long event,
1020                                        struct net_device *net_dev)
1021 {
1022         struct batadv_priv *bat_priv;
1023
1024         switch (event) {
1025         case NETDEV_REGISTER:
1026                 batadv_sysfs_add_meshif(net_dev);
1027                 bat_priv = netdev_priv(net_dev);
1028                 batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
1029                 break;
1030         case NETDEV_CHANGENAME:
1031                 batadv_debugfs_rename_meshif(net_dev);
1032                 break;
1033         }
1034
1035         return NOTIFY_DONE;
1036 }
1037
1038 static int batadv_hard_if_event(struct notifier_block *this,
1039                                 unsigned long event, void *ptr)
1040 {
1041         struct net_device *net_dev = netdev_notifier_info_to_dev(ptr);
1042         struct batadv_hard_iface *hard_iface;
1043         struct batadv_hard_iface *primary_if = NULL;
1044         struct batadv_priv *bat_priv;
1045
1046         if (batadv_softif_is_valid(net_dev))
1047                 return batadv_hard_if_event_softif(event, net_dev);
1048
1049         hard_iface = batadv_hardif_get_by_netdev(net_dev);
1050         if (!hard_iface && (event == NETDEV_REGISTER ||
1051                             event == NETDEV_POST_TYPE_CHANGE))
1052                 hard_iface = batadv_hardif_add_interface(net_dev);
1053
1054         if (!hard_iface)
1055                 goto out;
1056
1057         switch (event) {
1058         case NETDEV_UP:
1059                 batadv_hardif_activate_interface(hard_iface);
1060                 break;
1061         case NETDEV_GOING_DOWN:
1062         case NETDEV_DOWN:
1063                 batadv_hardif_deactivate_interface(hard_iface);
1064                 break;
1065         case NETDEV_UNREGISTER:
1066         case NETDEV_PRE_TYPE_CHANGE:
1067                 list_del_rcu(&hard_iface->list);
1068
1069                 batadv_hardif_remove_interface(hard_iface);
1070                 break;
1071         case NETDEV_CHANGEMTU:
1072                 if (hard_iface->soft_iface)
1073                         batadv_update_min_mtu(hard_iface->soft_iface);
1074                 break;
1075         case NETDEV_CHANGEADDR:
1076                 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
1077                         goto hardif_put;
1078
1079                 batadv_check_known_mac_addr(hard_iface->net_dev);
1080
1081                 bat_priv = netdev_priv(hard_iface->soft_iface);
1082                 bat_priv->algo_ops->iface.update_mac(hard_iface);
1083
1084                 primary_if = batadv_primary_if_get_selected(bat_priv);
1085                 if (!primary_if)
1086                         goto hardif_put;
1087
1088                 if (hard_iface == primary_if)
1089                         batadv_primary_if_update_addr(bat_priv, NULL);
1090                 break;
1091         case NETDEV_CHANGEUPPER:
1092                 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
1093                 if (batadv_is_wifi_hardif(hard_iface))
1094                         hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
1095                 break;
1096         case NETDEV_CHANGENAME:
1097                 batadv_debugfs_rename_hardif(hard_iface);
1098                 break;
1099         default:
1100                 break;
1101         }
1102
1103 hardif_put:
1104         batadv_hardif_put(hard_iface);
1105 out:
1106         if (primary_if)
1107                 batadv_hardif_put(primary_if);
1108         return NOTIFY_DONE;
1109 }
1110
1111 struct notifier_block batadv_hard_if_notifier = {
1112         .notifier_call = batadv_hard_if_event,
1113 };