Skip to content

Commit

Permalink
bridge: fix ordering of NEWLINK and NEWNEIGH events
Browse files Browse the repository at this point in the history
When port is added to a bridge, the old code would send the new neighbor
netlink message before the subsequent new link message. This bug makes
it difficult to use the monitoring API in an application.

This code changes the ordering to add the forwarding entry
after the port is setup. One of the error checks (for invalid address)
is moved earlier in the process to avoid having to do unwind.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
stephen hemminger authored and David S. Miller committed Oct 3, 2011
1 parent 3de0945 commit 77f9859
Showing 1 changed file with 7 additions and 8 deletions.
15 changes: 7 additions & 8 deletions net/bridge/br_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/netpoll.h>
#include <linux/ethtool.h>
#include <linux/if_arp.h>
Expand Down Expand Up @@ -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 */
Expand All @@ -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;

Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit 77f9859

Please sign in to comment.