svn commit: r306938 - head/sys/dev/hyperv/netvsc

Sepherosa Ziehau sephe at FreeBSD.org
Mon Oct 10 05:59:32 UTC 2016


Author: sephe
Date: Mon Oct 10 05:59:30 2016
New Revision: 306938
URL: https://svnweb.freebsd.org/changeset/base/306938

Log:
  hyperv/hn: Generalize RSS capabilities query.
  
  - Support NDIS < 6.30.
  - Stringent response checks.
  
  MFC after:	1 week
  Sponsored by:	Microsoft
  Differential Revision:	https://reviews.freebsd.org/D8090

Modified:
  head/sys/dev/hyperv/netvsc/hv_rndis_filter.c

Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c	Mon Oct 10 05:50:01 2016	(r306937)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c	Mon Oct 10 05:59:30 2016	(r306938)
@@ -745,26 +745,44 @@ hn_rndis_get_rsscaps(struct hn_softc *sc
 	size_t caps_len;
 	int error;
 
-	/*
-	 * Only NDIS 6.30+ is supported.
-	 */
-	KASSERT(sc->hn_ndis_ver >= HN_NDIS_VERSION_6_30,
-	    ("NDIS 6.30+ is required, NDIS version 0x%08x", sc->hn_ndis_ver));
 	*rxr_cnt = 0;
 
 	memset(&in, 0, sizeof(in));
 	in.ndis_hdr.ndis_type = NDIS_OBJTYPE_RSS_CAPS;
-	in.ndis_hdr.ndis_rev = NDIS_RSS_CAPS_REV_2;
-	in.ndis_hdr.ndis_size = NDIS_RSS_CAPS_SIZE;
+	if (sc->hn_ndis_ver < HN_NDIS_VERSION_6_30) {
+		in.ndis_hdr.ndis_rev = NDIS_RSS_CAPS_REV_1;
+		in.ndis_hdr.ndis_size = NDIS_RSS_CAPS_SIZE_6_0;
+	} else {
+		in.ndis_hdr.ndis_rev = NDIS_RSS_CAPS_REV_2;
+		in.ndis_hdr.ndis_size = NDIS_RSS_CAPS_SIZE;
+	}
 
 	caps_len = NDIS_RSS_CAPS_SIZE;
-	error = hn_rndis_query(sc, OID_GEN_RECEIVE_SCALE_CAPABILITIES,
-	    &in, NDIS_RSS_CAPS_SIZE, &caps, &caps_len);
+	error = hn_rndis_query2(sc, OID_GEN_RECEIVE_SCALE_CAPABILITIES,
+	    &in, NDIS_RSS_CAPS_SIZE, &caps, &caps_len, NDIS_RSS_CAPS_SIZE_6_0);
 	if (error)
 		return (error);
-	if (caps_len < NDIS_RSS_CAPS_SIZE_6_0) {
-		if_printf(sc->hn_ifp, "invalid NDIS RSS caps len %zu",
-		    caps_len);
+
+	/*
+	 * Preliminary verification.
+	 */
+	if (caps.ndis_hdr.ndis_type != NDIS_OBJTYPE_RSS_CAPS) {
+		if_printf(sc->hn_ifp, "invalid NDIS objtype 0x%02x\n",
+		    caps.ndis_hdr.ndis_type);
+		return (EINVAL);
+	}
+	if (caps.ndis_hdr.ndis_rev < NDIS_RSS_CAPS_REV_1) {
+		if_printf(sc->hn_ifp, "invalid NDIS objrev 0x%02x\n",
+		    caps.ndis_hdr.ndis_rev);
+		return (EINVAL);
+	}
+	if (caps.ndis_hdr.ndis_size > caps_len) {
+		if_printf(sc->hn_ifp, "invalid NDIS objsize %u, "
+		    "data size %zu\n", caps.ndis_hdr.ndis_size, caps_len);
+		return (EINVAL);
+	} else if (caps.ndis_hdr.ndis_size < NDIS_RSS_CAPS_SIZE_6_0) {
+		if_printf(sc->hn_ifp, "invalid NDIS objsize %u\n",
+		    caps.ndis_hdr.ndis_size);
 		return (EINVAL);
 	}
 
@@ -774,7 +792,7 @@ hn_rndis_get_rsscaps(struct hn_softc *sc
 	}
 	*rxr_cnt = caps.ndis_nrxr;
 
-	if (caps_len == NDIS_RSS_CAPS_SIZE) {
+	if (caps.ndis_hdr.ndis_size == NDIS_RSS_CAPS_SIZE) {
 		if (bootverbose) {
 			if_printf(sc->hn_ifp, "RSS indirect table size %u\n",
 			    caps.ndis_nind);


More information about the svn-src-all mailing list