linux/net/bridge/br_if.c
<<
>>
Prefs
   1/*
   2 *      Userspace interface
   3 *      Linux ethernet bridge
   4 *
   5 *      Authors:
   6 *      Lennert Buytenhek               <buytenh@gnu.org>
   7 *
   8 *      This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License
  10 *      as published by the Free Software Foundation; either version
  11 *      2 of the License, or (at your option) any later version.
  12 */
  13
  14#include <linux/kernel.h>
  15#include <linux/netdevice.h>
  16#include <linux/netpoll.h>
  17#include <linux/ethtool.h>
  18#include <linux/if_arp.h>
  19#include <linux/module.h>
  20#include <linux/init.h>
  21#include <linux/rtnetlink.h>
  22#include <linux/if_ether.h>
  23#include <linux/slab.h>
  24#include <net/sock.h>
  25
  26#include "br_private.h"
  27
  28/*
  29 * Determine initial path cost based on speed.
  30 * using recommendations from 802.1d standard
  31 *
  32 * Since driver might sleep need to not be holding any locks.
  33 */
  34static int port_cost(struct net_device *dev)
  35{
  36        if (dev->ethtool_ops && dev->ethtool_ops->get_settings) {
  37                struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET, };
  38
  39                if (!dev_ethtool_get_settings(dev, &ecmd)) {
  40                        switch (ethtool_cmd_speed(&ecmd)) {
  41                        case SPEED_10000:
  42                                return 2;
  43                        case SPEED_1000:
  44                                return 4;
  45                        case SPEED_100:
  46                                return 19;
  47                        case SPEED_10:
  48                                return 100;
  49                        }
  50                }
  51        }
  52
  53        /* Old silly heuristics based on name */
  54        if (!strncmp(dev->name, "lec", 3))
  55                return 7;
  56
  57        if (!strncmp(dev->name, "plip", 4))
  58                return 2500;
  59
  60        return 100;     /* assume old 10Mbps */
  61}
  62
  63
  64/* Check for port carrier transistions. */
  65void br_port_carrier_check(struct net_bridge_port *p)
  66{
  67        struct net_device *dev = p->dev;
  68        struct net_bridge *br = p->br;
  69
  70        if (netif_running(dev) && netif_carrier_ok(dev))
  71                p->path_cost = port_cost(dev);
  72
  73        if (!netif_running(br->dev))
  74                return;
  75
  76        spin_lock_bh(&br->lock);
  77        if (netif_running(dev) && netif_carrier_ok(dev)) {
  78                if (p->state == BR_STATE_DISABLED)
  79                        br_stp_enable_port(p);
  80        } else {
  81                if (p->state != BR_STATE_DISABLED)
  82                        br_stp_disable_port(p);
  83        }
  84        spin_unlock_bh(&br->lock);
  85}
  86
  87static void release_nbp(struct kobject *kobj)
  88{
  89        struct net_bridge_port *p
  90                = container_of(kobj, struct net_bridge_port, kobj);
  91        kfree(p);
  92}
  93
  94static struct kobj_type brport_ktype = {
  95#ifdef CONFIG_SYSFS
  96        .sysfs_ops = &brport_sysfs_ops,
  97#endif
  98        .release = release_nbp,
  99};
 100
 101static void destroy_nbp(struct net_bridge_port *p)
 102{
 103        struct net_device *dev = p->dev;
 104
 105        p->br = NULL;
 106        p->dev = NULL;
 107        dev_put(dev);
 108
 109        kobject_put(&p->kobj);
 110}
 111
 112static void destroy_nbp_rcu(struct rcu_head *head)
 113{
 114        struct net_bridge_port *p =
 115                        container_of(head, struct net_bridge_port, rcu);
 116        destroy_nbp(p);
 117}
 118
 119/* Delete port(interface) from bridge is done in two steps.
 120 * via RCU. First step, marks device as down. That deletes
 121 * all the timers and stops new packets from flowing through.
 122 *
 123 * Final cleanup doesn't occur until after all CPU's finished
 124 * processing packets.
 125 *
 126 * Protected from multiple admin operations by RTNL mutex
 127 */
 128static void del_nbp(struct net_bridge_port *p)
 129{
 130        struct net_bridge *br = p->br;
 131        struct net_device *dev = p->dev;
 132
 133        sysfs_remove_link(br->ifobj, p->dev->name);
 134
 135        dev_set_promiscuity(dev, -1);
 136
 137        spin_lock_bh(&br->lock);
 138        br_stp_disable_port(p);
 139        spin_unlock_bh(&br->lock);
 140
 141        br_ifinfo_notify(RTM_DELLINK, p);
 142
 143        br_fdb_delete_by_port(br, p, 1);
 144
 145        list_del_rcu(&p->list);
 146
 147        dev->priv_flags &= ~IFF_BRIDGE_PORT;
 148
 149        netdev_rx_handler_unregister(dev);
 150        synchronize_net();
 151
 152        netdev_set_master(dev, NULL);
 153
 154        br_multicast_del_port(p);
 155
 156        kobject_uevent(&p->kobj, KOBJ_REMOVE);
 157        kobject_del(&p->kobj);
 158
 159        br_netpoll_disable(p);
 160
 161        call_rcu(&p->rcu, destroy_nbp_rcu);
 162}
 163
 164/* Delete bridge device */
 165void br_dev_delete(struct net_device *dev, struct list_head *head)
 166{
 167        struct net_bridge *br = netdev_priv(dev);
 168        struct net_bridge_port *p, *n;
 169
 170        list_for_each_entry_safe(p, n, &br->port_list, list) {
 171                del_nbp(p);
 172        }
 173
 174        del_timer_sync(&br->gc_timer);
 175
 176        br_sysfs_delbr(br->dev);
 177        unregister_netdevice_queue(br->dev, head);
 178}
 179
 180/* find an available port number */
 181static int find_portno(struct net_bridge *br)
 182{
 183        int index;
 184        struct net_bridge_port *p;
 185        unsigned long *inuse;
 186
 187        inuse = kcalloc(BITS_TO_LONGS(BR_MAX_PORTS), sizeof(unsigned long),
 188                        GFP_KERNEL);
 189        if (!inuse)
 190                return -ENOMEM;
 191
 192        set_bit(0, inuse);      /* zero is reserved */
 193        list_for_each_entry(p, &br->port_list, list) {
 194                set_bit(p->port_no, inuse);
 195        }
 196        index = find_first_zero_bit(inuse, BR_MAX_PORTS);
 197        kfree(inuse);
 198
 199        return (index >= BR_MAX_PORTS) ? -EXFULL : index;
 200}
 201
 202/* called with RTNL but without bridge lock */
 203static struct net_bridge_port *new_nbp(struct net_bridge *br,
 204                                       struct net_device *dev)
 205{
 206        int index;
 207        struct net_bridge_port *p;
 208
 209        index = find_portno(br);
 210        if (index < 0)
 211                return ERR_PTR(index);
 212
 213        p = kzalloc(sizeof(*p), GFP_KERNEL);
 214        if (p == NULL)
 215                return ERR_PTR(-ENOMEM);
 216
 217        p->br = br;
 218        dev_hold(dev);
 219        p->dev = dev;
 220        p->path_cost = port_cost(dev);
 221        p->priority = 0x8000 >> BR_PORT_BITS;
 222        p->port_no = index;
 223        p->flags = 0;
 224        br_init_port(p);
 225        p->state = BR_STATE_DISABLED;
 226        br_stp_port_timer_init(p);
 227        br_multicast_add_port(p);
 228
 229        return p;
 230}
 231
 232int br_add_bridge(struct net *net, const char *name)
 233{
 234        struct net_device *dev;
 235        int res;
 236
 237        dev = alloc_netdev(sizeof(struct net_bridge), name,
 238                           br_dev_setup);
 239
 240        if (!dev)
 241                return -ENOMEM;
 242
 243        dev_net_set(dev, net);
 244
 245        res = register_netdev(dev);
 246        if (res)
 247                free_netdev(dev);
 248        return res;
 249}
 250
 251int br_del_bridge(struct net *net, const char *name)
 252{
 253        struct net_device *dev;
 254        int ret = 0;
 255
 256        rtnl_lock();
 257        dev = __dev_get_by_name(net, name);
 258        if (dev == NULL)
 259                ret =  -ENXIO;  /* Could not find device */
 260
 261        else if (!(dev->priv_flags & IFF_EBRIDGE)) {
 262                /* Attempt to delete non bridge device! */
 263                ret = -EPERM;
 264        }
 265
 266        else if (dev->flags & IFF_UP) {
 267                /* Not shutdown yet. */
 268                ret = -EBUSY;
 269        }
 270
 271        else
 272                br_dev_delete(dev, NULL);
 273
 274        rtnl_unlock();
 275        return ret;
 276}
 277
 278/* MTU of the bridge pseudo-device: ETH_DATA_LEN or the minimum of the ports */
 279int br_min_mtu(const struct net_bridge *br)
 280{
 281        const struct net_bridge_port *p;
 282        int mtu = 0;
 283
 284        ASSERT_RTNL();
 285
 286        if (list_empty(&br->port_list))
 287                mtu = ETH_DATA_LEN;
 288        else {
 289                list_for_each_entry(p, &br->port_list, list) {
 290                        if (!mtu  || p->dev->mtu < mtu)
 291                                mtu = p->dev->mtu;
 292                }
 293        }
 294        return mtu;
 295}
 296
 297/*
 298 * Recomputes features using slave's features
 299 */
 300u32 br_features_recompute(struct net_bridge *br, u32 features)
 301{
 302        struct net_bridge_port *p;
 303        u32 mask;
 304
 305        if (list_empty(&br->port_list))
 306                return features;
 307
 308        mask = features;
 309        features &= ~NETIF_F_ONE_FOR_ALL;
 310
 311        list_for_each_entry(p, &br->port_list, list) {
 312                features = netdev_increment_features(features,
 313                                                     p->dev->features, mask);
 314        }
 315
 316        return features;
 317}
 318
 319/* called with RTNL */
 320int br_add_if(struct net_bridge *br, struct net_device *dev)
 321{
 322        struct net_bridge_port *p;
 323        int err = 0;
 324        bool changed_addr;
 325
 326        /* Don't allow bridging non-ethernet like devices */
 327        if ((dev->flags & IFF_LOOPBACK) ||
 328            dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN)
 329                return -EINVAL;
 330
 331        /* No bridging of bridges */
 332        if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
 333                return -ELOOP;
 334
 335        /* Device is already being bridged */
 336        if (br_port_exists(dev))
 337                return -EBUSY;
 338
 339        /* No bridging devices that dislike that (e.g. wireless) */
 340        if (dev->priv_flags & IFF_DONT_BRIDGE)
 341                return -EOPNOTSUPP;
 342
 343        p = new_nbp(br, dev);
 344        if (IS_ERR(p))
 345                return PTR_ERR(p);
 346
 347        call_netdevice_notifiers(NETDEV_JOIN, dev);
 348
 349        err = dev_set_promiscuity(dev, 1);
 350        if (err)
 351                goto put_back;
 352
 353        err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
 354                                   SYSFS_BRIDGE_PORT_ATTR);
 355        if (err)
 356                goto err0;
 357
 358        err = br_fdb_insert(br, p, dev->dev_addr);
 359        if (err)
 360                goto err1;
 361
 362        err = br_sysfs_addif(p);
 363        if (err)
 364                goto err2;
 365
 366        if (br_netpoll_info(br) && ((err = br_netpoll_enable(p))))
 367                goto err3;
 368
 369        err = netdev_set_master(dev, br->dev);
 370        if (err)
 371                goto err3;
 372
 373        err = netdev_rx_handler_register(dev, br_handle_frame, p);
 374        if (err)
 375                goto err4;
 376
 377        dev->priv_flags |= IFF_BRIDGE_PORT;
 378
 379        dev_disable_lro(dev);
 380
 381        list_add_rcu(&p->list, &br->port_list);
 382
 383        netdev_update_features(br->dev);
 384
 385        spin_lock_bh(&br->lock);
 386        changed_addr = br_stp_recalculate_bridge_id(br);
 387
 388        if ((dev->flags & IFF_UP) && netif_carrier_ok(dev) &&
 389            (br->dev->flags & IFF_UP))
 390                br_stp_enable_port(p);
 391        spin_unlock_bh(&br->lock);
 392
 393        br_ifinfo_notify(RTM_NEWLINK, p);
 394
 395        if (changed_addr)
 396                call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev);
 397
 398        dev_set_mtu(br->dev, br_min_mtu(br));
 399
 400        kobject_uevent(&p->kobj, KOBJ_ADD);
 401
 402        return 0;
 403
 404err4:
 405        netdev_set_master(dev, NULL);
 406err3:
 407        sysfs_remove_link(br->ifobj, p->dev->name);
 408err2:
 409        br_fdb_delete_by_port(br, p, 1);
 410err1:
 411        kobject_put(&p->kobj);
 412        p = NULL; /* kobject_put frees */
 413err0:
 414        dev_set_promiscuity(dev, -1);
 415put_back:
 416        dev_put(dev);
 417        kfree(p);
 418        return err;
 419}
 420
 421/* called with RTNL */
 422int br_del_if(struct net_bridge *br, struct net_device *dev)
 423{
 424        struct net_bridge_port *p;
 425        bool changed_addr;
 426
 427        p = br_port_get_rtnl(dev);
 428        if (!p || p->br != br)
 429                return -EINVAL;
 430
 431        del_nbp(p);
 432
 433        spin_lock_bh(&br->lock);
 434        changed_addr = br_stp_recalculate_bridge_id(br);
 435        spin_unlock_bh(&br->lock);
 436
 437        if (changed_addr)
 438                call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev);
 439
 440        netdev_update_features(br->dev);
 441
 442        return 0;
 443}
 444
 445void __net_exit br_net_exit(struct net *net)
 446{
 447        struct net_device *dev;
 448        LIST_HEAD(list);
 449
 450        rtnl_lock();
 451        for_each_netdev(net, dev)
 452                if (dev->priv_flags & IFF_EBRIDGE)
 453                        br_dev_delete(dev, &list);
 454
 455        unregister_netdevice_many(&list);
 456        rtnl_unlock();
 457
 458}
 459