===== include/net/inet_ecn.h 1.7 vs edited ===== --- 1.7/include/net/inet_ecn.h 2004-09-09 08:04:37 +10:00 +++ edited/include/net/inet_ecn.h 2004-09-09 09:51:08 +10:00 @@ -49,19 +49,27 @@ static inline void IP_ECN_set_ce(struct iphdr *iph) { u32 check = iph->check; + u32 ecn = (iph->tos + 1) & INET_ECN_MASK; - switch (iph->tos & INET_ECN_MASK) { - default: - case INET_ECN_NOT_ECT: - case INET_ECN_CE: + /* + * After the last operation we have (in binary): + * INET_ECN_NOT_ECT => 01 + * INET_ECN_ECT_1 => 10 + * INET_ECN_ECT_0 => 11 + * INET_ECN_CE => 00 + */ + if (!(ecn & 2)) return; - case INET_ECN_ECT_1: - check += __constant_htons(0xFFFD); - break; - case INET_ECN_ECT_0: - check += __constant_htons(0xFFFE); - break; - } + + /* + * The following gives us: + * INET_ECN_ECT_1 => check += __constant_htons(0xFFFD) + * INET_ECN_ECT_0 => check += __constant_htons(0xFFFE) + */ + if (__constant_htons(1) != 1) + ecn <<= 8; + check += __constant_htons(0xFFFB) + ecn; + iph->check = check + (check>=0xFFFF); iph->tos |= INET_ECN_CE; }