From 7741aeb8df1c57f1d7d1c34a86746791bfb33454 Mon Sep 17 00:00:00 2001 From: stephen hemminger Date: Fri, 30 Sep 2011 14:37:26 +0000 Subject: [PATCH] --- yaml --- r: 266404 b: refs/heads/master c: 77f9859837cbe262ef2aa12fc38d18458814c2ca h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/bridge/br_if.c | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index cdd44260447e..d4e71c049e13 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3de09455cfcde1898fb435ad425b9ad5d13ed362 +refs/heads/master: 77f9859837cbe262ef2aa12fc38d18458814c2ca diff --git a/trunk/net/bridge/br_if.c b/trunk/net/bridge/br_if.c index 13f34acb2a8e..c3b77dceb937 100644 --- a/trunk/net/bridge/br_if.c +++ b/trunk/net/bridge/br_if.c @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -322,7 +323,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) /* Don't allow bridging non-ethernet like devices */ if ((dev->flags & IFF_LOOPBACK) || - dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN) + dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN || + !is_valid_ether_addr(dev->dev_addr)) return -EINVAL; /* No bridging of bridges */ @@ -349,10 +351,6 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj), SYSFS_BRIDGE_PORT_ATTR); - if (err) - goto err0; - - err = br_fdb_insert(br, p, dev->dev_addr); if (err) goto err1; @@ -394,6 +392,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) dev_set_mtu(br->dev, br_min_mtu(br)); + if (br_fdb_insert(br, p, dev->dev_addr)) + netdev_err(dev, "failed insert local address bridge forwarding table\n"); + kobject_uevent(&p->kobj, KOBJ_ADD); return 0; @@ -403,11 +404,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) err3: sysfs_remove_link(br->ifobj, p->dev->name); err2: - br_fdb_delete_by_port(br, p, 1); -err1: kobject_put(&p->kobj); p = NULL; /* kobject_put frees */ -err0: +err1: dev_set_promiscuity(dev, -1); put_back: dev_put(dev);