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