Hi Aaron,

On 02/16/2017 08:31 PM, Aaron Conole wrote:
Maxime Coquelin <maxime.coque...@redhat.com> writes:

This patch implements support for the Virtio MTU feature.
When negotiated, the host shares its maximum supported MTU,
which is used as initial MTU and as maximum MTU the application
can set.

Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
---
 doc/guides/nics/features/virtio.ini |  1 +
 drivers/net/virtio/virtio_ethdev.c  | 22 ++++++++++++++++++++--
 drivers/net/virtio/virtio_ethdev.h  |  3 ++-
 drivers/net/virtio/virtio_pci.h     |  3 +++
 4 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/doc/guides/nics/features/virtio.ini 
b/doc/guides/nics/features/virtio.ini
index 5164937..7bea075 100644
--- a/doc/guides/nics/features/virtio.ini
+++ b/doc/guides/nics/features/virtio.ini
@@ -24,3 +24,4 @@ ARMv8                = Y
 x86-32               = Y
 x86-64               = Y
 Usage doc            = Y
+MTU update           = Y
diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index d1ff234..ad3e6e1 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -721,10 +721,13 @@ virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        uint32_t ether_hdr_len = ETHER_HDR_LEN + VLAN_TAG_LEN +
                                 hw->vtnet_hdr_size;
        uint32_t frame_size = mtu + ether_hdr_len;
+       uint32_t max_frame_size = hw->max_mtu + ether_hdr_len;

-       if (mtu < ETHER_MIN_MTU || frame_size > VIRTIO_MAX_RX_PKTLEN) {
+       max_frame_size = RTE_MIN(max_frame_size, VIRTIO_MAX_RX_PKTLEN);
+
+       if (mtu < ETHER_MIN_MTU || frame_size > max_frame_size) {
                PMD_INIT_LOG(ERR, "MTU should be between %d and %d",
-                       ETHER_MIN_MTU, VIRTIO_MAX_RX_PKTLEN - ether_hdr_len);
+                       ETHER_MIN_MTU, max_frame_size - ether_hdr_len);
                return -EINVAL;
        }
        return 0;
@@ -1392,6 +1395,21 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t 
req_features)

                hw->max_queue_pairs = config->max_virtqueue_pairs;

+               if (vtpci_with_feature(hw, VIRTIO_NET_F_MTU)) {
+                       vtpci_read_dev_config(hw,
+                               offsetof(struct virtio_net_config, mtu),
+                               &config->mtu,
+                               sizeof(config->mtu));

I think we need to check the value here against the min mtu, right?
Right. Moreover, we don't check it in Qemu.
I need to add the check both DPDK and Qemu.

Thanks,
Maxime

Reply via email to