Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org>
---
 test/validation/pktio/pktio.c | 112 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)

diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c
index ebe34fa..f8a8981 100644
--- a/test/validation/pktio/pktio.c
+++ b/test/validation/pktio/pktio.c
@@ -626,6 +626,117 @@ void pktio_test_inq(void)
        CU_ASSERT(odp_pktio_close(pktio) == 0);
 }
 
+static uint32_t pktio_pkt_validate(odp_packet_t pkt)
+{
+       size_t off;
+       pkt_head_t head;
+       pkt_tail_t tail;
+
+       if (pkt == ODP_PACKET_INVALID)
+               return -1;
+
+       off = odp_packet_l4_offset(pkt);
+       if (off ==  ODP_PACKET_OFFSET_INVALID)
+               return -1;
+
+       off += ODPH_UDPHDR_LEN;
+       if (odp_packet_copydata_out(pkt, off, sizeof(head), &head) != 0)
+               return -1;
+
+       if (head.magic != TEST_SEQ_MAGIC)
+               return -1;
+
+       if (odp_packet_len(pkt) == packet_len) {
+               off = packet_len - sizeof(tail);
+               if (odp_packet_copydata_out(pkt, off, sizeof(tail), &tail) != 0)
+                       return -1;
+       }
+
+       return 0;
+}
+
+static void pktio_test_start_stop(void)
+{
+       odp_pktio_t pktio[MAX_NUM_IFACES];
+       odp_packet_t pkt;
+       odp_event_t tx_ev[1000];
+       odp_event_t ev;
+       int i, pkts, ret, alloc = 0;
+       odp_queue_t outq;
+
+       for (i = 0; i < num_ifaces; i++) {
+               pktio[i] = create_pktio(iface_name[i], ODP_QUEUE_TYPE_SCHED, 0);
+               CU_ASSERT(pktio[i] != ODP_PKTIO_INVALID);
+               create_inq(pktio[i],  ODP_QUEUE_TYPE_SCHED);
+       }
+
+       for (alloc = 0; alloc < 1000; alloc++) {
+               pkt = odp_packet_alloc(default_pkt_pool, packet_len);
+               if (pkt == ODP_PACKET_INVALID)
+                       break;
+               pktio_init_packet(pkt);
+               tx_ev[alloc] = odp_packet_to_event(pkt);
+       }
+
+       outq = odp_pktio_outq_getdef(pktio[0]);
+
+       /* stop and check that we can not transmit*/
+       odp_pktio_stop(pktio[0]);
+       ret = odp_queue_enq_multi(outq, tx_ev, 10);
+       CU_ASSERT(ret == 0);
+
+       /* start first and queue 10 packets */
+       odp_pktio_start(pktio[0]);
+       for (pkts = 0; pkts != alloc; ) {
+               ret = odp_queue_enq_multi(outq, &tx_ev[pkts], alloc - pkts);
+               if (ret < 0) {
+                       CU_FAIL("unable to enqueue packet\n");
+                       break;
+               }
+               pkts += ret;
+       }
+       /* stop second and check that packets did not arrive */
+       if (num_ifaces == 1)
+               odp_pktio_stop(pktio[0]);
+       else
+               odp_pktio_stop(pktio[1]);
+       for (i = 0, pkts = 0; i < 1000; i++) {
+               ev = odp_schedule(NULL, ODP_TIME_MSEC);
+               if (ev != ODP_EVENT_INVALID) {
+                       if (odp_event_type(ev) == ODP_EVENT_PACKET) {
+                               if (!pktio_pkt_validate(pkt))
+                                       pkts++;
+                       }
+                       odp_event_free(ev);
+               }
+       }
+       if (pkts)
+               CU_FAIL("pktio stopped, received unexpected events");
+
+       /* start second and get packets */
+       if (num_ifaces == 1)
+               odp_pktio_start(pktio[0]);
+       else
+               odp_pktio_start(pktio[1]);
+       for (i = 0, pkts = 0; i < 1000; i++) {
+               ev = odp_schedule(NULL, ODP_TIME_MSEC);
+               if (ev != ODP_EVENT_INVALID) {
+                       if (odp_event_type(ev) == ODP_EVENT_PACKET) {
+                               pkt = odp_packet_from_event(ev);
+                               if (!pktio_pkt_validate(pkt))
+                                       pkts++;
+                       }
+                       odp_event_free(ev);
+               }
+       }
+       CU_ASSERT(pkts == alloc);
+
+       for (i = 0; i < num_ifaces; i++) {
+               destroy_inq(pktio[i]);
+               CU_ASSERT(odp_pktio_close(pktio[i]) == 0);
+       }
+}
+
 static int create_pool(const char *iface, int num)
 {
        char pool_name[ODP_POOL_NAME_LEN];
@@ -722,6 +833,7 @@ CU_TestInfo pktio_suite[] = {
        {"pktio promisc mode",  pktio_test_promisc},
        {"pktio mac",           pktio_test_mac},
        {"pktio inq_remdef",    pktio_test_inq_remdef},
+       {"pktio start stop",    pktio_test_start_stop},
        CU_TEST_INFO_NULL
 };
 
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to