Commit 1fac7ca4 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller

hv_netvsc: record hardware hash in skb

Since RSS hash is available from the host, record it in
the skb.
Signed-off-by: default avatarStephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent df9f540c
...@@ -853,6 +853,7 @@ struct multi_recv_comp { ...@@ -853,6 +853,7 @@ struct multi_recv_comp {
struct nvsc_rsc { struct nvsc_rsc {
const struct ndis_pkt_8021q_info *vlan; const struct ndis_pkt_8021q_info *vlan;
const struct ndis_tcp_ip_checksum_info *csum_info; const struct ndis_tcp_ip_checksum_info *csum_info;
const u32 *hash_info;
u8 is_last; /* last RNDIS msg in a vmtransfer_page */ u8 is_last; /* last RNDIS msg in a vmtransfer_page */
u32 cnt; /* #fragments in an RSC packet */ u32 cnt; /* #fragments in an RSC packet */
u32 pktlen; /* Full packet length */ u32 pktlen; /* Full packet length */
......
...@@ -766,6 +766,7 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net, ...@@ -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_pkt_8021q_info *vlan = nvchan->rsc.vlan;
const struct ndis_tcp_ip_checksum_info *csum_info = const struct ndis_tcp_ip_checksum_info *csum_info =
nvchan->rsc.csum_info; nvchan->rsc.csum_info;
const u32 *hash_info = nvchan->rsc.hash_info;
struct sk_buff *skb; struct sk_buff *skb;
int i; int i;
...@@ -802,6 +803,9 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net, ...@@ -802,6 +803,9 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net,
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
} }
if (hash_info)
skb_set_hash(skb, *hash_info, PKT_HASH_TYPE_L4);
if (vlan) { if (vlan) {
u16 vlan_tci = vlan->vlanid | (vlan->pri << VLAN_PRIO_SHIFT) | u16 vlan_tci = vlan->vlanid | (vlan->pri << VLAN_PRIO_SHIFT) |
(vlan->cfi ? VLAN_CFI_MASK : 0); (vlan->cfi ? VLAN_CFI_MASK : 0);
......
...@@ -358,6 +358,7 @@ static inline ...@@ -358,6 +358,7 @@ static inline
void rsc_add_data(struct netvsc_channel *nvchan, void rsc_add_data(struct netvsc_channel *nvchan,
const struct ndis_pkt_8021q_info *vlan, const struct ndis_pkt_8021q_info *vlan,
const struct ndis_tcp_ip_checksum_info *csum_info, const struct ndis_tcp_ip_checksum_info *csum_info,
const u32 *hash_info,
void *data, u32 len) void *data, u32 len)
{ {
u32 cnt = nvchan->rsc.cnt; u32 cnt = nvchan->rsc.cnt;
...@@ -368,6 +369,7 @@ void rsc_add_data(struct netvsc_channel *nvchan, ...@@ -368,6 +369,7 @@ void rsc_add_data(struct netvsc_channel *nvchan,
nvchan->rsc.vlan = vlan; nvchan->rsc.vlan = vlan;
nvchan->rsc.csum_info = csum_info; nvchan->rsc.csum_info = csum_info;
nvchan->rsc.pktlen = len; nvchan->rsc.pktlen = len;
nvchan->rsc.hash_info = hash_info;
} }
nvchan->rsc.data[cnt] = data; nvchan->rsc.data[cnt] = data;
...@@ -385,6 +387,7 @@ static int rndis_filter_receive_data(struct net_device *ndev, ...@@ -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_tcp_ip_checksum_info *csum_info;
const struct ndis_pkt_8021q_info *vlan; const struct ndis_pkt_8021q_info *vlan;
const struct rndis_pktinfo_id *pktinfo_id; const struct rndis_pktinfo_id *pktinfo_id;
const u32 *hash_info;
u32 data_offset; u32 data_offset;
void *data; void *data;
bool rsc_more = false; bool rsc_more = false;
...@@ -411,6 +414,8 @@ static int rndis_filter_receive_data(struct net_device *ndev, ...@@ -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); 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); pktinfo_id = rndis_get_ppi(rndis_pkt, RNDIS_PKTINFO_ID, 1);
data = (void *)msg + data_offset; data = (void *)msg + data_offset;
...@@ -441,7 +446,8 @@ static int rndis_filter_receive_data(struct net_device *ndev, ...@@ -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 * rndis_pkt->data_len tell us the real data length, we only copy
* the data packet to the stack, without the rndis trailer padding * 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) if (rsc_more)
return NVSP_STAT_SUCCESS; return NVSP_STAT_SUCCESS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment