]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.26 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Sat, 16 Aug 2008 22:14:03 +0000 (15:14 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 16 Aug 2008 22:14:03 +0000 (15:14 -0700)
queue-2.6.26/ipv6-fix-ip6_xmit-to-send-fragments-if-ipfragok-is-true.patch [new file with mode: 0644]
queue-2.6.26/random32-seeding-improvement.patch [new file with mode: 0644]
queue-2.6.26/series
queue-2.6.26/syncookies-make-sure-ecn-is-disabled.patch [new file with mode: 0644]

diff --git a/queue-2.6.26/ipv6-fix-ip6_xmit-to-send-fragments-if-ipfragok-is-true.patch b/queue-2.6.26/ipv6-fix-ip6_xmit-to-send-fragments-if-ipfragok-is-true.patch
new file mode 100644 (file)
index 0000000..d6f7129
--- /dev/null
@@ -0,0 +1,53 @@
+From bcac910d069f5c242301fd7ea65167665191f6e8 Mon Sep 17 00:00:00 2001
+From: Wei Yongjun <yjwei@cn.fujitsu.com>
+Date: Thu, 31 Jul 2008 20:46:47 -0700
+Subject: ipv6: Fix ip6_xmit to send fragments if ipfragok is true
+Message-Id: <20080805.164947.158498047.davem@davemloft.net>
+
+From: Wei Yongjun <yjwei@cn.fujitsu.com>
+
+[ Upstream commit 77e2f14f71d68d05945f1d30ca55b5194d6ab1ce ]
+
+SCTP used ip6_xmit() to send fragments after received ICMP packet too
+big message. But while send packet used ip6_xmit, the skb->local_df is
+not initialized. So when skb if enter ip6_fragment(), the following
+code will discard the skb.
+
+ip6_fragment(...)
+{
+    if (!skb->local_df) {
+        ...
+        return -EMSGSIZE;
+    }
+    ...
+}
+
+SCTP do the following step:
+1. send packet ip6_xmit(skb, ipfragok=0)
+2. received ICMP packet too big message
+3. if PMTUD_ENABLE: ip6_xmit(skb, ipfragok=1)
+
+This patch fixed the problem by set local_df if ipfragok is true.
+
+Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
+Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ net/ipv6/ip6_output.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -231,6 +231,10 @@ int ip6_xmit(struct sock *sk, struct sk_
+       skb_reset_network_header(skb);
+       hdr = ipv6_hdr(skb);
++      /* Allow local fragmentation. */
++      if (ipfragok)
++              skb->local_df = 1;
++
+       /*
+        *      Fill in the IPv6 header
+        */
diff --git a/queue-2.6.26/random32-seeding-improvement.patch b/queue-2.6.26/random32-seeding-improvement.patch
new file mode 100644 (file)
index 0000000..90a4907
--- /dev/null
@@ -0,0 +1,112 @@
+From 7d5b66670742520208a79e99766f91d4835827fa Mon Sep 17 00:00:00 2001
+From: Stephen Hemminger <shemminger@vyatta.com>
+Date: Wed, 30 Jul 2008 16:29:19 -0700
+Subject: random32: seeding improvement
+Message-Id: <20080805.164947.158498047.davem@davemloft.net>
+
+From: Stephen Hemminger <shemminger@vyatta.com>
+
+[ Upstream commit 697f8d0348a652593d195a13dd1067d9df911a82 ]
+
+The rationale is:
+   * use u32 consistently
+   * no need to do LCG on values from (better) get_random_bytes
+   * use more data from get_random_bytes for secondary seeding
+   * don't reduce state space on srandom32()
+   * enforce state variable initialization restrictions
+
+Note: the second paper has a version of random32() with even longer period
+and a version of random64() if needed.
+
+Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Cc: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ lib/random32.c |   48 +++++++++++++++++++++++++++---------------------
+ 1 file changed, 27 insertions(+), 21 deletions(-)
+
+--- a/lib/random32.c
++++ b/lib/random32.c
+@@ -56,23 +56,12 @@ static u32 __random32(struct rnd_state *
+       return (state->s1 ^ state->s2 ^ state->s3);
+ }
+-static void __set_random32(struct rnd_state *state, unsigned long s)
++/*
++ * Handle minimum values for seeds
++ */
++static inline u32 __seed(u32 x, u32 m)
+ {
+-      if (s == 0)
+-              s = 1;      /* default seed is 1 */
+-
+-#define LCG(n) (69069 * n)
+-      state->s1 = LCG(s);
+-      state->s2 = LCG(state->s1);
+-      state->s3 = LCG(state->s2);
+-
+-      /* "warm it up" */
+-      __random32(state);
+-      __random32(state);
+-      __random32(state);
+-      __random32(state);
+-      __random32(state);
+-      __random32(state);
++      return (x < m) ? x + m : x;
+ }
+ /**
+@@ -107,7 +96,7 @@ void srandom32(u32 entropy)
+        */
+       for_each_possible_cpu (i) {
+               struct rnd_state *state = &per_cpu(net_rand_state, i);
+-              __set_random32(state, state->s1 ^ entropy);
++              state->s1 = __seed(state->s1 ^ entropy, 1);
+       }
+ }
+ EXPORT_SYMBOL(srandom32);
+@@ -122,7 +111,19 @@ static int __init random32_init(void)
+       for_each_possible_cpu(i) {
+               struct rnd_state *state = &per_cpu(net_rand_state,i);
+-              __set_random32(state, i + jiffies);
++
++#define LCG(x)        ((x) * 69069)   /* super-duper LCG */
++              state->s1 = __seed(LCG(i + jiffies), 1);
++              state->s2 = __seed(LCG(state->s1), 7);
++              state->s3 = __seed(LCG(state->s2), 15);
++
++              /* "warm it up" */
++              __random32(state);
++              __random32(state);
++              __random32(state);
++              __random32(state);
++              __random32(state);
++              __random32(state);
+       }
+       return 0;
+ }
+@@ -135,13 +136,18 @@ core_initcall(random32_init);
+ static int __init random32_reseed(void)
+ {
+       int i;
+-      unsigned long seed;
+       for_each_possible_cpu(i) {
+               struct rnd_state *state = &per_cpu(net_rand_state,i);
++              u32 seeds[3];
++
++              get_random_bytes(&seeds, sizeof(seeds));
++              state->s1 = __seed(seeds[0], 1);
++              state->s2 = __seed(seeds[1], 7);
++              state->s3 = __seed(seeds[2], 15);
+-              get_random_bytes(&seed, sizeof(seed));
+-              __set_random32(state, seed);
++              /* mix it in */
++              __random32(state);
+       }
+       return 0;
+ }
index 74a551189f0a10fd65d4408bcc75028dc3262712..c7355ed431ba2924346925d13a2af296ce79b243 100644 (file)
@@ -22,3 +22,6 @@ acer-wmi-fix-wireless-and-bluetooth-on-early-amw0-v2-laptops.patch
 cifs-mount-of-ipc-breaks-with-iget-patch.patch
 cifs-if-get-root-inode-fails-during-mount-cleanup-tree-connection.patch
 dccp-change-l-r-must-have-at-least-one-byte-in-the-dccpsf_val-field.patch
