[PATCH] nf_nat_snmp: fix checksum calculation (v3)
From: Stephen Hemminger <hidden>
Date: 2010-09-20 16:44:51
Revised version of the original patch in the bug https://bugzilla.kernel.org/show_bug.cgi?id=17622 from clark wang [off-list ref] I took the opportunity to do some cleanup here. * reorder the assignment to make the byte order clear * get rid of unnecessary ref/deref and just pass the bytes * use sizeof() instead of hard coding size Signed-off-by: Stephen Hemminger <redacted> ---
--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c 2010-09-20 09:05:11.752067965 -0700
+++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c 2010-09-20 09:38:48.518661840 -0700@@ -885,24 +885,23 @@ static unsigned char snmp_request_decode * Fast checksum update for possibly oddly-aligned UDP byte, from the * code example in the draft. */ -static void fast_csum(__sum16 *csum, - const unsigned char *optr, - const unsigned char *nptr, - int offset) +static void fast_csum(__sum16 *csum, __u8 from, __u8 to, int offset) { - unsigned char s[4]; + __be16 diff[2]; if (offset & 1) { - s[0] = s[2] = 0; - s[1] = ~*optr; - s[3] = *nptr; + s[0] = ~0; + s[1] = ~from; + s[2] = 0; + s[3] = to; } else { - s[1] = s[3] = 0; - s[0] = ~*optr; - s[2] = *nptr; + s[0] = ~from; + s[1] = ~0; + s[2] = to; + s[3] = 0; } - *csum = csum_fold(csum_partial(s, 4, ~csum_unfold(*csum))); + *csum = csum_fold(csum_partial(s, sizeof(s), ~csum_unfold(*csum))); } /*
@@ -924,11 +923,8 @@ static inline void mangle_address(unsign *addr = map->to; /* Update UDP checksum if being used */ - if (*check) { - fast_csum(check, - &map->from, &map->to, addr - begin); - - } + if (*check) + fast_csum(check, map->from, map->to, addr - begin); if (debug) printk(KERN_DEBUG "bsalg: mapped %pI4 to %pI4\n",