diff mbox

[API-NEXT,PATCHv2,5/5] validation: implement pktio statistics counters

Message ID 1447839268-20423-6-git-send-email-maxim.uvarov@linaro.org
State Superseded
Headers show

Commit Message

Maxim Uvarov Nov. 18, 2015, 9:34 a.m. UTC
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 test/validation/pktio/pktio.c | 134 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 134 insertions(+)

Comments

Ivan Khoronzhuk Nov. 19, 2015, 12:04 p.m. UTC | #1
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 mbox

Patch

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
 };