bond: Give stable bonds one tag.
authorEthan Jackson <ethan@nicira.com>
Wed, 20 Apr 2011 00:19:25 +0000 (17:19 -0700)
committerEthan Jackson <ethan@nicira.com>
Wed, 20 Apr 2011 18:10:28 +0000 (11:10 -0700)
Stable bonds require all flows to be revalidated when anything
changes.  Instead of giving each slave a tag, and ORing them
together.  This commit creates one tag representing the entire
bond.  This will cause less false positives when deciding which
flows to revalidate.

lib/bond.c

index 5306bf44ee5aed8976a39b8137d02e607c1da9ad..5a370158d8c9bbbccad315aeacddd5214691789f 100644 (file)
@@ -107,7 +107,7 @@ struct bond {
     size_t n_stb_slaves;            /* Number of slaves in 'stb_slaves'. */
     size_t len_stb_slaves;          /* Slaves allocated in 'stb_slaves'. */
     bool stb_need_sort;             /* True if stb_slaves is not sorted. */
-
+    tag_type stb_tag;               /* Tag associated with this bond. */
 
     /* Monitoring. */
     enum bond_detect_mode detect;     /* Link status mode, one of BLSM_*. */
@@ -328,9 +328,13 @@ bond_reconfigure(struct bond *bond, const struct bond_settings *s)
     if (bond->balance != BM_STABLE) {
         free(bond->stb_slaves);
         bond->stb_slaves = NULL;
-    } else if (!bond->stb_slaves) {
+        bond->stb_tag = 0;
+    } else if (!bond->stb_tag) {
         struct bond_slave *slave;
 
+        bond->stb_tag = tag_create_random();
+
+        assert(!bond->stb_slaves);
         bond->n_stb_slaves = 0;
         bond->len_stb_slaves = 0;
         bond->stb_slaves = NULL;
@@ -479,11 +483,16 @@ bond_run(struct bond *bond, struct tag_set *tags, bool lacp_negotiated)
     }
 
     if (bond_stb_sort(bond) || is_tcp_hash != bond_is_tcp_hash(bond)) {
-        struct bond_slave *slave;
 
         bond_entry_reset(bond);
-        HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) {
-            tag_set_add(tags, slave->tag);
+        if (bond->balance != BM_STABLE) {
+            struct bond_slave *slave;
+
+            HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) {
+                tag_set_add(tags, slave->tag);
+            }
+        } else {
+            tag_set_add(tags, bond->stb_tag);
         }
     }
 
@@ -645,7 +654,7 @@ bond_choose_output_slave(struct bond *bond, const struct flow *flow,
 {
     struct bond_slave *slave = choose_output_slave(bond, flow, vlan);
     if (slave) {
-        *tags |= slave->tag;
+        *tags |= bond->balance == BM_STABLE ? bond->stb_tag : slave->tag;
         return slave->aux;
     } else {
         *tags |= bond->no_slaves_tag;