[PATCH net-next,v2] hyperv: Add handling of IP header with option field in netvsc_set_hash()

Subsystems: hyper-v/azure core and drivers, networking drivers, the rest

STALE4310d REVIEWED: 1 (1M)

1 review trailer (1 from subsystem maintainers).

3 messages, 2 authors, 2014-10-14 · open the first message on its own page

[PATCH net-next,v2] hyperv: Add handling of IP header with option field in netvsc_set_hash()

From: Haiyang Zhang <haiyangz@microsoft.com>
Date: 2014-10-14 21:17:29

In case that the IP header has optional field at the end, this patch will
get the port numbers after that field, and compute the hash.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/net/hyperv/netvsc_drv.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 0fcb5e7..0d60c91 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -162,7 +162,7 @@ union sub_key {
  * data: network byte order
  * return: host byte order
  */
-static u32 comp_hash(u8 *key, int klen, u8 *data, int dlen)
+static u32 comp_hash(u8 *key, int klen, void *data, int dlen)
 {
 	union sub_key subk;
 	int k_next = 4;
@@ -176,7 +176,7 @@ static u32 comp_hash(u8 *key, int klen, u8 *data, int dlen)
 	for (i = 0; i < dlen; i++) {
 		subk.kb = key[k_next];
 		k_next = (k_next + 1) % klen;
-		dt = data[i];
+		dt = ((u8 *)data)[i];
 		for (j = 0; j < 8; j++) {
 			if (dt & 0x80)
 				ret ^= subk.ka;
@@ -191,6 +191,7 @@ static u32 comp_hash(u8 *key, int klen, u8 *data, int dlen)
 static bool netvsc_set_hash(u32 *hash, struct sk_buff *skb)
 {
 	struct iphdr *iphdr;
+	__be32 dbuf[3];
 	int data_len;
 	bool ret = false;
 
@@ -200,12 +201,15 @@ static bool netvsc_set_hash(u32 *hash, struct sk_buff *skb)
 	iphdr = ip_hdr(skb);
 
 	if (iphdr->version == 4) {
-		if (iphdr->protocol == IPPROTO_TCP)
+		dbuf[0] = iphdr->saddr;
+		dbuf[1] = iphdr->daddr;
+		if (iphdr->protocol == IPPROTO_TCP) {
+			dbuf[2] = *(__be32 *)&tcp_hdr(skb)->source;
 			data_len = 12;
-		else
+		} else {
 			data_len = 8;
-		*hash = comp_hash(netvsc_hash_key, HASH_KEYLEN,
-				  (u8 *)&iphdr->saddr, data_len);
+		}
+		*hash = comp_hash(netvsc_hash_key, HASH_KEYLEN, dbuf, data_len);
 		ret = true;
 	}
 
-- 
1.7.1

Re: [PATCH net-next,v2] hyperv: Add handling of IP header with option field in netvsc_set_hash()

From: David Miller <davem@davemloft.net>
Date: 2014-10-14 21:37:21

From: Haiyang Zhang <haiyangz@microsoft.com>
Date: Tue, 14 Oct 2014 15:16:28 -0700
In case that the IP header has optional field at the end, this patch will
get the port numbers after that field, and compute the hash.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Instead of adding hack after hack after hack to your internal header
parser, just use the generic flow dissector we already have in the
kernel to fetch out the values you need.

__skb_flow_get_ports() etc.

RE: [PATCH net-next,v2] hyperv: Add handling of IP header with option field in netvsc_set_hash()

From: Haiyang Zhang <haiyangz@microsoft.com>
Date: 2014-10-14 22:21:10

-----Original Message-----
From: David Miller [mailto:davem@davemloft.net]
Sent: Tuesday, October 14, 2014 5:37 PM
To: Haiyang Zhang
Cc: netdev@vger.kernel.org; KY Srinivasan; olaf@aepfle.de;
jasowang@redhat.com; linux-kernel@vger.kernel.org; driverdev-
devel@linuxdriverproject.org
Subject: Re: [PATCH net-next,v2] hyperv: Add handling of IP header with option
field in netvsc_set_hash()

From: Haiyang Zhang <haiyangz@microsoft.com>
Date: Tue, 14 Oct 2014 15:16:28 -0700
quoted
In case that the IP header has optional field at the end, this patch
will get the port numbers after that field, and compute the hash.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Instead of adding hack after hack after hack to your internal header parser, just
use the generic flow dissector we already have in the kernel to fetch out the
values you need.

__skb_flow_get_ports() etc.
Thanks. I will update the patch.

- Haiyang
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help