]> git.hungrycats.org Git - linux/commitdiff
[INET]: Fix ECN encapsulation.
authorHideaki Yoshifuji <yoshfuji@linux-ipv6.o0rg>
Tue, 5 Oct 2004 15:00:08 +0000 (08:00 -0700)
committerDavid S. Miller <davem@nuts.davemloft.net>
Tue, 5 Oct 2004 15:00:08 +0000 (08:00 -0700)
We broke ECN encapsulation in tunnels recently.
Without this patch, even though encapusulated (inner) packet is
'not-ECN', encapusulating (outer) packet is sent with 'ECT(0)' set.
This is wrong and should be 'not-ECN.'
This patch fixes up.

From RFC3168:
   The full-functionality option for ECN encapsulation is to copy the
   ECN codepoint of the inside header to the outside header on
   encapsulation if the inside header is not-ECT or ECT, and to set the
   ECN codepoint of the outside header to ECT(0) if the ECN codepoint of
   the inside header is CE.

Signed-off-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_ecn.h

index 6e2ee16546ecc8ccd749d7ee3e63ca355476272f..f87845e2e96589a30791dac5af7603779f2c355a 100644 (file)
@@ -30,7 +30,8 @@ static inline int INET_ECN_is_capable(__u8 dsfield)
 static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner)
 {
        outer &= ~INET_ECN_MASK;
-       outer |= (inner & INET_ECN_MASK) ?: INET_ECN_ECT_0;
+       outer |= !INET_ECN_is_ce(inner) ? (inner & INET_ECN_MASK) :
+                                         INET_ECN_ECT_0;
        return outer;
 }