Author: sephe
Date: Fri Feb  5 05:17:48 2016
New Revision: 295301
URL: https://svnweb.freebsd.org/changeset/base/295301

Log:
  hyperv/hn: Obey IFCAP_RXCSUM configure
  
  Reviewed by:  adrian
  Approved by:  adrian (mentor)
  MFC after:    1 week
  Sponsored by: Microsoft OSTC
  Differential Revision:        https://reviews.freebsd.org/D5104

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

Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c  Fri Feb  5 05:12:30 
2016        (r295300)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c  Fri Feb  5 05:17:48 
2016        (r295301)
@@ -1142,7 +1142,7 @@ netvsc_recv(struct hv_device *device_ctx
        struct mbuf *m_new;
        struct ifnet *ifp;
        device_t dev = device_ctx->device;
-       int size, do_lro = 0;
+       int size, do_lro = 0, do_csum = 1;
 
        if (sc == NULL) {
                return (0); /* TODO: KYS how can this be! */
@@ -1190,18 +1190,21 @@ netvsc_recv(struct hv_device *device_ctx
        }
        m_new->m_pkthdr.rcvif = ifp;
 
+       if (__predict_false((ifp->if_capenable & IFCAP_RXCSUM) == 0))
+               do_csum = 0;
+
        /* receive side checksum offload */
        if (csum_info != NULL) {
                /* IP csum offload */
-               if (csum_info->receive.ip_csum_succeeded) {
+               if (csum_info->receive.ip_csum_succeeded && do_csum) {
                        m_new->m_pkthdr.csum_flags |=
                            (CSUM_IP_CHECKED | CSUM_IP_VALID);
                        sc->hn_csum_ip++;
                }
 
                /* TCP/UDP csum offload */
-               if (csum_info->receive.tcp_csum_succeeded ||
-                   csum_info->receive.udp_csum_succeeded) {
+               if ((csum_info->receive.tcp_csum_succeeded ||
+                    csum_info->receive.udp_csum_succeeded) && do_csum) {
                        m_new->m_pkthdr.csum_flags |=
                            (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
                        m_new->m_pkthdr.csum_data = 0xffff;
@@ -1239,7 +1242,8 @@ netvsc_recv(struct hv_device *device_ctx
 
                        pr = hn_check_iplen(m_new, hoff);
                        if (pr == IPPROTO_TCP) {
-                               if (sc->hn_trust_hcsum & HN_TRUST_HCSUM_TCP) {
+                               if (do_csum &&
+                                   (sc->hn_trust_hcsum & HN_TRUST_HCSUM_TCP)) {
                                        sc->hn_csum_trusted++;
                                        m_new->m_pkthdr.csum_flags |=
                                           (CSUM_IP_CHECKED | CSUM_IP_VALID |
@@ -1249,14 +1253,15 @@ netvsc_recv(struct hv_device *device_ctx
                                /* Rely on SW csum verification though... */
                                do_lro = 1;
                        } else if (pr == IPPROTO_UDP) {
-                               if (sc->hn_trust_hcsum & HN_TRUST_HCSUM_UDP) {
+                               if (do_csum &&
+                                   (sc->hn_trust_hcsum & HN_TRUST_HCSUM_UDP)) {
                                        sc->hn_csum_trusted++;
                                        m_new->m_pkthdr.csum_flags |=
                                           (CSUM_IP_CHECKED | CSUM_IP_VALID |
                                            CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
                                        m_new->m_pkthdr.csum_data = 0xffff;
                                }
-                       } else if (pr != IPPROTO_DONE &&
+                       } else if (pr != IPPROTO_DONE && do_csum &&
                            (sc->hn_trust_hcsum & HN_TRUST_HCSUM_IP)) {
                                sc->hn_csum_trusted++;
                                m_new->m_pkthdr.csum_flags |=
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to