Added validation test cases for packet output through event queues (ODP_PKTOUT_MODE_QUEUE).
Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com> --- test/validation/pktio/pktio.c | 74 +++++++++++++++++++++++++++++++++++++++---- test/validation/pktio/pktio.h | 3 ++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c index 13baffe..0a579e3 100644 --- a/test/validation/pktio/pktio.c +++ b/test/validation/pktio/pktio.c @@ -42,6 +42,7 @@ typedef struct { const char *name; odp_pktio_t id; odp_pktout_queue_t pktout; + odp_queue_t queue_out; odp_queue_t inq; odp_pktin_mode_t in_mode; } pktio_info_t; @@ -65,7 +66,8 @@ typedef enum { typedef enum { TXRX_MODE_SINGLE, - TXRX_MODE_MULTI + TXRX_MODE_MULTI, + TXRX_MODE_MULTI_EVENT } txrx_mode_e; /** size of transmitted packets */ @@ -446,6 +448,31 @@ static int send_packets(odp_pktout_queue_t pktout, return 0; } +static int send_packet_events(odp_queue_t queue, + odp_packet_t *pkt_tbl, unsigned pkts) +{ + int ret; + unsigned i; + unsigned sent = 0; + odp_event_t ev_tbl[pkts]; + + for (i = 0; i < pkts; i++) + ev_tbl[i] = odp_packet_to_event(pkt_tbl[i]); + + while (sent < pkts) { + ret = odp_queue_enq_multi(queue, &ev_tbl[sent], pkts - sent); + + if (ret < 0) { + CU_FAIL_FATAL("failed to send test packet as events"); + return -1; + } + + sent += ret; + } + + return 0; +} + static void pktio_txrx_multi(pktio_info_t *pktio_a, pktio_info_t *pktio_b, int num_pkts, txrx_mode_e mode) { @@ -488,8 +515,10 @@ static void pktio_txrx_multi(pktio_info_t *pktio_a, pktio_info_t *pktio_b, return; } } - } else { + } else if (mode == TXRX_MODE_MULTI) { send_packets(pktio_a->pktout, tx_pkt, num_pkts); + } else { + send_packet_events(pktio_a->queue_out, tx_pkt, num_pkts); } /* and wait for them to arrive back */ @@ -516,20 +545,32 @@ static void test_txrx(odp_pktin_mode_t in_mode, int num_pkts, for (i = 0; i < num_ifaces; ++i) { odp_pktout_queue_t pktout; odp_queue_t queue; + odp_pktin_mode_t out_mode = ODP_PKTOUT_MODE_DIRECT; + + if (mode == TXRX_MODE_MULTI_EVENT) + out_mode = ODP_PKTOUT_MODE_QUEUE; io = &pktios[i]; io->name = iface_name[i]; - io->id = create_pktio(i, in_mode, ODP_PKTOUT_MODE_DIRECT); + io->id = create_pktio(i, in_mode, out_mode); if (io->id == ODP_PKTIO_INVALID) { CU_FAIL("failed to open iface"); return; } - CU_ASSERT_FATAL(odp_pktout_queue(io->id, &pktout, 1) == 1); + if (mode == TXRX_MODE_MULTI_EVENT) { + CU_ASSERT_FATAL(odp_pktout_event_queue(io->id, + &queue, 1) == 1); + } else { + CU_ASSERT_FATAL(odp_pktout_queue(io->id, + &pktout, 1) == 1); + io->pktout = pktout; + queue = ODP_QUEUE_INVALID; + } - io->pktout = pktout; - io->in_mode = in_mode; + io->queue_out = queue; + io->in_mode = in_mode; if (in_mode == ODP_PKTIN_MODE_QUEUE) { CU_ASSERT_FATAL(odp_pktin_event_queue(io->id, &queue, 1) @@ -571,6 +612,12 @@ void pktio_test_plain_multi(void) test_txrx(ODP_PKTIN_MODE_QUEUE, 1, TXRX_MODE_MULTI); } +void pktio_test_plain_multi_event(void) +{ + test_txrx(ODP_PKTIN_MODE_QUEUE, 1, TXRX_MODE_MULTI_EVENT); + test_txrx(ODP_PKTIN_MODE_QUEUE, TX_BATCH_LEN, TXRX_MODE_MULTI_EVENT); +} + void pktio_test_sched_queue(void) { test_txrx(ODP_PKTIN_MODE_SCHED, 1, TXRX_MODE_SINGLE); @@ -583,6 +630,12 @@ void pktio_test_sched_multi(void) test_txrx(ODP_PKTIN_MODE_SCHED, 1, TXRX_MODE_MULTI); } +void pktio_test_sched_multi_event(void) +{ + test_txrx(ODP_PKTIN_MODE_SCHED, 1, TXRX_MODE_MULTI_EVENT); + test_txrx(ODP_PKTIN_MODE_SCHED, TX_BATCH_LEN, TXRX_MODE_MULTI_EVENT); +} + void pktio_test_recv(void) { test_txrx(ODP_PKTIN_MODE_DIRECT, 1, TXRX_MODE_SINGLE); @@ -593,6 +646,12 @@ void pktio_test_recv_multi(void) test_txrx(ODP_PKTIN_MODE_DIRECT, TX_BATCH_LEN, TXRX_MODE_MULTI); } +void pktio_test_recv_multi_event(void) +{ + test_txrx(ODP_PKTIN_MODE_DIRECT, 1, TXRX_MODE_MULTI_EVENT); + test_txrx(ODP_PKTIN_MODE_DIRECT, TX_BATCH_LEN, TXRX_MODE_MULTI_EVENT); +} + void pktio_test_recv_queue(void) { odp_pktio_t pktio_tx, pktio_rx; @@ -1679,6 +1738,9 @@ odp_testinfo_t pktio_suite_unsegmented[] = { ODP_TEST_INFO(pktio_test_start_stop), ODP_TEST_INFO(pktio_test_recv_on_wonly), ODP_TEST_INFO(pktio_test_send_on_ronly), + ODP_TEST_INFO(pktio_test_plain_multi_event), + ODP_TEST_INFO(pktio_test_sched_multi_event), + ODP_TEST_INFO(pktio_test_recv_multi_event), ODP_TEST_INFO_CONDITIONAL(pktio_test_statistics_counters, pktio_check_statistics_counters), ODP_TEST_INFO_NULL diff --git a/test/validation/pktio/pktio.h b/test/validation/pktio/pktio.h index 22fd814..10a573d 100644 --- a/test/validation/pktio/pktio.h +++ b/test/validation/pktio/pktio.h @@ -34,6 +34,9 @@ int pktio_check_send_failure(void); void pktio_test_send_failure(void); void pktio_test_recv_on_wonly(void); void pktio_test_send_on_ronly(void); +void pktio_test_plain_multi_event(void); +void pktio_test_sched_multi_event(void); +void pktio_test_recv_multi_event(void); int pktio_check_statistics_counters(void); void pktio_test_statistics_counters(void); -- 2.7.1 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp