meta-flow: Correctly set destination MAC in mf_set_flow_value().
[sliver-openvswitch.git] / tests / test-bundle.c
index c6c9aec..16e264d 100644 (file)
@@ -71,7 +71,7 @@ parse_bundle_actions(char *actions)
     struct ofpbuf b;
 
     ofpbuf_init(&b, 0);
-    bundle_parse(&b, actions);
+    bundle_parse_load(&b, actions);
     nab = ofpbuf_steal_data(&b);
     ofpbuf_uninit(&b);
 
@@ -105,6 +105,7 @@ main(int argc, char *argv[])
     struct flow *flows;
     size_t i, n_permute, old_n_enabled;
     struct slave_group sg;
+    int old_active;
 
     set_program_name(argv[0]);
     random_init();
@@ -135,7 +136,7 @@ main(int argc, char *argv[])
         flows[i].regs[0] = OFPP_NONE;
     }
 
-    if (bundle_check(nab, 1024)) {
+    if (bundle_check(nab, 1024, flows)) {
         ovs_fatal(0, "Bundle action fails to check.");
     }
 
@@ -144,12 +145,14 @@ main(int argc, char *argv[])
      * skip it by starting at i = 1. We do one extra iteration to cover
      * transitioning from the final state back to the initial state. */
     old_n_enabled = 0;
+    old_active = -1;
     n_permute = 1 << sg.n_slaves;
     for (i = 1; i <= n_permute + 1; i++) {
         struct slave *slave;
         size_t j, n_enabled, changed;
         double disruption, perfect;
         uint8_t mask;
+        int active;
 
         mask = i % n_permute;
 
@@ -171,13 +174,26 @@ main(int argc, char *argv[])
             }
         }
 
+        active = -1;
+        for (j = 0; j < sg.n_slaves; j++) {
+            if (sg.slaves[j].enabled) {
+                active = j;
+                break;
+            }
+        }
+
         changed = 0;
         for (j = 0; j < N_FLOWS; j++) {
             struct flow *flow = &flows[j];
-            uint16_t old_slave_id;
+            uint16_t old_slave_id, ofp_port;
 
             old_slave_id = flow->regs[0];
-            flow->regs[0] = bundle_execute(nab, flow, slave_enabled_cb, &sg);
+            ofp_port = bundle_execute(nab, flow, slave_enabled_cb, &sg);
+            bundle_execute_load(nab, flow, slave_enabled_cb, &sg);
+            if (flow->regs[0] != ofp_port) {
+                ovs_fatal(0, "bundle_execute_load() and bundle_execute() "
+                          "disagree");
+            }
 
             if (flow->regs[0] != OFPP_NONE) {
                 slave_lookup(&sg, flow->regs[0])->flow_count++;
@@ -188,15 +204,19 @@ main(int argc, char *argv[])
             }
         }
 
-        if (old_n_enabled || n_enabled) {
-            perfect = 1.0 / MAX(old_n_enabled, n_enabled);
+        if (nab->algorithm == htons(NX_BD_ALG_ACTIVE_BACKUP)) {
+            perfect = active == old_active ? 0.0 : 1.0;
         } else {
-            /* This will happen when 'sg.n_slaves' is 0. */
-            perfect = 0;
+            if (old_n_enabled || n_enabled) {
+                perfect = 1.0 / MAX(old_n_enabled, n_enabled);
+            } else {
+                /* This will happen when 'sg.n_slaves' is 0. */
+                perfect = 0;
+            }
         }
 
         disruption = changed / (double)N_FLOWS;
-        printf("%s: disruption=%.2f (perfect=%.2f) ",
+        printf("%s: disruption=%.2f (perfect=%.2f)",
                mask_str(mask, sg.n_slaves), disruption, perfect);
 
         for (j = 0 ; j < sg.n_slaves; j++) {
@@ -204,10 +224,16 @@ main(int argc, char *argv[])
             double flow_percent;
 
             flow_percent = slave->flow_count / (double)N_FLOWS;
-            printf("%.2f ", flow_percent);
+            printf( " %.2f", flow_percent);
 
             if (slave->enabled) {
-                double perfect_fp = 1.0 / n_enabled;
+                double perfect_fp;
+
+                if (nab->algorithm == htons(NX_BD_ALG_ACTIVE_BACKUP)) {
+                    perfect_fp = j == active ? 1.0 : 0.0;
+                } else {
+                    perfect_fp = 1.0 / n_enabled;
+                }
 
                 if (fabs(flow_percent - perfect_fp) >= .01) {
                     fprintf(stderr, "%s: slave %d: flow_percentage=%.5f for"
@@ -232,6 +258,7 @@ main(int argc, char *argv[])
             ok = false;
         }
 
+        old_active = active;
         old_n_enabled = n_enabled;
     }