X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Ftest-bundle.c;h=16e264d2b2496e9fab5ae3afad494c1452da1627;hb=f125905cdd3dc0339ad968c0a70128807884b400;hp=c6c9aec2ae5ec76fd87ca4fd8643bbbf1f927dd4;hpb=897b9afc123aec3b9e8950797b53909754e748bc;p=sliver-openvswitch.git diff --git a/tests/test-bundle.c b/tests/test-bundle.c index c6c9aec2a..16e264d2b 100644 --- a/tests/test-bundle.c +++ b/tests/test-bundle.c @@ -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; }