xref: /f-stack/dpdk/app/test/test_table.h (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <rte_table_stub.h>
64418919fSjohnjiang #include <rte_table_lpm.h>
74418919fSjohnjiang #include <rte_table_lpm_ipv6.h>
84418919fSjohnjiang #include <rte_table_hash.h>
94418919fSjohnjiang #include <rte_table_hash_cuckoo.h>
104418919fSjohnjiang #include <rte_table_array.h>
114418919fSjohnjiang #include <rte_pipeline.h>
124418919fSjohnjiang 
13*2d9fd380Sjfb8856606 #ifdef RTE_LIB_ACL
144418919fSjohnjiang #include <rte_table_acl.h>
154418919fSjohnjiang #endif
164418919fSjohnjiang 
174418919fSjohnjiang #include <rte_port_ring.h>
184418919fSjohnjiang #include <rte_port_ethdev.h>
194418919fSjohnjiang #include <rte_port_source_sink.h>
204418919fSjohnjiang 
214418919fSjohnjiang #ifndef TEST_TABLE_H_
224418919fSjohnjiang #define TEST_TABLE_H_
234418919fSjohnjiang 
244418919fSjohnjiang #define RING_SIZE 4096
254418919fSjohnjiang #define MAX_BULK 32
264418919fSjohnjiang #define N 65536
274418919fSjohnjiang #define TIME_S 5
284418919fSjohnjiang #define TEST_RING_FULL_EMTPY_ITER   8
294418919fSjohnjiang #define N_PORTS             2
304418919fSjohnjiang #define N_PKTS              2
314418919fSjohnjiang #define N_PKTS_EXT          6
324418919fSjohnjiang #define RING_RX rings_rx[0]
334418919fSjohnjiang #define RING_RX_2 rings_rx[1]
344418919fSjohnjiang #define RING_TX rings_tx[0]
354418919fSjohnjiang #define RING_TX_2 rings_tx[1]
364418919fSjohnjiang #define PORT_RX_RING_SIZE   128
374418919fSjohnjiang #define PORT_TX_RING_SIZE   512
384418919fSjohnjiang #define RING_RX_SIZE        128
394418919fSjohnjiang #define RING_TX_SIZE        128
404418919fSjohnjiang #define POOL_BUFFER_SIZE    RTE_MBUF_DEFAULT_BUF_SIZE
414418919fSjohnjiang #define POOL_SIZE           (32 * 1024)
424418919fSjohnjiang #define POOL_CACHE_SIZE     256
434418919fSjohnjiang #define BURST_SIZE          8
444418919fSjohnjiang #define WORKER_TYPE         1
454418919fSjohnjiang #define MAX_DUMMY_PORTS     2
464418919fSjohnjiang #define MP_NAME             "dummy_port_mempool"
474418919fSjohnjiang #define MBUF_COUNT          (8000 * MAX_DUMMY_PORTS)
484418919fSjohnjiang #define MP_CACHE_SZ         256
494418919fSjohnjiang #define MP_SOCKET           0
504418919fSjohnjiang #define MP_FLAGS            0
514418919fSjohnjiang 
524418919fSjohnjiang /* Macros */
534418919fSjohnjiang #define APP_METADATA_OFFSET(offset) (sizeof(struct rte_mbuf) + (offset))
544418919fSjohnjiang 
554418919fSjohnjiang #define RING_ENQUEUE(ring, value) do {					\
564418919fSjohnjiang 	struct rte_mbuf *m;						\
574418919fSjohnjiang 	uint32_t *k32, *signature;					\
584418919fSjohnjiang 	uint8_t *key;							\
594418919fSjohnjiang 									\
604418919fSjohnjiang 	m = rte_pktmbuf_alloc(pool);					\
614418919fSjohnjiang 	if (m == NULL)							\
624418919fSjohnjiang 		return -1;						\
634418919fSjohnjiang 	signature = RTE_MBUF_METADATA_UINT32_PTR(m,			\
644418919fSjohnjiang 			APP_METADATA_OFFSET(0));		\
654418919fSjohnjiang 	key = RTE_MBUF_METADATA_UINT8_PTR(m,			\
664418919fSjohnjiang 			APP_METADATA_OFFSET(32));		\
674418919fSjohnjiang 	k32 = (uint32_t *) key;						\
684418919fSjohnjiang 	k32[0] = (value);						\
694418919fSjohnjiang 	*signature = pipeline_test_hash(key, NULL, 0, 0);		\
704418919fSjohnjiang 	rte_ring_enqueue((ring), m);					\
714418919fSjohnjiang } while (0)
724418919fSjohnjiang 
734418919fSjohnjiang #define RUN_PIPELINE(pipeline) do {					\
744418919fSjohnjiang 	rte_pipeline_run((pipeline));					\
754418919fSjohnjiang 	rte_pipeline_flush((pipeline));					\
764418919fSjohnjiang } while (0)
774418919fSjohnjiang 
784418919fSjohnjiang #define VERIFY(var, value) do {						\
794418919fSjohnjiang 	if ((var) != -(value))						\
804418919fSjohnjiang 		return var;						\
814418919fSjohnjiang } while (0)
824418919fSjohnjiang 
834418919fSjohnjiang #define VERIFY_TRAFFIC(ring, sent, expected) do {			\
844418919fSjohnjiang 	unsigned i, n = 0;						\
854418919fSjohnjiang 	void *mbuf = NULL;						\
864418919fSjohnjiang 									\
874418919fSjohnjiang 	for (i = 0; i < (sent); i++) {					\
884418919fSjohnjiang 		if (!rte_ring_dequeue((ring), &mbuf)) {			\
894418919fSjohnjiang 			if (mbuf == NULL)				\
904418919fSjohnjiang 				continue;				\
914418919fSjohnjiang 			n++;						\
924418919fSjohnjiang 			rte_pktmbuf_free((struct rte_mbuf *)mbuf);	\
934418919fSjohnjiang 		}							\
944418919fSjohnjiang 		else							\
954418919fSjohnjiang 			break;						\
964418919fSjohnjiang 	}								\
974418919fSjohnjiang 	printf("Expected %d, got %d\n", expected, n);			\
984418919fSjohnjiang 	if (n != (expected)) {						\
994418919fSjohnjiang 		return -21;						\
1004418919fSjohnjiang 	}								\
1014418919fSjohnjiang } while (0)
1024418919fSjohnjiang 
1034418919fSjohnjiang /* Function definitions */
1044418919fSjohnjiang uint64_t pipeline_test_hash(
1054418919fSjohnjiang 	void *key,
106*2d9fd380Sjfb8856606 	__rte_unused void *key_mask,
107*2d9fd380Sjfb8856606 	__rte_unused uint32_t key_size,
108*2d9fd380Sjfb8856606 	__rte_unused uint64_t seed);
1094418919fSjohnjiang 
1104418919fSjohnjiang uint32_t pipeline_test_hash_cuckoo(
1114418919fSjohnjiang 	const void *key,
112*2d9fd380Sjfb8856606 	__rte_unused uint32_t key_size,
113*2d9fd380Sjfb8856606 	__rte_unused uint32_t seed);
1144418919fSjohnjiang 
1154418919fSjohnjiang /* Extern variables */
1164418919fSjohnjiang extern struct rte_pipeline *p;
1174418919fSjohnjiang extern struct rte_ring *rings_rx[N_PORTS];
1184418919fSjohnjiang extern struct rte_ring *rings_tx[N_PORTS];
1194418919fSjohnjiang extern struct rte_mempool *pool;
1204418919fSjohnjiang extern uint32_t port_in_id[N_PORTS];
1214418919fSjohnjiang extern uint32_t port_out_id[N_PORTS];
1224418919fSjohnjiang extern uint32_t port_out_id_type[3];
1234418919fSjohnjiang extern uint32_t table_id[N_PORTS*2];
1244418919fSjohnjiang extern uint64_t override_hit_mask;
1254418919fSjohnjiang extern uint64_t override_miss_mask;
1264418919fSjohnjiang extern uint64_t non_reserved_actions_hit;
1274418919fSjohnjiang extern uint64_t non_reserved_actions_miss;
1284418919fSjohnjiang extern uint8_t connect_miss_action_to_port_out;
1294418919fSjohnjiang extern uint8_t connect_miss_action_to_table;
1304418919fSjohnjiang extern uint32_t table_entry_default_action;
1314418919fSjohnjiang extern uint32_t table_entry_hit_action;
1324418919fSjohnjiang extern uint32_t table_entry_miss_action;
1334418919fSjohnjiang extern rte_pipeline_port_in_action_handler port_in_action;
1344418919fSjohnjiang extern rte_pipeline_port_out_action_handler port_out_action;
1354418919fSjohnjiang extern rte_pipeline_table_action_handler_hit action_handler_hit;
1364418919fSjohnjiang extern rte_pipeline_table_action_handler_miss action_handler_miss;
1374418919fSjohnjiang 
1384418919fSjohnjiang /* Global data types */
1394418919fSjohnjiang struct manage_ops {
1404418919fSjohnjiang 	uint32_t op_id;
1414418919fSjohnjiang 	void *op_data;
1424418919fSjohnjiang 	int expected_result;
1434418919fSjohnjiang };
1444418919fSjohnjiang 
1454418919fSjohnjiang /* Internal pipeline structures */
1464418919fSjohnjiang struct rte_port_in {
1474418919fSjohnjiang 	struct rte_port_in_ops ops;
1484418919fSjohnjiang 	uint32_t burst_size;
1494418919fSjohnjiang 	uint32_t table_id;
1504418919fSjohnjiang 	void *h_port;
1514418919fSjohnjiang };
1524418919fSjohnjiang 
1534418919fSjohnjiang struct rte_port_out {
1544418919fSjohnjiang 	struct rte_port_out_ops ops;
1554418919fSjohnjiang 	void *h_port;
1564418919fSjohnjiang };
1574418919fSjohnjiang 
1584418919fSjohnjiang struct rte_table {
1594418919fSjohnjiang 	struct rte_table_ops ops;
1604418919fSjohnjiang 	rte_pipeline_table_action_handler_hit f_action;
1614418919fSjohnjiang 	uint32_t table_next_id;
1624418919fSjohnjiang 	uint32_t table_next_id_valid;
1634418919fSjohnjiang 	uint8_t actions_lookup_miss[RTE_CACHE_LINE_SIZE];
1644418919fSjohnjiang 	uint32_t action_data_size;
1654418919fSjohnjiang 	void *h_table;
1664418919fSjohnjiang };
1674418919fSjohnjiang 
1684418919fSjohnjiang #define RTE_PIPELINE_MAX_NAME_SZ                           124
1694418919fSjohnjiang 
1704418919fSjohnjiang struct rte_pipeline {
1714418919fSjohnjiang 	char name[RTE_PIPELINE_MAX_NAME_SZ];
1724418919fSjohnjiang 	uint32_t socket_id;
1734418919fSjohnjiang 	struct rte_port_in ports_in[16];
1744418919fSjohnjiang 	struct rte_port_out ports_out[16];
1754418919fSjohnjiang 	struct rte_table tables[64];
1764418919fSjohnjiang 	uint32_t num_ports_in;
1774418919fSjohnjiang 	uint32_t num_ports_out;
1784418919fSjohnjiang 	uint32_t num_tables;
1794418919fSjohnjiang 	struct rte_mbuf *pkts[RTE_PORT_IN_BURST_SIZE_MAX];
1804418919fSjohnjiang 	struct rte_table_entry *actions[RTE_PORT_IN_BURST_SIZE_MAX];
1814418919fSjohnjiang 	uint64_t mask_action[64];
1824418919fSjohnjiang 	uint32_t mask_actions;
1834418919fSjohnjiang };
1844418919fSjohnjiang #endif
185