Commit cefc30b3 authored by Herbert Xu's avatar Herbert Xu Committed by Greg Kroah-Hartman

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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 949837a9
...@@ -1246,6 +1246,7 @@ int __skb_linearize(struct sk_buff *skb, gfp_t gfp_mask) ...@@ -1246,6 +1246,7 @@ int __skb_linearize(struct sk_buff *skb, gfp_t gfp_mask)
atomic_set(&ninfo->dataref, 1); atomic_set(&ninfo->dataref, 1);
ninfo->tso_size = skb_shinfo(skb)->tso_size; ninfo->tso_size = skb_shinfo(skb)->tso_size;
ninfo->tso_segs = skb_shinfo(skb)->tso_segs; ninfo->tso_segs = skb_shinfo(skb)->tso_segs;
ninfo->ufo_size = skb_shinfo(skb)->ufo_size;
ninfo->nr_frags = 0; ninfo->nr_frags = 0;
ninfo->frag_list = NULL; ninfo->frag_list = NULL;
......
...@@ -240,6 +240,7 @@ struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, ...@@ -240,6 +240,7 @@ struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp,
skb_shinfo(skb)->nr_frags = 0; skb_shinfo(skb)->nr_frags = 0;
skb_shinfo(skb)->tso_size = 0; skb_shinfo(skb)->tso_size = 0;
skb_shinfo(skb)->tso_segs = 0; skb_shinfo(skb)->tso_segs = 0;
skb_shinfo(skb)->ufo_size = 0;
skb_shinfo(skb)->frag_list = NULL; skb_shinfo(skb)->frag_list = NULL;
out: out:
return skb; return skb;
...@@ -529,6 +530,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) ...@@ -529,6 +530,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
atomic_set(&new->users, 1); atomic_set(&new->users, 1);
skb_shinfo(new)->tso_size = skb_shinfo(old)->tso_size; skb_shinfo(new)->tso_size = skb_shinfo(old)->tso_size;
skb_shinfo(new)->tso_segs = skb_shinfo(old)->tso_segs; skb_shinfo(new)->tso_segs = skb_shinfo(old)->tso_segs;
skb_shinfo(new)->ufo_size = skb_shinfo(old)->ufo_size;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment