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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to