1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Intel Corporation
3 */
4
5 #include "test.h"
6
7 #include <string.h>
8 #include <rte_common.h>
9 #include <rte_mempool.h>
10 #include <rte_mbuf.h>
11 #include <rte_ethdev.h>
12
13 #ifdef RTE_EXEC_ENV_WINDOWS
14 static int
test_event_eth_rx_adapter_common(void)15 test_event_eth_rx_adapter_common(void)
16 {
17 printf("event_eth_rx_adapter not supported on Windows, skipping test\n");
18 return TEST_SKIPPED;
19 }
20
21 static int
test_event_eth_rx_intr_adapter_common(void)22 test_event_eth_rx_intr_adapter_common(void)
23 {
24 printf("event_eth_rx_intr_adapter not supported on Windows, skipping test\n");
25 return TEST_SKIPPED;
26 }
27
28 #else
29
30 #include <rte_eventdev.h>
31 #include <rte_bus_vdev.h>
32
33 #include <rte_event_eth_rx_adapter.h>
34
35 #define MAX_NUM_RX_QUEUE 64
36 #define NB_MBUFS (8192 * num_ports * MAX_NUM_RX_QUEUE)
37 #define MBUF_CACHE_SIZE 512
38 #define MBUF_PRIV_SIZE 0
39 #define TEST_INST_ID 0
40 #define TEST_DEV_ID 0
41 #define TEST_ETHDEV_ID 0
42
43 struct event_eth_rx_adapter_test_params {
44 struct rte_mempool *mp;
45 uint16_t rx_rings, tx_rings;
46 uint32_t caps;
47 int rx_intr_port_inited;
48 uint16_t rx_intr_port;
49 };
50
51 static struct event_eth_rx_adapter_test_params default_params;
52 static bool event_dev_created;
53 static bool eth_dev_created;
54
55 static inline int
port_init_common(uint16_t port,const struct rte_eth_conf * port_conf,struct rte_mempool * mp)56 port_init_common(uint16_t port, const struct rte_eth_conf *port_conf,
57 struct rte_mempool *mp)
58 {
59 const uint16_t rx_ring_size = 512, tx_ring_size = 512;
60 int retval;
61 uint16_t q;
62 struct rte_eth_dev_info dev_info;
63
64 if (!rte_eth_dev_is_valid_port(port))
65 return -1;
66
67 retval = rte_eth_dev_configure(port, 0, 0, port_conf);
68
69 retval = rte_eth_dev_info_get(port, &dev_info);
70 if (retval != 0)
71 return retval;
72
73 default_params.rx_rings = RTE_MIN(dev_info.max_rx_queues,
74 MAX_NUM_RX_QUEUE);
75 default_params.tx_rings = 1;
76
77 /* Configure the Ethernet device. */
78 retval = rte_eth_dev_configure(port, default_params.rx_rings,
79 default_params.tx_rings, port_conf);
80 if (retval != 0)
81 return retval;
82
83 for (q = 0; q < default_params.rx_rings; q++) {
84 retval = rte_eth_rx_queue_setup(port, q, rx_ring_size,
85 rte_eth_dev_socket_id(port), NULL, mp);
86 if (retval < 0)
87 return retval;
88 }
89
90 /* Allocate and set up 1 TX queue per Ethernet port. */
91 for (q = 0; q < default_params.tx_rings; q++) {
92 retval = rte_eth_tx_queue_setup(port, q, tx_ring_size,
93 rte_eth_dev_socket_id(port), NULL);
94 if (retval < 0)
95 return retval;
96 }
97
98 /* Start the Ethernet port. */
99 retval = rte_eth_dev_start(port);
100 if (retval < 0)
101 return retval;
102
103 /* Display the port MAC address. */
104 struct rte_ether_addr addr;
105 retval = rte_eth_macaddr_get(port, &addr);
106 if (retval < 0)
107 return retval;
108 printf("Port %u MAC: %02" PRIx8 " %02" PRIx8 " %02" PRIx8
109 " %02" PRIx8 " %02" PRIx8 " %02" PRIx8 "\n",
110 (unsigned int)port, RTE_ETHER_ADDR_BYTES(&addr));
111
112 /* Enable RX in promiscuous mode for the Ethernet device. */
113 retval = rte_eth_promiscuous_enable(port);
114 if (retval != 0)
115 return retval;
116
117 return 0;
118 }
119
120 static inline int
port_init_rx_intr(uint16_t port,struct rte_mempool * mp)121 port_init_rx_intr(uint16_t port, struct rte_mempool *mp)
122 {
123 static const struct rte_eth_conf port_conf_default = {
124 .rxmode = {
125 .mq_mode = RTE_ETH_MQ_RX_NONE,
126 },
127 .intr_conf = {
128 .rxq = 1,
129 },
130 };
131
132 return port_init_common(port, &port_conf_default, mp);
133 }
134
135 static inline int
port_init(uint16_t port,struct rte_mempool * mp)136 port_init(uint16_t port, struct rte_mempool *mp)
137 {
138 static const struct rte_eth_conf port_conf_default = {
139 .rxmode = {
140 .mq_mode = RTE_ETH_MQ_RX_NONE,
141 },
142 };
143
144 return port_init_common(port, &port_conf_default, mp);
145 }
146
147 static int
init_port_rx_intr(int num_ports)148 init_port_rx_intr(int num_ports)
149 {
150 int retval;
151 uint16_t portid;
152 int err;
153
154 default_params.mp = rte_pktmbuf_pool_create("packet_pool",
155 NB_MBUFS,
156 MBUF_CACHE_SIZE,
157 MBUF_PRIV_SIZE,
158 RTE_MBUF_DEFAULT_BUF_SIZE,
159 rte_socket_id());
160 if (!default_params.mp)
161 return -ENOMEM;
162
163 RTE_ETH_FOREACH_DEV(portid) {
164 retval = port_init_rx_intr(portid, default_params.mp);
165 if (retval)
166 continue;
167 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, portid,
168 &default_params.caps);
169 if (err)
170 continue;
171 if (!(default_params.caps &
172 RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) {
173 default_params.rx_intr_port_inited = 1;
174 default_params.rx_intr_port = portid;
175 return 0;
176 }
177 retval = rte_eth_dev_stop(portid);
178 TEST_ASSERT(retval == 0, "Failed to stop port %u: %d\n",
179 portid, retval);
180 }
181 return 0;
182 }
183
184 static int
init_ports(int num_ports)185 init_ports(int num_ports)
186 {
187 uint16_t portid;
188 int retval;
189
190 struct rte_mempool *ptr = rte_mempool_lookup("packet_pool");
191
192 if (ptr == NULL)
193 default_params.mp = rte_pktmbuf_pool_create("packet_pool",
194 NB_MBUFS,
195 MBUF_CACHE_SIZE,
196 MBUF_PRIV_SIZE,
197 RTE_MBUF_DEFAULT_BUF_SIZE,
198 rte_socket_id());
199 else
200 default_params.mp = ptr;
201
202 if (!default_params.mp)
203 return -ENOMEM;
204
205 RTE_ETH_FOREACH_DEV(portid) {
206 retval = port_init(portid, default_params.mp);
207 if (retval)
208 return retval;
209 }
210
211 return 0;
212 }
213
214 static int
testsuite_setup(void)215 testsuite_setup(void)
216 {
217 int err;
218 uint8_t count;
219 struct rte_event_dev_info dev_info;
220
221 count = rte_event_dev_count();
222 if (!count) {
223 printf("Failed to find a valid event device,"
224 " testing with event_skeleton device\n");
225 err = rte_vdev_init("event_skeleton", NULL);
226 TEST_ASSERT(err == 0, "Failed to create event_skeleton. err=%d",
227 err);
228 event_dev_created = true;
229 }
230
231 struct rte_event_dev_config config = {
232 .nb_event_queues = 1,
233 .nb_event_ports = 1,
234 };
235
236 err = rte_event_dev_info_get(TEST_DEV_ID, &dev_info);
237 config.nb_event_queue_flows = dev_info.max_event_queue_flows;
238 config.nb_event_port_dequeue_depth =
239 dev_info.max_event_port_dequeue_depth;
240 config.nb_event_port_enqueue_depth =
241 dev_info.max_event_port_enqueue_depth;
242 config.nb_events_limit =
243 dev_info.max_num_events;
244 err = rte_event_dev_configure(TEST_DEV_ID, &config);
245 TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
246 err);
247
248 count = rte_eth_dev_count_total();
249 if (!count) {
250 printf("Testing with net_null device\n");
251 err = rte_vdev_init("net_null", NULL);
252 TEST_ASSERT(err == 0, "Failed to create net_null. err=%d",
253 err);
254 eth_dev_created = true;
255 }
256
257 /*
258 * eth devices like octeontx use event device to receive packets
259 * so rte_eth_dev_start invokes rte_event_dev_start internally, so
260 * call init_ports after rte_event_dev_configure
261 */
262 err = init_ports(rte_eth_dev_count_total());
263 TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
264
265 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, TEST_ETHDEV_ID,
266 &default_params.caps);
267 TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",
268 err);
269
270 return err;
271 }
272
273 static int
testsuite_setup_rx_intr(void)274 testsuite_setup_rx_intr(void)
275 {
276 int err;
277 uint8_t count;
278 struct rte_event_dev_info dev_info;
279
280 count = rte_event_dev_count();
281 if (!count) {
282 printf("Failed to find a valid event device,"
283 " testing with event_skeleton device\n");
284 err = rte_vdev_init("event_skeleton", NULL);
285 TEST_ASSERT(err == 0, "Failed to create event_skeleton. err=%d",
286 err);
287 event_dev_created = true;
288 }
289
290 struct rte_event_dev_config config = {
291 .nb_event_queues = 1,
292 .nb_event_ports = 1,
293 };
294
295 err = rte_event_dev_info_get(TEST_DEV_ID, &dev_info);
296 config.nb_event_queue_flows = dev_info.max_event_queue_flows;
297 config.nb_event_port_dequeue_depth =
298 dev_info.max_event_port_dequeue_depth;
299 config.nb_event_port_enqueue_depth =
300 dev_info.max_event_port_enqueue_depth;
301 config.nb_events_limit =
302 dev_info.max_num_events;
303
304 err = rte_event_dev_configure(TEST_DEV_ID, &config);
305 TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
306 err);
307
308 count = rte_eth_dev_count_total();
309 if (!count) {
310 printf("Testing with net_null device\n");
311 err = rte_vdev_init("net_null", NULL);
312 TEST_ASSERT(err == 0, "Failed to create net_null. err=%d",
313 err);
314 eth_dev_created = true;
315 }
316
317 /*
318 * eth devices like octeontx use event device to receive packets
319 * so rte_eth_dev_start invokes rte_event_dev_start internally, so
320 * call init_ports after rte_event_dev_configure
321 */
322 err = init_port_rx_intr(rte_eth_dev_count_total());
323 TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
324
325 if (!default_params.rx_intr_port_inited)
326 return 0;
327
328 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID,
329 default_params.rx_intr_port,
330 &default_params.caps);
331 TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n", err);
332
333 return err;
334 }
335
336 static void
testsuite_teardown(void)337 testsuite_teardown(void)
338 {
339 int err;
340 uint32_t i;
341 RTE_ETH_FOREACH_DEV(i)
342 rte_eth_dev_stop(i);
343
344 if (eth_dev_created) {
345 err = rte_vdev_uninit("net_null");
346 if (err)
347 printf("Failed to delete net_null. err=%d", err);
348 eth_dev_created = false;
349 }
350
351 rte_mempool_free(default_params.mp);
352 if (event_dev_created) {
353 err = rte_vdev_uninit("event_skeleton");
354 if (err)
355 printf("Failed to delete event_skeleton. err=%d", err);
356 event_dev_created = false;
357 }
358
359 memset(&default_params, 0, sizeof(default_params));
360 }
361
362 static void
testsuite_teardown_rx_intr(void)363 testsuite_teardown_rx_intr(void)
364 {
365 int err;
366 if (!default_params.rx_intr_port_inited)
367 return;
368
369 rte_eth_dev_stop(default_params.rx_intr_port);
370 if (eth_dev_created) {
371 err = rte_vdev_uninit("net_null");
372 if (err)
373 printf("Failed to delete net_null. err=%d", err);
374 eth_dev_created = false;
375 }
376 rte_mempool_free(default_params.mp);
377 if (event_dev_created) {
378 err = rte_vdev_uninit("event_skeleton");
379 if (err)
380 printf("Failed to delete event_skeleton. err=%d", err);
381 event_dev_created = false;
382 }
383
384 memset(&default_params, 0, sizeof(default_params));
385 }
386
387 static int
adapter_create(void)388 adapter_create(void)
389 {
390 int err;
391 struct rte_event_dev_info dev_info;
392 struct rte_event_port_conf rx_p_conf;
393
394 memset(&rx_p_conf, 0, sizeof(rx_p_conf));
395
396 err = rte_event_dev_info_get(TEST_DEV_ID, &dev_info);
397 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
398
399 rx_p_conf.new_event_threshold = dev_info.max_num_events;
400 rx_p_conf.dequeue_depth = dev_info.max_event_port_dequeue_depth;
401 rx_p_conf.enqueue_depth = dev_info.max_event_port_enqueue_depth;
402 err = rte_event_eth_rx_adapter_create(TEST_INST_ID, TEST_DEV_ID,
403 &rx_p_conf);
404 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
405
406 return err;
407 }
408
409 static int
adapter_create_with_params(void)410 adapter_create_with_params(void)
411 {
412 int err;
413 struct rte_event_dev_info dev_info;
414 struct rte_event_port_conf rx_p_conf;
415 struct rte_event_eth_rx_adapter_params rxa_params;
416
417 memset(&rx_p_conf, 0, sizeof(rx_p_conf));
418
419 err = rte_event_dev_info_get(TEST_DEV_ID, &dev_info);
420 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
421
422 rx_p_conf.new_event_threshold = dev_info.max_num_events;
423 rx_p_conf.dequeue_depth = dev_info.max_event_port_dequeue_depth;
424 rx_p_conf.enqueue_depth = dev_info.max_event_port_enqueue_depth;
425
426 rxa_params.use_queue_event_buf = false;
427 rxa_params.event_buf_size = 0;
428
429 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
430 TEST_DEV_ID, &rx_p_conf, &rxa_params);
431 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
432
433 rxa_params.use_queue_event_buf = true;
434
435 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
436 TEST_DEV_ID, &rx_p_conf, &rxa_params);
437 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
438
439 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
440 TEST_DEV_ID, &rx_p_conf, &rxa_params);
441 TEST_ASSERT(err == -EEXIST, "Expected -EEXIST got %d", err);
442
443 return TEST_SUCCESS;
444 }
445
446 static int
adapter_queue_event_buf_test(void)447 adapter_queue_event_buf_test(void)
448 {
449 int err;
450 struct rte_event ev;
451 uint32_t cap;
452
453 struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
454
455 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, TEST_ETHDEV_ID,
456 &cap);
457 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
458
459 ev.queue_id = 0;
460 ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
461 ev.priority = 0;
462
463 queue_config.rx_queue_flags = 0;
464 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID) {
465 ev.flow_id = 1;
466 queue_config.rx_queue_flags =
467 RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
468 }
469 queue_config.ev = ev;
470 queue_config.servicing_weight = 1;
471 queue_config.event_buf_size = 0;
472
473 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
474 TEST_ETHDEV_ID, 0,
475 &queue_config);
476 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
477
478 queue_config.event_buf_size = 1024;
479
480 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
481 TEST_ETHDEV_ID, 0,
482 &queue_config);
483 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
484
485 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
486 TEST_ETHDEV_ID,
487 0);
488 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
489
490 return TEST_SUCCESS;
491 }
492
493 static int
adapter_queue_stats_test(void)494 adapter_queue_stats_test(void)
495 {
496 int err;
497 struct rte_event ev;
498 uint32_t cap;
499 struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
500 struct rte_event_eth_rx_adapter_queue_stats q_stats;
501
502 err = rte_event_eth_rx_adapter_queue_stats_get(TEST_INST_ID,
503 TEST_ETHDEV_ID, 0,
504 &q_stats);
505 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
506
507 err = rte_event_eth_rx_adapter_queue_stats_reset(TEST_INST_ID,
508 TEST_ETHDEV_ID, 0);
509 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
510
511 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, TEST_ETHDEV_ID,
512 &cap);
513 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
514
515 ev.queue_id = 0;
516 ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
517 ev.priority = 0;
518
519 queue_config.rx_queue_flags = 0;
520 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID) {
521 ev.flow_id = 1;
522 queue_config.rx_queue_flags =
523 RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
524 }
525 queue_config.ev = ev;
526 queue_config.servicing_weight = 1;
527 queue_config.event_buf_size = 1024;
528
529 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
530 TEST_ETHDEV_ID, 0,
531 &queue_config);
532 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
533
534 err = rte_event_eth_rx_adapter_queue_stats_get(TEST_INST_ID,
535 TEST_ETHDEV_ID, 0,
536 &q_stats);
537 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
538
539 err = rte_event_eth_rx_adapter_queue_stats_reset(TEST_INST_ID,
540 TEST_ETHDEV_ID, 0);
541 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
542
543 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
544 TEST_ETHDEV_ID,
545 0);
546 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
547
548 return TEST_SUCCESS;
549 }
550
551 static void
adapter_free(void)552 adapter_free(void)
553 {
554 rte_event_eth_rx_adapter_free(TEST_INST_ID);
555 }
556
557 static int
adapter_create_free(void)558 adapter_create_free(void)
559 {
560 int err;
561
562 struct rte_event_port_conf rx_p_conf = {
563 .dequeue_depth = 8,
564 .enqueue_depth = 8,
565 .new_event_threshold = 1200,
566 };
567
568 err = rte_event_eth_rx_adapter_create(TEST_INST_ID, TEST_DEV_ID,
569 NULL);
570 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
571
572 err = rte_event_eth_rx_adapter_create(TEST_INST_ID, TEST_DEV_ID,
573 &rx_p_conf);
574 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
575
576 err = rte_event_eth_rx_adapter_create(TEST_INST_ID,
577 TEST_DEV_ID, &rx_p_conf);
578 TEST_ASSERT(err == -EEXIST, "Expected -EEXIST %d got %d", -EEXIST, err);
579
580 err = rte_event_eth_rx_adapter_free(TEST_INST_ID);
581 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
582
583 err = rte_event_eth_rx_adapter_free(TEST_INST_ID);
584 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
585
586 err = rte_event_eth_rx_adapter_free(1);
587 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
588
589 return TEST_SUCCESS;
590 }
591
592 static int
adapter_create_free_with_params(void)593 adapter_create_free_with_params(void)
594 {
595 int err;
596
597 struct rte_event_port_conf rx_p_conf = {
598 .dequeue_depth = 8,
599 .enqueue_depth = 8,
600 .new_event_threshold = 1200,
601 };
602
603 struct rte_event_eth_rx_adapter_params rxa_params = {
604 .event_buf_size = 1024
605 };
606
607 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
608 TEST_DEV_ID, NULL, NULL);
609 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
610
611 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
612 TEST_DEV_ID, &rx_p_conf, &rxa_params);
613 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
614
615 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
616 TEST_DEV_ID, &rx_p_conf, &rxa_params);
617 TEST_ASSERT(err == -EEXIST, "Expected -EEXIST %d got %d", -EEXIST, err);
618
619 rxa_params.event_buf_size = 0;
620 err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
621 TEST_DEV_ID, &rx_p_conf, &rxa_params);
622 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
623
624 err = rte_event_eth_rx_adapter_free(TEST_INST_ID);
625 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
626
627 err = rte_event_eth_rx_adapter_free(TEST_INST_ID);
628 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
629
630 err = rte_event_eth_rx_adapter_free(1);
631 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
632
633 return TEST_SUCCESS;
634 }
635
636 static int
adapter_queue_add_del(void)637 adapter_queue_add_del(void)
638 {
639 int err;
640 struct rte_event ev;
641 uint32_t cap;
642
643 struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
644
645 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, TEST_ETHDEV_ID,
646 &cap);
647 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
648
649 ev.queue_id = 0;
650 ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
651 ev.priority = 0;
652
653 queue_config.rx_queue_flags = 0;
654 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID) {
655 ev.flow_id = 1;
656 queue_config.rx_queue_flags =
657 RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
658 }
659 queue_config.ev = ev;
660 queue_config.servicing_weight = 1;
661
662 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
663 rte_eth_dev_count_total(),
664 -1, &queue_config);
665 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
666
667 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) {
668 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
669 TEST_ETHDEV_ID, 0,
670 &queue_config);
671 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
672
673 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
674 TEST_ETHDEV_ID, 0);
675 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
676
677 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
678 TEST_ETHDEV_ID,
679 -1,
680 &queue_config);
681 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
682
683 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
684 TEST_ETHDEV_ID,
685 -1);
686 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
687 } else {
688 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
689 TEST_ETHDEV_ID,
690 0,
691 &queue_config);
692 TEST_ASSERT(err == -EINVAL, "Expected EINVAL got %d", err);
693
694 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
695 TEST_ETHDEV_ID, -1,
696 &queue_config);
697 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
698
699 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
700 TEST_ETHDEV_ID, 0);
701 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
702
703 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
704 TEST_ETHDEV_ID, -1);
705 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
706
707 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
708 TEST_ETHDEV_ID, -1);
709 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
710 }
711
712 err = rte_event_eth_rx_adapter_queue_add(1, TEST_ETHDEV_ID, -1,
713 &queue_config);
714 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
715
716 err = rte_event_eth_rx_adapter_queue_del(1, TEST_ETHDEV_ID, -1);
717 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
718
719 return TEST_SUCCESS;
720 }
721
722 static int
adapter_multi_eth_add_del(void)723 adapter_multi_eth_add_del(void)
724 {
725 int err;
726 struct rte_event ev;
727
728 uint16_t port_index, port_index_base, drv_id = 0;
729 char driver_name[50];
730
731 struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
732
733 ev.queue_id = 0;
734 ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
735 ev.priority = 0;
736
737 queue_config.rx_queue_flags = 0;
738 queue_config.ev = ev;
739 queue_config.servicing_weight = 1;
740
741 /* stop eth devices for existing */
742 port_index = 0;
743 for (; port_index < rte_eth_dev_count_total(); port_index += 1) {
744 err = rte_eth_dev_stop(port_index);
745 TEST_ASSERT(err == 0, "Failed to stop port %u: %d\n",
746 port_index, err);
747 }
748
749 /* add the max port for rx_adapter */
750 port_index = rte_eth_dev_count_total();
751 port_index_base = port_index;
752 for (; port_index < RTE_MAX_ETHPORTS; port_index += 1) {
753 snprintf(driver_name, sizeof(driver_name), "%s%u", "net_null",
754 drv_id);
755 err = rte_vdev_init(driver_name, NULL);
756 TEST_ASSERT(err == 0, "Failed driver %s got %d",
757 driver_name, err);
758 drv_id += 1;
759 }
760
761 err = init_ports(rte_eth_dev_count_total());
762 TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
763
764 /* eth_rx_adapter_queue_add for n ports */
765 port_index = 0;
766 for (; port_index < rte_eth_dev_count_total(); port_index += 1) {
767 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
768 port_index, -1,
769 &queue_config);
770 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
771 }
772
773 /* eth_rx_adapter_queue_del n ports */
774 port_index = 0;
775 for (; port_index < rte_eth_dev_count_total(); port_index += 1) {
776 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
777 port_index, -1);
778 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
779 }
780
781 /* delete vdev ports */
782 for (drv_id = 0, port_index = port_index_base;
783 port_index < RTE_MAX_ETHPORTS;
784 drv_id += 1, port_index += 1) {
785 snprintf(driver_name, sizeof(driver_name), "%s%u", "net_null",
786 drv_id);
787 err = rte_vdev_uninit(driver_name);
788 TEST_ASSERT(err == 0, "Failed driver %s got %d",
789 driver_name, err);
790 }
791
792 return TEST_SUCCESS;
793 }
794
795 static int
adapter_intr_queue_add_del(void)796 adapter_intr_queue_add_del(void)
797 {
798 int err;
799 struct rte_event ev;
800 uint32_t cap;
801 uint16_t eth_port;
802 struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
803
804 if (!default_params.rx_intr_port_inited)
805 return 0;
806
807 eth_port = default_params.rx_intr_port;
808 err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, eth_port, &cap);
809 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
810
811 ev.queue_id = 0;
812 ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
813 ev.priority = 0;
814
815 queue_config.rx_queue_flags = 0;
816 queue_config.ev = ev;
817
818 /* weight = 0 => interrupt mode */
819 queue_config.servicing_weight = 0;
820
821 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) {
822 /* add queue 0 */
823 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
824 TEST_ETHDEV_ID, 0,
825 &queue_config);
826 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
827 }
828
829 /* add all queues */
830 queue_config.servicing_weight = 0;
831 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
832 TEST_ETHDEV_ID,
833 -1,
834 &queue_config);
835 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
836
837 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) {
838 /* del queue 0 */
839 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
840 TEST_ETHDEV_ID,
841 0);
842 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
843 }
844
845 /* del remaining queues */
846 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
847 TEST_ETHDEV_ID,
848 -1);
849 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
850
851 /* add all queues */
852 queue_config.servicing_weight = 0;
853 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
854 TEST_ETHDEV_ID,
855 -1,
856 &queue_config);
857 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
858
859 /* intr -> poll mode queue */
860 queue_config.servicing_weight = 1;
861
862 if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) {
863 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
864 TEST_ETHDEV_ID,
865 0,
866 &queue_config);
867 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
868 }
869
870 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
871 TEST_ETHDEV_ID,
872 -1,
873 &queue_config);
874 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
875
876 /* del queues */
877 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
878 TEST_ETHDEV_ID,
879 -1);
880 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
881
882 return TEST_SUCCESS;
883 }
884
885 static int
adapter_start_stop(void)886 adapter_start_stop(void)
887 {
888 int err;
889 struct rte_event ev;
890
891 ev.queue_id = 0;
892 ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
893 ev.priority = 0;
894
895 struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
896
897 queue_config.rx_queue_flags = 0;
898 if (default_params.caps &
899 RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID) {
900 ev.flow_id = 1;
901 queue_config.rx_queue_flags =
902 RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
903 }
904
905 queue_config.ev = ev;
906 queue_config.servicing_weight = 1;
907
908 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID, TEST_ETHDEV_ID,
909 -1, &queue_config);
910 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
911
912 err = rte_event_eth_rx_adapter_start(TEST_INST_ID);
913 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
914
915 err = rte_event_eth_rx_adapter_stop(TEST_INST_ID);
916 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
917
918 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID, TEST_ETHDEV_ID,
919 -1);
920 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
921
922 err = rte_event_eth_rx_adapter_start(TEST_INST_ID);
923 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
924
925 err = rte_event_eth_rx_adapter_stop(TEST_INST_ID);
926 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
927
928 err = rte_event_eth_rx_adapter_start(1);
929 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
930
931 err = rte_event_eth_rx_adapter_stop(1);
932 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
933
934 return TEST_SUCCESS;
935 }
936
937 static int
adapter_stats(void)938 adapter_stats(void)
939 {
940 int err;
941 struct rte_event_eth_rx_adapter_stats stats;
942
943 err = rte_event_eth_rx_adapter_stats_get(TEST_INST_ID, NULL);
944 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
945
946 err = rte_event_eth_rx_adapter_stats_get(TEST_INST_ID, &stats);
947 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
948
949 err = rte_event_eth_rx_adapter_stats_get(1, &stats);
950 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
951
952 return TEST_SUCCESS;
953 }
954
955 static int
adapter_queue_conf(void)956 adapter_queue_conf(void)
957 {
958 int err;
959 struct rte_event_eth_rx_adapter_queue_conf queue_conf = {0};
960
961 /* Case 1: queue conf get without any queues in Rx adapter */
962 err = rte_event_eth_rx_adapter_queue_conf_get(TEST_INST_ID,
963 TEST_ETHDEV_ID,
964 0, &queue_conf);
965 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
966
967 /* Add queue to Rx adapter */
968 queue_conf.ev.queue_id = 0;
969 queue_conf.ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
970 queue_conf.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
971
972 err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID,
973 TEST_ETHDEV_ID,
974 0, &queue_conf);
975 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
976
977 /* Case 2: queue conf get with queue added to Rx adapter */
978 err = rte_event_eth_rx_adapter_queue_conf_get(TEST_INST_ID,
979 TEST_ETHDEV_ID,
980 0, &queue_conf);
981 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
982
983 /* Case 3: queue conf get with invalid rx queue id */
984 err = rte_event_eth_rx_adapter_queue_conf_get(TEST_INST_ID,
985 TEST_ETHDEV_ID,
986 -1, &queue_conf);
987 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
988
989 /* Case 4: queue conf get with NULL queue conf struct */
990 err = rte_event_eth_rx_adapter_queue_conf_get(TEST_INST_ID,
991 TEST_ETHDEV_ID,
992 0, NULL);
993 TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
994
995 /* Delete queue from the Rx adapter */
996 err = rte_event_eth_rx_adapter_queue_del(TEST_INST_ID,
997 TEST_ETHDEV_ID,
998 0);
999 TEST_ASSERT(err == 0, "Expected 0 got %d", err);
1000
1001 return TEST_SUCCESS;
1002 }
1003
1004 static struct unit_test_suite event_eth_rx_tests = {
1005 .suite_name = "rx event eth adapter test suite",
1006 .setup = testsuite_setup,
1007 .teardown = testsuite_teardown,
1008 .unit_test_cases = {
1009 TEST_CASE_ST(NULL, NULL, adapter_create_free),
1010 TEST_CASE_ST(NULL, NULL, adapter_create_free_with_params),
1011 TEST_CASE_ST(adapter_create, adapter_free,
1012 adapter_queue_add_del),
1013 TEST_CASE_ST(adapter_create, adapter_free,
1014 adapter_multi_eth_add_del),
1015 TEST_CASE_ST(adapter_create, adapter_free, adapter_start_stop),
1016 TEST_CASE_ST(adapter_create, adapter_free, adapter_stats),
1017 TEST_CASE_ST(adapter_create, adapter_free, adapter_queue_conf),
1018 TEST_CASE_ST(adapter_create_with_params, adapter_free,
1019 adapter_queue_event_buf_test),
1020 TEST_CASE_ST(adapter_create_with_params, adapter_free,
1021 adapter_queue_stats_test),
1022 TEST_CASES_END() /**< NULL terminate unit test array */
1023 }
1024 };
1025
1026 static struct unit_test_suite event_eth_rx_intr_tests = {
1027 .suite_name = "rx event eth adapter test suite",
1028 .setup = testsuite_setup_rx_intr,
1029 .teardown = testsuite_teardown_rx_intr,
1030 .unit_test_cases = {
1031 TEST_CASE_ST(adapter_create, adapter_free,
1032 adapter_intr_queue_add_del),
1033 TEST_CASES_END() /**< NULL terminate unit test array */
1034 }
1035 };
1036
1037 static int
test_event_eth_rx_adapter_common(void)1038 test_event_eth_rx_adapter_common(void)
1039 {
1040 return unit_test_suite_runner(&event_eth_rx_tests);
1041 }
1042
1043 static int
test_event_eth_rx_intr_adapter_common(void)1044 test_event_eth_rx_intr_adapter_common(void)
1045 {
1046 return unit_test_suite_runner(&event_eth_rx_intr_tests);
1047 }
1048
1049 #endif /* !RTE_EXEC_ENV_WINDOWS */
1050
1051 REGISTER_TEST_COMMAND(event_eth_rx_adapter_autotest,
1052 test_event_eth_rx_adapter_common);
1053 REGISTER_TEST_COMMAND(event_eth_rx_intr_adapter_autotest,
1054 test_event_eth_rx_intr_adapter_common);
1055