Message ID | 1447839268-20423-6-git-send-email-maxim.uvarov@linaro.org |
---|---|
State | Superseded |
Headers | show |
On 18.11.15 11:34, Maxim Uvarov wrote: > Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> > --- > test/validation/pktio/pktio.c | 134 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 134 insertions(+) > > diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c > index 6320b77..9f05392 100644 > --- a/test/validation/pktio/pktio.c > +++ b/test/validation/pktio/pktio.c > @@ -23,6 +23,8 @@ > #define TEST_SEQ_MAGIC 0x92749451 > #define TX_BATCH_LEN 4 > > +#undef DEBUG_STATS > + > /** interface names used for testing */ > static const char *iface_name[MAX_NUM_IFACES]; > > @@ -690,6 +692,137 @@ void pktio_test_inq(void) > CU_ASSERT(odp_pktio_close(pktio) == 0); > } > > +#ifdef DEBUG_STATS > +static void _print_pktio_stats(odp_pktio_stats_t *s, const char *name) > +{ > + fprintf(stderr, "\n%s:\n" > + " in_octets %"PRIu64"\n" > + " in_ucast_pkts %"PRIu64"\n" > + " in_discards %"PRIu64"\n" > + " in_errors %"PRIu64"\n" > + " in_unknown_protos %"PRIu64"\n" > + " out_octets %"PRIu64"\n" > + " out_ucast_pkts %"PRIu64"\n" > + " out_discards %"PRIu64"\n" > + " out_errors %"PRIu64"\n", > + name, > + s->in_octets, > + s->in_ucast_pkts, > + s->in_discards, > + s->in_errors, > + s->in_unknown_protos, > + s->out_octets, > + s->out_ucast_pkts, > + s->out_discards, > + s->out_errors); > +} > +#endif > + > +static void pktio_test_statistics_counters(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; > + uint64_t wait = odp_schedule_wait_time(ODP_TIME_MSEC); Will likely have conflict while merge api-next where it's ODP_TIME_MSEC_IN_NS. > + odp_pktio_stats_t stats[2]; > + > + for (i = 0; i < num_ifaces; i++) { > + pktio[i] = create_pktio(i, ODP_PKTIN_MODE_SCHED); > + CU_ASSERT_FATAL(pktio[i] != ODP_PKTIO_INVALID); > + create_inq(pktio[i], ODP_QUEUE_TYPE_SCHED); > + } > + > + outq = odp_pktio_outq_getdef(pktio[0]); > + > + ret = odp_pktio_start(pktio[0]); > + CU_ASSERT(ret == 0); > + if (num_ifaces > 1) { > + ret = odp_pktio_start(pktio[1]); > + CU_ASSERT(ret == 0); > + } > + > + /* flush packets with magic number in pipes */ > + for (i = 0; i < 1000; i++) { > + ev = odp_schedule(NULL, wait); > + if (ev != ODP_EVENT_INVALID) > + odp_event_free(ev); > + } > + > + /* alloc */ > + 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); > + } > + > + ret = odp_pktio_stats_reset(pktio[0]); > + CU_ASSERT(ret == 0); > + if (num_ifaces > 1) { > + ret = odp_pktio_stats_reset(pktio[1]); > + CU_ASSERT(ret == 0); > + } > + > + /* send */ > + 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; > + } > + > + /* get */ > + for (i = 0, pkts = 0; i < 1000; i++) { > + ev = odp_schedule(NULL, wait); > + if (ev != ODP_EVENT_INVALID) { > + if (odp_event_type(ev) == ODP_EVENT_PACKET) { > + pkt = odp_packet_from_event(ev); > + if (pktio_pkt_seq(pkt) != TEST_SEQ_INVALID) > + pkts++; > + } > + odp_event_free(ev); > + } > + } > + > + ret = odp_pktio_stats(pktio[0], &stats[0]); > + CU_ASSERT(ret == 0); > + > + if (num_ifaces > 1) { > + ret = odp_pktio_stats(pktio[1], &stats[1]); > + CU_ASSERT(ret == 0); > + CU_ASSERT(stats[1].in_ucast_pkts >= (uint64_t)pkts); > + CU_ASSERT(stats[0].out_ucast_pkts == stats[1].in_ucast_pkts); > + CU_ASSERT(stats[0].out_octets == stats[1].in_octets); > + CU_ASSERT(stats[0].out_octets >= > + (PKT_LEN_NORMAL * (uint64_t)pkts)); > + } else { > + CU_ASSERT(stats[0].in_ucast_pkts == (uint64_t)pkts); > + CU_ASSERT(stats[0].in_octets == > + (PKT_LEN_NORMAL * (uint64_t)pkts)); > + } > + > + CU_ASSERT(pkts == alloc); > + CU_ASSERT(0 == stats[0].in_discards); > + CU_ASSERT(0 == stats[0].in_errors); > + CU_ASSERT(0 == stats[0].in_unknown_protos); > + CU_ASSERT(0 == stats[0].out_discards); > + CU_ASSERT(0 == stats[0].out_errors); > + > + for (i = 0; i < num_ifaces; i++) { > +#ifdef DEBUG_STATS > + _print_pktio_stats(&stats[i], iface_name[i]); > +#endif > + destroy_inq(pktio[i]); > + CU_ASSERT(odp_pktio_close(pktio[i]) == 0); > + } > +} > + > static void pktio_test_start_stop(void) > { > odp_pktio_t pktio[MAX_NUM_IFACES]; > @@ -1057,6 +1190,7 @@ odp_testinfo_t pktio_suite_unsegmented[] = { > ODP_TEST_INFO(pktio_test_mac), > ODP_TEST_INFO(pktio_test_inq_remdef), > ODP_TEST_INFO(pktio_test_start_stop), > + ODP_TEST_INFO(pktio_test_statistics_counters), > ODP_TEST_INFO_NULL > }; > >
diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c index 6320b77..9f05392 100644 --- a/test/validation/pktio/pktio.c +++ b/test/validation/pktio/pktio.c @@ -23,6 +23,8 @@ #define TEST_SEQ_MAGIC 0x92749451 #define TX_BATCH_LEN 4 +#undef DEBUG_STATS + /** interface names used for testing */ static const char *iface_name[MAX_NUM_IFACES]; @@ -690,6 +692,137 @@ void pktio_test_inq(void) CU_ASSERT(odp_pktio_close(pktio) == 0); } +#ifdef DEBUG_STATS +static void _print_pktio_stats(odp_pktio_stats_t *s, const char *name) +{ + fprintf(stderr, "\n%s:\n" + " in_octets %"PRIu64"\n" + " in_ucast_pkts %"PRIu64"\n" + " in_discards %"PRIu64"\n" + " in_errors %"PRIu64"\n" + " in_unknown_protos %"PRIu64"\n" + " out_octets %"PRIu64"\n" + " out_ucast_pkts %"PRIu64"\n" + " out_discards %"PRIu64"\n" + " out_errors %"PRIu64"\n", + name, + s->in_octets, + s->in_ucast_pkts, + s->in_discards, + s->in_errors, + s->in_unknown_protos, + s->out_octets, + s->out_ucast_pkts, + s->out_discards, + s->out_errors); +} +#endif + +static void pktio_test_statistics_counters(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; + uint64_t wait = odp_schedule_wait_time(ODP_TIME_MSEC); + odp_pktio_stats_t stats[2]; + + for (i = 0; i < num_ifaces; i++) { + pktio[i] = create_pktio(i, ODP_PKTIN_MODE_SCHED); + CU_ASSERT_FATAL(pktio[i] != ODP_PKTIO_INVALID); + create_inq(pktio[i], ODP_QUEUE_TYPE_SCHED); + } + + outq = odp_pktio_outq_getdef(pktio[0]); + + ret = odp_pktio_start(pktio[0]); + CU_ASSERT(ret == 0); + if (num_ifaces > 1) { + ret = odp_pktio_start(pktio[1]); + CU_ASSERT(ret == 0); + } + + /* flush packets with magic number in pipes */ + for (i = 0; i < 1000; i++) { + ev = odp_schedule(NULL, wait); + if (ev != ODP_EVENT_INVALID) + odp_event_free(ev); + } + + /* alloc */ + 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); + } + + ret = odp_pktio_stats_reset(pktio[0]); + CU_ASSERT(ret == 0); + if (num_ifaces > 1) { + ret = odp_pktio_stats_reset(pktio[1]); + CU_ASSERT(ret == 0); + } + + /* send */ + 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; + } + + /* get */ + for (i = 0, pkts = 0; i < 1000; i++) { + ev = odp_schedule(NULL, wait); + if (ev != ODP_EVENT_INVALID) { + if (odp_event_type(ev) == ODP_EVENT_PACKET) { + pkt = odp_packet_from_event(ev); + if (pktio_pkt_seq(pkt) != TEST_SEQ_INVALID) + pkts++; + } + odp_event_free(ev); + } + } + + ret = odp_pktio_stats(pktio[0], &stats[0]); + CU_ASSERT(ret == 0); + + if (num_ifaces > 1) { + ret = odp_pktio_stats(pktio[1], &stats[1]); + CU_ASSERT(ret == 0); + CU_ASSERT(stats[1].in_ucast_pkts >= (uint64_t)pkts); + CU_ASSERT(stats[0].out_ucast_pkts == stats[1].in_ucast_pkts); + CU_ASSERT(stats[0].out_octets == stats[1].in_octets); + CU_ASSERT(stats[0].out_octets >= + (PKT_LEN_NORMAL * (uint64_t)pkts)); + } else { + CU_ASSERT(stats[0].in_ucast_pkts == (uint64_t)pkts); + CU_ASSERT(stats[0].in_octets == + (PKT_LEN_NORMAL * (uint64_t)pkts)); + } + + CU_ASSERT(pkts == alloc); + CU_ASSERT(0 == stats[0].in_discards); + CU_ASSERT(0 == stats[0].in_errors); + CU_ASSERT(0 == stats[0].in_unknown_protos); + CU_ASSERT(0 == stats[0].out_discards); + CU_ASSERT(0 == stats[0].out_errors); + + for (i = 0; i < num_ifaces; i++) { +#ifdef DEBUG_STATS + _print_pktio_stats(&stats[i], iface_name[i]); +#endif + destroy_inq(pktio[i]); + CU_ASSERT(odp_pktio_close(pktio[i]) == 0); + } +} + static void pktio_test_start_stop(void) { odp_pktio_t pktio[MAX_NUM_IFACES]; @@ -1057,6 +1190,7 @@ odp_testinfo_t pktio_suite_unsegmented[] = { ODP_TEST_INFO(pktio_test_mac), ODP_TEST_INFO(pktio_test_inq_remdef), ODP_TEST_INFO(pktio_test_start_stop), + ODP_TEST_INFO(pktio_test_statistics_counters), ODP_TEST_INFO_NULL };
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> --- test/validation/pktio/pktio.c | 134 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+)