aboutsummaryrefslogtreecommitdiff
path: root/test/validation/api/pktio/pktio.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/validation/api/pktio/pktio.c')
-rw-r--r--test/validation/api/pktio/pktio.c188
1 files changed, 170 insertions, 18 deletions
diff --git a/test/validation/api/pktio/pktio.c b/test/validation/api/pktio/pktio.c
index 2f4dda4a4..f412a01c4 100644
--- a/test/validation/api/pktio/pktio.c
+++ b/test/validation/api/pktio/pktio.c
@@ -3495,7 +3495,7 @@ static void pktio_test_pktout_ts(void)
}
}
-static void pktio_test_pktout_compl(bool use_plain_queue)
+static void pktio_test_pktout_compl_event(bool use_plain_queue)
{
odp_pktio_t pktio[MAX_NUM_IFACES] = {ODP_PKTIO_INVALID};
odp_queue_t compl_queue[TX_BATCH_LEN];
@@ -3550,7 +3550,9 @@ static void pktio_test_pktout_compl(bool use_plain_queue)
/* Configure Tx completion offload for PKTIO Tx */
if (i == 0) {
- CU_ASSERT_FATAL(pktio_capa.tx_compl.mode_all == 1);
+ CU_ASSERT_FATAL(pktio_capa.tx_compl.mode_event == 1);
+ CU_ASSERT_FATAL(pktio_capa.tx_compl.mode_all ==
+ pktio_capa.tx_compl.mode_event);
if (use_plain_queue) {
/* CU_ASSERT needs these extra braces */
CU_ASSERT_FATAL(pktio_capa.tx_compl.queue_type_plain != 0);
@@ -3559,7 +3561,7 @@ static void pktio_test_pktout_compl(bool use_plain_queue)
}
odp_pktio_config_init(&config);
- config.pktout.bit.tx_compl_ena = 1;
+ config.tx_compl.mode_event = 1;
CU_ASSERT_FATAL(odp_pktio_config(pktio[i], &config) == 0);
}
@@ -3583,10 +3585,30 @@ static void pktio_test_pktout_compl(bool use_plain_queue)
memset(&opt, 0, sizeof(opt));
+ /* Disabled by default */
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) == 0);
+
+ /* Check that disable works. Also COMPL_ALL should be still supported. */
+ opt.queue = compl_queue[0];
+ opt.mode = ODP_PACKET_TX_COMPL_ALL;
+ odp_packet_tx_compl_request(pkt_tbl[0], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) != 0);
+ opt.mode = ODP_PACKET_TX_COMPL_DISABLED;
+ odp_packet_tx_compl_request(pkt_tbl[0], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) == 0);
+ opt.queue = compl_queue[0];
+ opt.mode = ODP_PACKET_TX_COMPL_EVENT;
+ odp_packet_tx_compl_request(pkt_tbl[0], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) != 0);
+ opt.mode = ODP_PACKET_TX_COMPL_DISABLED;
+ odp_packet_tx_compl_request(pkt_tbl[0], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) == 0);
+
/* Prepare batch of pkts with different tx completion queues */
for (i = 0; i < TX_BATCH_LEN; i++) {
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[i]) == 0);
opt.queue = compl_queue[i];
- opt.mode = ODP_PACKET_TX_COMPL_ALL;
+ opt.mode = ODP_PACKET_TX_COMPL_EVENT;
odp_packet_tx_compl_request(pkt_tbl[i], &opt);
CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[i]) != 0);
/* Set pkt sequence number as its user ptr */
@@ -3623,6 +3645,9 @@ static void pktio_test_pktout_compl(bool use_plain_queue)
CU_ASSERT(odp_packet_tx_compl_user_ptr(tx_compl) ==
(const void *)&pkt_seq[i]);
+ /* No user area for TX completion events */
+ CU_ASSERT(odp_event_user_area(ev) == NULL);
+
/* Alternatively call event free / compl free */
if (i % 2)
odp_packet_tx_compl_free(tx_compl);
@@ -3657,6 +3682,10 @@ static void pktio_test_pktout_compl(bool use_plain_queue)
break;
}
}
+
+ /* No user area for TX completion events */
+ CU_ASSERT(odp_event_user_area(ev) == NULL);
+
/* Check that sequence number is found */
CU_ASSERT(j < TX_BATCH_LEN);
@@ -3690,7 +3719,104 @@ static void pktio_test_pktout_compl(bool use_plain_queue)
odp_queue_destroy(compl_queue[i]);
}
-static int pktio_check_pktout_compl(bool plain)
+static void pktio_test_pktout_compl_poll(void)
+{
+ odp_pktio_t pktio[MAX_NUM_IFACES] = {ODP_PKTIO_INVALID};
+ odp_packet_t pkt_tbl[TX_BATCH_LEN];
+ odp_pktio_capability_t pktio_capa;
+ odp_pktout_queue_t pktout_queue;
+ uint32_t pkt_seq[TX_BATCH_LEN];
+ odp_pktio_t pktio_tx, pktio_rx;
+ odp_packet_tx_compl_opt_t opt;
+ pktio_info_t pktio_rx_info;
+ odp_pktio_config_t config;
+ int ret, i, num_rx = 0;
+
+ CU_ASSERT_FATAL(num_ifaces >= 1);
+
+ /* Open and configure interfaces */
+ for (i = 0; i < num_ifaces; ++i) {
+ pktio[i] = create_pktio(i, ODP_PKTIN_MODE_DIRECT,
+ ODP_PKTOUT_MODE_DIRECT);
+ CU_ASSERT_FATAL(pktio[i] != ODP_PKTIO_INVALID);
+
+ CU_ASSERT_FATAL(odp_pktio_capability(pktio[i], &pktio_capa) == 0);
+
+ /* Configure Tx completion offload for PKTIO Tx */
+ if (i == 0) {
+ CU_ASSERT_FATAL(pktio_capa.tx_compl.mode_poll == 1);
+ CU_ASSERT_FATAL(pktio_capa.tx_compl.max_compl_id >= (TX_BATCH_LEN - 1));
+
+ odp_pktio_config_init(&config);
+ config.tx_compl.mode_poll = 1;
+ config.tx_compl.max_compl_id = TX_BATCH_LEN - 1;
+ CU_ASSERT_FATAL(odp_pktio_config(pktio[i], &config) == 0);
+ }
+
+ CU_ASSERT_FATAL(odp_pktio_start(pktio[i]) == 0);
+ }
+
+ for (i = 0; i < num_ifaces; i++)
+ _pktio_wait_linkup(pktio[i]);
+
+ pktio_tx = pktio[0];
+ pktio_rx = (num_ifaces > 1) ? pktio[1] : pktio_tx;
+ pktio_rx_info.id = pktio_rx;
+ pktio_rx_info.inq = ODP_QUEUE_INVALID;
+ pktio_rx_info.in_mode = ODP_PKTIN_MODE_DIRECT;
+
+ ret = create_packets(pkt_tbl, pkt_seq, TX_BATCH_LEN, pktio_tx, pktio_rx);
+ CU_ASSERT_FATAL(ret == TX_BATCH_LEN);
+
+ ret = odp_pktout_queue(pktio_tx, &pktout_queue, 1);
+ CU_ASSERT_FATAL(ret > 0);
+
+ memset(&opt, 0, sizeof(opt));
+
+ /* Disabled by default */
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) == 0);
+
+ /* Check that disable works */
+ opt.compl_id = 0;
+ opt.mode = ODP_PACKET_TX_COMPL_POLL;
+ odp_packet_tx_compl_request(pkt_tbl[0], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) != 0);
+ opt.mode = ODP_PACKET_TX_COMPL_DISABLED;
+ odp_packet_tx_compl_request(pkt_tbl[0], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[0]) == 0);
+
+ /* Prepare batch of pkts with different tx completion identifiers */
+ for (i = 0; i < TX_BATCH_LEN; i++) {
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[i]) == 0);
+ opt.compl_id = i;
+ opt.mode = ODP_PACKET_TX_COMPL_EVENT;
+ odp_packet_tx_compl_request(pkt_tbl[i], &opt);
+ CU_ASSERT(odp_packet_has_tx_compl_request(pkt_tbl[i]) != 0);
+ /* Set pkt sequence number as its user ptr */
+ odp_packet_user_ptr_set(pkt_tbl[i], (const void *)&pkt_seq[i]);
+ }
+
+ CU_ASSERT_FATAL(odp_pktout_send(pktout_queue, pkt_tbl, TX_BATCH_LEN) == TX_BATCH_LEN);
+
+ num_rx = wait_for_packets(&pktio_rx_info, pkt_tbl, pkt_seq, TX_BATCH_LEN, TXRX_MODE_SINGLE,
+ ODP_TIME_SEC_IN_NS, false);
+ CU_ASSERT(num_rx == TX_BATCH_LEN);
+ for (i = 0; i < num_rx; i++)
+ odp_packet_free(pkt_tbl[i]);
+
+ /* Transmits should be complete since we received the packets already */
+ for (i = 0; i < num_rx; i++) {
+ ret = odp_packet_tx_compl_done(pktio_tx, i);
+ CU_ASSERT(ret > 0);
+ }
+
+ for (i = 0; i < num_ifaces; i++) {
+ CU_ASSERT_FATAL(odp_pktio_stop(pktio[i]) == 0);
+ CU_ASSERT_FATAL(odp_pktio_close(pktio[i]) == 0);
+ }
+}
+
+static int pktio_check_pktout_compl_event(bool plain)
{
odp_pktio_param_t pktio_param;
odp_pktio_capability_t capa;
@@ -3708,7 +3834,7 @@ static int pktio_check_pktout_compl(bool plain)
ret = odp_pktio_capability(pktio, &capa);
(void)odp_pktio_close(pktio);
- if (ret < 0 || !capa.tx_compl.mode_all ||
+ if (ret < 0 || !capa.tx_compl.mode_event ||
(plain && !capa.tx_compl.queue_type_plain) ||
(!plain && !capa.tx_compl.queue_type_sched))
return ODP_TEST_INACTIVE;
@@ -3716,24 +3842,49 @@ static int pktio_check_pktout_compl(bool plain)
return ODP_TEST_ACTIVE;
}
-static int pktio_check_pktout_compl_plain_queue(void)
+static int pktio_check_pktout_compl_poll(void)
+{
+ odp_pktio_param_t pktio_param;
+ odp_pktio_capability_t capa;
+ odp_pktio_t pktio;
+ int ret;
+
+ odp_pktio_param_init(&pktio_param);
+ pktio_param.in_mode = ODP_PKTIN_MODE_DIRECT;
+ pktio_param.out_mode = ODP_PKTOUT_MODE_DIRECT;
+
+ pktio = odp_pktio_open(iface_name[0], pool[0], &pktio_param);
+ if (pktio == ODP_PKTIO_INVALID)
+ return ODP_TEST_INACTIVE;
+
+ ret = odp_pktio_capability(pktio, &capa);
+ (void)odp_pktio_close(pktio);
+
+ if (ret < 0 || capa.tx_compl.mode_poll == 0 ||
+ capa.tx_compl.max_compl_id < (TX_BATCH_LEN - 1))
+ return ODP_TEST_INACTIVE;
+
+ return ODP_TEST_ACTIVE;
+}
+
+static int pktio_check_pktout_compl_event_plain_queue(void)
{
- return pktio_check_pktout_compl(true);
+ return pktio_check_pktout_compl_event(true);
}
-static int pktio_check_pktout_compl_sched_queue(void)
+static int pktio_check_pktout_compl_event_sched_queue(void)
{
- return pktio_check_pktout_compl(false);
+ return pktio_check_pktout_compl_event(false);
}
-static void pktio_test_pktout_compl_plain_queue(void)
+static void pktio_test_pktout_compl_event_plain_queue(void)
{
- pktio_test_pktout_compl(true);
+ pktio_test_pktout_compl_event(true);
}
-static void pktio_test_pktout_compl_sched_queue(void)
+static void pktio_test_pktout_compl_event_sched_queue(void)
{
- pktio_test_pktout_compl(false);
+ pktio_test_pktout_compl_event(false);
}
static void pktio_test_chksum(void (*config_fn)(odp_pktio_t, odp_pktio_t),
@@ -5172,10 +5323,11 @@ odp_testinfo_t pktio_suite_unsegmented[] = {
pktio_check_maxlen_set),
ODP_TEST_INFO_CONDITIONAL(pktio_test_pktout_aging_tmo,
pktio_check_pktout_aging_tmo),
- ODP_TEST_INFO_CONDITIONAL(pktio_test_pktout_compl_plain_queue,
- pktio_check_pktout_compl_plain_queue),
- ODP_TEST_INFO_CONDITIONAL(pktio_test_pktout_compl_sched_queue,
- pktio_check_pktout_compl_sched_queue),
+ ODP_TEST_INFO_CONDITIONAL(pktio_test_pktout_compl_event_plain_queue,
+ pktio_check_pktout_compl_event_plain_queue),
+ ODP_TEST_INFO_CONDITIONAL(pktio_test_pktout_compl_event_sched_queue,
+ pktio_check_pktout_compl_event_sched_queue),
+ ODP_TEST_INFO_CONDITIONAL(pktio_test_pktout_compl_poll, pktio_check_pktout_compl_poll),
ODP_TEST_INFO_CONDITIONAL(pktio_test_enable_pause_rx, pktio_check_pause_rx),
ODP_TEST_INFO_CONDITIONAL(pktio_test_enable_pause_tx, pktio_check_pause_tx),
ODP_TEST_INFO_CONDITIONAL(pktio_test_enable_pause_both, pktio_check_pause_both),