+syncookies-make-sure-ecn-is-disabled.patch
+random32-seeding-improvement.patch
+ipv6-fix-ip6_xmit-to-send-fragments-if-ipfragok-is-true.patch
diff --git a/queue-2.6.26/syncookies-make-sure-ecn-is-disabled.patch b/queue-2.6.26/syncookies-make-sure-ecn-is-disabled.patch
new file mode 100644 (file)
index 0000000..526aaa2
--- /dev/null
@@ -0,0 +1,44 @@
+From d1ad459db7eafccbc12418aac875826c0a1d2612 Mon Sep 17 00:00:00 2001
+From: Florian Westphal <fw@strlen.de>
+Date: Sat, 26 Jul 2008 02:21:54 -0700
+Subject: syncookies: Make sure ECN is disabled
+Message-Id: <20080805.164947.158498047.davem@davemloft.net>
+
+From: Florian Westphal <fw@strlen.de>
+
+[ Upstream commit 16df845f4566bc252f3e09db12f5c2f22cb44226 ]
+
+ecn_ok is not initialized when a connection is established by cookies.
+The cookie syn-ack never sets ECN, so ecn_ok must be set to 0.
+
+Spotted using ns-3/network simulation cradle simulator and valgrind.
+
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ net/ipv4/syncookies.c |    1 +
+ net/ipv6/syncookies.c |    1 +
+ 2 files changed, 2 insertions(+)
+
+--- a/net/ipv4/syncookies.c
++++ b/net/ipv4/syncookies.c
+@@ -301,6 +301,7 @@ struct sock *cookie_v4_check(struct sock
+       ireq->rmt_port          = th->source;
+       ireq->loc_addr          = ip_hdr(skb)->daddr;
+       ireq->rmt_addr          = ip_hdr(skb)->saddr;
++      ireq->ecn_ok            = 0;
+       ireq->snd_wscale        = tcp_opt.snd_wscale;
+       ireq->rcv_wscale        = tcp_opt.rcv_wscale;
+       ireq->sack_ok           = tcp_opt.sack_ok;
+--- a/net/ipv6/syncookies.c
++++ b/net/ipv6/syncookies.c
+@@ -223,6 +223,7 @@ struct sock *cookie_v6_check(struct sock
+       req->expires = 0UL;
+       req->retrans = 0;
++      ireq->ecn_ok            = 0;
+       ireq->snd_wscale        = tcp_opt.snd_wscale;
+       ireq->rcv_wscale        = tcp_opt.rcv_wscale;
+       ireq->sack_ok           = tcp_opt.sack_ok;