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