diff options
Diffstat (limited to 'drivers/net/hyperv/netvsc_drv.c')
| -rw-r--r-- | drivers/net/hyperv/netvsc_drv.c | 70 | 
1 files changed, 6 insertions, 64 deletions
| diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 1c8db9afdcda..98e34fee45c7 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -196,65 +196,6 @@ static void *init_ppi_data(struct rndis_message *msg, u32 ppi_size,  	return ppi;  } -union sub_key { -	u64 k; -	struct { -		u8 pad[3]; -		u8 kb; -		u32 ka; -	}; -}; - -/* Toeplitz hash function - * data: network byte order - * return: host byte order - */ -static u32 comp_hash(u8 *key, int klen, void *data, int dlen) -{ -	union sub_key subk; -	int k_next = 4; -	u8 dt; -	int i, j; -	u32 ret = 0; - -	subk.k = 0; -	subk.ka = ntohl(*(u32 *)key); - -	for (i = 0; i < dlen; i++) { -		subk.kb = key[k_next]; -		k_next = (k_next + 1) % klen; -		dt = ((u8 *)data)[i]; -		for (j = 0; j < 8; j++) { -			if (dt & 0x80) -				ret ^= subk.ka; -			dt <<= 1; -			subk.k <<= 1; -		} -	} - -	return ret; -} - -static bool netvsc_set_hash(u32 *hash, struct sk_buff *skb) -{ -	struct flow_keys flow; -	int data_len; - -	if (!skb_flow_dissect_flow_keys(skb, &flow, 0) || -	    !(flow.basic.n_proto == htons(ETH_P_IP) || -	      flow.basic.n_proto == htons(ETH_P_IPV6))) -		return false; - -	if (flow.basic.ip_proto == IPPROTO_TCP) -		data_len = 12; -	else -		data_len = 8; - -	*hash = comp_hash(netvsc_hash_key, HASH_KEYLEN, &flow, data_len); - -	return true; -} -  static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,  			void *accel_priv, select_queue_fallback_t fallback)  { @@ -267,11 +208,9 @@ static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,  	if (nvsc_dev == NULL || ndev->real_num_tx_queues <= 1)  		return 0; -	if (netvsc_set_hash(&hash, skb)) { -		q_idx = nvsc_dev->send_table[hash % VRSS_SEND_TAB_SIZE] % -			ndev->real_num_tx_queues; -		skb_set_hash(skb, hash, PKT_HASH_TYPE_L3); -	} +	hash = skb_get_hash(skb); +	q_idx = nvsc_dev->send_table[hash % VRSS_SEND_TAB_SIZE] % +		ndev->real_num_tx_queues;  	if (!nvsc_dev->chn_table[q_idx])  		q_idx = 0; @@ -1150,6 +1089,9 @@ static int netvsc_probe(struct hv_device *dev,  	net->ethtool_ops = ðtool_ops;  	SET_NETDEV_DEV(net, &dev->device); +	/* We always need headroom for rndis header */ +	net->needed_headroom = RNDIS_AND_PPI_SIZE; +  	/* Notify the netvsc driver of the new device */  	memset(&device_info, 0, sizeof(device_info));  	device_info.ring_size = ring_size; | 
