[v4,02/22] app/testpmd: fix max rx packet length for VLAN packets

Message ID 20210118070428.36998-3-stevex.yang@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series fix rx packets dropped issue |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Steve Yang Jan. 18, 2021, 7:04 a.m. UTC
  When the max rx packet length is smaller than the sum of mtu size and
ether overhead size, it should be enlarged, otherwise the VLAN packets
will be dropped.

Removed the rx_offloads assignment for jumbo frame during command line
parsing, and set the correct jumbo frame flag if MTU size is larger than
the default value 'RTE_ETHER_MTU' within 'init_config()'.

Fixes: 384161e00627 ("app/testpmd: adjust on the fly VLAN configuration")
Fixes: 35b2d13fd6fd ("net: add rte prefix to ether defines")
Fixes: ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
Fixes: 150c9ac2df13 ("app/testpmd: update Rx offload after setting MTU")

Cc: Wenzhuo Lu <wenzhuo.lu@intel.com>
Cc: Beilei Xing <beilei.xing@intel.com>
Cc: Bernard Iremonger <bernard.iremonger@intel.com>

Signed-off-by: Steve Yang <stevex.yang@intel.com>
---
 app/test-pmd/cmdline.c    |  6 ------
 app/test-pmd/config.c     |  2 +-
 app/test-pmd/parameters.c |  7 ++-----
 app/test-pmd/testpmd.c    | 18 ++++++++++++++++++
 4 files changed, 21 insertions(+), 12 deletions(-)
  

Comments

