From: Wei Dai Date: Mon, 8 Aug 2016 06:40:45 +0000 (+0800) Subject: app/test: verify LPM tbl8 recycle X-Git-Tag: spdx-start~5601 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=231fa88ed5222b7ab7cdb47bf21dadd6a8382ae0;p=dpdk.git app/test: verify LPM tbl8 recycle As a bug-fix for lpm tbl8 recycle is introduced, add a test case to verify tbl8 group is correctly freed when it only includes a rule with depth=24. Signed-off-by: Wei Dai Acked-by: Bruce Richardson --- diff --git a/app/test/test_lpm.c b/app/test/test_lpm.c index 0952f52b31..80e0efc5fc 100644 --- a/app/test/test_lpm.c +++ b/app/test/test_lpm.c @@ -68,6 +68,7 @@ static int32_t test14(void); static int32_t test15(void); static int32_t test16(void); static int32_t test17(void); +static int32_t test18(void); rte_lpm_test tests[] = { /* Test Cases */ @@ -89,6 +90,7 @@ rte_lpm_test tests[] = { test15, test16, test17, + test18 }; #define NUM_LPM_TESTS (sizeof(tests)/sizeof(tests[0])) @@ -1217,6 +1219,82 @@ test17(void) return PASS; } +/* + * Test for recycle of tbl8 + * - step 1: add a rule with depth=28 (> 24) + * - step 2: add a rule with same 24-bit prefix and depth=23 (< 24) + * - step 3: delete the first rule + * - step 4: check tbl8 is freed + * - step 5: add a rule same as the first one (depth=28) + * - step 6: check same tbl8 is allocated + * - step 7: add a rule with same 24-bit prefix and depth=24 + * - step 8: delete the rule (depth=28) added in step 5 + * - step 9: check tbl8 is freed + * - step 10: add a rule with same 24-bit prefix and depth = 28 + * - setp 11: check same tbl8 is allocated again + */ +int32_t +test18(void) +{ +#define group_idx next_hop + struct rte_lpm *lpm = NULL; + struct rte_lpm_config config; + uint32_t ip, next_hop; + uint8_t depth; + uint32_t tbl8_group_index; + + config.max_rules = MAX_RULES; + config.number_tbl8s = NUMBER_TBL8S; + config.flags = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config); + TEST_LPM_ASSERT(lpm != NULL); + + ip = IPv4(192, 168, 100, 100); + depth = 28; + next_hop = 1; + rte_lpm_add(lpm, ip, depth, next_hop); + + TEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group); + tbl8_group_index = lpm->tbl8[ip>>8].group_idx; + + depth = 23; + next_hop = 2; + rte_lpm_add(lpm, ip, depth, next_hop); + TEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group); + + depth = 28; + rte_lpm_delete(lpm, ip, depth); + + TEST_LPM_ASSERT(!lpm->tbl24[ip>>8].valid_group); + + next_hop = 3; + rte_lpm_add(lpm, ip, depth, next_hop); + + TEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group); + TEST_LPM_ASSERT(tbl8_group_index == lpm->tbl8[ip>>8].group_idx); + + depth = 24; + next_hop = 4; + rte_lpm_add(lpm, ip, depth, next_hop); + TEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group); + + depth = 28; + rte_lpm_delete(lpm, ip, depth); + + TEST_LPM_ASSERT(!lpm->tbl24[ip>>8].valid_group); + + next_hop = 5; + rte_lpm_add(lpm, ip, depth, next_hop); + + TEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group); + TEST_LPM_ASSERT(tbl8_group_index == lpm->tbl8[ip>>8].group_idx); + + rte_lpm_free(lpm); +#undef group_idx + return PASS; +} + /* * Do all unit tests. */ @@ -1230,7 +1308,7 @@ test_lpm(void) for (i = 0; i < NUM_LPM_TESTS; i++) { status = tests[i](); if (status < 0) { - printf("ERROR: LPM Test %s: FAIL\n", RTE_STR(tests[i])); + printf("ERROR: LPM Test %u: FAIL\n", i); global_status = status; } }