Thread (6 messages) 6 messages, 3 authors, 2013-11-29

Re: [Xen-devel] [PATCH net v2] xen-netback: fix fragment detection in checksum setup

From: annie li <hidden>
Date: 2013-11-29 09:57:14

On 2013/11/29 17:10, Paul Durrant wrote:
quoted
-----Original Message-----
From: annie li [mailto:annie.li@oracle.com]
Sent: 29 November 2013 05:36
To: Paul Durrant
Cc: xen-devel@lists.xen.org; netdev@vger.kernel.org; Wei Liu; Ian Campbell;
David Vrabel
Subject: Re: [PATCH net v2] xen-netback: fix fragment detection in checksum
setup


On 2013/11/28 21:23, Paul Durrant wrote:
quoted
The code to detect fragments in checksum_setup() was missing for IPv4
and
quoted
too eager for IPv6. (It transpires that Windows seems to send IPv6 packets
with a fragment header even if they are not a fragment - i.e. offset is zero,
and M bit is not set).

Signed-off-by: Paul Durrant <redacted>
Cc: Wei Liu <redacted>
Cc: Ian Campbell <redacted>
Cc: David Vrabel <redacted>
---
v2

- Added comments noting what fragment/offset masks mean

   drivers/net/xen-netback/netback.c |   33
++++++++++++++++++++++++++++++---
quoted
   1 file changed, 30 insertions(+), 3 deletions(-)
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-
netback/netback.c
quoted
index 919b650..c7464d8 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1165,15 +1165,28 @@ static int checksum_setup_ip(struct xenvif *vif,
struct sk_buff *skb,
quoted
   	struct iphdr *iph = (void *)skb->data;
   	unsigned int header_size;
   	unsigned int off;
+	bool fragment;
   	int err = -EPROTO;

+	fragment = false;
Is it better to initialize fragment directly as following?
bool fragment = false;
I think that's a matter of personal taste. I tend to favour this style.
That is OK, I point this out because it is inconsistent with other 
variable initialization in netback.c.

Thanks
Annie
quoted
quoted
+
   	off = sizeof(struct iphdr);

   	header_size = skb->network_header + off + MAX_IPOPTLEN;
   	maybe_pull_tail(skb, header_size);

+	/* 3fff -> fragment offset != 0 OR more fragments */
+	if (ntohs(iph->frag_off) & 0x3fff)
+		fragment = true;
+
   	off = iph->ihl * 4;

+	if (fragment) {
+		if (net_ratelimit())
+			netdev_err(vif->dev, "Packet is a fragment!\n");
+		goto out;
+	}
+
   	switch (iph->protocol) {
   	case IPPROTO_TCP:
   		if (!skb_partial_csum_set(skb, off,
@@ -1237,6 +1250,7 @@ static int checksum_setup_ipv6(struct xenvif *vif,
struct sk_buff *skb,
quoted
   	bool fragment;
   	bool done;

+	fragment = false;
   	done = false;
Same as above for "done" and "fragment"...

Thanks
Annie
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help