X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fbond.c;h=6f18824c436e640912fb94f0a18eccd4430d1a8b;hb=007948177581f3b3dad188221593d0e4bdca6ba0;hp=2b540523ef103efd9611ed234e4d1b174ff4ef05;hpb=2db65bf72c008cf7ee658d0b44744b39495ead14;p=sliver-openvswitch.git diff --git a/lib/bond.c b/lib/bond.c index 2b540523e..6f18824c4 100644 --- a/lib/bond.c +++ b/lib/bond.c @@ -337,6 +337,21 @@ bond_reconfigure(struct bond *bond, const struct bond_settings *s) return revalidate; } +static void +bond_slave_set_netdev__(struct bond *bond, struct bond_slave *slave, + struct netdev *netdev) +{ + if (slave->netdev != netdev) { + if (bond->monitor) { + if (slave->netdev) { + netdev_monitor_remove(bond->monitor, slave->netdev); + } + netdev_monitor_add(bond->monitor, netdev); + } + slave->netdev = netdev; + } +} + /* Registers 'slave_' as a slave of 'bond'. The 'slave_' pointer is an * arbitrary client-provided pointer that uniquely identifies a slave within a * bond. If 'slave_' already exists within 'bond' then this function @@ -376,20 +391,26 @@ bond_slave_register(struct bond *bond, void *slave_, uint32_t stb_id, bond->bond_revalidate = true; } - if (slave->netdev != netdev) { - if (bond->monitor) { - if (slave->netdev) { - netdev_monitor_remove(bond->monitor, slave->netdev); - } - netdev_monitor_add(bond->monitor, netdev); - } - slave->netdev = netdev; - } + bond_slave_set_netdev__(bond, slave, netdev); free(slave->name); slave->name = xstrdup(netdev_get_name(netdev)); } +/* Updates the network device to be used with 'slave_' to 'netdev'. + * + * This is useful if the caller closes and re-opens the network device + * registered with bond_slave_register() but doesn't need to change anything + * else. */ +void +bond_slave_set_netdev(struct bond *bond, void *slave_, struct netdev *netdev) +{ + struct bond_slave *slave = bond_slave_lookup(bond, slave_); + if (slave) { + bond_slave_set_netdev__(bond, slave, netdev); + } +} + /* Unregisters 'slave_' from 'bond'. If 'bond' does not contain such a slave * then this function has no effect. *