Message ID | 1413324988-8863-1-git-send-email-haiyangz@microsoft.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
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. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> -----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 > > > 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 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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; }