Page MenuHomeFreeBSD

D12352.diff
No OneTemporary

D12352.diff

Index: head/sys/dev/hyperv/netvsc/hn_nvs.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hn_nvs.c
+++ head/sys/dev/hyperv/netvsc/hn_nvs.c
@@ -43,6 +43,7 @@
#include <sys/systm.h>
#include <sys/taskqueue.h>
+#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_media.h>
@@ -503,7 +504,7 @@
memset(&conf, 0, sizeof(conf));
conf.nvs_type = HN_NVS_TYPE_NDIS_CONF;
- conf.nvs_mtu = mtu;
+ conf.nvs_mtu = mtu + ETHER_HDR_LEN;
conf.nvs_caps = HN_NVS_NDIS_CONF_VLAN;
if (sc->hn_nvs_ver >= HN_NVS_VERSION_5)
conf.nvs_caps |= HN_NVS_NDIS_CONF_SRIOV;
Index: head/sys/dev/hyperv/netvsc/hn_rndis.h
===================================================================
--- head/sys/dev/hyperv/netvsc/hn_rndis.h
+++ head/sys/dev/hyperv/netvsc/hn_rndis.h
@@ -41,6 +41,7 @@
/* link_status: NDIS_MEDIA_STATE_ */
int hn_rndis_get_linkstatus(struct hn_softc *sc,
uint32_t *link_status);
+int hn_rndis_get_mtu(struct hn_softc *sc, uint32_t *mtu);
/* filter: NDIS_PACKET_TYPE_. */
int hn_rndis_set_rxfilter(struct hn_softc *sc, uint32_t filter);
void hn_rndis_rx_ctrl(struct hn_softc *sc, const void *data,
Index: head/sys/dev/hyperv/netvsc/hn_rndis.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hn_rndis.c
+++ head/sys/dev/hyperv/netvsc/hn_rndis.c
@@ -188,6 +188,24 @@
return (0);
}
+int
+hn_rndis_get_mtu(struct hn_softc *sc, uint32_t *mtu)
+{
+ size_t size;
+ int error;
+
+ size = sizeof(*mtu);
+ error = hn_rndis_query(sc, OID_GEN_MAXIMUM_FRAME_SIZE, NULL, 0,
+ mtu, &size);
+ if (error)
+ return (error);
+ if (size != sizeof(uint32_t)) {
+ if_printf(sc->hn_ifp, "invalid mtu len %zu\n", size);
+ return (EINVAL);
+ }
+ return (0);
+}
+
static const void *
hn_rndis_xact_exec1(struct hn_softc *sc, struct vmbus_xact *xact, size_t reqlen,
struct hn_nvs_sendctx *sndc, size_t *comp_len)
Index: head/sys/dev/hyperv/netvsc/if_hn.c
===================================================================
--- head/sys/dev/hyperv/netvsc/if_hn.c
+++ head/sys/dev/hyperv/netvsc/if_hn.c
@@ -2003,6 +2003,7 @@
uint8_t eaddr[ETHER_ADDR_LEN];
struct ifnet *ifp = NULL;
int error, ring_cnt, tx_ring_cnt;
+ uint32_t mtu;
sc->hn_dev = dev;
sc->hn_prichan = vmbus_get_channel(dev);
@@ -2159,6 +2160,12 @@
if (error)
goto failed;
+ error = hn_rndis_get_mtu(sc, &mtu);
+ if (error)
+ mtu = ETHERMTU;
+ else if (bootverbose)
+ device_printf(dev, "RNDIS mtu %u\n", mtu);
+
#if __FreeBSD_version >= 1100099
if (sc->hn_rx_ring_inuse > 1) {
/*
@@ -2343,6 +2350,10 @@
if_printf(ifp, "TSO segcnt %u segsz %u\n",
ifp->if_hw_tsomaxsegcount, ifp->if_hw_tsomaxsegsize);
}
+ if (mtu < ETHERMTU) {
+ if_printf(ifp, "fixup mtu %u -> %u\n", ifp->if_mtu, mtu);
+ ifp->if_mtu = mtu;
+ }
/* Inform the upper layer about the long frame support. */
ifp->if_hdrlen = sizeof(struct ether_vlan_header);
@@ -3587,6 +3598,7 @@
int mask, error = 0;
struct ifrsskey *ifrk;
struct ifrsshash *ifrh;
+ uint32_t mtu;
switch (cmd) {
case SIOCSIFMTU:
@@ -3650,11 +3662,23 @@
break;
}
+ error = hn_rndis_get_mtu(sc, &mtu);
+ if (error)
+ mtu = ifr->ifr_mtu;
+ else if (bootverbose)
+ if_printf(ifp, "RNDIS mtu %u\n", mtu);
+
/*
* Commit the requested MTU, after the synthetic parts
* have been successfully attached.
*/
- ifp->if_mtu = ifr->ifr_mtu;
+ if (mtu >= ifr->ifr_mtu) {
+ mtu = ifr->ifr_mtu;
+ } else {
+ if_printf(ifp, "fixup mtu %d -> %u\n",
+ ifr->ifr_mtu, mtu);
+ }
+ ifp->if_mtu = mtu;
/*
* Synthetic parts' reattach may change the chimney

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 2, 4:31 AM (21 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16917714
Default Alt Text
D12352.diff (3 KB)

Event Timeline