Port configuration fails when offload flags don't match the expected value, e.g. when max-pkt-len is set to a value that should enable receive port offloading but doesn't.
This can be triggered by running testpmd e.g. with --max-pkt-len=2000. It will fail with "Ethdev port_id=0 requested Rx offloads 0x800 doesn't match Rx offloads capabilities 0x20d in rte_eth_dev_configure()" To fix this there are two cases to consider: 1. VIRTIO_NET_F_MTU is negotiated. Then we need to check if the requested max. packet length fits into the MTU. If yes we set the offload flag. 2. VIRTIO_NET_F_MTU is not negotiated. We can set the offload flag. Signed-off-by: Jens Freimann <jfreim...@redhat.com> --- drivers/net/virtio/virtio_ethdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 7c4c1df00..e0d6542d4 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -2351,6 +2351,17 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) if ((host_features & tso_mask) == tso_mask) dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_TCP_LRO; + if (host_features & (1ULL << VIRTIO_NET_F_MTU)) { + struct virtio_net_config config; + vtpci_read_dev_config(hw, + offsetof(struct virtio_net_config, mtu), + &config.mtu, sizeof(config.mtu)); + if (dev->data->dev_conf.rxmode.max_rx_pkt_len <= config.mtu) + dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME; + } else { + dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME; + } + dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS | DEV_TX_OFFLOAD_VLAN_INSERT; if (host_features & (1ULL << VIRTIO_NET_F_CSUM)) { -- 2.17.2