From 04a85497b994b0cb1c702d4ff8b0d2149767ae0e Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Mon, 18 Jul 2011 13:50:26 -0700 Subject: bundle: Implement NX_BD_ALG_ACTIVE_BACKUP. I don't expect this bundling algorithm to be particularly useful in software switches. However, hardware switches will probably only support this bundling algorithm, so it's implemented here as an example and a reference. --- tests/bundle.at | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/test-bundle.c | 36 +++++++++++++++++++++------ 2 files changed, 100 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/bundle.at b/tests/bundle.at index 063cdd312..8a8cb4f2f 100644 --- a/tests/bundle.at +++ b/tests/bundle.at @@ -77,6 +77,77 @@ AT_CHECK([[test-bundle 'symmetric_l4,60,hrw,ofport,slaves:1,2,3,4,5,6']], # 100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 AT_CLEANUP +AT_SETUP([active_backup bundle link selection]) +AT_CHECK([[test-bundle 'symmetric_l4,60,active_backup,ofport,slaves:1,2,3,4,5,6']], + [0], +[100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +110000: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +010000: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +011000: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +111000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +101000: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +001000: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00 +001100: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00 +101100: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +111100: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +011100: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +010100: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +110100: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +100100: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +000100: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 1.00 0.00 0.00 +000110: disruption=0.00 (perfect=0.00) 0.00 0.00 0.00 1.00 0.00 0.00 +100110: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +110110: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +010110: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +011110: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +111110: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +101110: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +001110: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00 +001010: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00 +101010: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +111010: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +011010: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +010010: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +110010: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +100010: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +000010: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 1.00 0.00 +000011: disruption=0.00 (perfect=0.00) 0.00 0.00 0.00 0.00 1.00 0.00 +100011: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +110011: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +010011: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +011011: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +111011: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +101011: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +001011: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00 +001111: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00 +101111: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +111111: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +011111: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +010111: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +110111: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +100111: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +000111: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 1.00 0.00 0.00 +000101: disruption=0.00 (perfect=0.00) 0.00 0.00 0.00 1.00 0.00 0.00 +100101: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +110101: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +010101: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +011101: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +111101: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +101101: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +001101: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00 +001001: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00 +101001: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +111001: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +011001: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00 +010001: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00 +110001: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +100001: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00 +000001: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 0.00 1.00 +000000: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 0.00 0.00 +100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00 +]) +AT_CLEANUP + AT_SETUP([hrw bundle single link selection]) AT_CHECK([[test-bundle 'symmetric_l4,60,hrw,ofport,slaves:1']], [0], [ignore]) diff --git a/tests/test-bundle.c b/tests/test-bundle.c index c6c9aec2a..fb15faf98 100644 --- a/tests/test-bundle.c +++ b/tests/test-bundle.c @@ -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(); @@ -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,6 +174,14 @@ 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]; @@ -188,15 +199,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 +219,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 +253,7 @@ main(int argc, char *argv[]) ok = false; } + old_active = active; old_n_enabled = n_enabled; } -- cgit v1.2.1