14ccd4259SVladimir Medvedkin /* SPDX-License-Identifier: BSD-3-Clause 24ccd4259SVladimir Medvedkin * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com> 34ccd4259SVladimir Medvedkin * Copyright(c) 2019 Intel Corporation 44ccd4259SVladimir Medvedkin */ 54ccd4259SVladimir Medvedkin 64ccd4259SVladimir Medvedkin #include <stdio.h> 74ccd4259SVladimir Medvedkin #include <stdint.h> 84ccd4259SVladimir Medvedkin #include <stdlib.h> 94ccd4259SVladimir Medvedkin 104ccd4259SVladimir Medvedkin #include <rte_ip.h> 114ccd4259SVladimir Medvedkin #include <rte_log.h> 124ccd4259SVladimir Medvedkin #include <rte_fib.h> 134ccd4259SVladimir Medvedkin 144ccd4259SVladimir Medvedkin #include "test.h" 154ccd4259SVladimir Medvedkin 164ccd4259SVladimir Medvedkin typedef int32_t (*rte_fib_test)(void); 174ccd4259SVladimir Medvedkin 184ccd4259SVladimir Medvedkin static int32_t test_create_invalid(void); 194ccd4259SVladimir Medvedkin static int32_t test_multiple_create(void); 204ccd4259SVladimir Medvedkin static int32_t test_free_null(void); 214ccd4259SVladimir Medvedkin static int32_t test_add_del_invalid(void); 224ccd4259SVladimir Medvedkin static int32_t test_get_invalid(void); 234ccd4259SVladimir Medvedkin static int32_t test_lookup(void); 244ccd4259SVladimir Medvedkin 254ccd4259SVladimir Medvedkin #define MAX_ROUTES (1 << 16) 264ccd4259SVladimir Medvedkin #define MAX_TBL8 (1 << 15) 274ccd4259SVladimir Medvedkin 284ccd4259SVladimir Medvedkin /* 294ccd4259SVladimir Medvedkin * Check that rte_fib_create fails gracefully for incorrect user input 304ccd4259SVladimir Medvedkin * arguments 314ccd4259SVladimir Medvedkin */ 324ccd4259SVladimir Medvedkin int32_t 334ccd4259SVladimir Medvedkin test_create_invalid(void) 344ccd4259SVladimir Medvedkin { 354ccd4259SVladimir Medvedkin struct rte_fib *fib = NULL; 364ccd4259SVladimir Medvedkin struct rte_fib_conf config; 374ccd4259SVladimir Medvedkin 384ccd4259SVladimir Medvedkin config.max_routes = MAX_ROUTES; 39*11c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 404ccd4259SVladimir Medvedkin config.default_nh = 0; 414ccd4259SVladimir Medvedkin config.type = RTE_FIB_DUMMY; 424ccd4259SVladimir Medvedkin 434ccd4259SVladimir Medvedkin /* rte_fib_create: fib name == NULL */ 444ccd4259SVladimir Medvedkin fib = rte_fib_create(NULL, SOCKET_ID_ANY, &config); 454ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 464ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 474ccd4259SVladimir Medvedkin 484ccd4259SVladimir Medvedkin /* rte_fib_create: config == NULL */ 494ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, NULL); 504ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 514ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 524ccd4259SVladimir Medvedkin 534ccd4259SVladimir Medvedkin /* socket_id < -1 is invalid */ 544ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, -2, &config); 554ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 564ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 574ccd4259SVladimir Medvedkin 584ccd4259SVladimir Medvedkin /* rte_fib_create: max_routes = 0 */ 594ccd4259SVladimir Medvedkin config.max_routes = 0; 604ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 614ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 624ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 634ccd4259SVladimir Medvedkin config.max_routes = MAX_ROUTES; 644ccd4259SVladimir Medvedkin 654f66d3beSVladimir Medvedkin config.type = RTE_FIB_DIR24_8 + 1; 664ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 674ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 684ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 694ccd4259SVladimir Medvedkin 704ccd4259SVladimir Medvedkin config.type = RTE_FIB_DIR24_8; 714ccd4259SVladimir Medvedkin config.dir24_8.num_tbl8 = MAX_TBL8; 724ccd4259SVladimir Medvedkin 734ccd4259SVladimir Medvedkin config.dir24_8.nh_sz = RTE_FIB_DIR24_8_8B + 1; 744ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 754ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 764ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 774ccd4259SVladimir Medvedkin config.dir24_8.nh_sz = RTE_FIB_DIR24_8_8B; 784ccd4259SVladimir Medvedkin 794ccd4259SVladimir Medvedkin config.dir24_8.num_tbl8 = 0; 804ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 814ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib == NULL, 824ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 834ccd4259SVladimir Medvedkin 844ccd4259SVladimir Medvedkin return TEST_SUCCESS; 854ccd4259SVladimir Medvedkin } 864ccd4259SVladimir Medvedkin 874ccd4259SVladimir Medvedkin /* 884ccd4259SVladimir Medvedkin * Create fib table then delete fib table 10 times 894ccd4259SVladimir Medvedkin * Use a slightly different rules size each time 904ccd4259SVladimir Medvedkin */ 914ccd4259SVladimir Medvedkin int32_t 924ccd4259SVladimir Medvedkin test_multiple_create(void) 934ccd4259SVladimir Medvedkin { 944ccd4259SVladimir Medvedkin struct rte_fib *fib = NULL; 954ccd4259SVladimir Medvedkin struct rte_fib_conf config; 964ccd4259SVladimir Medvedkin int32_t i; 974ccd4259SVladimir Medvedkin 98*11c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 994ccd4259SVladimir Medvedkin config.default_nh = 0; 1004ccd4259SVladimir Medvedkin config.type = RTE_FIB_DUMMY; 1014ccd4259SVladimir Medvedkin 1024ccd4259SVladimir Medvedkin for (i = 0; i < 100; i++) { 1034ccd4259SVladimir Medvedkin config.max_routes = MAX_ROUTES - i; 1044ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 1054ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 1064ccd4259SVladimir Medvedkin rte_fib_free(fib); 1074ccd4259SVladimir Medvedkin } 1084ccd4259SVladimir Medvedkin /* Can not test free so return success */ 1094ccd4259SVladimir Medvedkin return TEST_SUCCESS; 1104ccd4259SVladimir Medvedkin } 1114ccd4259SVladimir Medvedkin 1124ccd4259SVladimir Medvedkin /* 1134ccd4259SVladimir Medvedkin * Call rte_fib_free for NULL pointer user input. Note: free has no return and 1144ccd4259SVladimir Medvedkin * therefore it is impossible to check for failure but this test is added to 1154ccd4259SVladimir Medvedkin * increase function coverage metrics and to validate that freeing null does 1164ccd4259SVladimir Medvedkin * not crash. 1174ccd4259SVladimir Medvedkin */ 1184ccd4259SVladimir Medvedkin int32_t 1194ccd4259SVladimir Medvedkin test_free_null(void) 1204ccd4259SVladimir Medvedkin { 1214ccd4259SVladimir Medvedkin struct rte_fib *fib = NULL; 1224ccd4259SVladimir Medvedkin struct rte_fib_conf config; 1234ccd4259SVladimir Medvedkin 1244ccd4259SVladimir Medvedkin config.max_routes = MAX_ROUTES; 125*11c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 1264ccd4259SVladimir Medvedkin config.default_nh = 0; 1274ccd4259SVladimir Medvedkin config.type = RTE_FIB_DUMMY; 1284ccd4259SVladimir Medvedkin 1294ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 1304ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 1314ccd4259SVladimir Medvedkin 1324ccd4259SVladimir Medvedkin rte_fib_free(fib); 1334ccd4259SVladimir Medvedkin rte_fib_free(NULL); 1344ccd4259SVladimir Medvedkin return TEST_SUCCESS; 1354ccd4259SVladimir Medvedkin } 1364ccd4259SVladimir Medvedkin 1374ccd4259SVladimir Medvedkin /* 1384ccd4259SVladimir Medvedkin * Check that rte_fib_add and rte_fib_delete fails gracefully 1394ccd4259SVladimir Medvedkin * for incorrect user input arguments 1404ccd4259SVladimir Medvedkin */ 1414ccd4259SVladimir Medvedkin int32_t 1424ccd4259SVladimir Medvedkin test_add_del_invalid(void) 1434ccd4259SVladimir Medvedkin { 1444ccd4259SVladimir Medvedkin struct rte_fib *fib = NULL; 1454ccd4259SVladimir Medvedkin struct rte_fib_conf config; 1464ccd4259SVladimir Medvedkin uint64_t nh = 100; 1474ccd4259SVladimir Medvedkin uint32_t ip = RTE_IPV4(0, 0, 0, 0); 1484ccd4259SVladimir Medvedkin int ret; 1494ccd4259SVladimir Medvedkin uint8_t depth = 24; 1504ccd4259SVladimir Medvedkin 1514ccd4259SVladimir Medvedkin config.max_routes = MAX_ROUTES; 152*11c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 1534ccd4259SVladimir Medvedkin config.default_nh = 0; 1544ccd4259SVladimir Medvedkin config.type = RTE_FIB_DUMMY; 1554ccd4259SVladimir Medvedkin 1564ccd4259SVladimir Medvedkin /* rte_fib_add: fib == NULL */ 1574ccd4259SVladimir Medvedkin ret = rte_fib_add(NULL, ip, depth, nh); 1584ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 1594ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 1604ccd4259SVladimir Medvedkin 1614ccd4259SVladimir Medvedkin /* rte_fib_delete: fib == NULL */ 1624ccd4259SVladimir Medvedkin ret = rte_fib_delete(NULL, ip, depth); 1634ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 1644ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 1654ccd4259SVladimir Medvedkin 1664ccd4259SVladimir Medvedkin /*Create valid fib to use in rest of test. */ 1674ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 1684ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 1694ccd4259SVladimir Medvedkin 1704ccd4259SVladimir Medvedkin /* rte_fib_add: depth > RTE_FIB_MAXDEPTH */ 1714ccd4259SVladimir Medvedkin ret = rte_fib_add(fib, ip, RTE_FIB_MAXDEPTH + 1, nh); 1724ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 1734ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 1744ccd4259SVladimir Medvedkin 1754ccd4259SVladimir Medvedkin /* rte_fib_delete: depth > RTE_FIB_MAXDEPTH */ 1764ccd4259SVladimir Medvedkin ret = rte_fib_delete(fib, ip, RTE_FIB_MAXDEPTH + 1); 1774ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret < 0, 1784ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 1794ccd4259SVladimir Medvedkin 1804ccd4259SVladimir Medvedkin rte_fib_free(fib); 1814ccd4259SVladimir Medvedkin 1824ccd4259SVladimir Medvedkin return TEST_SUCCESS; 1834ccd4259SVladimir Medvedkin } 1844ccd4259SVladimir Medvedkin 1854ccd4259SVladimir Medvedkin /* 1864ccd4259SVladimir Medvedkin * Check that rte_fib_get_dp and rte_fib_get_rib fails gracefully 1874ccd4259SVladimir Medvedkin * for incorrect user input arguments 1884ccd4259SVladimir Medvedkin */ 1894ccd4259SVladimir Medvedkin int32_t 1904ccd4259SVladimir Medvedkin test_get_invalid(void) 1914ccd4259SVladimir Medvedkin { 1924ccd4259SVladimir Medvedkin void *p; 1934ccd4259SVladimir Medvedkin 1944ccd4259SVladimir Medvedkin p = rte_fib_get_dp(NULL); 1954ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(p == NULL, 1964ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 1974ccd4259SVladimir Medvedkin 1984ccd4259SVladimir Medvedkin p = rte_fib_get_rib(NULL); 1994ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(p == NULL, 2004ccd4259SVladimir Medvedkin "Call succeeded with invalid parameters\n"); 2014ccd4259SVladimir Medvedkin 2024ccd4259SVladimir Medvedkin return TEST_SUCCESS; 2034ccd4259SVladimir Medvedkin } 2044ccd4259SVladimir Medvedkin 2054ccd4259SVladimir Medvedkin /* 2064ccd4259SVladimir Medvedkin * Add routes for one supernet with all possible depths and do lookup 2074ccd4259SVladimir Medvedkin * on each step 2084ccd4259SVladimir Medvedkin * After delete routes with doing lookup on each step 2094ccd4259SVladimir Medvedkin */ 2104ccd4259SVladimir Medvedkin static int 2114ccd4259SVladimir Medvedkin lookup_and_check_asc(struct rte_fib *fib, uint32_t ip_arr[RTE_FIB_MAXDEPTH], 2124ccd4259SVladimir Medvedkin uint32_t ip_missing, uint64_t def_nh, uint32_t n) 2134ccd4259SVladimir Medvedkin { 2144ccd4259SVladimir Medvedkin uint64_t nh_arr[RTE_FIB_MAXDEPTH]; 2154ccd4259SVladimir Medvedkin int ret; 2164ccd4259SVladimir Medvedkin uint32_t i = 0; 2174ccd4259SVladimir Medvedkin 2184ccd4259SVladimir Medvedkin ret = rte_fib_lookup_bulk(fib, ip_arr, nh_arr, RTE_FIB_MAXDEPTH); 2194ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to lookup\n"); 2204ccd4259SVladimir Medvedkin 2214ccd4259SVladimir Medvedkin for (; i <= RTE_FIB_MAXDEPTH - n; i++) 2224ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == n, 2234ccd4259SVladimir Medvedkin "Failed to get proper nexthop\n"); 2244ccd4259SVladimir Medvedkin 2254ccd4259SVladimir Medvedkin for (; i < RTE_FIB_MAXDEPTH; i++) 2264ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == --n, 2274ccd4259SVladimir Medvedkin "Failed to get proper nexthop\n"); 2284ccd4259SVladimir Medvedkin 2294ccd4259SVladimir Medvedkin ret = rte_fib_lookup_bulk(fib, &ip_missing, nh_arr, 1); 2304ccd4259SVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (nh_arr[0] == def_nh), 2314ccd4259SVladimir Medvedkin "Failed to get proper nexthop\n"); 2324ccd4259SVladimir Medvedkin 2334ccd4259SVladimir Medvedkin return TEST_SUCCESS; 2344ccd4259SVladimir Medvedkin } 2354ccd4259SVladimir Medvedkin 2364ccd4259SVladimir Medvedkin static int 2374ccd4259SVladimir Medvedkin lookup_and_check_desc(struct rte_fib *fib, uint32_t ip_arr[RTE_FIB_MAXDEPTH], 2384ccd4259SVladimir Medvedkin uint32_t ip_missing, uint64_t def_nh, uint32_t n) 2394ccd4259SVladimir Medvedkin { 2404ccd4259SVladimir Medvedkin uint64_t nh_arr[RTE_FIB_MAXDEPTH]; 2414ccd4259SVladimir Medvedkin int ret; 2424ccd4259SVladimir Medvedkin uint32_t i = 0; 2434ccd4259SVladimir Medvedkin 2444ccd4259SVladimir Medvedkin ret = rte_fib_lookup_bulk(fib, ip_arr, nh_arr, RTE_FIB_MAXDEPTH); 2454ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to lookup\n"); 2464ccd4259SVladimir Medvedkin 2474ccd4259SVladimir Medvedkin for (; i < n; i++) 2484ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == RTE_FIB_MAXDEPTH - i, 2494ccd4259SVladimir Medvedkin "Failed to get proper nexthop\n"); 2504ccd4259SVladimir Medvedkin 2514ccd4259SVladimir Medvedkin for (; i < RTE_FIB_MAXDEPTH; i++) 2524ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(nh_arr[i] == def_nh, 2534ccd4259SVladimir Medvedkin "Failed to get proper nexthop\n"); 2544ccd4259SVladimir Medvedkin 2554ccd4259SVladimir Medvedkin ret = rte_fib_lookup_bulk(fib, &ip_missing, nh_arr, 1); 2564ccd4259SVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (nh_arr[0] == def_nh), 2574ccd4259SVladimir Medvedkin "Failed to get proper nexthop\n"); 2584ccd4259SVladimir Medvedkin 2594ccd4259SVladimir Medvedkin return TEST_SUCCESS; 2604ccd4259SVladimir Medvedkin } 2614ccd4259SVladimir Medvedkin 2624ccd4259SVladimir Medvedkin static int 2634ccd4259SVladimir Medvedkin check_fib(struct rte_fib *fib) 2644ccd4259SVladimir Medvedkin { 2654ccd4259SVladimir Medvedkin uint64_t def_nh = 100; 2664ccd4259SVladimir Medvedkin uint32_t ip_arr[RTE_FIB_MAXDEPTH]; 2674ccd4259SVladimir Medvedkin uint32_t ip_add = RTE_IPV4(128, 0, 0, 0); 2684ccd4259SVladimir Medvedkin uint32_t i, ip_missing = RTE_IPV4(127, 255, 255, 255); 2694ccd4259SVladimir Medvedkin int ret; 2704ccd4259SVladimir Medvedkin 2714ccd4259SVladimir Medvedkin for (i = 0; i < RTE_FIB_MAXDEPTH; i++) 2724ccd4259SVladimir Medvedkin ip_arr[i] = ip_add + (1ULL << i) - 1; 2734ccd4259SVladimir Medvedkin 2744ccd4259SVladimir Medvedkin ret = lookup_and_check_desc(fib, ip_arr, ip_missing, def_nh, 0); 2754ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 2764ccd4259SVladimir Medvedkin 2774ccd4259SVladimir Medvedkin for (i = 1; i <= RTE_FIB_MAXDEPTH; i++) { 2784ccd4259SVladimir Medvedkin ret = rte_fib_add(fib, ip_add, i, i); 2794ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to add a route\n"); 2804ccd4259SVladimir Medvedkin ret = lookup_and_check_asc(fib, ip_arr, ip_missing, 2814ccd4259SVladimir Medvedkin def_nh, i); 2824ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 2834ccd4259SVladimir Medvedkin } 2844ccd4259SVladimir Medvedkin 2854ccd4259SVladimir Medvedkin for (i = RTE_FIB_MAXDEPTH; i > 1; i--) { 2864ccd4259SVladimir Medvedkin ret = rte_fib_delete(fib, ip_add, i); 2874ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); 2884ccd4259SVladimir Medvedkin ret = lookup_and_check_asc(fib, ip_arr, ip_missing, 2894ccd4259SVladimir Medvedkin def_nh, i - 1); 2904ccd4259SVladimir Medvedkin 2914ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 2924ccd4259SVladimir Medvedkin } 2934ccd4259SVladimir Medvedkin ret = rte_fib_delete(fib, ip_add, i); 2944ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); 2954ccd4259SVladimir Medvedkin ret = lookup_and_check_desc(fib, ip_arr, ip_missing, def_nh, 0); 2964ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 2974ccd4259SVladimir Medvedkin 2984ccd4259SVladimir Medvedkin for (i = 0; i < RTE_FIB_MAXDEPTH; i++) { 2994ccd4259SVladimir Medvedkin ret = rte_fib_add(fib, ip_add, RTE_FIB_MAXDEPTH - i, 3004ccd4259SVladimir Medvedkin RTE_FIB_MAXDEPTH - i); 3014ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to add a route\n"); 3024ccd4259SVladimir Medvedkin ret = lookup_and_check_desc(fib, ip_arr, ip_missing, 3034ccd4259SVladimir Medvedkin def_nh, i + 1); 3044ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 3054ccd4259SVladimir Medvedkin } 3064ccd4259SVladimir Medvedkin 3074ccd4259SVladimir Medvedkin for (i = 1; i <= RTE_FIB_MAXDEPTH; i++) { 3084ccd4259SVladimir Medvedkin ret = rte_fib_delete(fib, ip_add, i); 3094ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); 3104ccd4259SVladimir Medvedkin ret = lookup_and_check_desc(fib, ip_arr, ip_missing, def_nh, 3114ccd4259SVladimir Medvedkin RTE_FIB_MAXDEPTH - i); 3124ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); 3134ccd4259SVladimir Medvedkin } 3144ccd4259SVladimir Medvedkin 3154ccd4259SVladimir Medvedkin return TEST_SUCCESS; 3164ccd4259SVladimir Medvedkin } 3174ccd4259SVladimir Medvedkin 3184ccd4259SVladimir Medvedkin int32_t 3194ccd4259SVladimir Medvedkin test_lookup(void) 3204ccd4259SVladimir Medvedkin { 3214ccd4259SVladimir Medvedkin struct rte_fib *fib = NULL; 3224ccd4259SVladimir Medvedkin struct rte_fib_conf config; 3234ccd4259SVladimir Medvedkin uint64_t def_nh = 100; 3244ccd4259SVladimir Medvedkin int ret; 3254ccd4259SVladimir Medvedkin 3264ccd4259SVladimir Medvedkin config.max_routes = MAX_ROUTES; 327*11c5b9b5SVladimir Medvedkin config.rib_ext_sz = 0; 3284ccd4259SVladimir Medvedkin config.default_nh = def_nh; 3294ccd4259SVladimir Medvedkin config.type = RTE_FIB_DUMMY; 3304ccd4259SVladimir Medvedkin 3314ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 3324ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 3334ccd4259SVladimir Medvedkin ret = check_fib(fib); 3344ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 3354ccd4259SVladimir Medvedkin "Check_fib fails for DUMMY type\n"); 3364ccd4259SVladimir Medvedkin rte_fib_free(fib); 3374ccd4259SVladimir Medvedkin 3384ccd4259SVladimir Medvedkin config.type = RTE_FIB_DIR24_8; 3394ccd4259SVladimir Medvedkin 3404ccd4259SVladimir Medvedkin config.dir24_8.nh_sz = RTE_FIB_DIR24_8_1B; 3414ccd4259SVladimir Medvedkin config.dir24_8.num_tbl8 = 127; 3424ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 3434ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 3444ccd4259SVladimir Medvedkin ret = check_fib(fib); 3454ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 3464ccd4259SVladimir Medvedkin "Check_fib fails for DIR24_8_1B type\n"); 3474ccd4259SVladimir Medvedkin rte_fib_free(fib); 3484ccd4259SVladimir Medvedkin 3494ccd4259SVladimir Medvedkin config.dir24_8.nh_sz = RTE_FIB_DIR24_8_2B; 3504ccd4259SVladimir Medvedkin config.dir24_8.num_tbl8 = MAX_TBL8 - 1; 3514ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 3524ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 3534ccd4259SVladimir Medvedkin ret = check_fib(fib); 3544ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 3554ccd4259SVladimir Medvedkin "Check_fib fails for DIR24_8_2B type\n"); 3564ccd4259SVladimir Medvedkin rte_fib_free(fib); 3574ccd4259SVladimir Medvedkin 3584ccd4259SVladimir Medvedkin config.dir24_8.nh_sz = RTE_FIB_DIR24_8_4B; 3594ccd4259SVladimir Medvedkin config.dir24_8.num_tbl8 = MAX_TBL8; 3604ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 3614ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 3624ccd4259SVladimir Medvedkin ret = check_fib(fib); 3634ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 3644ccd4259SVladimir Medvedkin "Check_fib fails for DIR24_8_4B type\n"); 3654ccd4259SVladimir Medvedkin rte_fib_free(fib); 3664ccd4259SVladimir Medvedkin 3674ccd4259SVladimir Medvedkin config.dir24_8.nh_sz = RTE_FIB_DIR24_8_8B; 3684ccd4259SVladimir Medvedkin config.dir24_8.num_tbl8 = MAX_TBL8; 3694ccd4259SVladimir Medvedkin fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); 3704ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); 3714ccd4259SVladimir Medvedkin ret = check_fib(fib); 3724ccd4259SVladimir Medvedkin RTE_TEST_ASSERT(ret == TEST_SUCCESS, 3734ccd4259SVladimir Medvedkin "Check_fib fails for DIR24_8_8B type\n"); 3744ccd4259SVladimir Medvedkin rte_fib_free(fib); 3754ccd4259SVladimir Medvedkin 3764ccd4259SVladimir Medvedkin return TEST_SUCCESS; 3774ccd4259SVladimir Medvedkin } 3784ccd4259SVladimir Medvedkin 3794ccd4259SVladimir Medvedkin static struct unit_test_suite fib_fast_tests = { 3804ccd4259SVladimir Medvedkin .suite_name = "fib autotest", 3814ccd4259SVladimir Medvedkin .setup = NULL, 3824ccd4259SVladimir Medvedkin .teardown = NULL, 3834ccd4259SVladimir Medvedkin .unit_test_cases = { 3844ccd4259SVladimir Medvedkin TEST_CASE(test_create_invalid), 3854ccd4259SVladimir Medvedkin TEST_CASE(test_free_null), 3864ccd4259SVladimir Medvedkin TEST_CASE(test_add_del_invalid), 3874ccd4259SVladimir Medvedkin TEST_CASE(test_get_invalid), 3884ccd4259SVladimir Medvedkin TEST_CASE(test_lookup), 3894ccd4259SVladimir Medvedkin TEST_CASES_END() 3904ccd4259SVladimir Medvedkin } 3914ccd4259SVladimir Medvedkin }; 3924ccd4259SVladimir Medvedkin 3934ccd4259SVladimir Medvedkin static struct unit_test_suite fib_slow_tests = { 3944ccd4259SVladimir Medvedkin .suite_name = "fib slow autotest", 3954ccd4259SVladimir Medvedkin .setup = NULL, 3964ccd4259SVladimir Medvedkin .teardown = NULL, 3974ccd4259SVladimir Medvedkin .unit_test_cases = { 3984ccd4259SVladimir Medvedkin TEST_CASE(test_multiple_create), 3994ccd4259SVladimir Medvedkin TEST_CASES_END() 4004ccd4259SVladimir Medvedkin } 4014ccd4259SVladimir Medvedkin }; 4024ccd4259SVladimir Medvedkin 4034ccd4259SVladimir Medvedkin /* 4044ccd4259SVladimir Medvedkin * Do all unit tests. 4054ccd4259SVladimir Medvedkin */ 4064ccd4259SVladimir Medvedkin static int 4074ccd4259SVladimir Medvedkin test_fib(void) 4084ccd4259SVladimir Medvedkin { 4094ccd4259SVladimir Medvedkin return unit_test_suite_runner(&fib_fast_tests); 4104ccd4259SVladimir Medvedkin } 4114ccd4259SVladimir Medvedkin 4124ccd4259SVladimir Medvedkin static int 4134ccd4259SVladimir Medvedkin test_slow_fib(void) 4144ccd4259SVladimir Medvedkin { 4154ccd4259SVladimir Medvedkin return unit_test_suite_runner(&fib_slow_tests); 4164ccd4259SVladimir Medvedkin } 4174ccd4259SVladimir Medvedkin 4184ccd4259SVladimir Medvedkin REGISTER_TEST_COMMAND(fib_autotest, test_fib); 4194ccd4259SVladimir Medvedkin REGISTER_TEST_COMMAND(fib_slow_autotest, test_slow_fib); 420