xref: /dpdk/app/test/test_table_combined.c (revision cf435a07)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include <string.h>
35 #include "test_table_combined.h"
36 #include "test_table.h"
37 #include <rte_table_lpm_ipv6.h>
38 
39 #define MAX_TEST_KEYS 128
40 #define N_PACKETS 50
41 
42 enum check_table_result {
43 	CHECK_TABLE_OK,
44 	CHECK_TABLE_PORT_CONFIG,
45 	CHECK_TABLE_PORT_ENABLE,
46 	CHECK_TABLE_TABLE_CONFIG,
47 	CHECK_TABLE_ENTRY_ADD,
48 	CHECK_TABLE_DEFAULT_ENTRY_ADD,
49 	CHECK_TABLE_CONNECT,
50 	CHECK_TABLE_MANAGE_ERROR,
51 	CHECK_TABLE_CONSISTENCY,
52 	CHECK_TABLE_NO_TRAFFIC,
53 	CHECK_TABLE_INVALID_PARAMETER,
54 };
55 
56 struct table_packets {
57 	uint32_t hit_packet[MAX_TEST_KEYS];
58 	uint32_t miss_packet[MAX_TEST_KEYS];
59 	uint32_t n_hit_packets;
60 	uint32_t n_miss_packets;
61 };
62 
63 combined_table_test table_tests_combined[] = {
64 	test_table_lpm_combined,
65 	test_table_lpm_ipv6_combined,
66 	test_table_hash8lru,
67 	test_table_hash8ext,
68 	test_table_hash16lru,
69 	test_table_hash16ext,
70 	test_table_hash32lru,
71 	test_table_hash32ext,
72 	test_table_hash_cuckoo_combined,
73 };
74 
75 unsigned n_table_tests_combined = RTE_DIM(table_tests_combined);
76 
77 /* Generic port tester function */
78 static int
79 test_table_type(struct rte_table_ops *table_ops, void *table_args,
80 	void *key, struct table_packets *table_packets,
81 	struct manage_ops *manage_ops, unsigned n_ops)
82 {
83 	uint32_t ring_in_id, table_id, ring_out_id, ring_out_2_id;
84 	unsigned i;
85 
86 	RTE_SET_USED(manage_ops);
87 	RTE_SET_USED(n_ops);
88 	/* Create pipeline */
89 	struct rte_pipeline_params pipeline_params = {
90 		.name = "pipeline",
91 		.socket_id = 0,
92 	};
93 
94 	struct rte_pipeline *pipeline = rte_pipeline_create(&pipeline_params);
95 
96 	/* Create input ring */
97 	struct rte_port_ring_reader_params ring_params_rx = {
98 		.ring = RING_RX,
99 	};
100 
101 	struct rte_port_ring_writer_params ring_params_tx = {
102 		.ring = RING_RX,
103 		.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX,
104 	};
105 
106 	struct rte_pipeline_port_in_params ring_in_params = {
107 		.ops = &rte_port_ring_reader_ops,
108 		.arg_create = (void *)&ring_params_rx,
109 		.f_action = NULL,
110 		.burst_size = RTE_PORT_IN_BURST_SIZE_MAX,
111 	};
112 
113 	if (rte_pipeline_port_in_create(pipeline, &ring_in_params,
114 		&ring_in_id) != 0) {
115 		rte_pipeline_free(pipeline);
116 		return -CHECK_TABLE_PORT_CONFIG;
117 	}
118 
119 	/* Create table */
120 	struct rte_pipeline_table_params table_params = {
121 		.ops = table_ops,
122 		.arg_create = table_args,
123 		.f_action_hit = NULL,
124 		.f_action_miss = NULL,
125 		.arg_ah = NULL,
126 		.action_data_size = 0,
127 	};
128 
129 	if (rte_pipeline_table_create(pipeline, &table_params,
130 		&table_id) != 0) {
131 		rte_pipeline_free(pipeline);
132 		return -CHECK_TABLE_TABLE_CONFIG;
133 	}
134 
135 	/* Create output ports */
136 	ring_params_tx.ring = RING_TX;
137 
138 	struct rte_pipeline_port_out_params ring_out_params = {
139 		.ops = &rte_port_ring_writer_ops,
140 		.arg_create = (void *)&ring_params_tx,
141 		.f_action = NULL,
142 	};
143 
144 	if (rte_pipeline_port_out_create(pipeline, &ring_out_params,
145 		&ring_out_id) != 0) {
146 		rte_pipeline_free(pipeline);
147 		return -CHECK_TABLE_PORT_CONFIG;
148 	}
149 
150 	ring_params_tx.ring = RING_TX_2;
151 
152 	if (rte_pipeline_port_out_create(pipeline, &ring_out_params,
153 		&ring_out_2_id) != 0) {
154 		rte_pipeline_free(pipeline);
155 		return -CHECK_TABLE_PORT_CONFIG;
156 	}
157 
158 	/* Add entry to the table */
159 	struct rte_pipeline_table_entry default_entry = {
160 		.action = RTE_PIPELINE_ACTION_DROP,
161 		{.table_id = ring_out_id},
162 	};
163 
164 	struct rte_pipeline_table_entry table_entry = {
165 		.action = RTE_PIPELINE_ACTION_PORT,
166 		{.table_id = ring_out_id},
167 	};
168 
169 	struct rte_pipeline_table_entry *default_entry_ptr, *entry_ptr;
170 
171 	int key_found;
172 
173 	if (rte_pipeline_table_default_entry_add(pipeline, table_id,
174 		&default_entry, &default_entry_ptr) != 0) {
175 		rte_pipeline_free(pipeline);
176 		return -CHECK_TABLE_DEFAULT_ENTRY_ADD;
177 	}
178 
179 	if (rte_pipeline_table_entry_add(pipeline, table_id,
180 		key ? key : &table_entry, &table_entry, &key_found,
181 			&entry_ptr) != 0) {
182 		rte_pipeline_free(pipeline);
183 		return -CHECK_TABLE_ENTRY_ADD;
184 	}
185 
186 	/* Create connections and check consistency */
187 	if (rte_pipeline_port_in_connect_to_table(pipeline, ring_in_id,
188 		table_id) != 0) {
189 		rte_pipeline_free(pipeline);
190 		return -CHECK_TABLE_CONNECT;
191 	}
192 
193 	if (rte_pipeline_port_in_enable(pipeline, ring_in_id) != 0) {
194 		rte_pipeline_free(pipeline);
195 		return -CHECK_TABLE_PORT_ENABLE;
196 	}
197 
198 	if (rte_pipeline_check(pipeline) != 0) {
199 		rte_pipeline_free(pipeline);
200 		return -CHECK_TABLE_CONSISTENCY;
201 	}
202 
203 
204 
205 	/* Flow test - All hits */
206 	if (table_packets->n_hit_packets) {
207 		for (i = 0; i < table_packets->n_hit_packets; i++)
208 			RING_ENQUEUE(RING_RX, table_packets->hit_packet[i]);
209 
210 		RUN_PIPELINE(pipeline);
211 
212 		VERIFY_TRAFFIC(RING_TX, table_packets->n_hit_packets,
213 				table_packets->n_hit_packets);
214 	}
215 
216 	/* Flow test - All misses */
217 	if (table_packets->n_miss_packets) {
218 		for (i = 0; i < table_packets->n_miss_packets; i++)
219 			RING_ENQUEUE(RING_RX, table_packets->miss_packet[i]);
220 
221 		RUN_PIPELINE(pipeline);
222 
223 		VERIFY_TRAFFIC(RING_TX, table_packets->n_miss_packets, 0);
224 	}
225 
226 	/* Flow test - Half hits, half misses */
227 	if (table_packets->n_hit_packets && table_packets->n_miss_packets) {
228 		for (i = 0; i < (table_packets->n_hit_packets) / 2; i++)
229 			RING_ENQUEUE(RING_RX, table_packets->hit_packet[i]);
230 
231 		for (i = 0; i < (table_packets->n_miss_packets) / 2; i++)
232 			RING_ENQUEUE(RING_RX, table_packets->miss_packet[i]);
233 
234 		RUN_PIPELINE(pipeline);
235 		VERIFY_TRAFFIC(RING_TX, table_packets->n_hit_packets,
236 			table_packets->n_hit_packets / 2);
237 	}
238 
239 	/* Flow test - Single packet */
240 	if (table_packets->n_hit_packets) {
241 		RING_ENQUEUE(RING_RX, table_packets->hit_packet[0]);
242 		RUN_PIPELINE(pipeline);
243 		VERIFY_TRAFFIC(RING_TX, table_packets->n_hit_packets, 1);
244 	}
245 	if (table_packets->n_miss_packets) {
246 		RING_ENQUEUE(RING_RX, table_packets->miss_packet[0]);
247 		RUN_PIPELINE(pipeline);
248 		VERIFY_TRAFFIC(RING_TX, table_packets->n_miss_packets, 0);
249 	}
250 
251 
252 	/* Change table entry action */
253 	printf("Change entry action\n");
254 	table_entry.table_id = ring_out_2_id;
255 
256 	if (rte_pipeline_table_default_entry_add(pipeline, table_id,
257 		&default_entry, &default_entry_ptr) != 0) {
258 		rte_pipeline_free(pipeline);
259 		return -CHECK_TABLE_ENTRY_ADD;
260 	}
261 
262 	if (rte_pipeline_table_entry_add(pipeline, table_id,
263 		key ? key : &table_entry, &table_entry, &key_found,
264 			&entry_ptr) != 0) {
265 		rte_pipeline_free(pipeline);
266 		return -CHECK_TABLE_ENTRY_ADD;
267 	}
268 
269 	/* Check that traffic destination has changed */
270 	if (table_packets->n_hit_packets) {
271 		for (i = 0; i < table_packets->n_hit_packets; i++)
272 			RING_ENQUEUE(RING_RX, table_packets->hit_packet[i]);
273 
274 		RUN_PIPELINE(pipeline);
275 		VERIFY_TRAFFIC(RING_TX, table_packets->n_hit_packets, 0);
276 		VERIFY_TRAFFIC(RING_TX_2, table_packets->n_hit_packets,
277 			table_packets->n_hit_packets);
278 	}
279 
280 	printf("delete entry\n");
281 	/* Delete table entry */
282 	rte_pipeline_table_entry_delete(pipeline, table_id,
283 		key ? key : &table_entry, &key_found, NULL);
284 
285 	rte_pipeline_free(pipeline);
286 
287 	return 0;
288 }
289 
290 /* Table tests */
291 int
292 test_table_stub_combined(void)
293 {
294 	int status, i;
295 	struct table_packets table_packets;
296 
297 	printf("--------------\n");
298 	printf("RUNNING TEST - %s\n", __func__);
299 	printf("--------------\n");
300 	for (i = 0; i < N_PACKETS; i++)
301 		table_packets.hit_packet[i] = i;
302 
303 	table_packets.n_hit_packets = N_PACKETS;
304 	table_packets.n_miss_packets = 0;
305 
306 	status = test_table_type(&rte_table_stub_ops, NULL, NULL,
307 		&table_packets, NULL, 1);
308 	VERIFY(status, CHECK_TABLE_OK);
309 
310 	return 0;
311 }
312 
313 int
314 test_table_lpm_combined(void)
315 {
316 	int status, i;
317 
318 	/* Traffic flow */
319 	struct rte_table_lpm_params lpm_params = {
320 		.name = "LPM",
321 		.n_rules = 1 << 16,
322 		.number_tbl8s = 1 << 8,
323 		.flags = 0,
324 		.entry_unique_size = 8,
325 		.offset = APP_METADATA_OFFSET(0),
326 	};
327 
328 	struct rte_table_lpm_key lpm_key = {
329 		.ip = 0xadadadad,
330 		.depth = 16,
331 	};
332 
333 	struct table_packets table_packets;
334 
335 	printf("--------------\n");
336 	printf("RUNNING TEST - %s\n", __func__);
337 	printf("--------------\n");
338 
339 	for (i = 0; i < N_PACKETS; i++)
340 		table_packets.hit_packet[i] = 0xadadadad;
341 
342 	for (i = 0; i < N_PACKETS; i++)
343 		table_packets.miss_packet[i] = 0xfefefefe;
344 
345 	table_packets.n_hit_packets = N_PACKETS;
346 	table_packets.n_miss_packets = N_PACKETS;
347 
348 	status = test_table_type(&rte_table_lpm_ops, (void *)&lpm_params,
349 		(void *)&lpm_key, &table_packets, NULL, 0);
350 	VERIFY(status, CHECK_TABLE_OK);
351 
352 	/* Invalid parameters */
353 	lpm_params.n_rules = 0;
354 
355 	status = test_table_type(&rte_table_lpm_ops, (void *)&lpm_params,
356 		(void *)&lpm_key, &table_packets, NULL, 0);
357 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
358 
359 	lpm_params.n_rules = 1 << 24;
360 	lpm_key.depth = 0;
361 
362 	status = test_table_type(&rte_table_lpm_ops, (void *)&lpm_params,
363 		(void *)&lpm_key, &table_packets, NULL, 0);
364 	VERIFY(status, CHECK_TABLE_ENTRY_ADD);
365 
366 	lpm_key.depth = 33;
367 
368 	status = test_table_type(&rte_table_lpm_ops, (void *)&lpm_params,
369 		(void *)&lpm_key, &table_packets, NULL, 0);
370 	VERIFY(status, CHECK_TABLE_ENTRY_ADD);
371 
372 	return 0;
373 }
374 
375 int
376 test_table_lpm_ipv6_combined(void)
377 {
378 	int status, i;
379 
380 	/* Traffic flow */
381 	struct rte_table_lpm_ipv6_params lpm_ipv6_params = {
382 		.name = "LPM",
383 		.n_rules = 1 << 16,
384 		.number_tbl8s = 1 << 13,
385 		.entry_unique_size = 8,
386 		.offset = APP_METADATA_OFFSET(32),
387 	};
388 
389 	struct rte_table_lpm_ipv6_key lpm_ipv6_key = {
390 		.depth = 16,
391 	};
392 	memset(lpm_ipv6_key.ip, 0xad, 16);
393 
394 	struct table_packets table_packets;
395 
396 	printf("--------------\n");
397 	printf("RUNNING TEST - %s\n", __func__);
398 	printf("--------------\n");
399 	for (i = 0; i < N_PACKETS; i++)
400 		table_packets.hit_packet[i] = 0xadadadad;
401 
402 	for (i = 0; i < N_PACKETS; i++)
403 		table_packets.miss_packet[i] = 0xadadadab;
404 
405 	table_packets.n_hit_packets = N_PACKETS;
406 	table_packets.n_miss_packets = N_PACKETS;
407 
408 	status = test_table_type(&rte_table_lpm_ipv6_ops,
409 		(void *)&lpm_ipv6_params,
410 		(void *)&lpm_ipv6_key, &table_packets, NULL, 0);
411 	VERIFY(status, CHECK_TABLE_OK);
412 
413 	/* Invalid parameters */
414 	lpm_ipv6_params.n_rules = 0;
415 
416 	status = test_table_type(&rte_table_lpm_ipv6_ops,
417 		(void *)&lpm_ipv6_params,
418 		(void *)&lpm_ipv6_key, &table_packets, NULL, 0);
419 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
420 
421 	lpm_ipv6_params.n_rules = 1 << 24;
422 	lpm_ipv6_key.depth = 0;
423 
424 	status = test_table_type(&rte_table_lpm_ipv6_ops,
425 		(void *)&lpm_ipv6_params,
426 		(void *)&lpm_ipv6_key, &table_packets, NULL, 0);
427 	VERIFY(status, CHECK_TABLE_ENTRY_ADD);
428 
429 	lpm_ipv6_key.depth = 129;
430 	status = test_table_type(&rte_table_lpm_ipv6_ops,
431 		(void *)&lpm_ipv6_params,
432 		(void *)&lpm_ipv6_key, &table_packets, NULL, 0);
433 	VERIFY(status, CHECK_TABLE_ENTRY_ADD);
434 
435 	return 0;
436 }
437 
438 int
439 test_table_hash8lru(void)
440 {
441 	int status, i;
442 
443 	/* Traffic flow */
444 	struct rte_table_hash_key8_lru_params key8lru_params = {
445 		.n_entries = 1<<24,
446 		.f_hash = pipeline_test_hash,
447 		.signature_offset = APP_METADATA_OFFSET(0),
448 		.key_offset = APP_METADATA_OFFSET(32),
449 		.key_mask = NULL,
450 	};
451 
452 	uint8_t key8lru[8];
453 	uint32_t *k8lru = (uint32_t *) key8lru;
454 
455 	memset(key8lru, 0, sizeof(key8lru));
456 	k8lru[0] = 0xadadadad;
457 
458 	struct table_packets table_packets;
459 
460 	printf("--------------\n");
461 	printf("RUNNING TEST - %s\n", __func__);
462 	printf("--------------\n");
463 	for (i = 0; i < 50; i++)
464 		table_packets.hit_packet[i] = 0xadadadad;
465 
466 	for (i = 0; i < 50; i++)
467 		table_packets.miss_packet[i] = 0xfefefefe;
468 
469 	table_packets.n_hit_packets = 50;
470 	table_packets.n_miss_packets = 50;
471 
472 	status = test_table_type(&rte_table_hash_key8_lru_ops,
473 		(void *)&key8lru_params, (void *)key8lru, &table_packets,
474 			NULL, 0);
475 	VERIFY(status, CHECK_TABLE_OK);
476 
477 	/* Invalid parameters */
478 	key8lru_params.n_entries = 0;
479 
480 	status = test_table_type(&rte_table_hash_key8_lru_ops,
481 		(void *)&key8lru_params, (void *)key8lru, &table_packets,
482 			NULL, 0);
483 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
484 
485 	key8lru_params.n_entries = 1<<16;
486 	key8lru_params.f_hash = NULL;
487 
488 	status = test_table_type(&rte_table_hash_key8_lru_ops,
489 		(void *)&key8lru_params, (void *)key8lru, &table_packets,
490 			NULL, 0);
491 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
492 
493 	return 0;
494 }
495 
496 int
497 test_table_hash16lru(void)
498 {
499 	int status, i;
500 
501 	/* Traffic flow */
502 	struct rte_table_hash_key16_lru_params key16lru_params = {
503 		.n_entries = 1<<16,
504 		.f_hash = pipeline_test_hash,
505 		.seed = 0,
506 		.signature_offset = APP_METADATA_OFFSET(0),
507 		.key_offset = APP_METADATA_OFFSET(32),
508 		.key_mask = NULL,
509 	};
510 
511 	uint8_t key16lru[16];
512 	uint32_t *k16lru = (uint32_t *) key16lru;
513 
514 	memset(key16lru, 0, sizeof(key16lru));
515 	k16lru[0] = 0xadadadad;
516 
517 	struct table_packets table_packets;
518 
519 	printf("--------------\n");
520 	printf("RUNNING TEST - %s\n", __func__);
521 	printf("--------------\n");
522 	for (i = 0; i < 50; i++)
523 		table_packets.hit_packet[i] = 0xadadadad;
524 
525 	for (i = 0; i < 50; i++)
526 		table_packets.miss_packet[i] = 0xfefefefe;
527 
528 	table_packets.n_hit_packets = 50;
529 	table_packets.n_miss_packets = 50;
530 
531 	status = test_table_type(&rte_table_hash_key16_lru_ops,
532 		(void *)&key16lru_params, (void *)key16lru, &table_packets,
533 			NULL, 0);
534 	VERIFY(status, CHECK_TABLE_OK);
535 
536 	/* Invalid parameters */
537 	key16lru_params.n_entries = 0;
538 
539 	status = test_table_type(&rte_table_hash_key16_lru_ops,
540 		(void *)&key16lru_params, (void *)key16lru, &table_packets,
541 			NULL, 0);
542 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
543 
544 	key16lru_params.n_entries = 1<<16;
545 	key16lru_params.f_hash = NULL;
546 
547 	status = test_table_type(&rte_table_hash_key16_lru_ops,
548 		(void *)&key16lru_params, (void *)key16lru, &table_packets,
549 			NULL, 0);
550 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
551 
552 	return 0;
553 }
554 
555 int
556 test_table_hash32lru(void)
557 {
558 	int status, i;
559 
560 	/* Traffic flow */
561 	struct rte_table_hash_key32_lru_params key32lru_params = {
562 		.n_entries = 1<<16,
563 		.f_hash = pipeline_test_hash,
564 		.seed = 0,
565 		.signature_offset = APP_METADATA_OFFSET(0),
566 		.key_offset = APP_METADATA_OFFSET(32),
567 	};
568 
569 	uint8_t key32lru[32];
570 	uint32_t *k32lru = (uint32_t *) key32lru;
571 
572 	memset(key32lru, 0, sizeof(key32lru));
573 	k32lru[0] = 0xadadadad;
574 
575 	struct table_packets table_packets;
576 
577 	printf("--------------\n");
578 	printf("RUNNING TEST - %s\n", __func__);
579 	printf("--------------\n");
580 	for (i = 0; i < 50; i++)
581 		table_packets.hit_packet[i] = 0xadadadad;
582 
583 	for (i = 0; i < 50; i++)
584 		table_packets.miss_packet[i] = 0xbdadadad;
585 
586 	table_packets.n_hit_packets = 50;
587 	table_packets.n_miss_packets = 50;
588 
589 	status = test_table_type(&rte_table_hash_key32_lru_ops,
590 		(void *)&key32lru_params, (void *)key32lru, &table_packets,
591 		NULL, 0);
592 	VERIFY(status, CHECK_TABLE_OK);
593 
594 	/* Invalid parameters */
595 	key32lru_params.n_entries = 0;
596 
597 	status = test_table_type(&rte_table_hash_key32_lru_ops,
598 		(void *)&key32lru_params, (void *)key32lru, &table_packets,
599 		NULL, 0);
600 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
601 
602 	key32lru_params.n_entries = 1<<16;
603 	key32lru_params.f_hash = NULL;
604 
605 	status = test_table_type(&rte_table_hash_key32_lru_ops,
606 		(void *)&key32lru_params, (void *)key32lru, &table_packets,
607 		NULL, 0);
608 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
609 
610 	return 0;
611 }
612 
613 int
614 test_table_hash8ext(void)
615 {
616 	int status, i;
617 
618 	/* Traffic flow */
619 	struct rte_table_hash_key8_ext_params key8ext_params = {
620 		.n_entries = 1<<16,
621 		.n_entries_ext = 1<<15,
622 		.f_hash = pipeline_test_hash,
623 		.seed = 0,
624 		.signature_offset = APP_METADATA_OFFSET(0),
625 		.key_offset = APP_METADATA_OFFSET(32),
626 		.key_mask = NULL,
627 	};
628 
629 	uint8_t key8ext[8];
630 	uint32_t *k8ext = (uint32_t *) key8ext;
631 
632 	memset(key8ext, 0, sizeof(key8ext));
633 	k8ext[0] = 0xadadadad;
634 
635 	struct table_packets table_packets;
636 
637 	printf("--------------\n");
638 	printf("RUNNING TEST - %s\n", __func__);
639 	printf("--------------\n");
640 	for (i = 0; i < 50; i++)
641 		table_packets.hit_packet[i] = 0xadadadad;
642 
643 	for (i = 0; i < 50; i++)
644 		table_packets.miss_packet[i] = 0xbdadadad;
645 
646 	table_packets.n_hit_packets = 50;
647 	table_packets.n_miss_packets = 50;
648 
649 	status = test_table_type(&rte_table_hash_key8_ext_ops,
650 		(void *)&key8ext_params, (void *)key8ext, &table_packets,
651 		NULL, 0);
652 	VERIFY(status, CHECK_TABLE_OK);
653 
654 	/* Invalid parameters */
655 	key8ext_params.n_entries = 0;
656 
657 	status = test_table_type(&rte_table_hash_key8_ext_ops,
658 		(void *)&key8ext_params, (void *)key8ext, &table_packets,
659 		NULL, 0);
660 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
661 
662 	key8ext_params.n_entries = 1<<16;
663 	key8ext_params.f_hash = NULL;
664 
665 	status = test_table_type(&rte_table_hash_key8_ext_ops,
666 		(void *)&key8ext_params, (void *)key8ext, &table_packets,
667 		NULL, 0);
668 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
669 
670 	key8ext_params.f_hash = pipeline_test_hash;
671 	key8ext_params.n_entries_ext = 0;
672 
673 	status = test_table_type(&rte_table_hash_key8_ext_ops,
674 	(void *)&key8ext_params, (void *)key8ext, &table_packets, NULL, 0);
675 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
676 
677 	return 0;
678 }
679 
680 int
681 test_table_hash16ext(void)
682 {
683 	int status, i;
684 
685 	/* Traffic flow */
686 	struct rte_table_hash_key16_ext_params key16ext_params = {
687 		.n_entries = 1<<16,
688 		.n_entries_ext = 1<<15,
689 		.f_hash = pipeline_test_hash,
690 		.seed = 0,
691 		.signature_offset = APP_METADATA_OFFSET(0),
692 		.key_offset = APP_METADATA_OFFSET(32),
693 		.key_mask = NULL,
694 	};
695 
696 	uint8_t key16ext[16];
697 	uint32_t *k16ext = (uint32_t *) key16ext;
698 
699 	memset(key16ext, 0, sizeof(key16ext));
700 	k16ext[0] = 0xadadadad;
701 
702 	struct table_packets table_packets;
703 
704 	printf("--------------\n");
705 	printf("RUNNING TEST - %s\n", __func__);
706 	printf("--------------\n");
707 	for (i = 0; i < 50; i++)
708 		table_packets.hit_packet[i] = 0xadadadad;
709 
710 	for (i = 0; i < 50; i++)
711 		table_packets.miss_packet[i] = 0xbdadadad;
712 
713 	table_packets.n_hit_packets = 50;
714 	table_packets.n_miss_packets = 50;
715 
716 	status = test_table_type(&rte_table_hash_key16_ext_ops,
717 		(void *)&key16ext_params, (void *)key16ext, &table_packets,
718 		NULL, 0);
719 	VERIFY(status, CHECK_TABLE_OK);
720 
721 	/* Invalid parameters */
722 	key16ext_params.n_entries = 0;
723 
724 	status = test_table_type(&rte_table_hash_key16_ext_ops,
725 		(void *)&key16ext_params, (void *)key16ext, &table_packets,
726 		NULL, 0);
727 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
728 
729 	key16ext_params.n_entries = 1<<16;
730 	key16ext_params.f_hash = NULL;
731 
732 	status = test_table_type(&rte_table_hash_key16_ext_ops,
733 		(void *)&key16ext_params, (void *)key16ext, &table_packets,
734 		NULL, 0);
735 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
736 
737 	key16ext_params.f_hash = pipeline_test_hash;
738 	key16ext_params.n_entries_ext = 0;
739 
740 	status = test_table_type(&rte_table_hash_key16_ext_ops,
741 	(void *)&key16ext_params, (void *)key16ext, &table_packets, NULL, 0);
742 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
743 
744 	return 0;
745 }
746 
747 int
748 test_table_hash32ext(void)
749 {
750 	int status, i;
751 
752 	/* Traffic flow */
753 	struct rte_table_hash_key32_ext_params key32ext_params = {
754 		.n_entries = 1<<16,
755 		.n_entries_ext = 1<<15,
756 		.f_hash = pipeline_test_hash,
757 		.seed = 0,
758 		.signature_offset = APP_METADATA_OFFSET(0),
759 		.key_offset = APP_METADATA_OFFSET(32),
760 	};
761 
762 	uint8_t key32ext[32];
763 	uint32_t *k32ext = (uint32_t *) key32ext;
764 
765 	memset(key32ext, 0, sizeof(key32ext));
766 	k32ext[0] = 0xadadadad;
767 
768 	struct table_packets table_packets;
769 
770 	printf("--------------\n");
771 	printf("RUNNING TEST - %s\n", __func__);
772 	printf("--------------\n");
773 	for (i = 0; i < 50; i++)
774 		table_packets.hit_packet[i] = 0xadadadad;
775 
776 	for (i = 0; i < 50; i++)
777 		table_packets.miss_packet[i] = 0xbdadadad;
778 
779 	table_packets.n_hit_packets = 50;
780 	table_packets.n_miss_packets = 50;
781 
782 	status = test_table_type(&rte_table_hash_key32_ext_ops,
783 		(void *)&key32ext_params, (void *)key32ext, &table_packets,
784 		NULL, 0);
785 	VERIFY(status, CHECK_TABLE_OK);
786 
787 	/* Invalid parameters */
788 	key32ext_params.n_entries = 0;
789 
790 	status = test_table_type(&rte_table_hash_key32_ext_ops,
791 		(void *)&key32ext_params, (void *)key32ext, &table_packets,
792 		NULL, 0);
793 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
794 
795 	key32ext_params.n_entries = 1<<16;
796 	key32ext_params.f_hash = NULL;
797 
798 	status = test_table_type(&rte_table_hash_key32_ext_ops,
799 		(void *)&key32ext_params, (void *)key32ext, &table_packets,
800 		NULL, 0);
801 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
802 
803 	key32ext_params.f_hash = pipeline_test_hash;
804 	key32ext_params.n_entries_ext = 0;
805 
806 	status = test_table_type(&rte_table_hash_key32_ext_ops,
807 		(void *)&key32ext_params, (void *)key32ext, &table_packets,
808 		NULL, 0);
809 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
810 
811 	return 0;
812 }
813 
814 int
815 test_table_hash_cuckoo_combined(void)
816 {
817 	int status, i;
818 
819 	/* Traffic flow */
820 	struct rte_table_hash_cuckoo_params cuckoo_params = {
821 		.key_size = 32,
822 		.n_keys = 1<<16,
823 		.f_hash = pipeline_test_hash,
824 		.seed = 0,
825 		.signature_offset = APP_METADATA_OFFSET(0),
826 		.key_offset = APP_METADATA_OFFSET(32),
827 		.name = "CUCKOO_HASH",
828 	};
829 
830 	uint8_t key_cuckoo[32];
831 	uint32_t *kcuckoo = (uint32_t *) key_cuckoo;
832 
833 	memset(key_cuckoo, 0, sizeof(key_cuckoo));
834 	kcuckoo[0] = 0xadadadad;
835 
836 	struct table_packets table_packets;
837 
838 	printf("--------------\n");
839 	printf("RUNNING TEST - %s\n", __func__);
840 	printf("--------------\n");
841 	for (i = 0; i < 50; i++)
842 		table_packets.hit_packet[i] = 0xadadadad;
843 
844 	for (i = 0; i < 50; i++)
845 		table_packets.miss_packet[i] = 0xbdadadad;
846 
847 	table_packets.n_hit_packets = 50;
848 	table_packets.n_miss_packets = 50;
849 
850 	status = test_table_type(&rte_table_hash_cuckoo_dosig_ops,
851 		(void *)&cuckoo_params, (void *)key_cuckoo, &table_packets,
852 		NULL, 0);
853 	VERIFY(status, CHECK_TABLE_OK);
854 
855 	/* Invalid parameters */
856 	cuckoo_params.key_size = 0;
857 
858 	status = test_table_type(&rte_table_hash_cuckoo_dosig_ops,
859 		(void *)&cuckoo_params, (void *)key_cuckoo, &table_packets,
860 		NULL, 0);
861 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
862 
863 	cuckoo_params.key_size = 32;
864 	cuckoo_params.n_keys = 0;
865 
866 	status = test_table_type(&rte_table_hash_cuckoo_dosig_ops,
867 		(void *)&cuckoo_params, (void *)key_cuckoo, &table_packets,
868 		NULL, 0);
869 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
870 
871 	cuckoo_params.n_keys = 1<<16;
872 	cuckoo_params.f_hash = NULL;
873 
874 	status = test_table_type(&rte_table_hash_cuckoo_dosig_ops,
875 		(void *)&cuckoo_params, (void *)key_cuckoo, &table_packets,
876 		NULL, 0);
877 	VERIFY(status, CHECK_TABLE_TABLE_CONFIG);
878 
879 	return 0;
880 }
881 
882