diff mbox

[PATCHv2] linux-generic: mmap: jumbo frames support

Message ID 1425311395-19488-1-git-send-email-maxim.uvarov@linaro.org
State New
Headers show

Commit Message

Maxim Uvarov March 2, 2015, 3:49 p.m. UTC
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.uvarov@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(-)

Comments

Bill Fischofer March 2, 2015, 9:39 p.m. UTC | #1
On Mon, Mar 2, 2015 at 9:49 AM, Maxim Uvarov <maxim.uvarov@linaro.org>
wrote:

> 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.uvarov@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__)) {
>

odp_align.h defines ODP_PACKED.  It should be used here instead of the
expansion.


> +       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
>
diff mbox

Patch

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