Rework the way test packets are generated in order to allow generating
and verifying arbitrary length packets.
Signed-off-by: Stuart Haslam <[email protected]>
---
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(¶ms, 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(¶ms, 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)