forked from mirrors/linux
		
	hv_netvsc: record hardware hash in skb
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>
This commit is contained in:
		
							parent
							
								
									df9f540ca7
								
							
						
					
					
						commit
						1fac7ca4e6
					
				
					 3 changed files with 12 additions and 1 deletions
				
			
		|  | @ -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 */ | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Stephen Hemminger
						Stephen Hemminger