summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2006-11-08 07:47:29 +0100
committerAdrian Bunk <bunk@stusta.de>2006-11-08 07:47:29 +0100
commit41dc00ec4d90588a7362075cfd0f0afae5d29ff4 (patch)
tree3314571f33bade3748afdd8b03e98867e8c9ab7b /net
parent8bd3ff1d04183848b589c53e94e4467a83746c8f (diff)
downloadlinux-stable-41dc00ec4d90588a7362075cfd0f0afae5d29ff4.tar.gz
linux-stable-41dc00ec4d90588a7362075cfd0f0afae5d29ff4.tar.bz2
linux-stable-41dc00ec4d90588a7362075cfd0f0afae5d29ff4.zip
[NET]: Add missing UFO initialisations
This bug was unknowingly fixed the GSO patches (or rather, its effect was unknown at the time). Thanks to Marco Berizzi's persistence which is documented in the thread "ipsec tunnel asymmetrical mtu", we now know that it can have highly non-obvious symptoms. What happens is that uninitialised uso_size fields can cause packets to be incorrectly identified as UFO, which means that it does not get fragmented even if it's over the MTU. The fix is simple enough. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Adrian Bunk <bunk@stusta.de>
Diffstat (limited to 'net')
-rw-r--r--net/core/dev.c1
-rw-r--r--net/core/skbuff.c2
2 files changed, 3 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 12a214c4e801..7405b3ffd338 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1173,6 +1173,7 @@ int __skb_linearize(struct sk_buff *skb, gfp_t gfp_mask)
atomic_set(&ninfo->dataref, 1);
ninfo->tso_size = skb_shinfo(skb)->tso_size;
ninfo->tso_segs = skb_shinfo(skb)->tso_segs;
+ ninfo->ufo_size = skb_shinfo(skb)->ufo_size;
ninfo->nr_frags = 0;
ninfo->frag_list = NULL;
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 2144952d1c6c..c0029f93899d 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -232,6 +232,7 @@ struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp,
skb_shinfo(skb)->nr_frags = 0;
skb_shinfo(skb)->tso_size = 0;
skb_shinfo(skb)->tso_segs = 0;
+ skb_shinfo(skb)->ufo_size = 0;
skb_shinfo(skb)->frag_list = NULL;
out:
return skb;
@@ -503,6 +504,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
atomic_set(&new->users, 1);
skb_shinfo(new)->tso_size = skb_shinfo(old)->tso_size;
skb_shinfo(new)->tso_segs = skb_shinfo(old)->tso_segs;
+ skb_shinfo(new)->ufo_size = skb_shinfo(old)->ufo_size;
}
/**