diff options
Diffstat (limited to 'net/bridge/br_if.c')
-rw-r--r-- | net/bridge/br_if.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index 13f34acb2a8e..c3b77dceb937 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/netdevice.h> | 15 | #include <linux/netdevice.h> |
16 | #include <linux/etherdevice.h> | ||
16 | #include <linux/netpoll.h> | 17 | #include <linux/netpoll.h> |
17 | #include <linux/ethtool.h> | 18 | #include <linux/ethtool.h> |
18 | #include <linux/if_arp.h> | 19 | #include <linux/if_arp.h> |
@@ -322,7 +323,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
322 | 323 | ||
323 | /* Don't allow bridging non-ethernet like devices */ | 324 | /* Don't allow bridging non-ethernet like devices */ |
324 | if ((dev->flags & IFF_LOOPBACK) || | 325 | if ((dev->flags & IFF_LOOPBACK) || |
325 | dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN) | 326 | dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN || |
327 | !is_valid_ether_addr(dev->dev_addr)) | ||
326 | return -EINVAL; | 328 | return -EINVAL; |
327 | 329 | ||
328 | /* No bridging of bridges */ | 330 | /* No bridging of bridges */ |
@@ -350,10 +352,6 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
350 | err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj), | 352 | err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj), |
351 | SYSFS_BRIDGE_PORT_ATTR); | 353 | SYSFS_BRIDGE_PORT_ATTR); |
352 | if (err) | 354 | if (err) |
353 | goto err0; | ||
354 | |||
355 | err = br_fdb_insert(br, p, dev->dev_addr); | ||
356 | if (err) | ||
357 | goto err1; | 355 | goto err1; |
358 | 356 | ||
359 | err = br_sysfs_addif(p); | 357 | err = br_sysfs_addif(p); |
@@ -394,6 +392,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
394 | 392 | ||
395 | dev_set_mtu(br->dev, br_min_mtu(br)); | 393 | dev_set_mtu(br->dev, br_min_mtu(br)); |
396 | 394 | ||
395 | if (br_fdb_insert(br, p, dev->dev_addr)) | ||
396 | netdev_err(dev, "failed insert local address bridge forwarding table\n"); | ||
397 | |||
397 | kobject_uevent(&p->kobj, KOBJ_ADD); | 398 | kobject_uevent(&p->kobj, KOBJ_ADD); |
398 | 399 | ||
399 | return 0; | 400 | return 0; |
@@ -403,11 +404,9 @@ err4: | |||
403 | err3: | 404 | err3: |
404 | sysfs_remove_link(br->ifobj, p->dev->name); | 405 | sysfs_remove_link(br->ifobj, p->dev->name); |
405 | err2: | 406 | err2: |
406 | br_fdb_delete_by_port(br, p, 1); | ||
407 | err1: | ||
408 | kobject_put(&p->kobj); | 407 | kobject_put(&p->kobj); |
409 | p = NULL; /* kobject_put frees */ | 408 | p = NULL; /* kobject_put frees */ |
410 | err0: | 409 | err1: |
411 | dev_set_promiscuity(dev, -1); | 410 | dev_set_promiscuity(dev, -1); |
412 | put_back: | 411 | put_back: |
413 | dev_put(dev); | 412 | dev_put(dev); |