Skip to content

Commit

Permalink
app/testpmd: fix max Rx packet length for VLAN packets
Browse files Browse the repository at this point in the history
[ upstream commit 761c4d6 ]

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: 384161e ("app/testpmd: adjust on the fly VLAN configuration")
Fixes: 35b2d13 ("net: add rte prefix to ether defines")
Fixes: ce17edd ("ethdev: introduce Rx queue offloads API")
Fixes: 150c9ac ("app/testpmd: update Rx offload after setting MTU")

Signed-off-by: Steve Yang <stevex.yang@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
  • Loading branch information
Steve Yang authored and cpaelzer committed Feb 3, 2021
1 parent 91f2ad5 commit a709e6b
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 12 deletions.
6 changes: 0 additions & 6 deletions app/test-pmd/cmdline.c
Original file line number Diff line number Diff line change
Expand Up @@ -1983,7 +1983,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) {
Expand All @@ -1995,11 +1994,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;
Expand Down
2 changes: 1 addition & 1 deletion app/test-pmd/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -1287,7 +1287,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 =
Expand Down
7 changes: 2 additions & 5 deletions app/test-pmd/parameters.c
Original file line number Diff line number Diff line change
Expand Up @@ -884,12 +884,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);
Expand Down
18 changes: 18 additions & 0 deletions app/test-pmd/testpmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1301,6 +1301,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;
Expand Down Expand Up @@ -1337,6 +1338,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 &=
Expand Down

0 comments on commit a709e6b

Please sign in to comment.