ACK: Maverick SRU: ipv6: restore correct ECN handling on TCP xmit
Stefan Bader
stefan.bader at canonical.com
Tue Oct 11 10:20:56 UTC 2011
On 11.10.2011 11:06, Tim Gardner wrote:
> From 94140d8effd553ee6afefa42c89e1a9fad53bb0c Mon Sep 17 00:00:00 2001
> From: Steinar H. Gunderson <sgunderson at bigfoot.com>
> Date: Fri, 6 May 2011 23:44:46 +0000
> Subject: [PATCH] ipv6: restore correct ECN handling on TCP xmit
>
> BugLink: http://bugs.launchpad.net/bugs/872179
>
> Since commit e9df2e8fd8fbc9 (Use appropriate sock tclass setting for
> routing lookup) we lost ability to properly add ECN codemarks to ipv6
> TCP frames.
>
> It seems like TCP_ECN_send() calls INET_ECN_xmit(), which only sets the
> ECN bit in the IPv4 ToS field (inet_sk(sk)->tos), but after the patch,
> what's checked is inet6_sk(sk)->tclass, which is a completely different
> field.
>
> Close bug https://bugzilla.kernel.org/show_bug.cgi?id=34322
>
> [Eric Dumazet] : added the INET_ECN_dontxmit() fix and replace macros
> by inline functions for clarity.
>
> Signed-off-by: Steinar H. Gunderson <sgunderson at bigfoot.com>
> Signed-off-by: Eric Dumazet <eric.dumazet at gmail.com>
> Cc: YOSHIFUJI Hideaki <yoshfuji at linux-ipv6.org>
> Cc: Andrew Morton <akpm at linux-foundation.org>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit ca06707022d6ba4744198a8ebbe4994786b0c613)
>
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
> include/net/inet_ecn.h | 16 +++++++++++++---
> 1 files changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
> index 9b5d08f..b64115a 100644
> --- a/include/net/inet_ecn.h
> +++ b/include/net/inet_ecn.h
> @@ -38,9 +38,19 @@ static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner)
> return outer;
> }
>
> -#define INET_ECN_xmit(sk) do { inet_sk(sk)->tos |= INET_ECN_ECT_0; } while (0)
> -#define INET_ECN_dontxmit(sk) \
> - do { inet_sk(sk)->tos &= ~INET_ECN_MASK; } while (0)
> +static inline void INET_ECN_xmit(struct sock *sk)
> +{
> + inet_sk(sk)->tos |= INET_ECN_ECT_0;
> + if (inet6_sk(sk) != NULL)
> + inet6_sk(sk)->tclass |= INET_ECN_ECT_0;
> +}
> +
> +static inline void INET_ECN_dontxmit(struct sock *sk)
> +{
> + inet_sk(sk)->tos &= ~INET_ECN_MASK;
> + if (inet6_sk(sk) != NULL)
> + inet6_sk(sk)->tclass &= ~INET_ECN_MASK;
> +}
>
> #define IP6_ECN_flow_init(label) do { \
> (label) &= ~htonl(INET_ECN_MASK << 20); \
More information about the kernel-team
mailing list