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