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