xref: /dpdk/app/test/test_pmd_ring.c (revision e9d48c0072d36eb6423b45fba4ec49d0def6c36f)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2014 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 #include "test.h"
34 
35 #ifdef RTE_LIBRTE_PMD_RING
36 
37 #include <stdio.h>
38 
39 #include <rte_eth_ring.h>
40 #include <rte_ethdev.h>
41 
42 /* two test rings, r1 is used by two ports, r2 just by one */
43 static struct rte_ring *r1[2], *r2;
44 
45 static struct rte_ring *nullring = NULL;
46 static struct rte_mempool *mp;
47 static uint8_t start_idx; /* will store the port id of the first of our new ports */
48 
49 #define TX_PORT (uint8_t)(start_idx + 1)
50 #define RX_PORT (uint8_t)(start_idx + 2)
51 #define RXTX_PORT (uint8_t)(start_idx + 3)
52 #define RXTX_PORT2 (uint8_t)(start_idx + 4)
53 #define RXTX_PORT4 (uint8_t)(start_idx + 6)
54 #define RXTX_PORT5 (uint8_t)(start_idx + 7)
55 #define SOCKET0 0
56 
57 #define RING_SIZE 256
58 
59 #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
60 #define NB_MBUF   512
61 
62 
63 static int
64 test_ring_ethdev_create(void)
65 {
66 	int retval;
67 	printf("Testing ring pmd create\n");
68 
69 	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
70 	if (retval < 0) {
71 		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
72 		return -1;
73 	}
74 
75 	retval = rte_eth_from_rings(NULL, 0, NULL, 0, RTE_MAX_NUMA_NODES);
76 	if (retval >= 0) {
77 		printf("Failure, can create ring pmd on socket %d\n", RTE_MAX_NUMA_NODES);
78 		return -1;
79 	}
80 
81 	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
82 	if (retval >= 0) {
83 		printf("Failure, can create pmd with null rx rings\n");
84 		return -1;
85 	}
86 
87 	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
88 	if (retval >= 0) {
89 		printf("Failure, can create pmd with null tx rings\n");
90 		return -1;
91 	}
92 
93 	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
94 	if (retval < 0) {
95 		printf("Failure, failed to create TX-only ring pmd\n");
96 		return -1;
97 	}
98 
99 	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
100 	if (retval < 0) {
101 		printf("Failure, failed to create RX-only ring pmd\n");
102 		return -1;
103 	}
104 
105 	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
106 	if (retval < 0) {
107 		printf("Failure, failed to create RXTX ring pmd\n");
108 		return -1;
109 	}
110 
111 	return 0;
112 }
113 
114 static int
115 test_ethdev_configure(void)
116 {
117 	struct rte_eth_conf null_conf;
118 	struct rte_eth_link link;
119 
120 	memset(&null_conf, 0, sizeof(struct rte_eth_conf));
121 
122 	if ((TX_PORT >= RTE_MAX_ETHPORTS) || (RX_PORT >= RTE_MAX_ETHPORTS)\
123 		|| (RXTX_PORT >= RTE_MAX_ETHPORTS)) {
124 		printf(" TX/RX port exceed max eth ports\n");
125 		return -1;
126 	}
127 	if (rte_eth_dev_configure(TX_PORT, 1, 2, &null_conf) < 0) {
128 		printf("Configure failed for TX port\n");
129 		return -1;
130 	}
131 
132 	/* Test queue release */
133 	if (rte_eth_dev_configure(TX_PORT, 1, 1, &null_conf) < 0) {
134 		printf("Configure failed for TX port\n");
135 		return -1;
136 	}
137 	if (rte_eth_dev_configure(RX_PORT, 1, 1, &null_conf) < 0) {
138 		printf("Configure failed for RX port\n");
139 		return -1;
140 	}
141 	if (rte_eth_dev_configure(RXTX_PORT, 1, 1, &null_conf) < 0) {
142 		printf("Configure failed for RX port\n");
143 		return -1;
144 	}
145 
146 	if (rte_eth_tx_queue_setup(TX_PORT, 0, RING_SIZE, SOCKET0, NULL) < 0) {
147 		printf("TX queue setup failed\n");
148 		return -1;
149 	}
150 	if (rte_eth_rx_queue_setup(RX_PORT, 0, RING_SIZE, SOCKET0,
151 			NULL, mp) < 0) {
152 		printf("RX queue setup failed\n");
153 		return -1;
154 	}
155 	if (rte_eth_tx_queue_setup(RXTX_PORT, 0, RING_SIZE, SOCKET0, NULL) < 0) {
156 		printf("TX queue setup failed\n");
157 		return -1;
158 	}
159 	if (rte_eth_rx_queue_setup(RXTX_PORT, 0, RING_SIZE, SOCKET0,
160 			NULL, mp) < 0) {
161 		printf("RX queue setup failed\n");
162 		return -1;
163 	}
164 
165 	if (rte_eth_dev_start(TX_PORT) < 0) {
166 		printf("Error starting TX port\n");
167 		return -1;
168 	}
169 	if (rte_eth_dev_start(RX_PORT) < 0) {
170 		printf("Error starting RX port\n");
171 		return -1;
172 	}
173 	if (rte_eth_dev_start(RXTX_PORT) < 0) {
174 		printf("Error starting RX port\n");
175 		return -1;
176 	}
177 
178 	rte_eth_link_get(TX_PORT, &link);
179 	rte_eth_link_get(RX_PORT, &link);
180 	rte_eth_link_get(RXTX_PORT, &link);
181 
182 	return 0;
183 }
184 
185 static int
186 test_send_basic_packets(void)
187 {
188 	struct rte_mbuf  bufs[RING_SIZE];
189 	struct rte_mbuf *pbufs[RING_SIZE];
190 	int i;
191 
192 	printf("Testing ring pmd RX/TX\n");
193 
194 	for (i = 0; i < RING_SIZE/2; i++)
195 		pbufs[i] = &bufs[i];
196 
197 	if (rte_eth_tx_burst(TX_PORT, 0, pbufs, RING_SIZE/2) < RING_SIZE/2) {
198 		printf("Failed to transmit packet burst\n");
199 		return -1;
200 	}
201 
202 	if (rte_eth_rx_burst(RX_PORT, 0, pbufs, RING_SIZE) != RING_SIZE/2) {
203 		printf("Failed to receive packet burst\n");
204 		return -1;
205 	}
206 
207 	for (i = 0; i < RING_SIZE/2; i++)
208 		if (pbufs[i] != &bufs[i]) {
209 			printf("Error: received data does not match that transmitted\n");
210 			return -1;
211 		}
212 
213 	return 0;
214 }
215 
216 static int
217 test_get_stats(void)
218 {
219 	struct rte_eth_stats stats;
220 	struct rte_mbuf buf, *pbuf = &buf;
221 
222 	printf("Testing ring PMD stats\n");
223 
224 	/* check stats of RXTX port, should all be zero */
225 	rte_eth_stats_get(RXTX_PORT, &stats);
226 	if (stats.ipackets != 0 || stats.opackets != 0 ||
227 			stats.ibytes != 0 || stats.obytes != 0 ||
228 			stats.ierrors != 0 || stats.oerrors != 0) {
229 		printf("Error: RXTX port stats are not zero\n");
230 		return -1;
231 	}
232 
233 	/* send and receive 1 packet and check for stats update */
234 	if (rte_eth_tx_burst(RXTX_PORT, 0, &pbuf, 1) != 1) {
235 		printf("Error sending packet to RXTX port\n");
236 		return -1;
237 	}
238 	if (rte_eth_rx_burst(RXTX_PORT, 0, &pbuf, 1) != 1) {
239 		printf("Error receiving packet from RXTX port\n");
240 		return -1;
241 	}
242 
243 	rte_eth_stats_get(RXTX_PORT, &stats);
244 	if (stats.ipackets != 1 || stats.opackets != 1 ||
245 			stats.ibytes != 0 || stats.obytes != 0 ||
246 			stats.ierrors != 0 || stats.oerrors != 0) {
247 		printf("Error: RXTX port stats are not as expected\n");
248 		return -1;
249 	}
250 	return 0;
251 }
252 
253 static int
254 test_stats_reset(void)
255 {
256 	struct rte_eth_stats stats;
257 	struct rte_mbuf buf, *pbuf = &buf;
258 
259 	printf("Testing ring PMD stats reset\n");
260 
261 	rte_eth_stats_reset(RXTX_PORT);
262 
263 	/* check stats of RXTX port, should all be zero */
264 	rte_eth_stats_get(RXTX_PORT, &stats);
265 	if (stats.ipackets != 0 || stats.opackets != 0 ||
266 			stats.ibytes != 0 || stats.obytes != 0 ||
267 			stats.ierrors != 0 || stats.oerrors != 0) {
268 		printf("Error: RXTX port stats are not zero\n");
269 		return -1;
270 	}
271 
272 	/* send and receive 1 packet and check for stats update */
273 	if (rte_eth_tx_burst(RXTX_PORT, 0, &pbuf, 1) != 1) {
274 		printf("Error sending packet to RXTX port\n");
275 		return -1;
276 	}
277 
278 	if (rte_eth_rx_burst(RXTX_PORT, 0, &pbuf, 1) != 1) {
279 		printf("Error receiving packet from RXTX port\n");
280 		return -1;
281 	}
282 
283 	rte_eth_stats_get(RXTX_PORT, &stats);
284 	if (stats.ipackets != 1 || stats.opackets != 1 ||
285 			stats.ibytes != 0 || stats.obytes != 0 ||
286 			stats.ierrors != 0 || stats.oerrors != 0) {
287 		printf("Error: RXTX port stats are not as expected\n");
288 		return -1;
289 	}
290 
291 	rte_eth_stats_reset(RXTX_PORT);
292 
293 	/* check stats of RXTX port, should all be zero */
294 	rte_eth_stats_get(RXTX_PORT, &stats);
295 	if (stats.ipackets != 0 || stats.opackets != 0 ||
296 			stats.ibytes != 0 || stats.obytes != 0 ||
297 			stats.ierrors != 0 || stats.oerrors != 0) {
298 		printf("Error: RXTX port stats are not zero\n");
299 		return -1;
300 	}
301 
302 	return 0;
303 }
304 
305 static int
306 test_pmd_ring_init(void)
307 {
308 	const char * name1 = "R3";
309 	const char * name2 = "R4";
310 	const char * params_null = NULL;
311 	const char * params = "PARAMS";
312 	struct rte_eth_stats stats;
313 	struct rte_mbuf buf, *pbuf = &buf;
314 	struct rte_eth_conf null_conf;
315 
316 	printf("Testing ring pmd init\n");
317 
318 	if (rte_pmd_ring_init(name1, params_null) < 0) {
319 		printf("Testing ring pmd init fail\n");
320 		return -1;
321 	}
322 
323 	if (rte_pmd_ring_init(name2, params) < 0) {
324 		printf("Testing ring pmd init fail\n");
325 		return -1;
326 	}
327 
328 	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
329 		printf(" TX/RX port exceed max eth ports\n");
330 		return -1;
331 	}
332 	if (rte_eth_dev_configure(RXTX_PORT2, 1, 1, &null_conf) < 0) {
333 		printf("Configure failed for RXTX port\n");
334 		return -1;
335 	}
336 
337 	if (rte_eth_tx_queue_setup(RXTX_PORT2, 0, RING_SIZE, SOCKET0, NULL) < 0) {
338 		printf("TX queue setup failed\n");
339 		return -1;
340 	}
341 
342 	if (rte_eth_rx_queue_setup(RXTX_PORT2, 0, RING_SIZE, SOCKET0,
343 			NULL, mp) < 0) {
344 		printf("RX queue setup failed\n");
345 		return -1;
346 	}
347 
348 	if (rte_eth_dev_start(RXTX_PORT2) < 0) {
349 		printf("Error starting RX port\n");
350 		return -1;
351 	}
352 
353 	/* send and receive 1 packet and check for stats update */
354 	if (rte_eth_tx_burst(RXTX_PORT2, 0, &pbuf, 1) != 1) {
355 		printf("Error sending packet to RXTX port\n");
356 		return -1;
357 	}
358 
359 	if (rte_eth_rx_burst(RXTX_PORT2, 0, &pbuf, 1) != 1) {
360 		printf("Error receiving packet from RXTX port\n");
361 		return -1;
362 	}
363 
364 	rte_eth_stats_get(RXTX_PORT2, &stats);
365 	if (stats.ipackets != 1 || stats.opackets != 1 ||
366 			stats.ibytes != 0 || stats.obytes != 0 ||
367 			stats.ierrors != 0 || stats.oerrors != 0) {
368 		printf("Error: RXTX port stats are not as expected\n");
369 		return -1;
370 	}
371 
372 	rte_eth_dev_stop(RXTX_PORT2);
373 
374 	/* Test init same name pmd ring */
375 	rte_pmd_ring_init(name1, params_null);
376 	return 0;
377 }
378 
379 static int
380 test_pmd_ring_pair_create(void)
381 {
382 	const char * name1 = "_RNG_P0";
383 	struct rte_eth_stats stats, stats2;
384 	struct rte_mbuf buf, *pbuf = &buf;
385 	struct rte_eth_conf null_conf;
386 
387 	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
388 		printf("Create ring pair failed\n");
389 		return -1;
390 	}
391 
392 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
393 		printf(" TX/RX port exceed max eth ports\n");
394 		return -1;
395 	}
396 	if ((rte_eth_dev_configure(RXTX_PORT4, 1, 1, &null_conf) < 0)
397 		|| (rte_eth_dev_configure(RXTX_PORT5, 1, 1, &null_conf) < 0)) {
398 		printf("Configure failed for RXTX port\n");
399 		return -1;
400 	}
401 
402 	if ((rte_eth_tx_queue_setup(RXTX_PORT4, 0, RING_SIZE, SOCKET0, NULL) < 0)
403 		|| (rte_eth_tx_queue_setup(RXTX_PORT5, 0, RING_SIZE, SOCKET0, NULL) < 0)) {
404 		printf("TX queue setup failed\n");
405 		return -1;
406 	}
407 
408 	if ((rte_eth_rx_queue_setup(RXTX_PORT4, 0, RING_SIZE, SOCKET0, NULL, mp) < 0)
409 		|| (rte_eth_rx_queue_setup(RXTX_PORT5, 0, RING_SIZE, SOCKET0, NULL, mp) < 0)) {
410 		printf("RX queue setup failed\n");
411 		return -1;
412 	}
413 
414 	if ((rte_eth_dev_start(RXTX_PORT4) < 0)
415 		|| (rte_eth_dev_start(RXTX_PORT5) < 0)) {
416 		printf("Error starting RXTX port\n");
417 		return -1;
418 	}
419 
420 	/* send and receive 1 packet and check for stats update */
421 	if (rte_eth_tx_burst(RXTX_PORT4, 0, &pbuf, 1) != 1) {
422 		printf("Error sending packet to RXTX port\n");
423 		return -1;
424 	}
425 
426 	if (rte_eth_rx_burst(RXTX_PORT5, 0, &pbuf, 1) != 1) {
427 		printf("Error receiving packet from RXTX port\n");
428 		return -1;
429 	}
430 
431 	rte_eth_stats_get(RXTX_PORT4, &stats);
432 	rte_eth_stats_get(RXTX_PORT5, &stats2);
433 	if (stats.ipackets != 0 || stats.opackets != 1 ||
434 			stats.ibytes != 0 || stats.obytes != 0 ||
435 			stats.ierrors != 0 || stats.oerrors != 0) {
436 		printf("Error: RXTX port stats are not as expected\n");
437 		return -1;
438 	}
439 
440 	if (stats2.ipackets != 1 || stats2.opackets != 0 ||
441 			stats2.ibytes != 0 || stats2.obytes != 0 ||
442 			stats2.ierrors != 0 || stats2.oerrors != 0) {
443 		printf("Error: RXTX port stats are not as expected\n");
444 		return -1;
445 	}
446 
447 	rte_eth_dev_stop(RXTX_PORT4);
448 	rte_eth_dev_stop(RXTX_PORT5);
449 
450 	/* Test create same name ring pair */
451 	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
452 		printf("Create same name ring pair error\n");
453 		return -1;
454 	}
455 	return 0;
456 }
457 
458 static int
459 test_pmd_ring_pair_attach(void)
460 {
461 	const char * name1 = "_RNG_P0";
462 	const char * name2 = "_RNG_P1";
463 	struct rte_eth_stats stats, stats2;
464 	struct rte_mbuf buf, *pbuf = &buf;
465 	struct rte_eth_conf null_conf;
466 
467 	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
468 		printf("Attach ring pair failed\n");
469 		return -1;
470 	}
471 
472 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
473 		printf(" TX/RX port exceed max eth ports\n");
474 		return -1;
475 	}
476 	if ((rte_eth_dev_configure(RXTX_PORT4, 1, 1, &null_conf) < 0)
477 		|| (rte_eth_dev_configure(RXTX_PORT5, 1, 1, &null_conf) < 0)) {
478 		printf("Configure failed for RXTX port\n");
479 		return -1;
480 	}
481 
482 	if ((rte_eth_tx_queue_setup(RXTX_PORT4, 0, RING_SIZE, SOCKET0, NULL) < 0)
483 		|| (rte_eth_tx_queue_setup(RXTX_PORT5, 0, RING_SIZE, SOCKET0, NULL) < 0)) {
484 		printf("TX queue setup failed\n");
485 		return -1;
486 	}
487 
488 	if ((rte_eth_rx_queue_setup(RXTX_PORT4, 0, RING_SIZE, SOCKET0, NULL, mp) < 0)
489 		|| (rte_eth_rx_queue_setup(RXTX_PORT5, 0, RING_SIZE, SOCKET0, NULL, mp) < 0)) {
490 		printf("RX queue setup failed\n");
491 		return -1;
492 	}
493 
494 	if ((rte_eth_dev_start(RXTX_PORT4) < 0)
495 		|| (rte_eth_dev_start(RXTX_PORT5) < 0)) {
496 		printf("Error starting RXTX port\n");
497 		return -1;
498 	}
499 
500 	rte_eth_stats_reset(RXTX_PORT4);
501 	rte_eth_stats_reset(RXTX_PORT5);
502 
503 	/* send and receive 1 packet and check for stats update */
504 	if (rte_eth_tx_burst(RXTX_PORT4, 0, &pbuf, 1) != 1) {
505 		printf("Error sending packet to RXTX port\n");
506 		return -1;
507 	}
508 	if (rte_eth_rx_burst(RXTX_PORT5, 0, &pbuf, 1) != 1) {
509 		printf("Error receiving packet from RXTX port\n");
510 		return -1;
511 	}
512 
513 	rte_eth_stats_get(RXTX_PORT4, &stats);
514 	rte_eth_stats_get(RXTX_PORT5, &stats2);
515 	if (stats.ipackets != 0 || stats.opackets != 1 ||
516 			stats.ibytes != 0 || stats.obytes != 0 ||
517 			stats.ierrors != 0 || stats.oerrors != 0) {
518 		printf("Error: RXTX port stats are not as expected\n");
519 		return -1;
520 	}
521 
522 	if (stats2.ipackets != 1 || stats2.opackets != 0 ||
523 			stats2.ibytes != 0 || stats2.obytes != 0 ||
524 			stats2.ierrors != 0 || stats2.oerrors != 0) {
525 		printf("Error: RXTX port stats are not as expected\n");
526 		return -1;
527 	}
528 
529 	rte_eth_dev_stop(RXTX_PORT4);
530 	rte_eth_dev_stop(RXTX_PORT5);
531 
532 	/* Test attach non-existing ring pair */
533 	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
534 		printf("Attach non-existing ring pair error\n");
535 		return -1;
536 	}
537 	return 0;
538 }
539 
540 int
541 test_pmd_ring(void)
542 {
543 	r1[0] = rte_ring_create("R1", RING_SIZE, 0, 0);
544 	r1[1] = rte_ring_create("R2", RING_SIZE, 0, 0);
545 	if (r1[0] == NULL && (r1[0] = rte_ring_lookup("R1")) == NULL)
546 		return -1;
547 	if (r1[1] == NULL && (r1[1] = rte_ring_lookup("R2")) == NULL)
548 		return -1;
549 
550 	r2 = rte_ring_create("R3", RING_SIZE, 0, RING_F_SP_ENQ|RING_F_SC_DEQ);
551 	if (r2 == NULL && (r2 = rte_ring_lookup("R3")) == NULL)
552 		return -1;
553 
554 	mp = rte_mempool_create("mbuf_pool", NB_MBUF,
555 			MBUF_SIZE, 32,
556 			sizeof(struct rte_pktmbuf_pool_private),
557 			rte_pktmbuf_pool_init, NULL,
558 			rte_pktmbuf_init, NULL,
559 			rte_socket_id(), 0);
560 	if (mp == NULL)
561 		return -1;
562 
563 	start_idx = rte_eth_dev_count();
564 
565 	if ((TX_PORT >= RTE_MAX_ETHPORTS) || (RX_PORT >= RTE_MAX_ETHPORTS)\
566 		|| (RXTX_PORT >= RTE_MAX_ETHPORTS)) {
567 		printf(" TX/RX port exceed max eth ports\n");
568 		return -1;
569 	}
570 
571 	if (test_ring_ethdev_create() < 0)
572 		return -1;
573 
574 	if (test_ethdev_configure() < 0)
575 		return -1;
576 
577 	if (test_send_basic_packets() < 0)
578 		return -1;
579 
580 	if (test_get_stats() < 0)
581 		return -1;
582 
583 	if (test_stats_reset() < 0)
584 		return -1;
585 
586 	rte_eth_dev_stop(RX_PORT);
587 	rte_eth_dev_stop(TX_PORT);
588 	rte_eth_dev_stop(RXTX_PORT);
589 
590 	if (test_pmd_ring_init() < 0)
591 		return -1;
592 
593 	if (test_pmd_ring_pair_create() < 0)
594 		return -1;
595 
596 	if (test_pmd_ring_pair_attach() < 0)
597 		return -1;
598 	return 0;
599 }
600 
601 #else
602 
603 int
604 test_pmd_ring(void)
605 {
606 	return 0;
607 }
608 
609 #endif
610 
611