diff mbox

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

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

Commit Message

Maxim Uvarov March 3, 2015, 10:28 a.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>
---
 v3: use ODP_PACKED macro.
 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

Ciprian Barbu March 3, 2015, 1:10 p.m. UTC | #1
On Tue, Mar 3, 2015 at 12:28 PM, 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>
> ---
>  v3: use ODP_PACKED macro.
>  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..609b3cc 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 ODP_PACKED {
> +       struct {
> +               uint32be_t magic;
> +               uint32be_t seq;
> +       } head;
> +       char data[9162]; /* total size of eth packet 9216 */

What is the connection between 9162 and 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.9.1
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
Maxim Uvarov March 3, 2015, 2:25 p.m. UTC | #2
On 03/03/15 16:10, Ciprian Barbu wrote:
> On Tue, Mar 3, 2015 at 12:28 PM, 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>
>> ---
>>   v3: use ODP_PACKED macro.
>>   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..609b3cc 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 ODP_PACKED {
>> +       struct {
>> +               uint32be_t magic;
>> +               uint32be_t seq;
>> +       } head;
>> +       char data[9162]; /* total size of eth packet 9216 */
> What is the connection between 9162 and 9216?

That is padding to make packets in wireshark sized to 9216. I think it's 
included hw address
total packet 9216 -  odp_packet(9162 + 4 + 4 + 4) = 42.

42 - 12 (2 mac addressees) = 30 left. Need to think what is 30 here.

I just run this patch under root and looks like this version is broken 
now. Looks like we have more changes in pool.
Will send update.

Maxim.



>
>> +       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.9.1
>>
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> http://lists.linaro.org/mailman/listinfo/lng-odp
Ola Liljedahl March 3, 2015, 2:48 p.m. UTC | #3
Some of these explanations should be present in the code. Perhaps
actually have the calculation in the code and let the compiler do the
work. Currently, nobody seems to understand how you get from A to B.


On 3 March 2015 at 15:25, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> On 03/03/15 16:10, Ciprian Barbu wrote:
>>
>> On Tue, Mar 3, 2015 at 12:28 PM, 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>
>>> ---
>>>   v3: use ODP_PACKED macro.
>>>   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..609b3cc 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 ODP_PACKED {
>>> +       struct {
>>> +               uint32be_t magic;
>>> +               uint32be_t seq;
>>> +       } head;
>>> +       char data[9162]; /* total size of eth packet 9216 */
>>
>> What is the connection between 9162 and 9216?
>
>
> That is padding to make packets in wireshark sized to 9216. I think it's
> included hw address
> total packet 9216 -  odp_packet(9162 + 4 + 4 + 4) = 42.
>
> 42 - 12 (2 mac addressees) = 30 left. Need to think what is 30 here.
>
> I just run this patch under root and looks like this version is broken now.
> Looks like we have more changes in pool.
> Will send update.
>
> Maxim.
>
>
>
>
>>
>>> +       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.9.1
>>>
>>>
>>> _______________________________________________
>>> lng-odp mailing list
>>> lng-odp@lists.linaro.org
>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
Maxim Uvarov March 3, 2015, 3:11 p.m. UTC | #4
On 03/03/15 17:48, Ola Liljedahl wrote:
> Some of these explanations should be present in the code. Perhaps
> actually have the calculation in the code and let the compiler do the
> work. Currently, nobody seems to understand how you get from A to B.

Ok, will add in new version.

Maxim.
>
> On 3 March 2015 at 15:25, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
>> On 03/03/15 16:10, Ciprian Barbu wrote:
>>> On Tue, Mar 3, 2015 at 12:28 PM, 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>
>>>> ---
>>>>    v3: use ODP_PACKED macro.
>>>>    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..609b3cc 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 ODP_PACKED {
>>>> +       struct {
>>>> +               uint32be_t magic;
>>>> +               uint32be_t seq;
>>>> +       } head;
>>>> +       char data[9162]; /* total size of eth packet 9216 */
>>> What is the connection between 9162 and 9216?
>>
>> That is padding to make packets in wireshark sized to 9216. I think it's
>> included hw address
>> total packet 9216 -  odp_packet(9162 + 4 + 4 + 4) = 42.
>>
>> 42 - 12 (2 mac addressees) = 30 left. Need to think what is 30 here.
>>
>> I just run this patch under root and looks like this version is broken now.
>> Looks like we have more changes in pool.
>> Will send update.
>>
>> Maxim.
>>
>>
>>
>>
>>>> +       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.9.1
>>>>
>>>>
>>>> _______________________________________________
>>>> lng-odp mailing list
>>>> lng-odp@lists.linaro.org
>>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>>
>>
>> _______________________________________________
>> 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..609b3cc 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 ODP_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