Author: sephe
Date: Thu Aug 18 05:33:58 2016
New Revision: 304327
URL: https://svnweb.freebsd.org/changeset/base/304327

Log:
  hyperv/hn: Pass RX packet info to netvsc_recv.
  
  This paves to nuke netvsc_packet, which does not serves much
  purpose now.
  
  MFC after:    1 week
  Sponsored by: Microsoft
  Differential Revision:        https://reviews.freebsd.org/D7541

Modified:
  head/sys/dev/hyperv/netvsc/hv_net_vsc.h
  head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
  head/sys/dev/hyperv/netvsc/hv_rndis.h
  head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
  head/sys/dev/hyperv/netvsc/if_hnvar.h

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.h     Thu Aug 18 05:07:02 2016        
(r304326)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.h     Thu Aug 18 05:33:58 2016        
(r304327)
@@ -275,7 +275,6 @@ typedef void (*pfn_on_send_rx_completion
 #endif
 
 typedef struct netvsc_packet_ {
-       uint16_t        vlan_tci;
        uint32_t        status;
        uint32_t        tot_data_buf_len;
        void            *data;

Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c  Thu Aug 18 05:07:02 
2016        (r304326)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c  Thu Aug 18 05:33:58 
2016        (r304327)
@@ -1278,9 +1278,7 @@ hn_lro_rx(struct lro_ctrl *lc, struct mb
  */
 int
 netvsc_recv(struct hn_rx_ring *rxr, netvsc_packet *packet,
-    const rndis_tcp_ip_csum_info *csum_info,
-    const struct rndis_hash_info *hash_info,
-    const struct rndis_hash_value *hash_value)
+    const struct hn_recvinfo *info)
 {
        struct ifnet *ifp = rxr->hn_ifp;
        struct mbuf *m_new;
@@ -1332,28 +1330,28 @@ netvsc_recv(struct hn_rx_ring *rxr, netv
                do_csum = 0;
 
        /* receive side checksum offload */
-       if (csum_info != NULL) {
+       if (info->csum_info != NULL) {
                /* IP csum offload */
-               if (csum_info->receive.ip_csum_succeeded && do_csum) {
+               if (info->csum_info->receive.ip_csum_succeeded && do_csum) {
                        m_new->m_pkthdr.csum_flags |=
                            (CSUM_IP_CHECKED | CSUM_IP_VALID);
                        rxr->hn_csum_ip++;
                }
 
                /* TCP/UDP csum offload */
-               if ((csum_info->receive.tcp_csum_succeeded ||
-                    csum_info->receive.udp_csum_succeeded) && do_csum) {
+               if ((info->csum_info->receive.tcp_csum_succeeded ||
+                    info->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;
-                       if (csum_info->receive.tcp_csum_succeeded)
+                       if (info->csum_info->receive.tcp_csum_succeeded)
                                rxr->hn_csum_tcp++;
                        else
                                rxr->hn_csum_udp++;
                }
 
-               if (csum_info->receive.ip_csum_succeeded &&
-                   csum_info->receive.tcp_csum_succeeded)
+               if (info->csum_info->receive.ip_csum_succeeded &&
+                   info->csum_info->receive.tcp_csum_succeeded)
                        do_lro = 1;
        } else {
                const struct ether_header *eh;
@@ -1409,19 +1407,18 @@ netvsc_recv(struct hn_rx_ring *rxr, netv
                }
        }
 skip:
-       if ((packet->vlan_tci != 0) &&
-           (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
-               m_new->m_pkthdr.ether_vtag = packet->vlan_tci;
+       if (info->vlan_info != NULL) {
+               m_new->m_pkthdr.ether_vtag = info->vlan_info->u1.s1.vlan_id;
                m_new->m_flags |= M_VLANTAG;
        }
 
-       if (hash_info != NULL && hash_value != NULL) {
+       if (info->hash_info != NULL && info->hash_value != NULL) {
                rxr->hn_rss_pkts++;
-               m_new->m_pkthdr.flowid = hash_value->hash_value;
-               if ((hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
+               m_new->m_pkthdr.flowid = info->hash_value->hash_value;
+               if ((info->hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
                    NDIS_HASH_FUNCTION_TOEPLITZ) {
                        uint32_t type =
-                           (hash_info->hash_info & NDIS_HASH_TYPE_MASK);
+                           (info->hash_info->hash_info & NDIS_HASH_TYPE_MASK);
 
                        switch (type) {
                        case NDIS_HASH_IPV4:
@@ -1450,8 +1447,8 @@ skip:
                        }
                }
        } else {
-               if (hash_value != NULL) {
-                       m_new->m_pkthdr.flowid = hash_value->hash_value;
+               if (info->hash_value != NULL) {
+                       m_new->m_pkthdr.flowid = info->hash_value->hash_value;
                } else {
                        m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
                        hash_type = M_HASHTYPE_OPAQUE;

Modified: head/sys/dev/hyperv/netvsc/hv_rndis.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis.h       Thu Aug 18 05:07:02 2016        
(r304326)
+++ head/sys/dev/hyperv/netvsc/hv_rndis.h       Thu Aug 18 05:33:58 2016        
(r304327)
@@ -1088,11 +1088,10 @@ typedef struct rndismp_rx_bufs_info_ {
  */
 struct hn_rx_ring;
 struct hn_tx_ring;
+struct hn_recvinfo;
 
 int netvsc_recv(struct hn_rx_ring *rxr,
-    netvsc_packet *packet, const rndis_tcp_ip_csum_info *csum_info,
-    const struct rndis_hash_info *hash_info,
-    const struct rndis_hash_value *hash_value);
+    netvsc_packet *packet, const struct hn_recvinfo *info);
 void netvsc_channel_rollup(struct hn_rx_ring *rxr, struct hn_tx_ring *txr);
 
 void* hv_set_rppi_data(rndis_msg *rndis_mesg,

Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Thu Aug 18 05:07:02 
2016        (r304326)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Thu Aug 18 05:33:58 
2016        (r304327)
@@ -52,13 +52,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/hyperv/netvsc/hv_rndis_filter.h>
 #include <dev/hyperv/netvsc/if_hnreg.h>
 
-struct hv_rf_recvinfo {
-       const ndis_8021q_info           *vlan_info;
-       const rndis_tcp_ip_csum_info    *csum_info;
-       const struct rndis_hash_info    *hash_info;
-       const struct rndis_hash_value   *hash_value;
-};
-
 #define HV_RF_RECVINFO_VLAN    0x1
 #define HV_RF_RECVINFO_CSUM    0x2
 #define HV_RF_RECVINFO_HASHINF 0x4
@@ -444,7 +437,7 @@ hv_rf_receive_indicate_status(rndis_devi
 }
 
 static int
-hv_rf_find_recvinfo(const rndis_packet *rpkt, struct hv_rf_recvinfo *info)
+hv_rf_find_recvinfo(const rndis_packet *rpkt, struct hn_recvinfo *info)
 {
        const rndis_per_packet_info *ppi;
        uint32_t mask, len;
@@ -530,7 +523,7 @@ hv_rf_receive_data(struct hn_rx_ring *rx
 {
        rndis_packet *rndis_pkt;
        uint32_t data_offset;
-       struct hv_rf_recvinfo info;
+       struct hn_recvinfo info;
 
        rndis_pkt = &message->msg.packet;
 
@@ -559,13 +552,7 @@ hv_rf_receive_data(struct hn_rx_ring *rx
                if_printf(rxr->hn_ifp, "recvinfo parsing failed\n");
                return;
        }
-
-       if (info.vlan_info != NULL)
-               pkt->vlan_tci = info.vlan_info->u1.s1.vlan_id;
-       else
-               pkt->vlan_tci = 0;
-
-       netvsc_recv(rxr, pkt, info.csum_info, info.hash_info, info.hash_value);
+       netvsc_recv(rxr, pkt, &info);
 }
 
 /*

Modified: head/sys/dev/hyperv/netvsc/if_hnvar.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnvar.h       Thu Aug 18 05:07:02 2016        
(r304326)
+++ head/sys/dev/hyperv/netvsc/if_hnvar.h       Thu Aug 18 05:33:58 2016        
(r304327)
@@ -35,7 +35,6 @@
 #include <dev/hyperv/netvsc/if_hnreg.h>
 
 struct netvsc_dev_;
-struct nvsp_msg_;
 
 struct vmbus_channel;
 struct hn_send_ctx;
@@ -51,6 +50,18 @@ struct hn_send_ctx {
        int                     hn_chim_sz;
 };
 
+struct rndis_hash_info;
+struct rndix_hash_value;
+struct ndis_8021q_info_;
+struct rndis_tcp_ip_csum_info_;
+
+struct hn_recvinfo {
+       const struct ndis_8021q_info_   *vlan_info;
+       const struct rndis_tcp_ip_csum_info_ *csum_info;
+       const struct rndis_hash_info    *hash_info;
+       const struct rndis_hash_value   *hash_value;
+};
+
 #define HN_SEND_CTX_INITIALIZER(cb, cbarg)             \
 {                                                      \
        .hn_cb          = cb,                           \
_______________________________________________
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