1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang * Copyright(c) 2010-2014 Intel Corporation
3*4418919fSjohnjiang */
4*4418919fSjohnjiang
5*4418919fSjohnjiang #include "test_table_ports.h"
6*4418919fSjohnjiang #include "test_table.h"
7*4418919fSjohnjiang
8*4418919fSjohnjiang port_test port_tests[] = {
9*4418919fSjohnjiang test_port_ring_reader,
10*4418919fSjohnjiang test_port_ring_writer,
11*4418919fSjohnjiang };
12*4418919fSjohnjiang
13*4418919fSjohnjiang unsigned n_port_tests = RTE_DIM(port_tests);
14*4418919fSjohnjiang
15*4418919fSjohnjiang /* Port tests */
16*4418919fSjohnjiang int
test_port_ring_reader(void)17*4418919fSjohnjiang test_port_ring_reader(void)
18*4418919fSjohnjiang {
19*4418919fSjohnjiang int status, i;
20*4418919fSjohnjiang struct rte_port_ring_reader_params port_ring_reader_params;
21*4418919fSjohnjiang void *port;
22*4418919fSjohnjiang
23*4418919fSjohnjiang /* Invalid params */
24*4418919fSjohnjiang port = rte_port_ring_reader_ops.f_create(NULL, 0);
25*4418919fSjohnjiang if (port != NULL)
26*4418919fSjohnjiang return -1;
27*4418919fSjohnjiang
28*4418919fSjohnjiang status = rte_port_ring_reader_ops.f_free(port);
29*4418919fSjohnjiang if (status >= 0)
30*4418919fSjohnjiang return -2;
31*4418919fSjohnjiang
32*4418919fSjohnjiang /* Create and free */
33*4418919fSjohnjiang port_ring_reader_params.ring = RING_RX;
34*4418919fSjohnjiang port = rte_port_ring_reader_ops.f_create(&port_ring_reader_params, 0);
35*4418919fSjohnjiang if (port == NULL)
36*4418919fSjohnjiang return -3;
37*4418919fSjohnjiang
38*4418919fSjohnjiang status = rte_port_ring_reader_ops.f_free(port);
39*4418919fSjohnjiang if (status != 0)
40*4418919fSjohnjiang return -4;
41*4418919fSjohnjiang
42*4418919fSjohnjiang /* -- Traffic RX -- */
43*4418919fSjohnjiang int expected_pkts, received_pkts;
44*4418919fSjohnjiang struct rte_mbuf *res_mbuf[RTE_PORT_IN_BURST_SIZE_MAX];
45*4418919fSjohnjiang void *mbuf[RTE_PORT_IN_BURST_SIZE_MAX];
46*4418919fSjohnjiang
47*4418919fSjohnjiang port_ring_reader_params.ring = RING_RX;
48*4418919fSjohnjiang port = rte_port_ring_reader_ops.f_create(&port_ring_reader_params, 0);
49*4418919fSjohnjiang
50*4418919fSjohnjiang /* Single packet */
51*4418919fSjohnjiang mbuf[0] = (void *)rte_pktmbuf_alloc(pool);
52*4418919fSjohnjiang
53*4418919fSjohnjiang expected_pkts = rte_ring_sp_enqueue_burst(port_ring_reader_params.ring,
54*4418919fSjohnjiang mbuf, 1, NULL);
55*4418919fSjohnjiang received_pkts = rte_port_ring_reader_ops.f_rx(port, res_mbuf, 1);
56*4418919fSjohnjiang
57*4418919fSjohnjiang if (received_pkts < expected_pkts)
58*4418919fSjohnjiang return -5;
59*4418919fSjohnjiang
60*4418919fSjohnjiang rte_pktmbuf_free(res_mbuf[0]);
61*4418919fSjohnjiang
62*4418919fSjohnjiang /* Multiple packets */
63*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
64*4418919fSjohnjiang mbuf[i] = rte_pktmbuf_alloc(pool);
65*4418919fSjohnjiang
66*4418919fSjohnjiang expected_pkts = rte_ring_sp_enqueue_burst(port_ring_reader_params.ring,
67*4418919fSjohnjiang (void * const *) mbuf, RTE_PORT_IN_BURST_SIZE_MAX, NULL);
68*4418919fSjohnjiang received_pkts = rte_port_ring_reader_ops.f_rx(port, res_mbuf,
69*4418919fSjohnjiang RTE_PORT_IN_BURST_SIZE_MAX);
70*4418919fSjohnjiang
71*4418919fSjohnjiang if (received_pkts < expected_pkts)
72*4418919fSjohnjiang return -6;
73*4418919fSjohnjiang
74*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
75*4418919fSjohnjiang rte_pktmbuf_free(res_mbuf[i]);
76*4418919fSjohnjiang
77*4418919fSjohnjiang return 0;
78*4418919fSjohnjiang }
79*4418919fSjohnjiang
80*4418919fSjohnjiang int
test_port_ring_writer(void)81*4418919fSjohnjiang test_port_ring_writer(void)
82*4418919fSjohnjiang {
83*4418919fSjohnjiang int status, i;
84*4418919fSjohnjiang struct rte_port_ring_writer_params port_ring_writer_params;
85*4418919fSjohnjiang void *port;
86*4418919fSjohnjiang
87*4418919fSjohnjiang /* Invalid params */
88*4418919fSjohnjiang port = rte_port_ring_writer_ops.f_create(NULL, 0);
89*4418919fSjohnjiang if (port != NULL)
90*4418919fSjohnjiang return -1;
91*4418919fSjohnjiang
92*4418919fSjohnjiang status = rte_port_ring_writer_ops.f_free(port);
93*4418919fSjohnjiang if (status >= 0)
94*4418919fSjohnjiang return -2;
95*4418919fSjohnjiang
96*4418919fSjohnjiang port_ring_writer_params.ring = NULL;
97*4418919fSjohnjiang
98*4418919fSjohnjiang port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0);
99*4418919fSjohnjiang if (port != NULL)
100*4418919fSjohnjiang return -3;
101*4418919fSjohnjiang
102*4418919fSjohnjiang port_ring_writer_params.ring = RING_TX;
103*4418919fSjohnjiang port_ring_writer_params.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX + 1;
104*4418919fSjohnjiang
105*4418919fSjohnjiang port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0);
106*4418919fSjohnjiang if (port != NULL)
107*4418919fSjohnjiang return -4;
108*4418919fSjohnjiang
109*4418919fSjohnjiang /* Create and free */
110*4418919fSjohnjiang port_ring_writer_params.ring = RING_TX;
111*4418919fSjohnjiang port_ring_writer_params.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX;
112*4418919fSjohnjiang
113*4418919fSjohnjiang port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0);
114*4418919fSjohnjiang if (port == NULL)
115*4418919fSjohnjiang return -5;
116*4418919fSjohnjiang
117*4418919fSjohnjiang status = rte_port_ring_writer_ops.f_free(port);
118*4418919fSjohnjiang if (status != 0)
119*4418919fSjohnjiang return -6;
120*4418919fSjohnjiang
121*4418919fSjohnjiang /* -- Traffic TX -- */
122*4418919fSjohnjiang int expected_pkts, received_pkts;
123*4418919fSjohnjiang struct rte_mbuf *mbuf[RTE_PORT_IN_BURST_SIZE_MAX];
124*4418919fSjohnjiang struct rte_mbuf *res_mbuf[RTE_PORT_IN_BURST_SIZE_MAX];
125*4418919fSjohnjiang
126*4418919fSjohnjiang port_ring_writer_params.ring = RING_TX;
127*4418919fSjohnjiang port_ring_writer_params.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX;
128*4418919fSjohnjiang port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0);
129*4418919fSjohnjiang
130*4418919fSjohnjiang /* Single packet */
131*4418919fSjohnjiang mbuf[0] = rte_pktmbuf_alloc(pool);
132*4418919fSjohnjiang
133*4418919fSjohnjiang rte_port_ring_writer_ops.f_tx(port, mbuf[0]);
134*4418919fSjohnjiang rte_port_ring_writer_ops.f_flush(port);
135*4418919fSjohnjiang expected_pkts = 1;
136*4418919fSjohnjiang received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring,
137*4418919fSjohnjiang (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL);
138*4418919fSjohnjiang
139*4418919fSjohnjiang if (received_pkts < expected_pkts)
140*4418919fSjohnjiang return -7;
141*4418919fSjohnjiang
142*4418919fSjohnjiang rte_pktmbuf_free(res_mbuf[0]);
143*4418919fSjohnjiang
144*4418919fSjohnjiang /* Multiple packets */
145*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) {
146*4418919fSjohnjiang mbuf[i] = rte_pktmbuf_alloc(pool);
147*4418919fSjohnjiang rte_port_ring_writer_ops.f_tx(port, mbuf[i]);
148*4418919fSjohnjiang }
149*4418919fSjohnjiang
150*4418919fSjohnjiang expected_pkts = RTE_PORT_IN_BURST_SIZE_MAX;
151*4418919fSjohnjiang received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring,
152*4418919fSjohnjiang (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL);
153*4418919fSjohnjiang
154*4418919fSjohnjiang if (received_pkts < expected_pkts)
155*4418919fSjohnjiang return -8;
156*4418919fSjohnjiang
157*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
158*4418919fSjohnjiang rte_pktmbuf_free(res_mbuf[i]);
159*4418919fSjohnjiang
160*4418919fSjohnjiang /* TX Bulk */
161*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
162*4418919fSjohnjiang mbuf[i] = rte_pktmbuf_alloc(pool);
163*4418919fSjohnjiang rte_port_ring_writer_ops.f_tx_bulk(port, mbuf, (uint64_t)-1);
164*4418919fSjohnjiang
165*4418919fSjohnjiang expected_pkts = RTE_PORT_IN_BURST_SIZE_MAX;
166*4418919fSjohnjiang received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring,
167*4418919fSjohnjiang (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL);
168*4418919fSjohnjiang
169*4418919fSjohnjiang if (received_pkts < expected_pkts)
170*4418919fSjohnjiang return -8;
171*4418919fSjohnjiang
172*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
173*4418919fSjohnjiang rte_pktmbuf_free(res_mbuf[i]);
174*4418919fSjohnjiang
175*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
176*4418919fSjohnjiang mbuf[i] = rte_pktmbuf_alloc(pool);
177*4418919fSjohnjiang rte_port_ring_writer_ops.f_tx_bulk(port, mbuf, (uint64_t)-3);
178*4418919fSjohnjiang rte_port_ring_writer_ops.f_tx_bulk(port, mbuf, (uint64_t)2);
179*4418919fSjohnjiang
180*4418919fSjohnjiang expected_pkts = RTE_PORT_IN_BURST_SIZE_MAX;
181*4418919fSjohnjiang received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring,
182*4418919fSjohnjiang (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL);
183*4418919fSjohnjiang
184*4418919fSjohnjiang if (received_pkts < expected_pkts)
185*4418919fSjohnjiang return -9;
186*4418919fSjohnjiang
187*4418919fSjohnjiang for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++)
188*4418919fSjohnjiang rte_pktmbuf_free(res_mbuf[i]);
189*4418919fSjohnjiang
190*4418919fSjohnjiang return 0;
191*4418919fSjohnjiang }
192