Lance Richardson Jan. 21, 2021, 3:27 p.m. UTC | #1
On Mon, Jan 18, 2021 at 2:08 AM Steve Yang <stevex.yang@intel.com> wrote:
>
> When the max rx packet length is smaller than the sum of mtu size and
> ether overhead size, it should be enlarged, otherwise the VLAN packets
> will be dropped.
>
> Removed the rx_offloads assignment for jumbo frame during command line
> parsing, and set the correct jumbo frame flag if MTU size is larger than
> the default value 'RTE_ETHER_MTU' within 'init_config()'.
>
> Fixes: 384161e00627 ("app/testpmd: adjust on the fly VLAN configuration")
> Fixes: 35b2d13fd6fd ("net: add rte prefix to ether defines")
> Fixes: ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
> Fixes: 150c9ac2df13 ("app/testpmd: update Rx offload after setting MTU")
>
> Cc: Wenzhuo Lu <wenzhuo.lu@intel.com>
> Cc: Beilei Xing <beilei.xing@intel.com>
> Cc: Bernard Iremonger <bernard.iremonger@intel.com>
>
> Signed-off-by: Steve Yang <stevex.yang@intel.com>
> ---
>  app/test-pmd/cmdline.c    |  6 ------
>  app/test-pmd/config.c     |  2 +-
>  app/test-pmd/parameters.c |  7 ++-----
>  app/test-pmd/testpmd.c    | 18 ++++++++++++++++++
>  4 files changed, 21 insertions(+), 12 deletions(-)
>
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index 2ccbaa039e..65042fcff5 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -1886,7 +1886,6 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
>
>         RTE_ETH_FOREACH_DEV(pid) {
>                 struct rte_port *port = &ports[pid];
> -               uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
>
>                 if (!strcmp(res->name, "max-pkt-len")) {
>                         if (res->value < RTE_ETHER_MIN_LEN) {
> @@ -1898,11 +1897,6 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
>                                 return;
>
>                         port->dev_conf.rxmode.max_rx_pkt_len = res->value;
> -                       if (res->value > RTE_ETHER_MAX_LEN)
> -                               rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> -                       else
> -                               rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -                       port->dev_conf.rxmode.offloads = rx_offloads;
>                 } else {
>                         printf("Unknown parameter\n");
>                         return;
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index 3f6c8642b1..1195f054f3 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1434,7 +1434,7 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
>                  * device supports jumbo frame.
>                  */
>                 eth_overhead = dev_info.max_rx_pktlen - dev_info.max_mtu;
> -               if (mtu > RTE_ETHER_MAX_LEN - eth_overhead) {
> +               if (mtu > RTE_ETHER_MTU) {
>                         rte_port->dev_conf.rxmode.offloads |=
>                                                 DEV_RX_OFFLOAD_JUMBO_FRAME;
>                         rte_port->dev_conf.rxmode.max_rx_pkt_len =
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index 414a0068fb..df5eb10d84 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -834,12 +834,9 @@ launch_args_parse(int argc, char** argv)
>                         }
>                         if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
>                                 n = atoi(optarg);
> -                               if (n >= RTE_ETHER_MIN_LEN) {
> +                               if (n >= RTE_ETHER_MIN_LEN)
>                                         rx_mode.max_rx_pkt_len = (uint32_t) n;
> -                                       if (n > RTE_ETHER_MAX_LEN)
> -                                               rx_offloads |=
> -                                                       DEV_RX_OFFLOAD_JUMBO_FRAME;
> -                               } else
> +                               else
>                                         rte_exit(EXIT_FAILURE,
>                                                  "Invalid max-pkt-len=%d - should be > %d\n",
>                                                  n, RTE_ETHER_MIN_LEN);
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 2b60f6c5d3..c256e719ae 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1410,6 +1410,7 @@ init_config(void)
>         struct rte_gro_param gro_param;
>         uint32_t gso_types;
>         uint16_t data_size;
> +       uint16_t eth_overhead;
>         bool warning = 0;
>         int k;
>         int ret;
> @@ -1446,6 +1447,23 @@ init_config(void)
>                         rte_exit(EXIT_FAILURE,
>                                  "rte_eth_dev_info_get() failed\n");
>
> +               /* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
> +               if (port->dev_info.max_mtu != UINT16_MAX &&
> +                   port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
> +                       eth_overhead = port->dev_info.max_rx_pktlen -
> +                               port->dev_info.max_mtu;
> +               else
> +                       eth_overhead =
> +                               RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
> +
> +               if (port->dev_conf.rxmode.max_rx_pkt_len <=
> +                       (uint32_t)(RTE_ETHER_MTU + eth_overhead))
> +                       port->dev_conf.rxmode.max_rx_pkt_len =
> +                                       RTE_ETHER_MTU + eth_overhead;
> +               else
> +                       port->dev_conf.rxmode.offloads |=
> +                                       DEV_RX_OFFLOAD_JUMBO_FRAME;
> +
>                 if (!(port->dev_info.tx_offload_capa &
>                       DEV_TX_OFFLOAD_MBUF_FAST_FREE))
>                         port->dev_conf.txmode.offloads &=
> --
> 2.17.1
>

Moving the setting of DEV_RX_OFFLOAD_JUMBO_FRAME from
cmd_config_max_pkt_len_parsed() to init_config() doesn't seem to
be correct for the case where max_rx_pkt_len is changed from the
command line via "port config all max-pkt-len".

The init_config() function is only called when testpmd is started,
but the DEV_RX_OFFLOAD_JUMBO_FRAME setting needs to
be recomputed whenever max_rx_pkt_len changes.

(Of course this won't matter when DEV_RX_OFFLOAD_JUMBO_FRAME
is removed, which seems like a great idea, but for now this is impacting
some test automation with 21.02-rc1.)
  
Lance Richardson Jan. 22, 2021, 2:26 p.m. UTC | #2
On Thu, Jan 21, 2021 at 10:27 AM Lance Richardson
<lance.richardson@broadcom.com> wrote:
>
> On Mon, Jan 18, 2021 at 2:08 AM Steve Yang <stevex.yang@intel.com> wrote:
> >
> > When the max rx packet length is smaller than the sum of mtu size and
> > ether overhead size, it should be enlarged, otherwise the VLAN packets
> > will be dropped.
> >
> > Removed the rx_offloads assignment for jumbo frame during command line
> > parsing, and set the correct jumbo frame flag if MTU size is larger than
> > the default value 'RTE_ETHER_MTU' within 'init_config()'.
> >
> > Fixes: 384161e00627 ("app/testpmd: adjust on the fly VLAN configuration")
> > Fixes: 35b2d13fd6fd ("net: add rte prefix to ether defines")
> > Fixes: ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
> > Fixes: 150c9ac2df13 ("app/testpmd: update Rx offload after setting MTU")
> >
> > Cc: Wenzhuo Lu <wenzhuo.lu@intel.com>
> > Cc: Beilei Xing <beilei.xing@intel.com>
> > Cc: Bernard Iremonger <bernard.iremonger@intel.com>
> >
> > Signed-off-by: Steve Yang <stevex.yang@intel.com>
> > ---
> >  app/test-pmd/cmdline.c    |  6 ------
> >  app/test-pmd/config.c     |  2 +-
> >  app/test-pmd/parameters.c |  7 ++-----
> >  app/test-pmd/testpmd.c    | 18 ++++++++++++++++++
> >  4 files changed, 21 insertions(+), 12 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> > index 2ccbaa039e..65042fcff5 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> > @@ -1886,7 +1886,6 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
> >
> >         RTE_ETH_FOREACH_DEV(pid) {
> >                 struct rte_port *port = &ports[pid];
> > -               uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
> >
> >                 if (!strcmp(res->name, "max-pkt-len")) {
> >                         if (res->value < RTE_ETHER_MIN_LEN) {
> > @@ -1898,11 +1897,6 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
> >                                 return;
> >
> >                         port->dev_conf.rxmode.max_rx_pkt_len = res->value;
> > -                       if (res->value > RTE_ETHER_MAX_LEN)
> > -                               rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> > -                       else
> > -                               rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> > -                       port->dev_conf.rxmode.offloads = rx_offloads;
> >                 } else {
> >                         printf("Unknown parameter\n");
> >                         return;
> > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> > index 3f6c8642b1..1195f054f3 100644
> > --- a/app/test-pmd/config.c
> > +++ b/app/test-pmd/config.c
> > @@ -1434,7 +1434,7 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
> >                  * device supports jumbo frame.
> >                  */
> >                 eth_overhead = dev_info.max_rx_pktlen - dev_info.max_mtu;
> > -               if (mtu > RTE_ETHER_MAX_LEN - eth_overhead) {
> > +               if (mtu > RTE_ETHER_MTU) {
> >                         rte_port->dev_conf.rxmode.offloads |=
> >                                                 DEV_RX_OFFLOAD_JUMBO_FRAME;
> >                         rte_port->dev_conf.rxmode.max_rx_pkt_len =
> > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> > index 414a0068fb..df5eb10d84 100644
> > --- a/app/test-pmd/parameters.c
> > +++ b/app/test-pmd/parameters.c
> > @@ -834,12 +834,9 @@ launch_args_parse(int argc, char** argv)
> >                         }
> >                         if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
> >                                 n = atoi(optarg);
> > -                               if (n >= RTE_ETHER_MIN_LEN) {
> > +                               if (n >= RTE_ETHER_MIN_LEN)
> >                                         rx_mode.max_rx_pkt_len = (uint32_t) n;
> > -                                       if (n > RTE_ETHER_MAX_LEN)
> > -                                               rx_offloads |=
> > -                                                       DEV_RX_OFFLOAD_JUMBO_FRAME;
> > -                               } else
> > +                               else
> >                                         rte_exit(EXIT_FAILURE,
> >                                                  "Invalid max-pkt-len=%d - should be > %d\n",
> >                                                  n, RTE_ETHER_MIN_LEN);
> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> > index 2b60f6c5d3..c256e719ae 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1410,6 +1410,7 @@ init_config(void)
> >         struct rte_gro_param gro_param;
> >         uint32_t gso_types;
> >         uint16_t data_size;
> > +       uint16_t eth_overhead;
> >         bool warning = 0;
> >         int k;
> >         int ret;
> > @@ -1446,6 +1447,23 @@ init_config(void)
> >                         rte_exit(EXIT_FAILURE,
> >                                  "rte_eth_dev_info_get() failed\n");
> >
> > +               /* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
> > +               if (port->dev_info.max_mtu != UINT16_MAX &&
> > +                   port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
> > +                       eth_overhead = port->dev_info.max_rx_pktlen -
> > +                               port->dev_info.max_mtu;
> > +               else
> > +                       eth_overhead =
> > +                               RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
> > +
> > +               if (port->dev_conf.rxmode.max_rx_pkt_len <=
> > +                       (uint32_t)(RTE_ETHER_MTU + eth_overhead))
> > +                       port->dev_conf.rxmode.max_rx_pkt_len =
> > +                                       RTE_ETHER_MTU + eth_overhead;
> > +               else
> > +                       port->dev_conf.rxmode.offloads |=
> > +                                       DEV_RX_OFFLOAD_JUMBO_FRAME;
> > +
> >                 if (!(port->dev_info.tx_offload_capa &
> >                       DEV_TX_OFFLOAD_MBUF_FAST_FREE))
> >                         port->dev_conf.txmode.offloads &=
> > --
> > 2.17.1
> >
>
> Moving the setting of DEV_RX_OFFLOAD_JUMBO_FRAME from
> cmd_config_max_pkt_len_parsed() to init_config() doesn't seem to
> be correct for the case where max_rx_pkt_len is changed from the
> command line via "port config all max-pkt-len".
>
> The init_config() function is only called when testpmd is started,
> but the DEV_RX_OFFLOAD_JUMBO_FRAME setting needs to
> be recomputed whenever max_rx_pkt_len changes.
>
> (Of course this won't matter when DEV_RX_OFFLOAD_JUMBO_FRAME
> is removed, which seems like a great idea, but for now this is impacting
> some test automation with 21.02-rc1.)

+Ferruh (sorry, thought he was already on this thread.)
  
Ferruh Yigit Jan. 25, 2021, 12:14 p.m. UTC | #3
On 1/21/2021 3:27 PM, Lance Richardson wrote:
> On Mon, Jan 18, 2021 at 2:08 AM Steve Yang <stevex.yang@intel.com> wrote:
>>
>> When the max rx packet length is smaller than the sum of mtu size and
>> ether overhead size, it should be enlarged, otherwise the VLAN packets
>> will be dropped.
>>
>> Removed the rx_offloads assignment for jumbo frame during command line
>> parsing, and set the correct jumbo frame flag if MTU size is larger than
>> the default value 'RTE_ETHER_MTU' within 'init_config()'.
>>
>> Fixes: 384161e00627 ("app/testpmd: adjust on the fly VLAN configuration")
>> Fixes: 35b2d13fd6fd ("net: add rte prefix to ether defines")
>> Fixes: ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
>> Fixes: 150c9ac2df13 ("app/testpmd: update Rx offload after setting MTU")
>>
>> Cc: Wenzhuo Lu <wenzhuo.lu@intel.com>
>> Cc: Beilei Xing <beilei.xing@intel.com>
>> Cc: Bernard Iremonger <bernard.iremonger@intel.com>
>>
>> Signed-off-by: Steve Yang <stevex.yang@intel.com>
>> ---
>>   app/test-pmd/cmdline.c    |  6 ------
>>   app/test-pmd/config.c     |  2 +-
>>   app/test-pmd/parameters.c |  7 ++-----
>>   app/test-pmd/testpmd.c    | 18 ++++++++++++++++++
>>   4 files changed, 21 insertions(+), 12 deletions(-)
>>
>> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
>> index 2ccbaa039e..65042fcff5 100644
>> --- a/app/test-pmd/cmdline.c
>> +++ b/app/test-pmd/cmdline.c
>> @@ -1886,7 +1886,6 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
>>
>>          RTE_ETH_FOREACH_DEV(pid) {
>>                  struct rte_port *port = &ports[pid];
>> -               uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
>>
>>                  if (!strcmp(res->name, "max-pkt-len")) {
>>                          if (res->value < RTE_ETHER_MIN_LEN) {
>> @@ -1898,11 +1897,6 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
>>                                  return;
>>
>>                          port->dev_conf.rxmode.max_rx_pkt_len = res->value;
>> -                       if (res->value > RTE_ETHER_MAX_LEN)
>> -                               rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
>> -                       else
>> -                               rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>> -                       port->dev_conf.rxmode.offloads = rx_offloads;
>>                  } else {
>>                          printf("Unknown parameter\n");
>>                          return;
>> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
>> index 3f6c8642b1..1195f054f3 100644
>> --- a/app/test-pmd/config.c
>> +++ b/app/test-pmd/config.c
>> @@ -1434,7 +1434,7 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
>>                   * device supports jumbo frame.
>>                   */
>>                  eth_overhead = dev_info.max_rx_pktlen - dev_info.max_mtu;
>> -               if (mtu > RTE_ETHER_MAX_LEN - eth_overhead) {
>> +               if (mtu > RTE_ETHER_MTU) {
>>                          rte_port->dev_conf.rxmode.offloads |=
>>                                                  DEV_RX_OFFLOAD_JUMBO_FRAME;
>>                          rte_port->dev_conf.rxmode.max_rx_pkt_len =
>> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
>> index 414a0068fb..df5eb10d84 100644
>> --- a/app/test-pmd/parameters.c
>> +++ b/app/test-pmd/parameters.c
>> @@ -834,12 +834,9 @@ launch_args_parse(int argc, char** argv)
>>                          }
>>                          if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
>>                                  n = atoi(optarg);
>> -                               if (n >= RTE_ETHER_MIN_LEN) {
>> +                               if (n >= RTE_ETHER_MIN_LEN)
>>                                          rx_mode.max_rx_pkt_len = (uint32_t) n;
>> -                                       if (n > RTE_ETHER_MAX_LEN)
>> -                                               rx_offloads |=
>> -                                                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>> -                               } else
>> +                               else
>>                                          rte_exit(EXIT_FAILURE,
>>                                                   "Invalid max-pkt-len=%d - should be > %d\n",
>>                                                   n, RTE_ETHER_MIN_LEN);
>> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
>> index 2b60f6c5d3..c256e719ae 100644
>> --- a/app/test-pmd/testpmd.c
>> +++ b/app/test-pmd/testpmd.c
>> @@ -1410,6 +1410,7 @@ init_config(void)
>>          struct rte_gro_param gro_param;
>>          uint32_t gso_types;
>>          uint16_t data_size;
>> +       uint16_t eth_overhead;
>>          bool warning = 0;
>>          int k;
>>          int ret;
>> @@ -1446,6 +1447,23 @@ init_config(void)
>>                          rte_exit(EXIT_FAILURE,
>>                                   "rte_eth_dev_info_get() failed\n");
>>
>> +               /* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
>> +               if (port->dev_info.max_mtu != UINT16_MAX &&
>> +                   port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
>> +                       eth_overhead = port->dev_info.max_rx_pktlen -
>> +                               port->dev_info.max_mtu;
>> +               else
>> +                       eth_overhead =
>> +                               RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
>> +
>> +               if (port->dev_conf.rxmode.max_rx_pkt_len <=
>> +                       (uint32_t)(RTE_ETHER_MTU + eth_overhead))
>> +                       port->dev_conf.rxmode.max_rx_pkt_len =
>> +                                       RTE_ETHER_MTU + eth_overhead;
>> +               else
>> +                       port->dev_conf.rxmode.offloads |=
>> +                                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>> +
>>                  if (!(port->dev_info.tx_offload_capa &
>>                        DEV_TX_OFFLOAD_MBUF_FAST_FREE))
>>                          port->dev_conf.txmode.offloads &=
>> --
>> 2.17.1
>>
> 
> Moving the setting of DEV_RX_OFFLOAD_JUMBO_FRAME from
> cmd_config_max_pkt_len_parsed() to init_config() doesn't seem to
> be correct for the case where max_rx_pkt_len is changed from the
> command line via "port config all max-pkt-len".
> 
> The init_config() function is only called when testpmd is started,
> but the DEV_RX_OFFLOAD_JUMBO_FRAME setting needs to
> be recomputed whenever max_rx_pkt_len changes.
> 

Hi Lance,

You are right, there is a patch trying to fix the command, can you please review it?
https://patches.dpdk.org/project/dpdk/list/?series=14925


> (Of course this won't matter when DEV_RX_OFFLOAD_JUMBO_FRAME
> is removed, which seems like a great idea, but for now this is impacting
> some test automation with 21.02-rc1.)
>
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 2ccbaa039e..65042fcff5 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1886,7 +1886,6 @@  cmd_config_max_pkt_len_parsed(void *parsed_result,
 
 	RTE_ETH_FOREACH_DEV(pid) {
 		struct rte_port *port = &ports[pid];
-		uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
 
 		if (!strcmp(res->name, "max-pkt-len")) {
 			if (res->value < RTE_ETHER_MIN_LEN) {
@@ -1898,11 +1897,6 @@  cmd_config_max_pkt_len_parsed(void *parsed_result,
 				return;
 
 			port->dev_conf.rxmode.max_rx_pkt_len = res->value;
-			if (res->value > RTE_ETHER_MAX_LEN)
-				rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-			else
-				rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
-			port->dev_conf.rxmode.offloads = rx_offloads;
 		} else {
 			printf("Unknown parameter\n");
 			return;
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 3f6c8642b1..1195f054f3 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1434,7 +1434,7 @@  port_mtu_set(portid_t port_id, uint16_t mtu)
 		 * device supports jumbo frame.
 		 */
 		eth_overhead = dev_info.max_rx_pktlen - dev_info.max_mtu;
-		if (mtu > RTE_ETHER_MAX_LEN - eth_overhead) {
+		if (mtu > RTE_ETHER_MTU) {
 			rte_port->dev_conf.rxmode.offloads |=
 						DEV_RX_OFFLOAD_JUMBO_FRAME;
 			rte_port->dev_conf.rxmode.max_rx_pkt_len =
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 414a0068fb..df5eb10d84 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -834,12 +834,9 @@  launch_args_parse(int argc, char** argv)
 			}
 			if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
 				n = atoi(optarg);
-				if (n >= RTE_ETHER_MIN_LEN) {
+				if (n >= RTE_ETHER_MIN_LEN)
 					rx_mode.max_rx_pkt_len = (uint32_t) n;
-					if (n > RTE_ETHER_MAX_LEN)
-						rx_offloads |=
-							DEV_RX_OFFLOAD_JUMBO_FRAME;
-				} else
+				else
 					rte_exit(EXIT_FAILURE,
 						 "Invalid max-pkt-len=%d - should be > %d\n",
 						 n, RTE_ETHER_MIN_LEN);
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 2b60f6c5d3..c256e719ae 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1410,6 +1410,7 @@  init_config(void)
 	struct rte_gro_param gro_param;
 	uint32_t gso_types;
 	uint16_t data_size;
+	uint16_t eth_overhead;
 	bool warning = 0;
 	int k;
 	int ret;
@@ -1446,6 +1447,23 @@  init_config(void)
 			rte_exit(EXIT_FAILURE,
 				 "rte_eth_dev_info_get() failed\n");
 
+		/* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
+		if (port->dev_info.max_mtu != UINT16_MAX &&
+		    port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
+			eth_overhead = port->dev_info.max_rx_pktlen -
+				port->dev_info.max_mtu;
+		else
+			eth_overhead =
+				RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
+
+		if (port->dev_conf.rxmode.max_rx_pkt_len <=
+			(uint32_t)(RTE_ETHER_MTU + eth_overhead))
+			port->dev_conf.rxmode.max_rx_pkt_len =
+					RTE_ETHER_MTU + eth_overhead;
+		else
+			port->dev_conf.rxmode.offloads |=
+					DEV_RX_OFFLOAD_JUMBO_FRAME;
+
 		if (!(port->dev_info.tx_offload_capa &
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
 			port->dev_conf.txmode.offloads &=