diff options
-rw-r--r-- | net/ipv6/netfilter/ip6t_NPT.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/net/ipv6/netfilter/ip6t_NPT.c b/net/ipv6/netfilter/ip6t_NPT.c index 7302b0b7b642..68788c84aee7 100644 --- a/net/ipv6/netfilter/ip6t_NPT.c +++ b/net/ipv6/netfilter/ip6t_NPT.c | |||
@@ -30,7 +30,7 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) | |||
30 | (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]); | 30 | (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]); |
31 | } | 31 | } |
32 | 32 | ||
33 | npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum); | 33 | npt->adjustment = ~csum_fold(csum_sub(src_sum, dst_sum)); |
34 | return 0; | 34 | return 0; |
35 | } | 35 | } |
36 | 36 | ||
@@ -66,8 +66,8 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt, | |||
66 | return false; | 66 | return false; |
67 | } | 67 | } |
68 | 68 | ||
69 | sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx], | 69 | sum = ~csum_fold(csum_add(csum_unfold((__force __sum16)addr->s6_addr16[idx]), |
70 | npt->adjustment); | 70 | csum_unfold(npt->adjustment))); |
71 | if (sum == CSUM_MANGLED_0) | 71 | if (sum == CSUM_MANGLED_0) |
72 | sum = 0; | 72 | sum = 0; |
73 | *(__force __sum16 *)&addr->s6_addr16[idx] = sum; | 73 | *(__force __sum16 *)&addr->s6_addr16[idx] = sum; |