xref: /dpdk/app/test/test_fib.c (revision 11c5b9b51a18396c73556031d55c32cc9c80045b)
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