xref: /dpdk/app/test/test_rib.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
1b35df4ddSVladimir Medvedkin /* SPDX-License-Identifier: BSD-3-Clause
2b35df4ddSVladimir Medvedkin  * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>
3b35df4ddSVladimir Medvedkin  * Copyright(c) 2019 Intel Corporation
4b35df4ddSVladimir Medvedkin  */
5b35df4ddSVladimir Medvedkin 
63c60274cSJie Zhou #include "test.h"
73c60274cSJie Zhou 
8b35df4ddSVladimir Medvedkin #include <stdio.h>
9b35df4ddSVladimir Medvedkin #include <stdint.h>
10b35df4ddSVladimir Medvedkin #include <stdlib.h>
11b35df4ddSVladimir Medvedkin 
12b35df4ddSVladimir Medvedkin #include <rte_ip.h>
133c60274cSJie Zhou #include <rte_rib.h>
14b35df4ddSVladimir Medvedkin 
15b35df4ddSVladimir Medvedkin typedef int32_t (*rte_rib_test)(void);
16b35df4ddSVladimir Medvedkin 
17b35df4ddSVladimir Medvedkin static int32_t test_create_invalid(void);
18b35df4ddSVladimir Medvedkin static int32_t test_multiple_create(void);
19b35df4ddSVladimir Medvedkin static int32_t test_free_null(void);
20b35df4ddSVladimir Medvedkin static int32_t test_insert_invalid(void);
21b35df4ddSVladimir Medvedkin static int32_t test_get_fn(void);
22b35df4ddSVladimir Medvedkin static int32_t test_basic(void);
23b35df4ddSVladimir Medvedkin static int32_t test_tree_traversal(void);
24b35df4ddSVladimir Medvedkin 
25b35df4ddSVladimir Medvedkin #define MAX_DEPTH 32
26b35df4ddSVladimir Medvedkin #define MAX_RULES (1 << 22)
27b35df4ddSVladimir Medvedkin 
28b35df4ddSVladimir Medvedkin /*
29b35df4ddSVladimir Medvedkin  * Check that rte_rib_create fails gracefully for incorrect user input
30b35df4ddSVladimir Medvedkin  * arguments
31b35df4ddSVladimir Medvedkin  */
32b35df4ddSVladimir Medvedkin int32_t
test_create_invalid(void)33b35df4ddSVladimir Medvedkin test_create_invalid(void)
34b35df4ddSVladimir Medvedkin {
35b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
36b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
37b35df4ddSVladimir Medvedkin 
38b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
39b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
40b35df4ddSVladimir Medvedkin 
41b35df4ddSVladimir Medvedkin 	/* rte_rib_create: rib name == NULL */
42b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(NULL, SOCKET_ID_ANY, &config);
43b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib == NULL,
44b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
45b35df4ddSVladimir Medvedkin 
46b35df4ddSVladimir Medvedkin 	/* rte_rib_create: config == NULL */
47b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, NULL);
48b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib == NULL,
49b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
50b35df4ddSVladimir Medvedkin 
51b35df4ddSVladimir Medvedkin 	/* socket_id < -1 is invalid */
52b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, -2, &config);
53b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib == NULL,
54b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
55b35df4ddSVladimir Medvedkin 
56b35df4ddSVladimir Medvedkin 	/* rte_rib_create: max_nodes = 0 */
57b35df4ddSVladimir Medvedkin 	config.max_nodes = 0;
58b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
59b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib == NULL,
60b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
61b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
62b35df4ddSVladimir Medvedkin 
63b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
64b35df4ddSVladimir Medvedkin }
65b35df4ddSVladimir Medvedkin 
66b35df4ddSVladimir Medvedkin /*
67b35df4ddSVladimir Medvedkin  * Create rib table then delete rib table 10 times
68b35df4ddSVladimir Medvedkin  * Use a slightly different rules size each time
69b35df4ddSVladimir Medvedkin  */
70b35df4ddSVladimir Medvedkin int32_t
test_multiple_create(void)71b35df4ddSVladimir Medvedkin test_multiple_create(void)
72b35df4ddSVladimir Medvedkin {
73b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
74b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
75b35df4ddSVladimir Medvedkin 	int32_t i;
76b35df4ddSVladimir Medvedkin 
77b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
78b35df4ddSVladimir Medvedkin 
7923f5fb66SVladimir Medvedkin 	for (i = 0; i < 100; i++) {
80b35df4ddSVladimir Medvedkin 		config.max_nodes = MAX_RULES - i;
81b35df4ddSVladimir Medvedkin 		rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
82b35df4ddSVladimir Medvedkin 		RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
83b35df4ddSVladimir Medvedkin 		rte_rib_free(rib);
84b35df4ddSVladimir Medvedkin 	}
85b35df4ddSVladimir Medvedkin 	/* Can not test free so return success */
86b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
87b35df4ddSVladimir Medvedkin }
88b35df4ddSVladimir Medvedkin 
89b35df4ddSVladimir Medvedkin /*
90b35df4ddSVladimir Medvedkin  * Call rte_rib_free for NULL pointer user input. Note: free has no return and
91b35df4ddSVladimir Medvedkin  * therefore it is impossible to check for failure but this test is added to
92b35df4ddSVladimir Medvedkin  * increase function coverage metrics and to validate that freeing null does
93b35df4ddSVladimir Medvedkin  * not crash.
94b35df4ddSVladimir Medvedkin  */
95b35df4ddSVladimir Medvedkin int32_t
test_free_null(void)96b35df4ddSVladimir Medvedkin test_free_null(void)
97b35df4ddSVladimir Medvedkin {
98b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
99b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
100b35df4ddSVladimir Medvedkin 
101b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
102b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
103b35df4ddSVladimir Medvedkin 
104b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
105b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
106b35df4ddSVladimir Medvedkin 
107b35df4ddSVladimir Medvedkin 	rte_rib_free(rib);
108b35df4ddSVladimir Medvedkin 	rte_rib_free(NULL);
109b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
110b35df4ddSVladimir Medvedkin }
111b35df4ddSVladimir Medvedkin 
112b35df4ddSVladimir Medvedkin /*
113b35df4ddSVladimir Medvedkin  * Check that rte_rib_insert fails gracefully for incorrect user input arguments
114b35df4ddSVladimir Medvedkin  */
115b35df4ddSVladimir Medvedkin int32_t
test_insert_invalid(void)116b35df4ddSVladimir Medvedkin test_insert_invalid(void)
117b35df4ddSVladimir Medvedkin {
118b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
119b35df4ddSVladimir Medvedkin 	struct rte_rib_node *node, *node1;
120b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
121b35df4ddSVladimir Medvedkin 	uint32_t ip = RTE_IPV4(0, 0, 0, 0);
122b35df4ddSVladimir Medvedkin 	uint8_t depth = 24;
123b35df4ddSVladimir Medvedkin 
124b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
125b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
126b35df4ddSVladimir Medvedkin 
127b35df4ddSVladimir Medvedkin 	/* rte_rib_insert: rib == NULL */
128b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(NULL, ip, depth);
129b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node == NULL,
130b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
131b35df4ddSVladimir Medvedkin 
132b35df4ddSVladimir Medvedkin 	/*Create valid rib to use in rest of test. */
133b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
134b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
135b35df4ddSVladimir Medvedkin 
136b35df4ddSVladimir Medvedkin 	/* rte_rib_insert: depth > MAX_DEPTH */
137b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(rib, ip, MAX_DEPTH + 1);
138b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node == NULL,
139b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
140b35df4ddSVladimir Medvedkin 
141b35df4ddSVladimir Medvedkin 	/* insert the same ip/depth twice*/
142b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(rib, ip, depth);
143b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
144b35df4ddSVladimir Medvedkin 	node1 = rte_rib_insert(rib, ip, depth);
145b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node1 == NULL,
146b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
147b35df4ddSVladimir Medvedkin 
148b35df4ddSVladimir Medvedkin 	rte_rib_free(rib);
149b35df4ddSVladimir Medvedkin 
150b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
151b35df4ddSVladimir Medvedkin }
152b35df4ddSVladimir Medvedkin 
153b35df4ddSVladimir Medvedkin /*
154b35df4ddSVladimir Medvedkin  * Call rte_rib_node access functions with incorrect input.
155b35df4ddSVladimir Medvedkin  * After call rte_rib_node access functions with correct args
156b35df4ddSVladimir Medvedkin  * and check the return values for correctness
157b35df4ddSVladimir Medvedkin  */
158b35df4ddSVladimir Medvedkin int32_t
test_get_fn(void)159b35df4ddSVladimir Medvedkin test_get_fn(void)
160b35df4ddSVladimir Medvedkin {
161b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
162b35df4ddSVladimir Medvedkin 	struct rte_rib_node *node;
163b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
164b35df4ddSVladimir Medvedkin 	void *ext;
165b35df4ddSVladimir Medvedkin 	uint32_t ip = RTE_IPV4(192, 0, 2, 0);
166b35df4ddSVladimir Medvedkin 	uint32_t ip_ret;
167b35df4ddSVladimir Medvedkin 	uint64_t nh_set = 10;
168b35df4ddSVladimir Medvedkin 	uint64_t nh_ret;
169b35df4ddSVladimir Medvedkin 	uint8_t depth = 24;
170b35df4ddSVladimir Medvedkin 	uint8_t depth_ret;
171b35df4ddSVladimir Medvedkin 	int ret;
172b35df4ddSVladimir Medvedkin 
173b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
174b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
175b35df4ddSVladimir Medvedkin 
176b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
177b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
178b35df4ddSVladimir Medvedkin 
179b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(rib, ip, depth);
180b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
181b35df4ddSVladimir Medvedkin 
182b35df4ddSVladimir Medvedkin 	/* test rte_rib_get_ip() with incorrect args */
183b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_ip(NULL, &ip_ret);
184b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
185b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
186b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_ip(node, NULL);
187b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
188b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
189b35df4ddSVladimir Medvedkin 
190b35df4ddSVladimir Medvedkin 	/* test rte_rib_get_depth() with incorrect args */
191b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_depth(NULL, &depth_ret);
192b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
193b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
194b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_depth(node, NULL);
195b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
196b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
197b35df4ddSVladimir Medvedkin 
198b35df4ddSVladimir Medvedkin 	/* test rte_rib_set_nh() with incorrect args */
199b35df4ddSVladimir Medvedkin 	ret = rte_rib_set_nh(NULL, nh_set);
200b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
201b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
202b35df4ddSVladimir Medvedkin 
203b35df4ddSVladimir Medvedkin 	/* test rte_rib_get_nh() with incorrect args */
204b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_nh(NULL, &nh_ret);
205b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
206b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
207b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_nh(node, NULL);
208b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret < 0,
209b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
210b35df4ddSVladimir Medvedkin 
211b35df4ddSVladimir Medvedkin 	/* test rte_rib_get_ext() with incorrect args */
212b35df4ddSVladimir Medvedkin 	ext = rte_rib_get_ext(NULL);
213b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ext == NULL,
214b35df4ddSVladimir Medvedkin 		"Call succeeded with invalid parameters\n");
215b35df4ddSVladimir Medvedkin 
216b35df4ddSVladimir Medvedkin 	/* check the return values */
217b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_ip(node, &ip_ret);
218b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT((ret == 0) && (ip_ret == ip),
219b35df4ddSVladimir Medvedkin 		"Failed to get proper node ip\n");
220b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_depth(node, &depth_ret);
221b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT((ret == 0) && (depth_ret == depth),
222b35df4ddSVladimir Medvedkin 		"Failed to get proper node depth\n");
223b35df4ddSVladimir Medvedkin 	ret = rte_rib_set_nh(node, nh_set);
224b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret == 0,
225b35df4ddSVladimir Medvedkin 		"Failed to set rte_rib_node nexthop\n");
226b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_nh(node, &nh_ret);
227b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT((ret == 0) && (nh_ret == nh_set),
228b35df4ddSVladimir Medvedkin 		"Failed to get proper nexthop\n");
229b35df4ddSVladimir Medvedkin 
230b35df4ddSVladimir Medvedkin 	rte_rib_free(rib);
231b35df4ddSVladimir Medvedkin 
232b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
233b35df4ddSVladimir Medvedkin }
234b35df4ddSVladimir Medvedkin 
235b35df4ddSVladimir Medvedkin /*
236b35df4ddSVladimir Medvedkin  * Call insert, lookup/lookup_exact and delete for a single rule
237b35df4ddSVladimir Medvedkin  */
238b35df4ddSVladimir Medvedkin int32_t
test_basic(void)239b35df4ddSVladimir Medvedkin test_basic(void)
240b35df4ddSVladimir Medvedkin {
241b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
242b35df4ddSVladimir Medvedkin 	struct rte_rib_node *node;
243b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
244b35df4ddSVladimir Medvedkin 
245b35df4ddSVladimir Medvedkin 	uint32_t ip = RTE_IPV4(192, 0, 2, 0);
246b35df4ddSVladimir Medvedkin 	uint64_t next_hop_add = 10;
247b35df4ddSVladimir Medvedkin 	uint64_t next_hop_return;
248b35df4ddSVladimir Medvedkin 	uint8_t depth = 24;
249b35df4ddSVladimir Medvedkin 	int ret;
250b35df4ddSVladimir Medvedkin 
251b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
252b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
253b35df4ddSVladimir Medvedkin 
254b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
255b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
256b35df4ddSVladimir Medvedkin 
257b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(rib, ip, depth);
258b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
259b35df4ddSVladimir Medvedkin 
260b35df4ddSVladimir Medvedkin 	ret = rte_rib_set_nh(node, next_hop_add);
261b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(ret == 0,
262b35df4ddSVladimir Medvedkin 		"Failed to set rte_rib_node field\n");
263b35df4ddSVladimir Medvedkin 
264b35df4ddSVladimir Medvedkin 	node = rte_rib_lookup(rib, ip);
265b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to lookup\n");
266b35df4ddSVladimir Medvedkin 
267b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_nh(node, &next_hop_return);
268b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT((ret == 0) && (next_hop_add == next_hop_return),
269b35df4ddSVladimir Medvedkin 		"Failed to get proper nexthop\n");
270b35df4ddSVladimir Medvedkin 
271b35df4ddSVladimir Medvedkin 	node = rte_rib_lookup_exact(rib, ip, depth);
272b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL,
273b35df4ddSVladimir Medvedkin 		"Failed to lookup\n");
274b35df4ddSVladimir Medvedkin 
275b35df4ddSVladimir Medvedkin 	ret = rte_rib_get_nh(node, &next_hop_return);
276b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT((ret == 0) && (next_hop_add == next_hop_return),
277b35df4ddSVladimir Medvedkin 		"Failed to get proper nexthop\n");
278b35df4ddSVladimir Medvedkin 
279b35df4ddSVladimir Medvedkin 	rte_rib_remove(rib, ip, depth);
280b35df4ddSVladimir Medvedkin 
281b35df4ddSVladimir Medvedkin 	node = rte_rib_lookup(rib, ip);
282b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node == NULL,
283b35df4ddSVladimir Medvedkin 		"Lookup returns non existent rule\n");
284b35df4ddSVladimir Medvedkin 	node = rte_rib_lookup_exact(rib, ip, depth);
285b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node == NULL,
286b35df4ddSVladimir Medvedkin 		"Lookup returns non existent rule\n");
287b35df4ddSVladimir Medvedkin 
288b35df4ddSVladimir Medvedkin 	rte_rib_free(rib);
289b35df4ddSVladimir Medvedkin 
290b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
291b35df4ddSVladimir Medvedkin }
292b35df4ddSVladimir Medvedkin 
293b35df4ddSVladimir Medvedkin int32_t
test_tree_traversal(void)294b35df4ddSVladimir Medvedkin test_tree_traversal(void)
295b35df4ddSVladimir Medvedkin {
296b35df4ddSVladimir Medvedkin 	struct rte_rib *rib = NULL;
297b35df4ddSVladimir Medvedkin 	struct rte_rib_node *node;
298b35df4ddSVladimir Medvedkin 	struct rte_rib_conf config;
299b35df4ddSVladimir Medvedkin 
300b35df4ddSVladimir Medvedkin 	uint32_t ip1 = RTE_IPV4(10, 10, 10, 0);
301b35df4ddSVladimir Medvedkin 	uint32_t ip2 = RTE_IPV4(10, 10, 130, 80);
302b35df4ddSVladimir Medvedkin 	uint8_t depth = 30;
303b35df4ddSVladimir Medvedkin 
304b35df4ddSVladimir Medvedkin 	config.max_nodes = MAX_RULES;
305b35df4ddSVladimir Medvedkin 	config.ext_sz = 0;
306b35df4ddSVladimir Medvedkin 
307b35df4ddSVladimir Medvedkin 	rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
308b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
309b35df4ddSVladimir Medvedkin 
310b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(rib, ip1, depth);
311b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
312b35df4ddSVladimir Medvedkin 
313b35df4ddSVladimir Medvedkin 	node = rte_rib_insert(rib, ip2, depth);
314b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
315b35df4ddSVladimir Medvedkin 
316b35df4ddSVladimir Medvedkin 	node = NULL;
317b35df4ddSVladimir Medvedkin 	node = rte_rib_get_nxt(rib, RTE_IPV4(10, 10, 130, 0), 24, node,
318b35df4ddSVladimir Medvedkin 			RTE_RIB_GET_NXT_ALL);
319b35df4ddSVladimir Medvedkin 	RTE_TEST_ASSERT(node != NULL, "Failed to get rib_node\n");
320b35df4ddSVladimir Medvedkin 
321b35df4ddSVladimir Medvedkin 	rte_rib_free(rib);
322b35df4ddSVladimir Medvedkin 
323b35df4ddSVladimir Medvedkin 	return TEST_SUCCESS;
324b35df4ddSVladimir Medvedkin }
325b35df4ddSVladimir Medvedkin 
326b35df4ddSVladimir Medvedkin static struct unit_test_suite rib_tests = {
327b35df4ddSVladimir Medvedkin 	.suite_name = "rib autotest",
328b35df4ddSVladimir Medvedkin 	.setup = NULL,
329b35df4ddSVladimir Medvedkin 	.teardown = NULL,
330b35df4ddSVladimir Medvedkin 	.unit_test_cases = {
331b35df4ddSVladimir Medvedkin 		TEST_CASE(test_create_invalid),
332b35df4ddSVladimir Medvedkin 		TEST_CASE(test_free_null),
333b35df4ddSVladimir Medvedkin 		TEST_CASE(test_insert_invalid),
334b35df4ddSVladimir Medvedkin 		TEST_CASE(test_get_fn),
335b35df4ddSVladimir Medvedkin 		TEST_CASE(test_basic),
336b35df4ddSVladimir Medvedkin 		TEST_CASE(test_tree_traversal),
337b35df4ddSVladimir Medvedkin 		TEST_CASES_END()
338b35df4ddSVladimir Medvedkin 	}
339b35df4ddSVladimir Medvedkin };
340b35df4ddSVladimir Medvedkin 
34123f5fb66SVladimir Medvedkin static struct unit_test_suite rib_slow_tests = {
34223f5fb66SVladimir Medvedkin 	.suite_name = "rib slow autotest",
34323f5fb66SVladimir Medvedkin 	.setup = NULL,
34423f5fb66SVladimir Medvedkin 	.teardown = NULL,
34523f5fb66SVladimir Medvedkin 	.unit_test_cases = {
34623f5fb66SVladimir Medvedkin 		TEST_CASE(test_multiple_create),
34723f5fb66SVladimir Medvedkin 		TEST_CASES_END()
34823f5fb66SVladimir Medvedkin 	}
34923f5fb66SVladimir Medvedkin };
35023f5fb66SVladimir Medvedkin 
351b35df4ddSVladimir Medvedkin /*
352b35df4ddSVladimir Medvedkin  * Do all unit tests.
353b35df4ddSVladimir Medvedkin  */
354b35df4ddSVladimir Medvedkin static int
test_rib(void)355b35df4ddSVladimir Medvedkin test_rib(void)
356b35df4ddSVladimir Medvedkin {
357b35df4ddSVladimir Medvedkin 	return unit_test_suite_runner(&rib_tests);
358b35df4ddSVladimir Medvedkin }
359b35df4ddSVladimir Medvedkin 
36023f5fb66SVladimir Medvedkin static int
test_slow_rib(void)36123f5fb66SVladimir Medvedkin test_slow_rib(void)
36223f5fb66SVladimir Medvedkin {
36323f5fb66SVladimir Medvedkin 	return unit_test_suite_runner(&rib_slow_tests);
36423f5fb66SVladimir Medvedkin }
36523f5fb66SVladimir Medvedkin 
366*e0a8442cSBruce Richardson REGISTER_FAST_TEST(rib_autotest, true, true, test_rib);
367*e0a8442cSBruce Richardson REGISTER_PERF_TEST(rib_slow_autotest, test_slow_rib);
368