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