Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6ab0288 authored by Al Viro's avatar Al Viro Committed by David S. Miller
Browse files

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

parent b51655b9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -92,4 +92,5 @@ static inline __wsum csum_unfold(__sum16 n)
	return (__force __wsum)n;
}

#define CSUM_MANGLED_0 ((__force __sum16)0xffff)
#endif
+3 −3
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ udp_fast_csum_update(struct udphdr *uhdr, __be32 oldip, __be32 newip,
				 ip_vs_check_diff(oldport ^ htons(0xFFFF),
						  newport, uhdr->check));
	if (!uhdr->check)
		uhdr->check = -1;
		uhdr->check = CSUM_MANGLED_0;
}

static int
@@ -173,7 +173,7 @@ udp_snat_handler(struct sk_buff **pskb,
						cp->protocol,
						(*pskb)->csum);
		if (udph->check == 0)
			udph->check = -1;
			udph->check = CSUM_MANGLED_0;
		IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%zd)\n",
			  pp->name, udph->check,
			  (char*)&(udph->check) - (char*)udph);
@@ -228,7 +228,7 @@ udp_dnat_handler(struct sk_buff **pskb,
						cp->protocol,
						(*pskb)->csum);
		if (udph->check == 0)
			udph->check = -1;
			udph->check = CSUM_MANGLED_0;
		(*pskb)->ip_summed = CHECKSUM_UNNECESSARY;
	}
	return 1;
+1 −1
Original line number Diff line number Diff line
@@ -264,7 +264,7 @@ ip_nat_mangle_udp_packet(struct sk_buff **pskb,
		                                csum_partial((char *)udph,
		                                             datalen, 0));
		if (!udph->check)
			udph->check = -1;
			udph->check = CSUM_MANGLED_0;
	} else
		udph->check = nf_proto_csum_update(*pskb,
						   htons(oldlen) ^ htons(0xFFFF),
+1 −1
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ udp_manip_pkt(struct sk_buff **pskb,
						  *portptr ^ htons(0xFFFF), newport,
						  hdr->check, 0);
		if (!hdr->check)
			hdr->check = -1;
			hdr->check = CSUM_MANGLED_0;
	}
	*portptr = newport;
	return 1;
+2 −2
Original line number Diff line number Diff line
@@ -441,7 +441,7 @@ static void udp4_hwcsum_outgoing(struct sock *sk, struct sk_buff *skb,

		uh->check = csum_tcpudp_magic(src, dst, len, IPPROTO_UDP, csum);
		if (uh->check == 0)
			uh->check = -1;
			uh->check = CSUM_MANGLED_0;
	}
}

@@ -490,7 +490,7 @@ int udp_push_pending_frames(struct sock *sk, struct udp_sock *up)
	uh->check = csum_tcpudp_magic(fl->fl4_src, fl->fl4_dst, up->len,
				      sk->sk_protocol, csum             );
	if (uh->check == 0)
		uh->check = -1;
		uh->check = CSUM_MANGLED_0;

send:
	err = ip_push_pending_frames(sk);
Loading