xref: /f-stack/dpdk/app/test/test_table.c (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <rte_byteorder.h>
64418919fSjohnjiang #include <rte_hexdump.h>
74418919fSjohnjiang #include <rte_string_fns.h>
84418919fSjohnjiang #include <string.h>
94418919fSjohnjiang #include "test.h"
104418919fSjohnjiang #include "test_table.h"
114418919fSjohnjiang #include "test_table_pipeline.h"
124418919fSjohnjiang #include "test_table_ports.h"
134418919fSjohnjiang #include "test_table_tables.h"
144418919fSjohnjiang #include "test_table_combined.h"
154418919fSjohnjiang #include "test_table_acl.h"
164418919fSjohnjiang 
174418919fSjohnjiang /* Global variables */
184418919fSjohnjiang struct rte_pipeline *p;
194418919fSjohnjiang struct rte_ring *rings_rx[N_PORTS];
204418919fSjohnjiang struct rte_ring *rings_tx[N_PORTS];
214418919fSjohnjiang struct rte_mempool *pool = NULL;
224418919fSjohnjiang 
234418919fSjohnjiang uint32_t port_in_id[N_PORTS];
244418919fSjohnjiang uint32_t port_out_id[N_PORTS];
254418919fSjohnjiang uint32_t port_out_id_type[3];
264418919fSjohnjiang uint32_t table_id[N_PORTS*2];
274418919fSjohnjiang uint64_t override_hit_mask = 0xFFFFFFFF;
284418919fSjohnjiang uint64_t override_miss_mask = 0xFFFFFFFF;
294418919fSjohnjiang uint64_t non_reserved_actions_hit = 0;
304418919fSjohnjiang uint64_t non_reserved_actions_miss = 0;
314418919fSjohnjiang uint8_t connect_miss_action_to_port_out = 0;
324418919fSjohnjiang uint8_t connect_miss_action_to_table = 0;
334418919fSjohnjiang uint32_t table_entry_default_action = RTE_PIPELINE_ACTION_DROP;
344418919fSjohnjiang uint32_t table_entry_hit_action = RTE_PIPELINE_ACTION_PORT;
354418919fSjohnjiang uint32_t table_entry_miss_action = RTE_PIPELINE_ACTION_DROP;
364418919fSjohnjiang rte_pipeline_port_in_action_handler port_in_action = NULL;
374418919fSjohnjiang rte_pipeline_port_out_action_handler port_out_action = NULL;
384418919fSjohnjiang rte_pipeline_table_action_handler_hit action_handler_hit = NULL;
394418919fSjohnjiang rte_pipeline_table_action_handler_miss action_handler_miss = NULL;
404418919fSjohnjiang 
414418919fSjohnjiang /* Function prototypes */
424418919fSjohnjiang static void app_init_rings(void);
434418919fSjohnjiang static void app_init_mbuf_pools(void);
444418919fSjohnjiang 
pipeline_test_hash(void * key,__rte_unused void * key_mask,__rte_unused uint32_t key_size,__rte_unused uint64_t seed)454418919fSjohnjiang uint64_t pipeline_test_hash(void *key,
46*2d9fd380Sjfb8856606 		__rte_unused void *key_mask,
47*2d9fd380Sjfb8856606 		__rte_unused uint32_t key_size,
48*2d9fd380Sjfb8856606 		__rte_unused uint64_t seed)
494418919fSjohnjiang {
504418919fSjohnjiang 	uint32_t *k32 = key;
514418919fSjohnjiang 	uint32_t ip_dst = rte_be_to_cpu_32(k32[0]);
524418919fSjohnjiang 	uint64_t signature = ip_dst;
534418919fSjohnjiang 
544418919fSjohnjiang 	return signature;
554418919fSjohnjiang }
564418919fSjohnjiang 
pipeline_test_hash_cuckoo(const void * key,__rte_unused uint32_t key_size,__rte_unused uint32_t seed)574418919fSjohnjiang uint32_t pipeline_test_hash_cuckoo(const void *key,
58*2d9fd380Sjfb8856606 		__rte_unused uint32_t key_size,
59*2d9fd380Sjfb8856606 		__rte_unused uint32_t seed)
604418919fSjohnjiang {
614418919fSjohnjiang 	const uint32_t *k32 = key;
624418919fSjohnjiang 	uint32_t ip_dst = rte_be_to_cpu_32(k32[0]);
634418919fSjohnjiang 	uint32_t signature = ip_dst;
644418919fSjohnjiang 
654418919fSjohnjiang 	return signature;
664418919fSjohnjiang }
674418919fSjohnjiang 
684418919fSjohnjiang static void
app_free_resources(void)694418919fSjohnjiang app_free_resources(void) {
704418919fSjohnjiang 	int i;
714418919fSjohnjiang 	for (i = 0; i < N_PORTS; i++)
724418919fSjohnjiang 		rte_ring_free(rings_rx[i]);
734418919fSjohnjiang 	rte_mempool_free(pool);
744418919fSjohnjiang }
754418919fSjohnjiang 
764418919fSjohnjiang static void
app_init_mbuf_pools(void)774418919fSjohnjiang app_init_mbuf_pools(void)
784418919fSjohnjiang {
794418919fSjohnjiang 	/* Init the buffer pool */
804418919fSjohnjiang 	printf("Getting/Creating the mempool ...\n");
814418919fSjohnjiang 	pool = rte_mempool_lookup("mempool");
824418919fSjohnjiang 	if (!pool) {
834418919fSjohnjiang 		pool = rte_pktmbuf_pool_create(
844418919fSjohnjiang 			"mempool",
854418919fSjohnjiang 			POOL_SIZE,
864418919fSjohnjiang 			POOL_CACHE_SIZE, 0, POOL_BUFFER_SIZE,
874418919fSjohnjiang 			0);
884418919fSjohnjiang 		if (pool == NULL)
894418919fSjohnjiang 			rte_panic("Cannot create mbuf pool\n");
904418919fSjohnjiang 	}
914418919fSjohnjiang }
924418919fSjohnjiang 
934418919fSjohnjiang static void
app_init_rings(void)944418919fSjohnjiang app_init_rings(void)
954418919fSjohnjiang {
964418919fSjohnjiang 	uint32_t i;
974418919fSjohnjiang 
984418919fSjohnjiang 	for (i = 0; i < N_PORTS; i++) {
994418919fSjohnjiang 		char name[32];
1004418919fSjohnjiang 
1014418919fSjohnjiang 		snprintf(name, sizeof(name), "app_ring_rx_%u", i);
1024418919fSjohnjiang 		rings_rx[i] = rte_ring_lookup(name);
1034418919fSjohnjiang 		if (rings_rx[i] == NULL) {
1044418919fSjohnjiang 			rings_rx[i] = rte_ring_create(
1054418919fSjohnjiang 				name,
1064418919fSjohnjiang 				RING_RX_SIZE,
1074418919fSjohnjiang 				0,
1084418919fSjohnjiang 				RING_F_SP_ENQ | RING_F_SC_DEQ);
1094418919fSjohnjiang 		}
1104418919fSjohnjiang 		if (rings_rx[i] == NULL)
1114418919fSjohnjiang 			rte_panic("Cannot create RX ring %u\n", i);
1124418919fSjohnjiang 	}
1134418919fSjohnjiang 
1144418919fSjohnjiang 	for (i = 0; i < N_PORTS; i++) {
1154418919fSjohnjiang 		char name[32];
1164418919fSjohnjiang 
1174418919fSjohnjiang 		snprintf(name, sizeof(name), "app_ring_tx_%u", i);
1184418919fSjohnjiang 		rings_tx[i] = rte_ring_lookup(name);
1194418919fSjohnjiang 		if (rings_tx[i] == NULL) {
1204418919fSjohnjiang 			rings_tx[i] = rte_ring_create(
1214418919fSjohnjiang 				name,
1224418919fSjohnjiang 				RING_TX_SIZE,
1234418919fSjohnjiang 				0,
1244418919fSjohnjiang 				RING_F_SP_ENQ | RING_F_SC_DEQ);
1254418919fSjohnjiang 		}
1264418919fSjohnjiang 		if (rings_tx[i] == NULL)
1274418919fSjohnjiang 			rte_panic("Cannot create TX ring %u\n", i);
1284418919fSjohnjiang 	}
1294418919fSjohnjiang 
1304418919fSjohnjiang }
1314418919fSjohnjiang 
1324418919fSjohnjiang static int
test_table(void)1334418919fSjohnjiang test_table(void)
1344418919fSjohnjiang {
1354418919fSjohnjiang 	int status, ret;
1364418919fSjohnjiang 	unsigned i;
1374418919fSjohnjiang 
1384418919fSjohnjiang 	ret = TEST_SUCCESS;
1394418919fSjohnjiang 
1404418919fSjohnjiang 	app_init_rings();
1414418919fSjohnjiang 	app_init_mbuf_pools();
1424418919fSjohnjiang 
1434418919fSjohnjiang 	printf("\n\n\n\n************Pipeline tests************\n");
1444418919fSjohnjiang 
1454418919fSjohnjiang 	if (test_table_pipeline() < 0) {
1464418919fSjohnjiang 		ret = TEST_FAILED;
1474418919fSjohnjiang 		goto end;
1484418919fSjohnjiang 	}
1494418919fSjohnjiang 
1504418919fSjohnjiang 	printf("\n\n\n\n************Port tests************\n");
1514418919fSjohnjiang 	for (i = 0; i < n_port_tests; i++) {
1524418919fSjohnjiang 		status = port_tests[i]();
1534418919fSjohnjiang 		if (status < 0) {
1544418919fSjohnjiang 			printf("\nPort test number %d failed (%d).\n", i,
1554418919fSjohnjiang 				status);
1564418919fSjohnjiang 			ret = TEST_FAILED;
1574418919fSjohnjiang 			goto end;
1584418919fSjohnjiang 		}
1594418919fSjohnjiang 	}
1604418919fSjohnjiang 
1614418919fSjohnjiang 	printf("\n\n\n\n************Table tests************\n");
1624418919fSjohnjiang 	for (i = 0; i < n_table_tests; i++) {
1634418919fSjohnjiang 		status = table_tests[i]();
1644418919fSjohnjiang 		if (status < 0) {
1654418919fSjohnjiang 			printf("\nTable test number %d failed (%d).\n", i,
1664418919fSjohnjiang 				status);
1674418919fSjohnjiang 			ret = TEST_FAILED;
1684418919fSjohnjiang 			goto end;
1694418919fSjohnjiang 		}
1704418919fSjohnjiang 	}
1714418919fSjohnjiang 
1724418919fSjohnjiang 	printf("\n\n\n\n************Table tests************\n");
1734418919fSjohnjiang 	for (i = 0; i < n_table_tests_combined; i++) {
1744418919fSjohnjiang 		status = table_tests_combined[i]();
1754418919fSjohnjiang 		if (status < 0) {
1764418919fSjohnjiang 			printf("\nCombined table test number %d failed with "
1774418919fSjohnjiang 				"reason number %d.\n", i, status);
1784418919fSjohnjiang 			ret = TEST_FAILED;
1794418919fSjohnjiang 			goto end;
1804418919fSjohnjiang 		}
1814418919fSjohnjiang 	}
1824418919fSjohnjiang 
183*2d9fd380Sjfb8856606 #ifdef RTE_LIB_ACL
1844418919fSjohnjiang 	printf("\n\n\n\n************ACL tests************\n");
1854418919fSjohnjiang 	if (test_table_acl() < 0) {
1864418919fSjohnjiang 		ret = TEST_FAILED;
1874418919fSjohnjiang 		goto end;
1884418919fSjohnjiang 	}
1894418919fSjohnjiang #endif
1904418919fSjohnjiang 
1914418919fSjohnjiang end:
1924418919fSjohnjiang 	app_free_resources();
1934418919fSjohnjiang 
1944418919fSjohnjiang 	return ret;
1954418919fSjohnjiang }
1964418919fSjohnjiang 
1974418919fSjohnjiang REGISTER_TEST_COMMAND(table_autotest, test_table);
198