hv_netvsc: Add support to set MTU reservation from guest side
authorHaiyang Zhang <haiyangz@microsoft.com>
Mon, 6 Jul 2015 21:11:37 +0000 (14:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Jul 2015 23:00:56 +0000 (16:00 -0700)
When packet encapsulation is in use, the MTU needs to be reduced for
headroom reservation.
The existing code takes the updated MTU value only from the host side.
But vSwitch extensions, such as Open vSwitch, require the flexibility
to change the MTU to different values from within a guest during the
lifecycle of a vNIC, when the encapsulation protocol is changed. The
patch supports this kind of MTU changes.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc_drv.c
drivers/net/hyperv/rndis_filter.c

index dd4544085db321d2f9020d97ebbbb9a8887ed4b9..26cd14ccf4d565324317f19fd86960242e34c7fb 100644 (file)
@@ -589,6 +589,7 @@ struct nvsp_message {
 
 
 #define NETVSC_MTU 65536
+#define NETVSC_MTU_MIN 68
 
 #define NETVSC_RECEIVE_BUFFER_SIZE             (1024*1024*16)  /* 16MB */
 #define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY      (1024*1024*15)  /* 15MB */
index 358475ed9b5964c53f038c61f7fb8a3996c2a5ab..b855ba9a507d5b0eeda334b0eb3e254ee5ba26f8 100644 (file)
@@ -743,8 +743,7 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
        if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2)
                limit = NETVSC_MTU - ETH_HLEN;
 
-       /* Hyper-V hosts don't support MTU < ETH_DATA_LEN (1500) */
-       if (mtu < ETH_DATA_LEN || mtu > limit)
+       if (mtu < NETVSC_MTU_MIN || mtu > limit)
                return -EINVAL;
 
        nvdev->start_remove = true;
index 236aeb76ef224ba5eaf9e0994b6e9363434047ac..2e40417a8087812b27bd5ffadbd24d98999980fd 100644 (file)
@@ -1054,7 +1054,7 @@ int rndis_filter_device_add(struct hv_device *dev,
        ret = rndis_filter_query_device(rndis_device,
                                        RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
                                        &mtu, &size);
-       if (ret == 0 && size == sizeof(u32))
+       if (ret == 0 && size == sizeof(u32) && mtu < net_device->ndev->mtu)
                net_device->ndev->mtu = mtu;
 
        /* Get the mac address */