Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[NET]: Make mangling a checksum (0 -> 0xffff on the wire) explicit.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Al Viro and committed by
David S. Miller
f6ab0288 b51655b9

+11 -10
+1
include/net/checksum.h
··· 92 92 return (__force __wsum)n; 93 93 } 94 94 95 + #define CSUM_MANGLED_0 ((__force __sum16)0xffff) 95 96 #endif
+3 -3
net/ipv4/ipvs/ip_vs_proto_udp.c
··· 125 125 ip_vs_check_diff(oldport ^ htons(0xFFFF), 126 126 newport, uhdr->check)); 127 127 if (!uhdr->check) 128 - uhdr->check = -1; 128 + uhdr->check = CSUM_MANGLED_0; 129 129 } 130 130 131 131 static int ··· 173 173 cp->protocol, 174 174 (*pskb)->csum); 175 175 if (udph->check == 0) 176 - udph->check = -1; 176 + udph->check = CSUM_MANGLED_0; 177 177 IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%zd)\n", 178 178 pp->name, udph->check, 179 179 (char*)&(udph->check) - (char*)udph); ··· 228 228 cp->protocol, 229 229 (*pskb)->csum); 230 230 if (udph->check == 0) 231 - udph->check = -1; 231 + udph->check = CSUM_MANGLED_0; 232 232 (*pskb)->ip_summed = CHECKSUM_UNNECESSARY; 233 233 } 234 234 return 1;
+1 -1
net/ipv4/netfilter/ip_nat_helper.c
··· 264 264 csum_partial((char *)udph, 265 265 datalen, 0)); 266 266 if (!udph->check) 267 - udph->check = -1; 267 + udph->check = CSUM_MANGLED_0; 268 268 } else 269 269 udph->check = nf_proto_csum_update(*pskb, 270 270 htons(oldlen) ^ htons(0xFFFF),
+1 -1
net/ipv4/netfilter/ip_nat_proto_udp.c
··· 121 121 *portptr ^ htons(0xFFFF), newport, 122 122 hdr->check, 0); 123 123 if (!hdr->check) 124 - hdr->check = -1; 124 + hdr->check = CSUM_MANGLED_0; 125 125 } 126 126 *portptr = newport; 127 127 return 1;
+2 -2
net/ipv4/udp.c
··· 441 441 442 442 uh->check = csum_tcpudp_magic(src, dst, len, IPPROTO_UDP, csum); 443 443 if (uh->check == 0) 444 - uh->check = -1; 444 + uh->check = CSUM_MANGLED_0; 445 445 } 446 446 } 447 447 ··· 490 490 uh->check = csum_tcpudp_magic(fl->fl4_src, fl->fl4_dst, up->len, 491 491 sk->sk_protocol, csum ); 492 492 if (uh->check == 0) 493 - uh->check = -1; 493 + uh->check = CSUM_MANGLED_0; 494 494 495 495 send: 496 496 err = ip_push_pending_frames(sk);
+2 -2
net/ipv6/raw.c
··· 536 536 &fl->fl6_dst, 537 537 total_len, fl->proto, tmp_csum); 538 538 539 - if (tmp_csum == 0 && fl->proto == IPPROTO_UDP) 540 - tmp_csum = -1; 539 + if (csum == 0 && fl->proto == IPPROTO_UDP) 540 + csum = CSUM_MANGLED_0; 541 541 542 542 if (skb_store_bits(skb, offset, &csum, 2)) 543 543 BUG();
+1 -1
net/ipv6/udp.c
··· 536 536 uh->check = csum_ipv6_magic(&fl->fl6_src, &fl->fl6_dst, 537 537 up->len, fl->proto, csum ); 538 538 if (uh->check == 0) 539 - uh->check = -1; 539 + uh->check = CSUM_MANGLED_0; 540 540 541 541 err = ip6_push_pending_frames(sk); 542 542 out: