summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordexuan <dexuan@FreeBSD.org>2017-02-23 06:49:46 +0000
committerdexuan <dexuan@FreeBSD.org>2017-02-23 06:49:46 +0000
commit2efa1535a98f7c89985bee7c9a39d33e1e15355c (patch)
tree52c93969962a34ab1cb8f20249bbd75b2ab5514f
parentd05bf5e24a5a42fda53da526e0437363330a3151 (diff)
downloadFreeBSD-src-2efa1535a98f7c89985bee7c9a39d33e1e15355c.zip
FreeBSD-src-2efa1535a98f7c89985bee7c9a39d33e1e15355c.tar.gz
MFC: r312685, r312686
Approved by: sephe (mentor) r312685 hyperv/hn: remember the channel pointer in struct hn_rx_ring This will be used by the coming NIC SR-IOV patch. Reviewed by: sephe Approved by: sephe (mentor) Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D8909 r312686 hyperv/hn: remove the MTU and IFF_DRV_RUNNING checking in hn_rxpkt() It's unnecessary because the upper nework stack does the same checking. In the case of Hyper-V SR-IOV, we need to remove the checking because 1) multicast/broadcast packets are still received through the synthetic NIC and we need to inject the packets through the VF interface; 2) we must inject the packets even if the synthetic NIC is down, or has a different MTU from the VF device. Reviewed by: sephe Approved by: sephe (mentor) Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D8962
-rw-r--r--sys/dev/hyperv/netvsc/if_hn.c11
-rw-r--r--sys/dev/hyperv/netvsc/if_hnvar.h2
2 files changed, 4 insertions, 9 deletions
diff --git a/sys/dev/hyperv/netvsc/if_hn.c b/sys/dev/hyperv/netvsc/if_hn.c
index 8750ab0..f7090f9 100644
--- a/sys/dev/hyperv/netvsc/if_hn.c
+++ b/sys/dev/hyperv/netvsc/if_hn.c
@@ -2118,15 +2118,7 @@ hn_rxpkt(struct hn_rx_ring *rxr, const void *data, int dlen,
int size, do_lro = 0, do_csum = 1;
int hash_type = M_HASHTYPE_OPAQUE;
- if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
- return (0);
-
- /*
- * Bail out if packet contains more data than configured MTU.
- */
- if (dlen > (ifp->if_mtu + ETHER_HDR_LEN)) {
- return (0);
- } else if (dlen <= MHLEN) {
+ if (dlen <= MHLEN) {
m_new = m_gethdr(M_NOWAIT, MT_DATA);
if (m_new == NULL) {
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
@@ -4297,6 +4289,7 @@ hn_chan_attach(struct hn_softc *sc, struct vmbus_channel *chan)
KASSERT((rxr->hn_rx_flags & HN_RX_FLAG_ATTACHED) == 0,
("RX ring %d already attached", idx));
rxr->hn_rx_flags |= HN_RX_FLAG_ATTACHED;
+ rxr->hn_chan = chan;
if (bootverbose) {
if_printf(sc->hn_ifp, "link RX ring %d to chan%u\n",
diff --git a/sys/dev/hyperv/netvsc/if_hnvar.h b/sys/dev/hyperv/netvsc/if_hnvar.h
index 7d5d912..5e25e8f 100644
--- a/sys/dev/hyperv/netvsc/if_hnvar.h
+++ b/sys/dev/hyperv/netvsc/if_hnvar.h
@@ -85,6 +85,8 @@ struct hn_rx_ring {
void *hn_br; /* TX/RX bufring */
struct hyperv_dma hn_br_dma;
+
+ struct vmbus_channel *hn_chan;
} __aligned(CACHE_LINE_SIZE);
#define HN_TRUST_HCSUM_IP 0x0001
OpenPOWER on IntegriCloud