1cae5d9fcSVladimir Medvedkin /* SPDX-License-Identifier: BSD-3-Clause 2cae5d9fcSVladimir Medvedkin * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com> 3cae5d9fcSVladimir Medvedkin * Copyright(c) 2019 Intel Corporation 4cae5d9fcSVladimir Medvedkin */ 5cae5d9fcSVladimir Medvedkin 6cae5d9fcSVladimir Medvedkin #include <stdio.h> 7cae5d9fcSVladimir Medvedkin #include <stdint.h> 8cae5d9fcSVladimir Medvedkin #include <stdlib.h> 9cae5d9fcSVladimir Medvedkin 10cae5d9fcSVladimir Medvedkin #include <rte_memory.h> 11cae5d9fcSVladimir Medvedkin #include <rte_log.h> 123c60274cSJie Zhou #include <rte_rib6.h> 133c60274cSJie Zhou #include <rte_fib6.h> 143c60274cSJie Zhou 15233b41c2SStephen Hemminger #include "test.h" 16233b41c2SStephen Hemminger 17cae5d9fcSVladimir Medvedkin typedef int32_t (*rte_fib6_test)(void); 18cae5d9fcSVladimir Medvedkin 19cae5d9fcSVladimir Medvedkin static int32_t test_create_invalid(void); 20cae5d9fcSVladimir Medvedkin static int32_t test_multiple_create(void); 21cae5d9fcSVladimir Medvedkin static int32_t test_free_null(void); 22cae5d9fcSVladimir Medvedkin static int32_t test_add_del_invalid(void); 23cae5d9fcSVladimir Medvedkin static int32_t test_get_invalid(void); 24cae5d9fcSVladimir Medvedkin static int32_t test_lookup(void); 25cae5d9fcSVladimir Medvedkin 26cae5d9fcSVladimir Medvedkin #define MAX_ROUTES (1 << 16) 27cae5d9fcSVladimir Medvedkin /** Maximum number of tbl8 for 2-byte entries */ 28cae5d9fcSVladimir Medvedkin #define MAX_TBL8 (1 << 15) 29cae5d9fcSVladimir Medvedkin 30cae5d9fcSVladimir Medvedkin /* 31cae5d9fcSVladimir Medvedkin * Check that rte_fib6_create fails gracefully for incorrect user input 32cae5d9fcSVladimir Medvedkin * arguments 33cae5d9fcSVladimir Medvedkin */ 34cae5d9fcSVladimir Medvedkin int32_t 35cae5d9fcSVladimir Medvedkin test_create_invalid(void) 36cae5d9fcSVladimir Medvedkin { 37cae5d9fcSVladimir Medvedkin struct rte_fib6 *fib = NULL; 38cae5d9fcSVladimir Medvedkin struct rte_fib6_conf config; 39cae5d9fcSVladimir Medvedkin 40cae5d9fcSVladimir Medvedkin config.max_routes = MAX_ROUTES; 4111c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 42cae5d9fcSVladimir Medvedkin config.default_nh = 0; 43cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_DUMMY; 44cae5d9fcSVladimir Medvedkin 45cae5d9fcSVladimir Medvedkin /* rte_fib6_create: fib name == NULL */ 46cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(NULL, SOCKET_ID_ANY, &config); 47cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 48cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 49cae5d9fcSVladimir Medvedkin 50cae5d9fcSVladimir Medvedkin /* rte_fib6_create: config == NULL */ 51cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, NULL); 52cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 53cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 54cae5d9fcSVladimir Medvedkin 55cae5d9fcSVladimir Medvedkin /* socket_id < -1 is invalid */ 56cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, -2, &config); 57cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 58cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 59cae5d9fcSVladimir Medvedkin 60cae5d9fcSVladimir Medvedkin /* rte_fib6_create: max_routes = 0 */ 61cae5d9fcSVladimir Medvedkin config.max_routes = 0; 62cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 63cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 64cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 65cae5d9fcSVladimir Medvedkin config.max_routes = MAX_ROUTES; 66cae5d9fcSVladimir Medvedkin 674f66d3beSVladimir Medvedkin config.type = RTE_FIB6_TRIE + 1; 68cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 69cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 70cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 71cae5d9fcSVladimir Medvedkin 72cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_TRIE; 73cae5d9fcSVladimir Medvedkin config.trie.num_tbl8 = MAX_TBL8; 74cae5d9fcSVladimir Medvedkin 75cae5d9fcSVladimir Medvedkin config.trie.nh_sz = RTE_FIB6_TRIE_8B + 1; 76cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 77cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 78cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 79cae5d9fcSVladimir Medvedkin config.trie.nh_sz = RTE_FIB6_TRIE_8B; 80cae5d9fcSVladimir Medvedkin 81cae5d9fcSVladimir Medvedkin config.trie.num_tbl8 = 0; 82cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 83cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 84cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 85cae5d9fcSVladimir Medvedkin 86cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 87cae5d9fcSVladimir Medvedkin } 88cae5d9fcSVladimir Medvedkin 89cae5d9fcSVladimir Medvedkin /* 90cae5d9fcSVladimir Medvedkin * Create fib table then delete fib table 10 times 91cae5d9fcSVladimir Medvedkin * Use a slightly different rules size each time 92cae5d9fcSVladimir Medvedkin */ 93cae5d9fcSVladimir Medvedkin int32_t 94cae5d9fcSVladimir Medvedkin test_multiple_create(void) 95cae5d9fcSVladimir Medvedkin { 96cae5d9fcSVladimir Medvedkin struct rte_fib6 *fib = NULL; 97cae5d9fcSVladimir Medvedkin struct rte_fib6_conf config; 98cae5d9fcSVladimir Medvedkin int32_t i; 99cae5d9fcSVladimir Medvedkin 10011c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 101cae5d9fcSVladimir Medvedkin config.default_nh = 0; 102cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_DUMMY; 103cae5d9fcSVladimir Medvedkin 104cae5d9fcSVladimir Medvedkin for (i = 0; i < 100; i++) { 105cae5d9fcSVladimir Medvedkin config.max_routes = MAX_ROUTES - i; 106cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 107cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 108cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 109cae5d9fcSVladimir Medvedkin } 110cae5d9fcSVladimir Medvedkin /* Can not test free so return success */ 111cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 112cae5d9fcSVladimir Medvedkin } 113cae5d9fcSVladimir Medvedkin 114cae5d9fcSVladimir Medvedkin /* 115cae5d9fcSVladimir Medvedkin * Call rte_fib6_free for NULL pointer user input. Note: free has no return and 116cae5d9fcSVladimir Medvedkin * therefore it is impossible to check for failure but this test is added to 117cae5d9fcSVladimir Medvedkin * increase function coverage metrics and to validate that freeing null does 118cae5d9fcSVladimir Medvedkin * not crash. 119cae5d9fcSVladimir Medvedkin */ 120cae5d9fcSVladimir Medvedkin int32_t 121cae5d9fcSVladimir Medvedkin test_free_null(void) 122cae5d9fcSVladimir Medvedkin { 123cae5d9fcSVladimir Medvedkin struct rte_fib6 *fib = NULL; 124cae5d9fcSVladimir Medvedkin struct rte_fib6_conf config; 125cae5d9fcSVladimir Medvedkin 126cae5d9fcSVladimir Medvedkin config.max_routes = MAX_ROUTES; 12711c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 128cae5d9fcSVladimir Medvedkin config.default_nh = 0; 129cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_DUMMY; 130cae5d9fcSVladimir Medvedkin 131cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 132cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 133cae5d9fcSVladimir Medvedkin 134cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 135cae5d9fcSVladimir Medvedkin rte_fib6_free(NULL); 136cae5d9fcSVladimir Medvedkin 137cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 138cae5d9fcSVladimir Medvedkin } 139cae5d9fcSVladimir Medvedkin 140cae5d9fcSVladimir Medvedkin /* 141cae5d9fcSVladimir Medvedkin * Check that rte_fib6_add and rte_fib6_delete fails gracefully 142cae5d9fcSVladimir Medvedkin * for incorrect user input arguments 143cae5d9fcSVladimir Medvedkin */ 144cae5d9fcSVladimir Medvedkin int32_t 145cae5d9fcSVladimir Medvedkin test_add_del_invalid(void) 146cae5d9fcSVladimir Medvedkin { 147cae5d9fcSVladimir Medvedkin struct rte_fib6 *fib = NULL; 148cae5d9fcSVladimir Medvedkin struct rte_fib6_conf config; 149cae5d9fcSVladimir Medvedkin uint64_t nh = 100; 150*6cb10a9bSRobin Jarry struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; 151cae5d9fcSVladimir Medvedkin int ret; 152cae5d9fcSVladimir Medvedkin uint8_t depth = 24; 153cae5d9fcSVladimir Medvedkin 154cae5d9fcSVladimir Medvedkin config.max_routes = MAX_ROUTES; 15511c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 156cae5d9fcSVladimir Medvedkin config.default_nh = 0; 157cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_DUMMY; 158cae5d9fcSVladimir Medvedkin 159cae5d9fcSVladimir Medvedkin /* rte_fib6_add: fib == NULL */ 160*6cb10a9bSRobin Jarry ret = rte_fib6_add(NULL, &ip, depth, nh); 161cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 162cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 163cae5d9fcSVladimir Medvedkin 164cae5d9fcSVladimir Medvedkin /* rte_fib6_delete: fib == NULL */ 165*6cb10a9bSRobin Jarry ret = rte_fib6_delete(NULL, &ip, depth); 166cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 167cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 168cae5d9fcSVladimir Medvedkin 169cae5d9fcSVladimir Medvedkin /*Create valid fib to use in rest of test. */ 170cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 171cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 172cae5d9fcSVladimir Medvedkin 173*6cb10a9bSRobin Jarry /* rte_fib6_add: depth > RTE_IPV6_MAX_DEPTH */ 174*6cb10a9bSRobin Jarry ret = rte_fib6_add(fib, &ip, RTE_IPV6_MAX_DEPTH + 1, nh); 175cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 176cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 177cae5d9fcSVladimir Medvedkin 178*6cb10a9bSRobin Jarry /* rte_fib6_delete: depth > RTE_IPV6_MAX_DEPTH */ 179*6cb10a9bSRobin Jarry ret = rte_fib6_delete(fib, &ip, RTE_IPV6_MAX_DEPTH + 1); 180cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 181cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 182cae5d9fcSVladimir Medvedkin 183cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 184cae5d9fcSVladimir Medvedkin 185cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 186cae5d9fcSVladimir Medvedkin } 187cae5d9fcSVladimir Medvedkin 188cae5d9fcSVladimir Medvedkin /* 189cae5d9fcSVladimir Medvedkin * Check that rte_fib6_get_dp and rte_fib6_get_rib fails gracefully 190cae5d9fcSVladimir Medvedkin * for incorrect user input arguments 191cae5d9fcSVladimir Medvedkin */ 192cae5d9fcSVladimir Medvedkin int32_t 193cae5d9fcSVladimir Medvedkin test_get_invalid(void) 194cae5d9fcSVladimir Medvedkin { 195cae5d9fcSVladimir Medvedkin void *p; 196cae5d9fcSVladimir Medvedkin 197cae5d9fcSVladimir Medvedkin p = rte_fib6_get_dp(NULL); 198cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(p == NULL, 199cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 200cae5d9fcSVladimir Medvedkin 201cae5d9fcSVladimir Medvedkin p = rte_fib6_get_rib(NULL); 202cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(p == NULL, 203cae5d9fcSVladimir Medvedkin "Call succeeded with invalid parameters\n"); 204cae5d9fcSVladimir Medvedkin 205cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 206cae5d9fcSVladimir Medvedkin } 207cae5d9fcSVladimir Medvedkin 208cae5d9fcSVladimir Medvedkin /* 209cae5d9fcSVladimir Medvedkin * Add routes for one supernet with all possible depths and do lookup 210cae5d9fcSVladimir Medvedkin * on each step 211cae5d9fcSVladimir Medvedkin * After delete routes with doing lookup on each step 212cae5d9fcSVladimir Medvedkin */ 213cae5d9fcSVladimir Medvedkin static int 214cae5d9fcSVladimir Medvedkin lookup_and_check_asc(struct rte_fib6 *fib, 215*6cb10a9bSRobin Jarry struct rte_ipv6_addr *ip_arr, 216*6cb10a9bSRobin Jarry struct rte_ipv6_addr *ip_missing, uint64_t def_nh, 217cae5d9fcSVladimir Medvedkin uint32_t n) 218cae5d9fcSVladimir Medvedkin { 219*6cb10a9bSRobin Jarry uint64_t nh_arr[RTE_IPV6_MAX_DEPTH]; 220cae5d9fcSVladimir Medvedkin int ret; 221cae5d9fcSVladimir Medvedkin uint32_t i = 0; 222cae5d9fcSVladimir Medvedkin 223*6cb10a9bSRobin Jarry ret = rte_fib6_lookup_bulk(fib, ip_arr, nh_arr, RTE_IPV6_MAX_DEPTH); 224cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to lookup\n"); 225cae5d9fcSVladimir Medvedkin 226*6cb10a9bSRobin Jarry for (; i <= RTE_IPV6_MAX_DEPTH - n; i++) 227cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == n, 228cae5d9fcSVladimir Medvedkin "Failed to get proper nexthop\n"); 229cae5d9fcSVladimir Medvedkin 230*6cb10a9bSRobin Jarry for (; i < RTE_IPV6_MAX_DEPTH; i++) 231cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == --n, 232cae5d9fcSVladimir Medvedkin "Failed to get proper nexthop\n"); 233cae5d9fcSVladimir Medvedkin 234cae5d9fcSVladimir Medvedkin ret = rte_fib6_lookup_bulk(fib, ip_missing, nh_arr, 1); 235cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (nh_arr[0] == def_nh), 236cae5d9fcSVladimir Medvedkin "Failed to get proper nexthop\n"); 237cae5d9fcSVladimir Medvedkin 238cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 239cae5d9fcSVladimir Medvedkin } 240cae5d9fcSVladimir Medvedkin 241cae5d9fcSVladimir Medvedkin static int 242cae5d9fcSVladimir Medvedkin lookup_and_check_desc(struct rte_fib6 *fib, 243*6cb10a9bSRobin Jarry struct rte_ipv6_addr *ip_arr, 244*6cb10a9bSRobin Jarry struct rte_ipv6_addr *ip_missing, uint64_t def_nh, 245cae5d9fcSVladimir Medvedkin uint32_t n) 246cae5d9fcSVladimir Medvedkin { 247*6cb10a9bSRobin Jarry uint64_t nh_arr[RTE_IPV6_MAX_DEPTH]; 248cae5d9fcSVladimir Medvedkin int ret; 249cae5d9fcSVladimir Medvedkin uint32_t i = 0; 250cae5d9fcSVladimir Medvedkin 251*6cb10a9bSRobin Jarry ret = rte_fib6_lookup_bulk(fib, ip_arr, nh_arr, RTE_IPV6_MAX_DEPTH); 252cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to lookup\n"); 253cae5d9fcSVladimir Medvedkin 254cae5d9fcSVladimir Medvedkin for (; i < n; i++) 255*6cb10a9bSRobin Jarry RTE_TEST_ASSERT(nh_arr[i] == RTE_IPV6_MAX_DEPTH - i, 256cae5d9fcSVladimir Medvedkin "Failed to get proper nexthop\n"); 257cae5d9fcSVladimir Medvedkin 258*6cb10a9bSRobin Jarry for (; i < RTE_IPV6_MAX_DEPTH; i++) 259cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == def_nh, 260cae5d9fcSVladimir Medvedkin "Failed to get proper nexthop\n"); 261cae5d9fcSVladimir Medvedkin 262cae5d9fcSVladimir Medvedkin ret = rte_fib6_lookup_bulk(fib, ip_missing, nh_arr, 1); 263cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (nh_arr[0] == def_nh), 264cae5d9fcSVladimir Medvedkin "Failed to get proper nexthop\n"); 265cae5d9fcSVladimir Medvedkin 266cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 267cae5d9fcSVladimir Medvedkin } 268cae5d9fcSVladimir Medvedkin 269cae5d9fcSVladimir Medvedkin static int 270cae5d9fcSVladimir Medvedkin check_fib(struct rte_fib6 *fib) 271cae5d9fcSVladimir Medvedkin { 272cae5d9fcSVladimir Medvedkin uint64_t def_nh = 100; 273*6cb10a9bSRobin Jarry struct rte_ipv6_addr ip_arr[RTE_IPV6_MAX_DEPTH]; 274*6cb10a9bSRobin Jarry struct rte_ipv6_addr ip_add = RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); 275*6cb10a9bSRobin Jarry struct rte_ipv6_addr ip_missing = 276*6cb10a9bSRobin Jarry RTE_IPV6(0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff); 277cae5d9fcSVladimir Medvedkin uint32_t i, j; 278cae5d9fcSVladimir Medvedkin int ret; 279cae5d9fcSVladimir Medvedkin 280*6cb10a9bSRobin Jarry for (i = 0; i < RTE_IPV6_MAX_DEPTH; i++) { 281*6cb10a9bSRobin Jarry ip_arr[i] = ip_add; 282*6cb10a9bSRobin Jarry j = (RTE_IPV6_MAX_DEPTH - i) / CHAR_BIT; 283*6cb10a9bSRobin Jarry if (j < RTE_IPV6_ADDR_SIZE) { 284*6cb10a9bSRobin Jarry ip_arr[i].a[j] |= UINT8_MAX >> ((RTE_IPV6_MAX_DEPTH - i) % CHAR_BIT); 285*6cb10a9bSRobin Jarry for (j++; j < RTE_IPV6_ADDR_SIZE; j++) 286*6cb10a9bSRobin Jarry ip_arr[i].a[j] = 0xff; 287cae5d9fcSVladimir Medvedkin } 288cae5d9fcSVladimir Medvedkin } 289cae5d9fcSVladimir Medvedkin 290*6cb10a9bSRobin Jarry ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, 0); 291cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 292cae5d9fcSVladimir Medvedkin 293*6cb10a9bSRobin Jarry for (i = 1; i <= RTE_IPV6_MAX_DEPTH; i++) { 294*6cb10a9bSRobin Jarry ret = rte_fib6_add(fib, &ip_add, i, i); 295cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to add a route\n"); 296*6cb10a9bSRobin Jarry ret = lookup_and_check_asc(fib, ip_arr, &ip_missing, def_nh, i); 297cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 298cae5d9fcSVladimir Medvedkin "Lookup and check fails\n"); 299cae5d9fcSVladimir Medvedkin } 300cae5d9fcSVladimir Medvedkin 301*6cb10a9bSRobin Jarry for (i = RTE_IPV6_MAX_DEPTH; i > 1; i--) { 302*6cb10a9bSRobin Jarry ret = rte_fib6_delete(fib, &ip_add, i); 303cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); 304*6cb10a9bSRobin Jarry ret = lookup_and_check_asc(fib, ip_arr, &ip_missing, 305cae5d9fcSVladimir Medvedkin def_nh, i - 1); 306cae5d9fcSVladimir Medvedkin 307cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 308cae5d9fcSVladimir Medvedkin "Lookup and check fails\n"); 309cae5d9fcSVladimir Medvedkin } 310*6cb10a9bSRobin Jarry ret = rte_fib6_delete(fib, &ip_add, i); 311cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); 312*6cb10a9bSRobin Jarry ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, 0); 313cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 314cae5d9fcSVladimir Medvedkin "Lookup and check fails\n"); 315cae5d9fcSVladimir Medvedkin 316*6cb10a9bSRobin Jarry for (i = 0; i < RTE_IPV6_MAX_DEPTH; i++) { 317*6cb10a9bSRobin Jarry ret = rte_fib6_add(fib, &ip_add, RTE_IPV6_MAX_DEPTH - i, 318*6cb10a9bSRobin Jarry RTE_IPV6_MAX_DEPTH - i); 319cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to add a route\n"); 320*6cb10a9bSRobin Jarry ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, 321cae5d9fcSVladimir Medvedkin def_nh, i + 1); 322cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 323cae5d9fcSVladimir Medvedkin "Lookup and check fails\n"); 324cae5d9fcSVladimir Medvedkin } 325cae5d9fcSVladimir Medvedkin 326*6cb10a9bSRobin Jarry for (i = 1; i <= RTE_IPV6_MAX_DEPTH; i++) { 327*6cb10a9bSRobin Jarry ret = rte_fib6_delete(fib, &ip_add, i); 328cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); 329*6cb10a9bSRobin Jarry ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, 330*6cb10a9bSRobin Jarry RTE_IPV6_MAX_DEPTH - i); 331cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 332cae5d9fcSVladimir Medvedkin "Lookup and check fails\n"); 333cae5d9fcSVladimir Medvedkin } 334cae5d9fcSVladimir Medvedkin 335cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 336cae5d9fcSVladimir Medvedkin } 337cae5d9fcSVladimir Medvedkin 338cae5d9fcSVladimir Medvedkin int32_t 339cae5d9fcSVladimir Medvedkin test_lookup(void) 340cae5d9fcSVladimir Medvedkin { 341cae5d9fcSVladimir Medvedkin struct rte_fib6 *fib = NULL; 342cae5d9fcSVladimir Medvedkin struct rte_fib6_conf config; 343cae5d9fcSVladimir Medvedkin uint64_t def_nh = 100; 344cae5d9fcSVladimir Medvedkin int ret; 345cae5d9fcSVladimir Medvedkin 346cae5d9fcSVladimir Medvedkin config.max_routes = MAX_ROUTES; 34711c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 348cae5d9fcSVladimir Medvedkin config.default_nh = def_nh; 349cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_DUMMY; 350cae5d9fcSVladimir Medvedkin 351cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 352cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 353cae5d9fcSVladimir Medvedkin ret = check_fib(fib); 354cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 355cae5d9fcSVladimir Medvedkin "Check_fib fails for DUMMY type\n"); 356cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 357cae5d9fcSVladimir Medvedkin 358cae5d9fcSVladimir Medvedkin config.type = RTE_FIB6_TRIE; 359cae5d9fcSVladimir Medvedkin 360cae5d9fcSVladimir Medvedkin config.trie.nh_sz = RTE_FIB6_TRIE_2B; 361cae5d9fcSVladimir Medvedkin config.trie.num_tbl8 = MAX_TBL8 - 1; 362cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 363cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 364cae5d9fcSVladimir Medvedkin ret = check_fib(fib); 365cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 366cae5d9fcSVladimir Medvedkin "Check_fib fails for TRIE_2B type\n"); 367cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 368cae5d9fcSVladimir Medvedkin 369cae5d9fcSVladimir Medvedkin config.trie.nh_sz = RTE_FIB6_TRIE_4B; 370cae5d9fcSVladimir Medvedkin config.trie.num_tbl8 = MAX_TBL8; 371cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 372cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 373cae5d9fcSVladimir Medvedkin ret = check_fib(fib); 374cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 375cae5d9fcSVladimir Medvedkin "Check_fib fails for TRIE_4B type\n"); 376cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 377cae5d9fcSVladimir Medvedkin 378cae5d9fcSVladimir Medvedkin config.trie.nh_sz = RTE_FIB6_TRIE_8B; 379cae5d9fcSVladimir Medvedkin config.trie.num_tbl8 = MAX_TBL8; 380cae5d9fcSVladimir Medvedkin fib = rte_fib6_create(__func__, SOCKET_ID_ANY, &config); 381cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 382cae5d9fcSVladimir Medvedkin ret = check_fib(fib); 383cae5d9fcSVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 384cae5d9fcSVladimir Medvedkin "Check_fib fails for TRIE_8B type\n"); 385cae5d9fcSVladimir Medvedkin rte_fib6_free(fib); 386cae5d9fcSVladimir Medvedkin 387cae5d9fcSVladimir Medvedkin return TEST_SUCCESS; 388cae5d9fcSVladimir Medvedkin } 389cae5d9fcSVladimir Medvedkin 390cae5d9fcSVladimir Medvedkin static struct unit_test_suite fib6_fast_tests = { 391cae5d9fcSVladimir Medvedkin .suite_name = "fib6 autotest", 392cae5d9fcSVladimir Medvedkin .setup = NULL, 393cae5d9fcSVladimir Medvedkin .teardown = NULL, 394cae5d9fcSVladimir Medvedkin .unit_test_cases = { 395cae5d9fcSVladimir Medvedkin TEST_CASE(test_create_invalid), 396cae5d9fcSVladimir Medvedkin TEST_CASE(test_free_null), 397cae5d9fcSVladimir Medvedkin TEST_CASE(test_add_del_invalid), 398cae5d9fcSVladimir Medvedkin TEST_CASE(test_get_invalid), 399cae5d9fcSVladimir Medvedkin TEST_CASE(test_lookup), 400cae5d9fcSVladimir Medvedkin TEST_CASES_END() 401cae5d9fcSVladimir Medvedkin } 402cae5d9fcSVladimir Medvedkin }; 403cae5d9fcSVladimir Medvedkin 404cae5d9fcSVladimir Medvedkin static struct unit_test_suite fib6_slow_tests = { 405cae5d9fcSVladimir Medvedkin .suite_name = "fib6 slow autotest", 406cae5d9fcSVladimir Medvedkin .setup = NULL, 407cae5d9fcSVladimir Medvedkin .teardown = NULL, 408cae5d9fcSVladimir Medvedkin .unit_test_cases = { 409cae5d9fcSVladimir Medvedkin TEST_CASE(test_multiple_create), 410cae5d9fcSVladimir Medvedkin TEST_CASES_END() 411cae5d9fcSVladimir Medvedkin } 412cae5d9fcSVladimir Medvedkin }; 413cae5d9fcSVladimir Medvedkin 414cae5d9fcSVladimir Medvedkin /* 415cae5d9fcSVladimir Medvedkin * Do all unit tests. 416cae5d9fcSVladimir Medvedkin */ 417cae5d9fcSVladimir Medvedkin static int 418cae5d9fcSVladimir Medvedkin test_fib6(void) 419cae5d9fcSVladimir Medvedkin { 420cae5d9fcSVladimir Medvedkin return unit_test_suite_runner(&fib6_fast_tests); 421cae5d9fcSVladimir Medvedkin } 422cae5d9fcSVladimir Medvedkin 423cae5d9fcSVladimir Medvedkin static int 424cae5d9fcSVladimir Medvedkin test_slow_fib6(void) 425cae5d9fcSVladimir Medvedkin { 426cae5d9fcSVladimir Medvedkin return unit_test_suite_runner(&fib6_slow_tests); 427cae5d9fcSVladimir Medvedkin } 428cae5d9fcSVladimir Medvedkin 429e0a8442cSBruce Richardson REGISTER_FAST_TEST(fib6_autotest, true, true, test_fib6); 430e0a8442cSBruce Richardson REGISTER_PERF_TEST(fib6_slow_autotest, test_slow_fib6); 431