bond: New function bond_slave_set_netdev().
authorBen Pfaff <blp@nicira.com>
Wed, 4 May 2011 17:26:58 +0000 (10:26 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 4 May 2011 17:26:58 +0000 (10:26 -0700)
To be used by an upcoming change.

lib/bond.c
lib/bond.h

index ed6ed89b887f17ba2300e116c18c6c4f5e240914..2083108416c1002bfaefb0196cddc9ff72de2496 100644 (file)
@@ -330,6 +330,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
@@ -369,20 +384,26 @@ bond_slave_register(struct bond *bond, void *slave_, uint16_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.
  *
index b2ab89cd850b05f92352083b9e01d152d6fb5ec9..8736f4cd4d16d9c4d77493bf27660bad7b41da69 100644 (file)
@@ -75,6 +75,7 @@ void bond_destroy(struct bond *);
 bool bond_reconfigure(struct bond *, const struct bond_settings *);
 void bond_slave_register(struct bond *, void *slave_,
                          uint16_t stable_id, struct netdev *);
+void bond_slave_set_netdev(struct bond *, void *slave_, struct netdev *);
 void bond_slave_unregister(struct bond *, const void *slave);
 
 void bond_run(struct bond *, struct tag_set *, bool lacp_negotiated);