xref: /dpdk/app/test/test_fib6.c (revision 6cb10a9bdb6d2d0253e4d022f230371d703d8ac2)
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