GNU Linux-libre 4.19.304-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         struct batadv_priv *bat_priv = netdev_priv(soft_iface);
647         int limit_mtu;
648         int mtu;
649
650         mtu = batadv_hardif_min_mtu(soft_iface);
651
652         if (bat_priv->mtu_set_by_user)
653                 limit_mtu = bat_priv->mtu_set_by_user;
654         else
655                 limit_mtu = ETH_DATA_LEN;
656
657         mtu = min(mtu, limit_mtu);
658         dev_set_mtu(soft_iface, mtu);
659
660         /* Check if the local translate table should be cleaned up to match a
661          * new (and smaller) MTU.
662          */
663         batadv_tt_local_resize_to_mtu(soft_iface);
664 }
665
666 static void
667 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface)
668 {
669         struct batadv_priv *bat_priv;
670         struct batadv_hard_iface *primary_if = NULL;
671
672         if (hard_iface->if_status != BATADV_IF_INACTIVE)
673                 goto out;
674
675         bat_priv = netdev_priv(hard_iface->soft_iface);
676
677         bat_priv->algo_ops->iface.update_mac(hard_iface);
678         hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED;
679
680         /* the first active interface becomes our primary interface or
681          * the next active interface after the old primary interface was removed
682          */
683         primary_if = batadv_primary_if_get_selected(bat_priv);
684         if (!primary_if)
685                 batadv_primary_if_select(bat_priv, hard_iface);
686
687         batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
688                     hard_iface->net_dev->name);
689
690         batadv_update_min_mtu(hard_iface->soft_iface);
691
692         if (bat_priv->algo_ops->iface.activate)
693                 bat_priv->algo_ops->iface.activate(hard_iface);
694
695 out:
696         if (primary_if)
697                 batadv_hardif_put(primary_if);
698 }
699
700 static void
701 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface)
702 {
703         if (hard_iface->if_status != BATADV_IF_ACTIVE &&
704             hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
705                 return;
706
707         hard_iface->if_status = BATADV_IF_INACTIVE;
708
709         batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
710                     hard_iface->net_dev->name);
711
712         batadv_update_min_mtu(hard_iface->soft_iface);
713 }
714
715 /**
716  * batadv_master_del_slave() - remove hard_iface from the current master iface
717  * @slave: the interface enslaved in another master
718  * @master: the master from which slave has to be removed
719  *
720  * Invoke ndo_del_slave on master passing slave as argument. In this way slave
721  * is free'd and master can correctly change its internal state.
722  *
723  * Return: 0 on success, a negative value representing the error otherwise
724  */
725 static int batadv_master_del_slave(struct batadv_hard_iface *slave,
726                                    struct net_device *master)
727 {
728         int ret;
729
730         if (!master)
731                 return 0;
732
733         ret = -EBUSY;
734         if (master->netdev_ops->ndo_del_slave)
735                 ret = master->netdev_ops->ndo_del_slave(master, slave->net_dev);
736
737         return ret;
738 }
739
740 /**
741  * batadv_hardif_enable_interface() - Enslave hard interface to soft interface
742  * @hard_iface: hard interface to add to soft interface
743  * @net: the applicable net namespace
744  * @iface_name: name of the soft interface
745  *
746  * Return: 0 on success or negative error number in case of failure
747  */
748 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
749                                    struct net *net, const char *iface_name)
750 {
751         struct batadv_priv *bat_priv;
752         struct net_device *soft_iface, *master;
753         __be16 ethertype = htons(ETH_P_BATMAN);
754         int max_header_len = batadv_max_header_len();
755         int ret;
756
757         if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
758                 goto out;
759
760         kref_get(&hard_iface->refcount);
761
762         soft_iface = dev_get_by_name(net, iface_name);
763
764         if (!soft_iface) {
765                 soft_iface = batadv_softif_create(net, iface_name);
766
767                 if (!soft_iface) {
768                         ret = -ENOMEM;
769                         goto err;
770                 }
771
772                 /* dev_get_by_name() increases the reference counter for us */
773                 dev_hold(soft_iface);
774         }
775
776         if (!batadv_softif_is_valid(soft_iface)) {
777                 pr_err("Can't create batman mesh interface %s: already exists as regular interface\n",
778                        soft_iface->name);
779                 ret = -EINVAL;
780                 goto err_dev;
781         }
782
783         /* check if the interface is enslaved in another virtual one and
784          * in that case unlink it first
785          */
786         master = netdev_master_upper_dev_get(hard_iface->net_dev);
787         ret = batadv_master_del_slave(hard_iface, master);
788         if (ret)
789                 goto err_dev;
790
791         hard_iface->soft_iface = soft_iface;
792         bat_priv = netdev_priv(hard_iface->soft_iface);
793
794         if (bat_priv->num_ifaces >= UINT_MAX) {
795                 ret = -ENOSPC;
796                 goto err_dev;
797         }
798
799         ret = netdev_master_upper_dev_link(hard_iface->net_dev,
800                                            soft_iface, NULL, NULL, NULL);
801         if (ret)
802                 goto err_dev;
803
804         ret = bat_priv->algo_ops->iface.enable(hard_iface);
805         if (ret < 0)
806                 goto err_upper;
807
808         hard_iface->if_num = bat_priv->num_ifaces;
809         bat_priv->num_ifaces++;
810         hard_iface->if_status = BATADV_IF_INACTIVE;
811         ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces);
812         if (ret < 0) {
813                 bat_priv->algo_ops->iface.disable(hard_iface);
814                 bat_priv->num_ifaces--;
815                 hard_iface->if_status = BATADV_IF_NOT_IN_USE;
816                 goto err_upper;
817         }
818
819         kref_get(&hard_iface->refcount);
820         hard_iface->batman_adv_ptype.type = ethertype;
821         hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv;
822         hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
823         dev_add_pack(&hard_iface->batman_adv_ptype);
824
825         batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
826                     hard_iface->net_dev->name);
827
828         if (atomic_read(&bat_priv->fragmentation) &&
829             hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
830                 batadv_info(hard_iface->soft_iface,
831                             "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",
832                             hard_iface->net_dev->name, hard_iface->net_dev->mtu,
833                             ETH_DATA_LEN + max_header_len);
834
835         if (!atomic_read(&bat_priv->fragmentation) &&
836             hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
837                 batadv_info(hard_iface->soft_iface,
838                             "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",
839                             hard_iface->net_dev->name, hard_iface->net_dev->mtu,
840                             ETH_DATA_LEN + max_header_len);
841
842         if (batadv_hardif_is_iface_up(hard_iface))
843                 batadv_hardif_activate_interface(hard_iface);
844         else
845                 batadv_err(hard_iface->soft_iface,
846                            "Not using interface %s (retrying later): interface not active\n",
847                            hard_iface->net_dev->name);
848
849         batadv_hardif_recalc_extra_skbroom(soft_iface);
850
851         if (bat_priv->algo_ops->iface.enabled)
852                 bat_priv->algo_ops->iface.enabled(hard_iface);
853
854 out:
855         return 0;
856
857 err_upper:
858         netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface);
859 err_dev:
860         hard_iface->soft_iface = NULL;
861         dev_put(soft_iface);
862 err:
863         batadv_hardif_put(hard_iface);
864         return ret;
865 }
866
867 /**
868  * batadv_hardif_disable_interface() - Remove hard interface from soft interface
869  * @hard_iface: hard interface to be removed
870  * @autodel: whether to delete soft interface when it doesn't contain any other
871  *  slave interfaces
872  */
873 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
874                                      enum batadv_hard_if_cleanup autodel)
875 {
876         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
877         struct batadv_hard_iface *primary_if = NULL;
878
879         batadv_hardif_deactivate_interface(hard_iface);
880
881         if (hard_iface->if_status != BATADV_IF_INACTIVE)
882                 goto out;
883
884         batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
885                     hard_iface->net_dev->name);
886         dev_remove_pack(&hard_iface->batman_adv_ptype);
887         batadv_hardif_put(hard_iface);
888
889         bat_priv->num_ifaces--;
890         batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces);
891
892         primary_if = batadv_primary_if_get_selected(bat_priv);
893         if (hard_iface == primary_if) {
894                 struct batadv_hard_iface *new_if;
895
896                 new_if = batadv_hardif_get_active(hard_iface->soft_iface);
897                 batadv_primary_if_select(bat_priv, new_if);
898
899                 if (new_if)
900                         batadv_hardif_put(new_if);
901         }
902
903         bat_priv->algo_ops->iface.disable(hard_iface);
904         hard_iface->if_status = BATADV_IF_NOT_IN_USE;
905
906         /* delete all references to this hard_iface */
907         batadv_purge_orig_ref(bat_priv);
908         batadv_purge_outstanding_packets(bat_priv, hard_iface);
909         dev_put(hard_iface->soft_iface);
910
911         netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
912         batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
913
914         /* nobody uses this interface anymore */
915         if (bat_priv->num_ifaces == 0) {
916                 batadv_gw_check_client_stop(bat_priv);
917
918                 if (autodel == BATADV_IF_CLEANUP_AUTO)
919                         batadv_softif_destroy_sysfs(hard_iface->soft_iface);
920         }
921
922         hard_iface->soft_iface = NULL;
923         batadv_hardif_put(hard_iface);
924
925 out:
926         if (primary_if)
927                 batadv_hardif_put(primary_if);
928 }
929
930 static struct batadv_hard_iface *
931 batadv_hardif_add_interface(struct net_device *net_dev)
932 {
933         struct batadv_hard_iface *hard_iface;
934         int ret;
935
936         ASSERT_RTNL();
937
938         if (!batadv_is_valid_iface(net_dev))
939                 goto out;
940
941         dev_hold(net_dev);
942
943         hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC);
944         if (!hard_iface)
945                 goto release_dev;
946
947         ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
948         if (ret)
949                 goto free_if;
950
951         hard_iface->if_num = 0;
952         hard_iface->net_dev = net_dev;
953         hard_iface->soft_iface = NULL;
954         hard_iface->if_status = BATADV_IF_NOT_IN_USE;
955
956         ret = batadv_debugfs_add_hardif(hard_iface);
957         if (ret)
958                 goto free_sysfs;
959
960         INIT_LIST_HEAD(&hard_iface->list);
961         INIT_HLIST_HEAD(&hard_iface->neigh_list);
962
963         mutex_init(&hard_iface->bat_iv.ogm_buff_mutex);
964         spin_lock_init(&hard_iface->neigh_list_lock);
965         kref_init(&hard_iface->refcount);
966
967         hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
968         hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
969         if (batadv_is_wifi_hardif(hard_iface))
970                 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
971
972         batadv_v_hardif_init(hard_iface);
973
974         batadv_check_known_mac_addr(hard_iface->net_dev);
975         kref_get(&hard_iface->refcount);
976         list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
977
978         return hard_iface;
979
980 free_sysfs:
981         batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
982 free_if:
983         kfree(hard_iface);
984 release_dev:
985         dev_put(net_dev);
986 out:
987         return NULL;
988 }
989
990 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
991 {
992         ASSERT_RTNL();
993
994         /* first deactivate interface */
995         if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
996                 batadv_hardif_disable_interface(hard_iface,
997                                                 BATADV_IF_CLEANUP_KEEP);
998
999         if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
1000                 return;
1001
1002         hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
1003         batadv_debugfs_del_hardif(hard_iface);
1004         batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
1005         batadv_hardif_put(hard_iface);
1006 }
1007
1008 /**
1009  * batadv_hardif_remove_interfaces() - Remove all hard interfaces
1010  */
1011 void batadv_hardif_remove_interfaces(void)
1012 {
1013         struct batadv_hard_iface *hard_iface, *hard_iface_tmp;
1014
1015         rtnl_lock();
1016         list_for_each_entry_safe(hard_iface, hard_iface_tmp,
1017                                  &batadv_hardif_list, list) {
1018                 list_del_rcu(&hard_iface->list);
1019                 batadv_hardif_remove_interface(hard_iface);
1020         }
1021         rtnl_unlock();
1022 }
1023
1024 /**
1025  * batadv_hard_if_event_softif() - Handle events for soft interfaces
1026  * @event: NETDEV_* event to handle
1027  * @net_dev: net_device which generated an event
1028  *
1029  * Return: NOTIFY_* result
1030  */
1031 static int batadv_hard_if_event_softif(unsigned long event,
1032                                        struct net_device *net_dev)
1033 {
1034         struct batadv_priv *bat_priv;
1035
1036         switch (event) {
1037         case NETDEV_REGISTER:
1038                 batadv_sysfs_add_meshif(net_dev);
1039                 bat_priv = netdev_priv(net_dev);
1040                 batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
1041                 break;
1042         case NETDEV_CHANGENAME:
1043                 batadv_debugfs_rename_meshif(net_dev);
1044                 break;
1045         }
1046
1047         return NOTIFY_DONE;
1048 }
1049
1050 static int batadv_hard_if_event(struct notifier_block *this,
1051                                 unsigned long event, void *ptr)
1052 {
1053         struct net_device *net_dev = netdev_notifier_info_to_dev(ptr);
1054         struct batadv_hard_iface *hard_iface;
1055         struct batadv_hard_iface *primary_if = NULL;
1056         struct batadv_priv *bat_priv;
1057
1058         if (batadv_softif_is_valid(net_dev))
1059                 return batadv_hard_if_event_softif(event, net_dev);
1060
1061         hard_iface = batadv_hardif_get_by_netdev(net_dev);
1062         if (!hard_iface && (event == NETDEV_REGISTER ||
1063                             event == NETDEV_POST_TYPE_CHANGE))
1064                 hard_iface = batadv_hardif_add_interface(net_dev);
1065
1066         if (!hard_iface)
1067                 goto out;
1068
1069         switch (event) {
1070         case NETDEV_UP:
1071                 batadv_hardif_activate_interface(hard_iface);
1072                 break;
1073         case NETDEV_GOING_DOWN:
1074         case NETDEV_DOWN:
1075                 batadv_hardif_deactivate_interface(hard_iface);
1076                 break;
1077         case NETDEV_UNREGISTER:
1078         case NETDEV_PRE_TYPE_CHANGE:
1079                 list_del_rcu(&hard_iface->list);
1080
1081                 batadv_hardif_remove_interface(hard_iface);
1082                 break;
1083         case NETDEV_CHANGEMTU:
1084                 if (hard_iface->soft_iface)
1085                         batadv_update_min_mtu(hard_iface->soft_iface);
1086                 break;
1087         case NETDEV_CHANGEADDR:
1088                 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
1089                         goto hardif_put;
1090
1091                 batadv_check_known_mac_addr(hard_iface->net_dev);
1092
1093                 bat_priv = netdev_priv(hard_iface->soft_iface);
1094                 bat_priv->algo_ops->iface.update_mac(hard_iface);
1095
1096                 primary_if = batadv_primary_if_get_selected(bat_priv);
1097                 if (!primary_if)
1098                         goto hardif_put;
1099
1100                 if (hard_iface == primary_if)
1101                         batadv_primary_if_update_addr(bat_priv, NULL);
1102                 break;
1103         case NETDEV_CHANGEUPPER:
1104                 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
1105                 if (batadv_is_wifi_hardif(hard_iface))
1106                         hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
1107                 break;
1108         case NETDEV_CHANGENAME:
1109                 batadv_debugfs_rename_hardif(hard_iface);
1110                 break;
1111         default:
1112                 break;
1113         }
1114
1115 hardif_put:
1116         batadv_hardif_put(hard_iface);
1117 out:
1118         if (primary_if)
1119                 batadv_hardif_put(primary_if);
1120         return NOTIFY_DONE;
1121 }
1122
1123 struct notifier_block batadv_hard_if_notifier = {
1124         .notifier_call = batadv_hard_if_event,
1125 };