diff mbox

[2/3] validation: pktio: support arbitrary length packets

Message ID 1427972861-14593-2-git-send-email-stuart.haslam@linaro.org
State Accepted
Commit d5af0f84ac05be65a8c9225292fb076254b37aab
Headers show

Commit Message

Stuart Haslam April 2, 2015, 11:07 a.m. UTC
Rework the way test packets are generated in order to allow generating
and verifying arbitrary length packets.

Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org>
---
 test/validation/odp_pktio.c | 140 ++++++++++++++++++--------------------------
 1 file changed, 58 insertions(+), 82 deletions(-)

Comments

Maxim Uvarov April 3, 2015, 2:40 p.m. UTC | #1
Merged this patch.

Maxim.

On 04/02/15 14:07, Stuart Haslam wrote:
> Rework the way test packets are generated in order to allow generating
> and verifying arbitrary length packets.
>
> Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org>
> ---
>   test/validation/odp_pktio.c | 140 ++++++++++++++++++--------------------------
>   1 file changed, 58 insertions(+), 82 deletions(-)
>
> diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
> index 5ea45e4..a078efe 100644
> --- a/test/validation/odp_pktio.c
> +++ b/test/validation/odp_pktio.c
> @@ -14,11 +14,10 @@
>   #include <stdlib.h>
>   
>   #define PKT_BUF_NUM            32
> -#define PKT_BUF_SIZE           1856
> -#define PKT_BUF_JUMBO_SIZE     (9*1024)
> -#define PKT_BUF_JUMBO_MAX_PAYLOAD (PKT_BUF_JUMBO_SIZE -\
> -				   (ODPH_UDPHDR_LEN +\
> -				   ODPH_IPV4HDR_LEN + ODPH_ETHHDR_LEN))
> +#define PKT_BUF_SIZE           (9*1024)
> +#define PKT_LEN_NORMAL         64
> +#define PKT_LEN_JUMBO          (PKT_BUF_SIZE - ODPH_ETHHDR_LEN - \
> +				ODPH_IPV4HDR_LEN - ODPH_UDPHDR_LEN)
>   #define MAX_NUM_IFACES         2
>   #define TEST_SEQ_INVALID       ((uint32_t)~0)
>   #define TEST_SEQ_MAGIC         0x92749451
> @@ -37,20 +36,19 @@ typedef struct {
>   	odp_queue_t inq;
>   } pktio_info_t;
>   
> +/** magic number and sequence at start of UDP payload */
>   typedef struct ODP_PACKED {
>   	uint32be_t magic;
>   	uint32be_t seq;
>   } pkt_head_t;
>   
> -/** structure of test packet UDP payload */
> +/** magic number at end of UDP payload */
>   typedef struct ODP_PACKED {
> -	pkt_head_t head;
> -	char data[PKT_BUF_JUMBO_MAX_PAYLOAD - sizeof(pkt_head_t) -
> -		  sizeof(uint32be_t)];
> -	uint32be_t magic2;
> -} pkt_test_data_t;
> +	uint32be_t magic;
> +} pkt_tail_t;
>   
> -static int test_jumbo;
> +/** size of transmitted packets */
> +static uint32_t packet_len = PKT_LEN_NORMAL;
>   
>   /** default packet pool */
>   odp_pool_t default_pkt_pool = ODP_POOL_INVALID;
> @@ -72,87 +70,76 @@ static void pktio_pkt_set_macs(odp_packet_t pkt,
>   	CU_ASSERT(ret == ODPH_ETHADDR_LEN);
>   }
>   
> -static uint32_t pkt_payload_len(void)
> -{
> -	return test_jumbo ? sizeof(pkt_test_data_t) : sizeof(pkt_head_t);
> -}
> -
> -static int pktio_pkt_set_seq(odp_packet_t pkt)
> +static uint32_t pktio_pkt_set_seq(odp_packet_t pkt)
>   {
>   	static uint32_t tstseq;
> -	size_t l4_off;
> -	pkt_test_data_t *data;
> -	uint32_t len = pkt_payload_len();
> -
> +	size_t off;
> +	pkt_head_t head;
> +	pkt_tail_t tail;
>   
> -	l4_off = odp_packet_l4_offset(pkt);
> -	if (!l4_off) {
> +	off = odp_packet_l4_offset(pkt);
> +	if (off == ODP_PACKET_OFFSET_INVALID) {
>   		CU_FAIL("packet L4 offset not set");
> -		return -1;
> +		return TEST_SEQ_INVALID;
>   	}
>   
> -	data = calloc(1, len);
> -	CU_ASSERT_FATAL(data != NULL);
> +	head.magic = TEST_SEQ_MAGIC;
> +	head.seq   = tstseq;
>   
> -	data->head.magic = TEST_SEQ_MAGIC;
> -	if (test_jumbo)
> -		data->magic2 = TEST_SEQ_MAGIC;
> -	data->head.seq   = tstseq;
> +	off += ODPH_UDPHDR_LEN;
> +	if (odp_packet_copydata_in(pkt, off, sizeof(head), &head) != 0)
> +		return TEST_SEQ_INVALID;
> +
> +	tail.magic = TEST_SEQ_MAGIC;
> +	off = odp_packet_len(pkt) - sizeof(pkt_tail_t);
> +	if (odp_packet_copydata_in(pkt, off, sizeof(tail), &tail) != 0)
> +		return TEST_SEQ_INVALID;
>   
> -	odp_packet_copydata_in(pkt, l4_off+ODPH_UDPHDR_LEN,
> -			       len, data);
> -	free(data);
>   	tstseq++;
>   
> -	return 0;
> +	return head.seq;
>   }
>   
>   static uint32_t pktio_pkt_seq(odp_packet_t pkt)
>   {
> -	size_t l4_off;
> +	size_t off;
>   	uint32_t seq = TEST_SEQ_INVALID;
> -	pkt_test_data_t *data;
> -	uint32_t len = pkt_payload_len();
> +	pkt_head_t head;
> +	pkt_tail_t tail;
>   
> -	l4_off = odp_packet_l4_offset(pkt);
> -	if (l4_off ==  ODP_PACKET_OFFSET_INVALID)
> +	off = odp_packet_l4_offset(pkt);
> +	if (off ==  ODP_PACKET_OFFSET_INVALID)
>   		return TEST_SEQ_INVALID;
>   
> -	data = calloc(1, len);
> -	CU_ASSERT_FATAL(data != NULL);
> +	off += ODPH_UDPHDR_LEN;
> +	if (odp_packet_copydata_out(pkt, off, sizeof(head), &head) != 0)
> +		return TEST_SEQ_INVALID;
>   
> -	odp_packet_copydata_out(pkt, l4_off+ODPH_UDPHDR_LEN,
> -				len, data);
> +	if (head.magic != TEST_SEQ_MAGIC)
> +		return TEST_SEQ_INVALID;
>   
> -	if (data->head.magic == TEST_SEQ_MAGIC) {
> -		if (test_jumbo && data->magic2 != TEST_SEQ_MAGIC) {
> -			free(data);
> +	if (odp_packet_len(pkt) == packet_len) {
> +		off = packet_len - sizeof(tail);
> +		if (odp_packet_copydata_out(pkt, off, sizeof(tail), &tail) != 0)
>   			return TEST_SEQ_INVALID;
> -		}
> -		seq = data->head.seq;
> +
> +		if (tail.magic == TEST_SEQ_MAGIC)
> +			seq = head.seq;
>   	}
>   
> -	free(data);
>   	return seq;
>   }
>   
> -static odp_packet_t pktio_create_packet(void)
> +static uint32_t pktio_init_packet(odp_packet_t pkt)
>   {
> -	odp_packet_t pkt;
>   	odph_ethhdr_t *eth;
>   	odph_ipv4hdr_t *ip;
>   	odph_udphdr_t *udp;
>   	char *buf;
>   	uint16_t seq;
> -	size_t payload_len = pkt_payload_len();
>   	uint8_t mac[ODPH_ETHADDR_LEN] = {0};
> +	int pkt_len = odp_packet_len(pkt);
>   
> -	pkt = odp_packet_alloc(default_pkt_pool, payload_len + ODPH_UDPHDR_LEN +
> -			       ODPH_IPV4HDR_LEN + ODPH_ETHHDR_LEN);
> -	if (pkt == ODP_PACKET_INVALID) {
> -		CU_FAIL("failed to allocate packet buffer");
> -		return ODP_PACKET_INVALID;
> -	}
>   	buf = odp_packet_data(pkt);
>   
>   	/* Ethernet */
> @@ -168,8 +155,7 @@ static odp_packet_t pktio_create_packet(void)
>   	ip->dst_addr = odp_cpu_to_be_32(0);
>   	ip->src_addr = odp_cpu_to_be_32(0);
>   	ip->ver_ihl = ODPH_IPV4 << 4 | ODPH_IPV4HDR_IHL_MIN;
> -	ip->tot_len = odp_cpu_to_be_16(payload_len + ODPH_UDPHDR_LEN +
> -				       ODPH_IPV4HDR_LEN);
> +	ip->tot_len = odp_cpu_to_be_16(pkt_len - ODPH_ETHHDR_LEN);
>   	ip->ttl = 128;
>   	ip->proto = ODPH_IPPROTO_UDP;
>   	seq = odp_atomic_fetch_inc_u32(&ip_seq);
> @@ -182,15 +168,11 @@ static odp_packet_t pktio_create_packet(void)
>   	udp = (odph_udphdr_t *)(buf + ODPH_ETHHDR_LEN + ODPH_IPV4HDR_LEN);
>   	udp->src_port = odp_cpu_to_be_16(0);
>   	udp->dst_port = odp_cpu_to_be_16(0);
> -	udp->length = odp_cpu_to_be_16(payload_len + ODPH_UDPHDR_LEN);
> +	udp->length = odp_cpu_to_be_16(pkt_len -
> +				       ODPH_ETHHDR_LEN - ODPH_IPV4HDR_LEN);
>   	udp->chksum = 0;
>   
> -	if (pktio_pkt_set_seq(pkt) != 0) {
> -		odp_packet_free(pkt);
> -		return ODP_PACKET_INVALID;
> -	}
> -
> -	return pkt;
> +	return pktio_pkt_set_seq(pkt);
>   }
>   
>   static int pktio_fixup_checksums(odp_packet_t pkt)
> @@ -224,8 +206,8 @@ static int default_pool_create(void)
>   		return -1;
>   
>   	memset(&params, 0, sizeof(params));
> -	params.pkt.seg_len = PKT_BUF_JUMBO_SIZE;
> -	params.pkt.len     = PKT_BUF_JUMBO_SIZE;
> +	params.pkt.seg_len = PKT_BUF_SIZE;
> +	params.pkt.len     = PKT_BUF_SIZE;
>   	params.pkt.num     = PKT_BUF_NUM;
>   	params.type        = ODP_POOL_PACKET;
>   
> @@ -245,14 +227,8 @@ static odp_pktio_t create_pktio(const char *iface)
>   	odp_pool_param_t params;
>   
>   	memset(&params, 0, sizeof(params));
> -	if (test_jumbo) {
> -		params.pkt.seg_len = PKT_BUF_JUMBO_SIZE;
> -		params.pkt.len     = PKT_BUF_JUMBO_SIZE;
> -
> -	} else {
> -		params.pkt.seg_len = PKT_BUF_SIZE;
> -		params.pkt.len     = PKT_BUF_SIZE;
> -	}
> +	params.pkt.seg_len = PKT_BUF_SIZE;
> +	params.pkt.len     = PKT_BUF_SIZE;
>   	params.pkt.num     = PKT_BUF_NUM;
>   	params.type        = ODP_POOL_PACKET;
>   
> @@ -393,11 +369,11 @@ static void pktio_txrx_multi(pktio_info_t *pktio_a, pktio_info_t *pktio_b,
>   
>   	/* generate test packets to send */
>   	for (i = 0; i < num_pkts; ++i) {
> -		tx_pkt[i] = pktio_create_packet();
> +		tx_pkt[i] = odp_packet_alloc(default_pkt_pool, packet_len);
>   		if (tx_pkt[i] == ODP_PACKET_INVALID)
>   			break;
>   
> -		tx_seq[i] = pktio_pkt_seq(tx_pkt[i]);
> +		tx_seq[i] = pktio_init_packet(tx_pkt[i]);
>   		if (tx_seq[i] == TEST_SEQ_INVALID)
>   			break;
>   
> @@ -500,9 +476,9 @@ static void test_odp_pktio_sched_multi(void)
>   
>   static void test_odp_pktio_jumbo(void)
>   {
> -	test_jumbo = 1;
> +	packet_len = PKT_LEN_JUMBO;
>   	test_odp_pktio_sched_multi();
> -	test_jumbo = 0;
> +	packet_len = PKT_LEN_NORMAL;
>   }
>   
>   static void test_odp_pktio_mtu(void)
diff mbox

Patch

diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
index 5ea45e4..a078efe 100644
--- a/test/validation/odp_pktio.c
+++ b/test/validation/odp_pktio.c
@@ -14,11 +14,10 @@ 
 #include <stdlib.h>
 
 #define PKT_BUF_NUM            32
-#define PKT_BUF_SIZE           1856
-#define PKT_BUF_JUMBO_SIZE     (9*1024)
-#define PKT_BUF_JUMBO_MAX_PAYLOAD (PKT_BUF_JUMBO_SIZE -\
-				   (ODPH_UDPHDR_LEN +\
-				   ODPH_IPV4HDR_LEN + ODPH_ETHHDR_LEN))
+#define PKT_BUF_SIZE           (9*1024)
+#define PKT_LEN_NORMAL         64
+#define PKT_LEN_JUMBO          (PKT_BUF_SIZE - ODPH_ETHHDR_LEN - \
+				ODPH_IPV4HDR_LEN - ODPH_UDPHDR_LEN)
 #define MAX_NUM_IFACES         2
 #define TEST_SEQ_INVALID       ((uint32_t)~0)
 #define TEST_SEQ_MAGIC         0x92749451
@@ -37,20 +36,19 @@  typedef struct {
 	odp_queue_t inq;
 } pktio_info_t;
 
+/** magic number and sequence at start of UDP payload */
 typedef struct ODP_PACKED {
 	uint32be_t magic;
 	uint32be_t seq;
 } pkt_head_t;
 
-/** structure of test packet UDP payload */
+/** magic number at end of UDP payload */
 typedef struct ODP_PACKED {
-	pkt_head_t head;
-	char data[PKT_BUF_JUMBO_MAX_PAYLOAD - sizeof(pkt_head_t) -
-		  sizeof(uint32be_t)];
-	uint32be_t magic2;
-} pkt_test_data_t;
+	uint32be_t magic;
+} pkt_tail_t;
 
-static int test_jumbo;
+/** size of transmitted packets */
+static uint32_t packet_len = PKT_LEN_NORMAL;
 
 /** default packet pool */
 odp_pool_t default_pkt_pool = ODP_POOL_INVALID;
@@ -72,87 +70,76 @@  static void pktio_pkt_set_macs(odp_packet_t pkt,
 	CU_ASSERT(ret == ODPH_ETHADDR_LEN);
 }
 
-static uint32_t pkt_payload_len(void)
-{
-	return test_jumbo ? sizeof(pkt_test_data_t) : sizeof(pkt_head_t);
-}
-
-static int pktio_pkt_set_seq(odp_packet_t pkt)
+static uint32_t pktio_pkt_set_seq(odp_packet_t pkt)
 {
 	static uint32_t tstseq;
-	size_t l4_off;
-	pkt_test_data_t *data;
-	uint32_t len = pkt_payload_len();
-
+	size_t off;
+	pkt_head_t head;
+	pkt_tail_t tail;
 
-	l4_off = odp_packet_l4_offset(pkt);
-	if (!l4_off) {
+	off = odp_packet_l4_offset(pkt);
+	if (off == ODP_PACKET_OFFSET_INVALID) {
 		CU_FAIL("packet L4 offset not set");
-		return -1;
+		return TEST_SEQ_INVALID;
 	}
 
-	data = calloc(1, len);
-	CU_ASSERT_FATAL(data != NULL);
+	head.magic = TEST_SEQ_MAGIC;
+	head.seq   = tstseq;
 
-	data->head.magic = TEST_SEQ_MAGIC;
-	if (test_jumbo)
-		data->magic2 = TEST_SEQ_MAGIC;
-	data->head.seq   = tstseq;
+	off += ODPH_UDPHDR_LEN;
+	if (odp_packet_copydata_in(pkt, off, sizeof(head), &head) != 0)
+		return TEST_SEQ_INVALID;
+
+	tail.magic = TEST_SEQ_MAGIC;
+	off = odp_packet_len(pkt) - sizeof(pkt_tail_t);
+	if (odp_packet_copydata_in(pkt, off, sizeof(tail), &tail) != 0)
+		return TEST_SEQ_INVALID;
 
-	odp_packet_copydata_in(pkt, l4_off+ODPH_UDPHDR_LEN,
-			       len, data);
-	free(data);
 	tstseq++;
 
-	return 0;
+	return head.seq;
 }
 
 static uint32_t pktio_pkt_seq(odp_packet_t pkt)
 {
-	size_t l4_off;
+	size_t off;
 	uint32_t seq = TEST_SEQ_INVALID;
-	pkt_test_data_t *data;
-	uint32_t len = pkt_payload_len();
+	pkt_head_t head;
+	pkt_tail_t tail;
 
-	l4_off = odp_packet_l4_offset(pkt);
-	if (l4_off ==  ODP_PACKET_OFFSET_INVALID)
+	off = odp_packet_l4_offset(pkt);
+	if (off ==  ODP_PACKET_OFFSET_INVALID)
 		return TEST_SEQ_INVALID;
 
-	data = calloc(1, len);
-	CU_ASSERT_FATAL(data != NULL);
+	off += ODPH_UDPHDR_LEN;
+	if (odp_packet_copydata_out(pkt, off, sizeof(head), &head) != 0)
+		return TEST_SEQ_INVALID;
 
-	odp_packet_copydata_out(pkt, l4_off+ODPH_UDPHDR_LEN,
-				len, data);
+	if (head.magic != TEST_SEQ_MAGIC)
+		return TEST_SEQ_INVALID;
 
-	if (data->head.magic == TEST_SEQ_MAGIC) {
-		if (test_jumbo && data->magic2 != TEST_SEQ_MAGIC) {
-			free(data);
+	if (odp_packet_len(pkt) == packet_len) {
+		off = packet_len - sizeof(tail);
+		if (odp_packet_copydata_out(pkt, off, sizeof(tail), &tail) != 0)
 			return TEST_SEQ_INVALID;
-		}
-		seq = data->head.seq;
+
+		if (tail.magic == TEST_SEQ_MAGIC)
+			seq = head.seq;
 	}
 
-	free(data);
 	return seq;
 }
 
-static odp_packet_t pktio_create_packet(void)
+static uint32_t pktio_init_packet(odp_packet_t pkt)
 {
-	odp_packet_t pkt;
 	odph_ethhdr_t *eth;
 	odph_ipv4hdr_t *ip;
 	odph_udphdr_t *udp;
 	char *buf;
 	uint16_t seq;
-	size_t payload_len = pkt_payload_len();
 	uint8_t mac[ODPH_ETHADDR_LEN] = {0};
+	int pkt_len = odp_packet_len(pkt);
 
-	pkt = odp_packet_alloc(default_pkt_pool, payload_len + ODPH_UDPHDR_LEN +
-			       ODPH_IPV4HDR_LEN + ODPH_ETHHDR_LEN);
-	if (pkt == ODP_PACKET_INVALID) {
-		CU_FAIL("failed to allocate packet buffer");
-		return ODP_PACKET_INVALID;
-	}
 	buf = odp_packet_data(pkt);
 
 	/* Ethernet */
@@ -168,8 +155,7 @@  static odp_packet_t pktio_create_packet(void)
 	ip->dst_addr = odp_cpu_to_be_32(0);
 	ip->src_addr = odp_cpu_to_be_32(0);
 	ip->ver_ihl = ODPH_IPV4 << 4 | ODPH_IPV4HDR_IHL_MIN;
-	ip->tot_len = odp_cpu_to_be_16(payload_len + ODPH_UDPHDR_LEN +
-				       ODPH_IPV4HDR_LEN);
+	ip->tot_len = odp_cpu_to_be_16(pkt_len - ODPH_ETHHDR_LEN);
 	ip->ttl = 128;
 	ip->proto = ODPH_IPPROTO_UDP;
 	seq = odp_atomic_fetch_inc_u32(&ip_seq);
@@ -182,15 +168,11 @@  static odp_packet_t pktio_create_packet(void)
 	udp = (odph_udphdr_t *)(buf + ODPH_ETHHDR_LEN + ODPH_IPV4HDR_LEN);
 	udp->src_port = odp_cpu_to_be_16(0);
 	udp->dst_port = odp_cpu_to_be_16(0);
-	udp->length = odp_cpu_to_be_16(payload_len + ODPH_UDPHDR_LEN);
+	udp->length = odp_cpu_to_be_16(pkt_len -
+				       ODPH_ETHHDR_LEN - ODPH_IPV4HDR_LEN);
 	udp->chksum = 0;
 
-	if (pktio_pkt_set_seq(pkt) != 0) {
-		odp_packet_free(pkt);
-		return ODP_PACKET_INVALID;
-	}
-
-	return pkt;
+	return pktio_pkt_set_seq(pkt);
 }
 
 static int pktio_fixup_checksums(odp_packet_t pkt)
@@ -224,8 +206,8 @@  static int default_pool_create(void)
 		return -1;
 
 	memset(&params, 0, sizeof(params));
-	params.pkt.seg_len = PKT_BUF_JUMBO_SIZE;
-	params.pkt.len     = PKT_BUF_JUMBO_SIZE;
+	params.pkt.seg_len = PKT_BUF_SIZE;
+	params.pkt.len     = PKT_BUF_SIZE;
 	params.pkt.num     = PKT_BUF_NUM;
 	params.type        = ODP_POOL_PACKET;
 
@@ -245,14 +227,8 @@  static odp_pktio_t create_pktio(const char *iface)
 	odp_pool_param_t params;
 
 	memset(&params, 0, sizeof(params));
-	if (test_jumbo) {
-		params.pkt.seg_len = PKT_BUF_JUMBO_SIZE;
-		params.pkt.len     = PKT_BUF_JUMBO_SIZE;
-
-	} else {
-		params.pkt.seg_len = PKT_BUF_SIZE;
-		params.pkt.len     = PKT_BUF_SIZE;
-	}
+	params.pkt.seg_len = PKT_BUF_SIZE;
+	params.pkt.len     = PKT_BUF_SIZE;
 	params.pkt.num     = PKT_BUF_NUM;
 	params.type        = ODP_POOL_PACKET;
 
@@ -393,11 +369,11 @@  static void pktio_txrx_multi(pktio_info_t *pktio_a, pktio_info_t *pktio_b,
 
 	/* generate test packets to send */
 	for (i = 0; i < num_pkts; ++i) {
-		tx_pkt[i] = pktio_create_packet();
+		tx_pkt[i] = odp_packet_alloc(default_pkt_pool, packet_len);
 		if (tx_pkt[i] == ODP_PACKET_INVALID)
 			break;
 
-		tx_seq[i] = pktio_pkt_seq(tx_pkt[i]);
+		tx_seq[i] = pktio_init_packet(tx_pkt[i]);
 		if (tx_seq[i] == TEST_SEQ_INVALID)
 			break;
 
@@ -500,9 +476,9 @@  static void test_odp_pktio_sched_multi(void)
 
 static void test_odp_pktio_jumbo(void)
 {
-	test_jumbo = 1;
+	packet_len = PKT_LEN_JUMBO;
 	test_odp_pktio_sched_multi();
-	test_jumbo = 0;
+	packet_len = PKT_LEN_NORMAL;
 }
 
 static void test_odp_pktio_mtu(void)