Support for jumbo frames for linux-generic with unsegmented buffers.
Test for pkio is also adjusted to work with 9*1024=9216 bytes packets.
https://bugs.linaro.org/show_bug.cgi?id=509

Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org>
---
 v2: separate test for jumbo frames.

 platform/linux-generic/odp_packet_socket.c |  2 +-
 test/validation/odp_pktio.c                | 70 +++++++++++++++++++++++-------
 test/validation/odp_pktio_run              |  4 +-
 3 files changed, 57 insertions(+), 19 deletions(-)

diff --git a/platform/linux-generic/odp_packet_socket.c 
b/platform/linux-generic/odp_packet_socket.c
index 55c212e..4dcb111 100644
--- a/platform/linux-generic/odp_packet_socket.c
+++ b/platform/linux-generic/odp_packet_socket.c
@@ -587,7 +587,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring 
*ring,
 static void mmap_fill_ring(struct ring *ring, unsigned blocks)
 {
        ring->req.tp_block_size = getpagesize() << 2;
-       ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7;
+       ring->req.tp_frame_size = 9216 + TPACKET_HDRLEN;
        ring->req.tp_block_nr = blocks;
 
        ring->req.tp_frame_nr = ring->req.tp_block_size /
diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
index 8df367d..8b40c8b 100644
--- a/test/validation/odp_pktio.c
+++ b/test/validation/odp_pktio.c
@@ -15,6 +15,7 @@
 
 #define PKT_BUF_NUM            32
 #define PKT_BUF_SIZE           1856
+#define PKT_BUF_JUMBO_SIZE     9216
 #define MAX_NUM_IFACES         2
 #define TEST_SEQ_INVALID       ((uint32_t)~0)
 #define TEST_SEQ_MAGIC         0x92749451
@@ -33,12 +34,18 @@ typedef struct {
        odp_queue_t inq;
 } pktio_info_t;
 
-/** structure of test packet UDP payload */
-typedef struct {
-       uint32be_t magic;
-       uint32be_t seq;
+/** structure of test jumbo packet UDP payload */
+typedef struct  __attribute__((__packed__)) {
+       struct {
+               uint32be_t magic;
+               uint32be_t seq;
+       } head;
+       char data[9162]; /* total size of eth packet 9216 */
+       uint32be_t magic2;
 } pkt_test_data_t;
 
+static int test_4_jumbo_pkts;
+
 /** default packet pool */
 odp_pool_t default_pkt_pool = ODP_POOL_INVALID;
 
@@ -64,9 +71,15 @@ static int pktio_pkt_set_seq(odp_packet_t pkt)
        static uint32_t tstseq;
        size_t l4_off;
        pkt_test_data_t data;
+       uint32_t len;
 
-       data.magic = TEST_SEQ_MAGIC;
-       data.seq   = tstseq;
+       data.head.magic = TEST_SEQ_MAGIC;
+       data.magic2 = TEST_SEQ_MAGIC;
+       data.head.seq   = tstseq;
+       if (test_4_jumbo_pkts)
+               len = sizeof(data);
+       else
+               len = sizeof(data.head);
 
        l4_off = odp_packet_l4_offset(pkt);
        if (!l4_off) {
@@ -75,8 +88,7 @@ static int pktio_pkt_set_seq(odp_packet_t pkt)
        }
 
        odp_packet_copydata_in(pkt, l4_off+ODPH_UDPHDR_LEN,
-                              sizeof(data), &data);
-
+                              len, &data);
        tstseq++;
 
        return 0;
@@ -85,18 +97,31 @@ static int pktio_pkt_set_seq(odp_packet_t pkt)
 static uint32_t pktio_pkt_seq(odp_packet_t pkt)
 {
        size_t l4_off;
+       uint32_t seq = TEST_SEQ_INVALID;
        pkt_test_data_t data;
+       uint32_t len;
 
        l4_off = odp_packet_l4_offset(pkt);
-       if (l4_off) {
-               odp_packet_copydata_out(pkt, l4_off+ODPH_UDPHDR_LEN,
-                                       sizeof(data), &data);
+       if (!l4_off)
+               return TEST_SEQ_INVALID;
 
-               if (data.magic == TEST_SEQ_MAGIC)
-                       return data.seq;
+       if (test_4_jumbo_pkts)
+               len = sizeof(data);
+       else
+               len = sizeof(data.head);
+
+       odp_packet_copydata_out(pkt, l4_off+ODPH_UDPHDR_LEN,
+                               len, &data);
+
+       if (data.head.magic == TEST_SEQ_MAGIC) {
+               if (test_4_jumbo_pkts &&
+                   data.magic2 != TEST_SEQ_MAGIC)
+                       return TEST_SEQ_INVALID;
+
+               seq = data.head.seq;
        }
 
-       return TEST_SEQ_INVALID;
+       return seq;
 }
 
 static odp_packet_t pktio_create_packet(void)
@@ -187,8 +212,14 @@ static int default_pool_create(void)
                return -1;
 
        memset(&params, 0, sizeof(params));
-       params.pkt.seg_len = PKT_BUF_SIZE;
-       params.pkt.len     = PKT_BUF_SIZE;
+       if (test_4_jumbo_pkts) {
+               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.num     = PKT_BUF_NUM;
        params.type        = ODP_POOL_PACKET;
 
@@ -450,6 +481,12 @@ static void test_odp_pktio_sched_multi(void)
        pktio_test_txrx(ODP_QUEUE_TYPE_SCHED, 4);
 }
 
+static void test_odp_pktio_jumbo(void)
+{
+       test_4_jumbo_pkts = 1;
+       pktio_test_txrx(ODP_QUEUE_TYPE_SCHED, 4);
+}
+
 static void test_odp_pktio_mtu(void)
 {
        int ret;
@@ -668,6 +705,7 @@ CU_TestInfo pktio_tests[] = {
        {"pktio poll multi",    test_odp_pktio_poll_multi},
        {"pktio sched queues",  test_odp_pktio_sched_queue},
        {"pktio sched multi",   test_odp_pktio_sched_multi},
+       {"pktio jumbo frames",  test_odp_pktio_jumbo},
        {"pktio mtu",           test_odp_pktio_mtu},
        {"pktio promisc mode",  test_odp_pktio_promisc},
        {"pktio mac",           test_odp_pktio_mac},
diff --git a/test/validation/odp_pktio_run b/test/validation/odp_pktio_run
index 08288e6..b9d7e3c 100755
--- a/test/validation/odp_pktio_run
+++ b/test/validation/odp_pktio_run
@@ -56,8 +56,8 @@ setup_env1()
                echo "pktio: error: unable to create veth pair"
                exit $TEST_SKIPPED
        fi
-       ip link set $IF0 up
-       ip link set $IF1 up
+       ip link set $IF0 mtu 9216 up
+       ip link set $IF1 mtu 9216 up
 
        # network needs a little time to come up
        sleep 1
-- 
1.8.5.1.163.gd7aced9


_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to