]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
hv_netvsc: record hardware hash in skb
authorStephen Hemminger <sthemmin@microsoft.com>
Fri, 1 Nov 2019 23:42:38 +0000 (16:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Nov 2019 22:01:35 +0000 (14:01 -0800)
Since RSS hash is available from the host, record it in
the skb.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc_drv.c
drivers/net/hyperv/rndis_filter.c

index 670ef682f268118c34e345dabcbc5e20a718c955..4209d1cf57f6029b71375ed76b8fab99b2054864 100644 (file)
@@ -853,6 +853,7 @@ struct multi_recv_comp {
 struct nvsc_rsc {
        const struct ndis_pkt_8021q_info *vlan;
        const struct ndis_tcp_ip_checksum_info *csum_info;
+       const u32 *hash_info;
        u8 is_last; /* last RNDIS msg in a vmtransfer_page */
        u32 cnt; /* #fragments in an RSC packet */
        u32 pktlen; /* Full packet length */
index e5e43db4acf2b1ea10726774e6ec459dfa91a57f..5fa5c49e481b6165eb9de951a79fae97c9e7092a 100644 (file)
@@ -766,6 +766,7 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net,
        const struct ndis_pkt_8021q_info *vlan = nvchan->rsc.vlan;
        const struct ndis_tcp_ip_checksum_info *csum_info =
                                                nvchan->rsc.csum_info;
+       const u32 *hash_info = nvchan->rsc.hash_info;
        struct sk_buff *skb;
        int i;
 
@@ -802,6 +803,9 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net,
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
        }
 
+       if (hash_info)
+               skb_set_hash(skb, *hash_info, PKT_HASH_TYPE_L4);
+
        if (vlan) {
                u16 vlan_tci = vlan->vlanid | (vlan->pri << VLAN_PRIO_SHIFT) |
                        (vlan->cfi ? VLAN_CFI_MASK : 0);
index abaf8156d19d43c12603c514d1870e4bbb69ed18..c06178380ac8ccbece4b4a5b5b44a2037ed97266 100644 (file)
@@ -358,6 +358,7 @@ static inline
 void rsc_add_data(struct netvsc_channel *nvchan,
                  const struct ndis_pkt_8021q_info *vlan,
                  const struct ndis_tcp_ip_checksum_info *csum_info,
+                 const u32 *hash_info,
                  void *data, u32 len)
 {
        u32 cnt = nvchan->rsc.cnt;
@@ -368,6 +369,7 @@ void rsc_add_data(struct netvsc_channel *nvchan,
                nvchan->rsc.vlan = vlan;
                nvchan->rsc.csum_info = csum_info;
                nvchan->rsc.pktlen = len;
+               nvchan->rsc.hash_info = hash_info;
        }
 
        nvchan->rsc.data[cnt] = data;
@@ -385,6 +387,7 @@ static int rndis_filter_receive_data(struct net_device *ndev,
        const struct ndis_tcp_ip_checksum_info *csum_info;
        const struct ndis_pkt_8021q_info *vlan;
        const struct rndis_pktinfo_id *pktinfo_id;
+       const u32 *hash_info;
        u32 data_offset;
        void *data;
        bool rsc_more = false;
@@ -411,6 +414,8 @@ static int rndis_filter_receive_data(struct net_device *ndev,
 
        csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO, 0);
 
+       hash_info = rndis_get_ppi(rndis_pkt, NBL_HASH_VALUE, 0);
+
        pktinfo_id = rndis_get_ppi(rndis_pkt, RNDIS_PKTINFO_ID, 1);
 
        data = (void *)msg + data_offset;
@@ -441,7 +446,8 @@ static int rndis_filter_receive_data(struct net_device *ndev,
         * rndis_pkt->data_len tell us the real data length, we only copy
         * the data packet to the stack, without the rndis trailer padding
         */
-       rsc_add_data(nvchan, vlan, csum_info, data, rndis_pkt->data_len);
+       rsc_add_data(nvchan, vlan, csum_info, hash_info,
+                    data, rndis_pkt->data_len);
 
        if (rsc_more)
                return NVSP_STAT_SUCCESS;