update Intel copyright years to 2014
[dpdk.git] / app / test / test_pmd_ring.c
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