xref: /f-stack/dpdk/app/test/test_efd.c (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2016-2017 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <rte_memcpy.h>
64418919fSjohnjiang #include <rte_malloc.h>
74418919fSjohnjiang #include <rte_efd.h>
84418919fSjohnjiang #include <rte_byteorder.h>
94418919fSjohnjiang #include <rte_random.h>
104418919fSjohnjiang #include <rte_debug.h>
114418919fSjohnjiang #include <rte_ip.h>
124418919fSjohnjiang 
134418919fSjohnjiang #include "test.h"
144418919fSjohnjiang 
154418919fSjohnjiang #define EFD_TEST_KEY_LEN 8
164418919fSjohnjiang #define TABLE_SIZE (1 << 21)
174418919fSjohnjiang #define ITERATIONS 3
184418919fSjohnjiang 
194418919fSjohnjiang #if RTE_EFD_VALUE_NUM_BITS == 32
204418919fSjohnjiang #define VALUE_BITMASK 0xffffffff
214418919fSjohnjiang #else
224418919fSjohnjiang #define VALUE_BITMASK ((1 << RTE_EFD_VALUE_NUM_BITS) - 1)
234418919fSjohnjiang #endif
244418919fSjohnjiang static unsigned int test_socket_id;
254418919fSjohnjiang 
264418919fSjohnjiang /* 5-tuple key type */
274418919fSjohnjiang struct flow_key {
284418919fSjohnjiang 	uint32_t ip_src;
294418919fSjohnjiang 	uint32_t ip_dst;
304418919fSjohnjiang 	uint16_t port_src;
314418919fSjohnjiang 	uint16_t port_dst;
324418919fSjohnjiang 	uint8_t proto;
33*2d9fd380Sjfb8856606 } __rte_packed;
344418919fSjohnjiang 
35*2d9fd380Sjfb8856606 RTE_LOG_REGISTER(efd_logtype_test, test.efd, INFO);
364418919fSjohnjiang 
374418919fSjohnjiang /*
384418919fSjohnjiang  * Print out result of unit test efd operation.
394418919fSjohnjiang  */
print_key_info(const char * msg,const struct flow_key * key,efd_value_t val)404418919fSjohnjiang static void print_key_info(const char *msg, const struct flow_key *key,
414418919fSjohnjiang 		efd_value_t val)
424418919fSjohnjiang {
434418919fSjohnjiang 	const uint8_t *p = (const uint8_t *) key;
444418919fSjohnjiang 	unsigned int i;
454418919fSjohnjiang 
464418919fSjohnjiang 	rte_log(RTE_LOG_DEBUG, efd_logtype_test, "%s key:0x", msg);
474418919fSjohnjiang 	for (i = 0; i < sizeof(struct flow_key); i++)
484418919fSjohnjiang 		rte_log(RTE_LOG_DEBUG, efd_logtype_test, "%02X", p[i]);
494418919fSjohnjiang 
504418919fSjohnjiang 	rte_log(RTE_LOG_DEBUG, efd_logtype_test, " @ val %d\n", val);
514418919fSjohnjiang }
524418919fSjohnjiang 
534418919fSjohnjiang /* Keys used by unit test functions */
544418919fSjohnjiang static struct flow_key keys[5] = {
554418919fSjohnjiang 	{
564418919fSjohnjiang 		.ip_src = RTE_IPV4(0x03, 0x02, 0x01, 0x00),
574418919fSjohnjiang 		.ip_dst = RTE_IPV4(0x07, 0x06, 0x05, 0x04),
584418919fSjohnjiang 		.port_src = 0x0908,
594418919fSjohnjiang 		.port_dst = 0x0b0a,
604418919fSjohnjiang 		.proto = 0x0c,
614418919fSjohnjiang 	},
624418919fSjohnjiang 	{
634418919fSjohnjiang 		.ip_src = RTE_IPV4(0x13, 0x12, 0x11, 0x10),
644418919fSjohnjiang 		.ip_dst = RTE_IPV4(0x17, 0x16, 0x15, 0x14),
654418919fSjohnjiang 		.port_src = 0x1918,
664418919fSjohnjiang 		.port_dst = 0x1b1a,
674418919fSjohnjiang 		.proto = 0x1c,
684418919fSjohnjiang 	},
694418919fSjohnjiang 	{
704418919fSjohnjiang 		.ip_src = RTE_IPV4(0x23, 0x22, 0x21, 0x20),
714418919fSjohnjiang 		.ip_dst = RTE_IPV4(0x27, 0x26, 0x25, 0x24),
724418919fSjohnjiang 		.port_src = 0x2928,
734418919fSjohnjiang 		.port_dst = 0x2b2a,
744418919fSjohnjiang 		.proto = 0x2c,
754418919fSjohnjiang 	},
764418919fSjohnjiang 	{
774418919fSjohnjiang 		.ip_src = RTE_IPV4(0x33, 0x32, 0x31, 0x30),
784418919fSjohnjiang 		.ip_dst = RTE_IPV4(0x37, 0x36, 0x35, 0x34),
794418919fSjohnjiang 		.port_src = 0x3938,
804418919fSjohnjiang 		.port_dst = 0x3b3a,
814418919fSjohnjiang 		.proto = 0x3c,
824418919fSjohnjiang 	},
834418919fSjohnjiang 	{
844418919fSjohnjiang 		.ip_src = RTE_IPV4(0x43, 0x42, 0x41, 0x40),
854418919fSjohnjiang 		.ip_dst = RTE_IPV4(0x47, 0x46, 0x45, 0x44),
864418919fSjohnjiang 		.port_src = 0x4948,
874418919fSjohnjiang 		.port_dst = 0x4b4a,
884418919fSjohnjiang 		.proto = 0x4c,
894418919fSjohnjiang 	}
904418919fSjohnjiang };
914418919fSjohnjiang /* Array to store the data */
924418919fSjohnjiang static efd_value_t data[5];
934418919fSjohnjiang 
efd_get_all_sockets_bitmask(void)944418919fSjohnjiang static inline uint8_t efd_get_all_sockets_bitmask(void)
954418919fSjohnjiang {
964418919fSjohnjiang 	uint8_t all_cpu_sockets_bitmask = 0;
974418919fSjohnjiang 	unsigned int i;
98*2d9fd380Sjfb8856606 	unsigned int next_lcore = rte_get_main_lcore();
994418919fSjohnjiang 	const int val_true = 1, val_false = 0;
1004418919fSjohnjiang 	for (i = 0; i < rte_lcore_count(); i++) {
1014418919fSjohnjiang 		all_cpu_sockets_bitmask |= 1 << rte_lcore_to_socket_id(next_lcore);
1024418919fSjohnjiang 		next_lcore = rte_get_next_lcore(next_lcore, val_false, val_true);
1034418919fSjohnjiang 	}
1044418919fSjohnjiang 
1054418919fSjohnjiang 	return all_cpu_sockets_bitmask;
1064418919fSjohnjiang }
1074418919fSjohnjiang 
1084418919fSjohnjiang /*
1094418919fSjohnjiang  * Basic sequence of operations for a single key:
1104418919fSjohnjiang  *      - add
1114418919fSjohnjiang  *      - lookup (hit)
1124418919fSjohnjiang  *      - delete
1134418919fSjohnjiang  * Note: lookup (miss) is not applicable since this is a filter
1144418919fSjohnjiang  */
test_add_delete(void)1154418919fSjohnjiang static int test_add_delete(void)
1164418919fSjohnjiang {
1174418919fSjohnjiang 	struct rte_efd_table *handle;
1184418919fSjohnjiang 	/* test with standard add/lookup/delete functions */
1194418919fSjohnjiang 	efd_value_t prev_value;
1204418919fSjohnjiang 	printf("Entering %s\n", __func__);
1214418919fSjohnjiang 
1224418919fSjohnjiang 	handle = rte_efd_create("test_add_delete",
1234418919fSjohnjiang 			TABLE_SIZE, sizeof(struct flow_key),
1244418919fSjohnjiang 			efd_get_all_sockets_bitmask(), test_socket_id);
1254418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(handle, "Error creating the EFD table\n");
1264418919fSjohnjiang 
1274418919fSjohnjiang 	data[0] = mrand48() & VALUE_BITMASK;
1284418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_efd_update(handle, test_socket_id, &keys[0],
1294418919fSjohnjiang 			data[0]),
1304418919fSjohnjiang 			"Error inserting the key");
1314418919fSjohnjiang 	print_key_info("Add", &keys[0], data[0]);
1324418919fSjohnjiang 
1334418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_efd_lookup(handle, test_socket_id, &keys[0]),
1344418919fSjohnjiang 			data[0],
1354418919fSjohnjiang 			"failed to find key");
1364418919fSjohnjiang 
1374418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_efd_delete(handle, test_socket_id, &keys[0],
1384418919fSjohnjiang 			&prev_value),
1394418919fSjohnjiang 			"failed to delete key");
1404418919fSjohnjiang 	TEST_ASSERT_EQUAL(prev_value, data[0],
1414418919fSjohnjiang 			"failed to delete the expected value, got %d, "
1424418919fSjohnjiang 			"expected %d", prev_value, data[0]);
1434418919fSjohnjiang 	print_key_info("Del", &keys[0], data[0]);
1444418919fSjohnjiang 
1454418919fSjohnjiang 	rte_efd_free(handle);
1464418919fSjohnjiang 
1474418919fSjohnjiang 	return 0;
1484418919fSjohnjiang }
1494418919fSjohnjiang 
1504418919fSjohnjiang /*
1514418919fSjohnjiang  * Sequence of operations for a single key:
1524418919fSjohnjiang  *      - add
1534418919fSjohnjiang  *      - lookup: hit
1544418919fSjohnjiang  *      - add: update
1554418919fSjohnjiang  *      - lookup: hit (updated data)
1564418919fSjohnjiang  *      - delete: hit
1574418919fSjohnjiang  */
test_add_update_delete(void)1584418919fSjohnjiang static int test_add_update_delete(void)
1594418919fSjohnjiang {
1604418919fSjohnjiang 	struct rte_efd_table *handle;
1614418919fSjohnjiang 	printf("Entering %s\n", __func__);
1624418919fSjohnjiang 	/* test with standard add/lookup/delete functions */
1634418919fSjohnjiang 	efd_value_t prev_value;
1644418919fSjohnjiang 	data[1] = mrand48() & VALUE_BITMASK;
1654418919fSjohnjiang 
1664418919fSjohnjiang 	handle = rte_efd_create("test_add_update_delete", TABLE_SIZE,
1674418919fSjohnjiang 			sizeof(struct flow_key),
1684418919fSjohnjiang 			efd_get_all_sockets_bitmask(), test_socket_id);
1694418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(handle, "Error creating the efd table\n");
1704418919fSjohnjiang 
1714418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_efd_update(handle, test_socket_id, &keys[1],
1724418919fSjohnjiang 			data[1]), "Error inserting the key");
1734418919fSjohnjiang 	print_key_info("Add", &keys[1], data[1]);
1744418919fSjohnjiang 
1754418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_efd_lookup(handle, test_socket_id, &keys[1]),
1764418919fSjohnjiang 			data[1], "failed to find key");
1774418919fSjohnjiang 	print_key_info("Lkp", &keys[1], data[1]);
1784418919fSjohnjiang 
1794418919fSjohnjiang 	data[1] = data[1] + 1;
1804418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_efd_update(handle, test_socket_id, &keys[1],
1814418919fSjohnjiang 			data[1]), "Error re-inserting the key");
1824418919fSjohnjiang 	print_key_info("Add", &keys[1], data[1]);
1834418919fSjohnjiang 
1844418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_efd_lookup(handle, test_socket_id, &keys[1]),
1854418919fSjohnjiang 			data[1], "failed to find key");
1864418919fSjohnjiang 	print_key_info("Lkp", &keys[1], data[1]);
1874418919fSjohnjiang 
1884418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_efd_delete(handle, test_socket_id, &keys[1],
1894418919fSjohnjiang 			&prev_value), "failed to delete key");
1904418919fSjohnjiang 	TEST_ASSERT_EQUAL(prev_value, data[1],
1914418919fSjohnjiang 			"failed to delete the expected value, got %d, "
1924418919fSjohnjiang 			"expected %d", prev_value, data[1]);
1934418919fSjohnjiang 	print_key_info("Del", &keys[1], data[1]);
1944418919fSjohnjiang 
1954418919fSjohnjiang 
1964418919fSjohnjiang 	rte_efd_free(handle);
1974418919fSjohnjiang 	return 0;
1984418919fSjohnjiang }
1994418919fSjohnjiang 
2004418919fSjohnjiang /*
2014418919fSjohnjiang  * Sequence of operations for find existing EFD table
2024418919fSjohnjiang  *
2034418919fSjohnjiang  *  - create table
2044418919fSjohnjiang  *  - find existing table: hit
2054418919fSjohnjiang  *  - find non-existing table: miss
2064418919fSjohnjiang  *
2074418919fSjohnjiang  */
test_efd_find_existing(void)2084418919fSjohnjiang static int test_efd_find_existing(void)
2094418919fSjohnjiang {
2104418919fSjohnjiang 	struct rte_efd_table *handle = NULL, *result = NULL;
2114418919fSjohnjiang 
2124418919fSjohnjiang 	printf("Entering %s\n", __func__);
2134418919fSjohnjiang 
2144418919fSjohnjiang 	/* Create EFD table. */
2154418919fSjohnjiang 	handle = rte_efd_create("efd_find_existing", TABLE_SIZE,
2164418919fSjohnjiang 			sizeof(struct flow_key),
2174418919fSjohnjiang 			efd_get_all_sockets_bitmask(), test_socket_id);
2184418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(handle, "Error creating the efd table\n");
2194418919fSjohnjiang 
2204418919fSjohnjiang 	/* Try to find existing EFD table */
2214418919fSjohnjiang 	result = rte_efd_find_existing("efd_find_existing");
2224418919fSjohnjiang 	TEST_ASSERT_EQUAL(result, handle, "could not find existing efd table");
2234418919fSjohnjiang 
2244418919fSjohnjiang 	/* Try to find non-existing EFD table */
2254418919fSjohnjiang 	result = rte_efd_find_existing("efd_find_non_existing");
2264418919fSjohnjiang 	TEST_ASSERT_NULL(result, "found table that shouldn't exist");
2274418919fSjohnjiang 
2284418919fSjohnjiang 	/* Cleanup. */
2294418919fSjohnjiang 	rte_efd_free(handle);
2304418919fSjohnjiang 
2314418919fSjohnjiang 	return 0;
2324418919fSjohnjiang }
2334418919fSjohnjiang 
2344418919fSjohnjiang /*
2354418919fSjohnjiang  * Sequence of operations for 5 keys
2364418919fSjohnjiang  *      - add keys
2374418919fSjohnjiang  *      - lookup keys: hit  (bulk)
2384418919fSjohnjiang  *      - add keys (update)
2394418919fSjohnjiang  *      - lookup keys: hit (updated data)
2404418919fSjohnjiang  *      - delete keys : hit
2414418919fSjohnjiang  */
test_five_keys(void)2424418919fSjohnjiang static int test_five_keys(void)
2434418919fSjohnjiang {
2444418919fSjohnjiang 	struct rte_efd_table *handle;
2454418919fSjohnjiang 	const void *key_array[5] = {0};
2464418919fSjohnjiang 	efd_value_t result[5] = {0};
2474418919fSjohnjiang 	efd_value_t prev_value;
2484418919fSjohnjiang 	unsigned int i;
2494418919fSjohnjiang 	printf("Entering %s\n", __func__);
2504418919fSjohnjiang 
2514418919fSjohnjiang 	handle = rte_efd_create("test_five_keys", TABLE_SIZE,
2524418919fSjohnjiang 			sizeof(struct flow_key),
2534418919fSjohnjiang 			efd_get_all_sockets_bitmask(), test_socket_id);
2544418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(handle, "Error creating the efd table\n");
2554418919fSjohnjiang 
2564418919fSjohnjiang 	/* Setup data */
2574418919fSjohnjiang 	for (i = 0; i < 5; i++)
2584418919fSjohnjiang 		data[i] = mrand48() & VALUE_BITMASK;
2594418919fSjohnjiang 
2604418919fSjohnjiang 	/* Add */
2614418919fSjohnjiang 	for (i = 0; i < 5; i++) {
2624418919fSjohnjiang 		TEST_ASSERT_SUCCESS(rte_efd_update(handle, test_socket_id,
2634418919fSjohnjiang 				&keys[i], data[i]),
2644418919fSjohnjiang 				"Error inserting the key");
2654418919fSjohnjiang 		print_key_info("Add", &keys[i], data[i]);
2664418919fSjohnjiang 	}
2674418919fSjohnjiang 
2684418919fSjohnjiang 	/* Lookup */
2694418919fSjohnjiang 	for (i = 0; i < 5; i++)
2704418919fSjohnjiang 		key_array[i] = &keys[i];
2714418919fSjohnjiang 
2724418919fSjohnjiang 	rte_efd_lookup_bulk(handle, test_socket_id, 5,
2734418919fSjohnjiang 			(void *) &key_array, result);
2744418919fSjohnjiang 
2754418919fSjohnjiang 	for (i = 0; i < 5; i++) {
2764418919fSjohnjiang 		TEST_ASSERT_EQUAL(result[i], data[i],
2774418919fSjohnjiang 				"bulk: failed to find key. Expected %d, got %d",
2784418919fSjohnjiang 				data[i], result[i]);
2794418919fSjohnjiang 		print_key_info("Lkp", &keys[i], data[i]);
2804418919fSjohnjiang 	}
2814418919fSjohnjiang 
2824418919fSjohnjiang 	/* Modify data (bulk) */
2834418919fSjohnjiang 	for (i = 0; i < 5; i++)
2844418919fSjohnjiang 		data[i] = data[i] + 1;
2854418919fSjohnjiang 
2864418919fSjohnjiang 	/* Add - update */
2874418919fSjohnjiang 	for (i = 0; i < 5; i++) {
2884418919fSjohnjiang 		TEST_ASSERT_SUCCESS(rte_efd_update(handle, test_socket_id,
2894418919fSjohnjiang 				&keys[i], data[i]),
2904418919fSjohnjiang 				"Error inserting the key");
2914418919fSjohnjiang 		print_key_info("Add", &keys[i], data[i]);
2924418919fSjohnjiang 	}
2934418919fSjohnjiang 
2944418919fSjohnjiang 	/* Lookup */
2954418919fSjohnjiang 	for (i = 0; i < 5; i++) {
2964418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_efd_lookup(handle, test_socket_id,
2974418919fSjohnjiang 				&keys[i]), data[i],
2984418919fSjohnjiang 				"failed to find key");
2994418919fSjohnjiang 		print_key_info("Lkp", &keys[i], data[i]);
3004418919fSjohnjiang 	}
3014418919fSjohnjiang 
3024418919fSjohnjiang 	/* Delete */
3034418919fSjohnjiang 	for (i = 0; i < 5; i++) {
3044418919fSjohnjiang 		TEST_ASSERT_SUCCESS(rte_efd_delete(handle, test_socket_id,
3054418919fSjohnjiang 				&keys[i], &prev_value),
3064418919fSjohnjiang 				"failed to delete key");
3074418919fSjohnjiang 		TEST_ASSERT_EQUAL(prev_value, data[i],
3084418919fSjohnjiang 				"failed to delete the expected value, got %d, "
3094418919fSjohnjiang 				"expected %d", prev_value, data[i]);
3104418919fSjohnjiang 		print_key_info("Del", &keys[i], data[i]);
3114418919fSjohnjiang 	}
3124418919fSjohnjiang 
3134418919fSjohnjiang 
3144418919fSjohnjiang 	rte_efd_free(handle);
3154418919fSjohnjiang 
3164418919fSjohnjiang 	return 0;
3174418919fSjohnjiang }
3184418919fSjohnjiang 
3194418919fSjohnjiang /*
3204418919fSjohnjiang  * Test to see the average table utilization (entries added/max entries)
3214418919fSjohnjiang  * before hitting a random entry that cannot be added
3224418919fSjohnjiang  */
test_average_table_utilization(void)3234418919fSjohnjiang static int test_average_table_utilization(void)
3244418919fSjohnjiang {
3254418919fSjohnjiang 	struct rte_efd_table *handle = NULL;
3264418919fSjohnjiang 	uint32_t num_rules_in = TABLE_SIZE;
3274418919fSjohnjiang 	uint8_t simple_key[EFD_TEST_KEY_LEN];
3284418919fSjohnjiang 	unsigned int i, j;
3294418919fSjohnjiang 	unsigned int added_keys, average_keys_added = 0;
3304418919fSjohnjiang 
3314418919fSjohnjiang 	printf("Evaluating table utilization and correctness, please wait\n");
3324418919fSjohnjiang 	fflush(stdout);
3334418919fSjohnjiang 
3344418919fSjohnjiang 	for (j = 0; j < ITERATIONS; j++) {
3354418919fSjohnjiang 		handle = rte_efd_create("test_efd", num_rules_in,
3364418919fSjohnjiang 				EFD_TEST_KEY_LEN, efd_get_all_sockets_bitmask(),
3374418919fSjohnjiang 				test_socket_id);
3384418919fSjohnjiang 		if (handle == NULL) {
3394418919fSjohnjiang 			printf("efd table creation failed\n");
3404418919fSjohnjiang 			return -1;
3414418919fSjohnjiang 		}
3424418919fSjohnjiang 
3434418919fSjohnjiang 		unsigned int succeeded = 0;
3444418919fSjohnjiang 		unsigned int lost_keys = 0;
3454418919fSjohnjiang 
3464418919fSjohnjiang 		/* Add random entries until key cannot be added */
3474418919fSjohnjiang 		for (added_keys = 0; added_keys < num_rules_in; added_keys++) {
3484418919fSjohnjiang 
3494418919fSjohnjiang 			for (i = 0; i < EFD_TEST_KEY_LEN; i++)
3504418919fSjohnjiang 				simple_key[i] = rte_rand() & 0xFF;
3514418919fSjohnjiang 
3524418919fSjohnjiang 			efd_value_t val = simple_key[0];
3534418919fSjohnjiang 
3544418919fSjohnjiang 			if (rte_efd_update(handle, test_socket_id, simple_key,
3554418919fSjohnjiang 						val))
3564418919fSjohnjiang 				break; /* continue;*/
3574418919fSjohnjiang 			if (rte_efd_lookup(handle, test_socket_id, simple_key)
3584418919fSjohnjiang 					!= val)
3594418919fSjohnjiang 				lost_keys++;
3604418919fSjohnjiang 			else
3614418919fSjohnjiang 				succeeded++;
3624418919fSjohnjiang 		}
3634418919fSjohnjiang 
3644418919fSjohnjiang 		average_keys_added += succeeded;
3654418919fSjohnjiang 
3664418919fSjohnjiang 		/* Reset the table */
3674418919fSjohnjiang 		rte_efd_free(handle);
3684418919fSjohnjiang 
3694418919fSjohnjiang 		/* Print progress on operations */
3704418919fSjohnjiang 		printf("Added %10u	Succeeded %10u	Lost %10u\n",
3714418919fSjohnjiang 				added_keys, succeeded, lost_keys);
3724418919fSjohnjiang 		fflush(stdout);
3734418919fSjohnjiang 	}
3744418919fSjohnjiang 
3754418919fSjohnjiang 	average_keys_added /= ITERATIONS;
3764418919fSjohnjiang 
3774418919fSjohnjiang 	printf("\nAverage table utilization = %.2f%% (%u/%u)\n",
3784418919fSjohnjiang 			((double) average_keys_added / num_rules_in * 100),
3794418919fSjohnjiang 			average_keys_added, num_rules_in);
3804418919fSjohnjiang 
3814418919fSjohnjiang 	return 0;
3824418919fSjohnjiang }
3834418919fSjohnjiang 
3844418919fSjohnjiang /*
3854418919fSjohnjiang  * Do tests for EFD creation with bad parameters.
3864418919fSjohnjiang  */
test_efd_creation_with_bad_parameters(void)3874418919fSjohnjiang static int test_efd_creation_with_bad_parameters(void)
3884418919fSjohnjiang {
3894418919fSjohnjiang 	struct rte_efd_table *handle, *tmp;
3904418919fSjohnjiang 	printf("Entering %s, **Errors are expected **\n", __func__);
3914418919fSjohnjiang 
3924418919fSjohnjiang 	handle = rte_efd_create("creation_with_bad_parameters_0", TABLE_SIZE, 0,
3934418919fSjohnjiang 			efd_get_all_sockets_bitmask(), test_socket_id);
3944418919fSjohnjiang 	if (handle != NULL) {
3954418919fSjohnjiang 		rte_efd_free(handle);
3964418919fSjohnjiang 		printf("Impossible creating EFD table successfully "
3974418919fSjohnjiang 			"if key_len in parameter is zero\n");
3984418919fSjohnjiang 		return -1;
3994418919fSjohnjiang 	}
4004418919fSjohnjiang 
4014418919fSjohnjiang 	handle = rte_efd_create("creation_with_bad_parameters_1", TABLE_SIZE,
4024418919fSjohnjiang 			sizeof(struct flow_key), 0, test_socket_id);
4034418919fSjohnjiang 	if (handle != NULL) {
4044418919fSjohnjiang 		rte_efd_free(handle);
4054418919fSjohnjiang 		printf("Impossible creating EFD table successfully "
4064418919fSjohnjiang 			"with invalid socket bitmask\n");
4074418919fSjohnjiang 		return -1;
4084418919fSjohnjiang 	}
4094418919fSjohnjiang 
4104418919fSjohnjiang 	handle = rte_efd_create("creation_with_bad_parameters_2", TABLE_SIZE,
4114418919fSjohnjiang 			sizeof(struct flow_key), efd_get_all_sockets_bitmask(),
4124418919fSjohnjiang 			255);
4134418919fSjohnjiang 	if (handle != NULL) {
4144418919fSjohnjiang 		rte_efd_free(handle);
4154418919fSjohnjiang 		printf("Impossible creating EFD table successfully "
4164418919fSjohnjiang 			"with invalid socket\n");
4174418919fSjohnjiang 		return -1;
4184418919fSjohnjiang 	}
4194418919fSjohnjiang 
4204418919fSjohnjiang 	/* test with same name should fail */
4214418919fSjohnjiang 	handle = rte_efd_create("same_name", TABLE_SIZE,
4224418919fSjohnjiang 			sizeof(struct flow_key),
4234418919fSjohnjiang 			efd_get_all_sockets_bitmask(), 0);
4244418919fSjohnjiang 	if (handle == NULL) {
4254418919fSjohnjiang 		printf("Cannot create first EFD table with 'same_name'\n");
4264418919fSjohnjiang 		return -1;
4274418919fSjohnjiang 	}
4284418919fSjohnjiang 	tmp = rte_efd_create("same_name", TABLE_SIZE, sizeof(struct flow_key),
4294418919fSjohnjiang 			efd_get_all_sockets_bitmask(), 0);
4304418919fSjohnjiang 	if (tmp != NULL) {
4314418919fSjohnjiang 		printf("Creation of EFD table with same name should fail\n");
4324418919fSjohnjiang 		rte_efd_free(handle);
4334418919fSjohnjiang 		rte_efd_free(tmp);
4344418919fSjohnjiang 		return -1;
4354418919fSjohnjiang 	}
4364418919fSjohnjiang 	rte_efd_free(handle);
4374418919fSjohnjiang 
4384418919fSjohnjiang 	printf("# Test successful. No more errors expected\n");
4394418919fSjohnjiang 
4404418919fSjohnjiang 	return 0;
4414418919fSjohnjiang }
4424418919fSjohnjiang 
4434418919fSjohnjiang static int
test_efd(void)4444418919fSjohnjiang test_efd(void)
4454418919fSjohnjiang {
4464418919fSjohnjiang 
4474418919fSjohnjiang 	/* Unit tests */
4484418919fSjohnjiang 	if (test_add_delete() < 0)
4494418919fSjohnjiang 		return -1;
4504418919fSjohnjiang 	if (test_efd_find_existing() < 0)
4514418919fSjohnjiang 		return -1;
4524418919fSjohnjiang 	if (test_add_update_delete() < 0)
4534418919fSjohnjiang 		return -1;
4544418919fSjohnjiang 	if (test_five_keys() < 0)
4554418919fSjohnjiang 		return -1;
4564418919fSjohnjiang 	if (test_efd_creation_with_bad_parameters() < 0)
4574418919fSjohnjiang 		return -1;
4584418919fSjohnjiang 	if (test_average_table_utilization() < 0)
4594418919fSjohnjiang 		return -1;
4604418919fSjohnjiang 
4614418919fSjohnjiang 	return 0;
4624418919fSjohnjiang }
4634418919fSjohnjiang 
4644418919fSjohnjiang REGISTER_TEST_COMMAND(efd_autotest, test_efd);
465