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 {
 | 
					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,
 | 
				
			||||||
	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,
 | 
				
			||||||
			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
 | 
				
			||||||
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,
 | 
				
			||||||
		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,
 | 
				
			||||||
	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,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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,
 | 
				
			||||||
	 * 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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue