|
@@ -14,42 +14,23 @@
|
|
|
#include <linux/netfilter_ipv6/ip6t_NPT.h>
|
|
|
#include <linux/netfilter/x_tables.h>
|
|
|
|
|
|
-static __sum16 csum16_complement(__sum16 a)
|
|
|
-{
|
|
|
- return (__force __sum16)(0xffff - (__force u16)a);
|
|
|
-}
|
|
|
-
|
|
|
-static __sum16 csum16_add(__sum16 a, __sum16 b)
|
|
|
-{
|
|
|
- u16 sum;
|
|
|
-
|
|
|
- sum = (__force u16)a + (__force u16)b;
|
|
|
- sum += (__force u16)a < (__force u16)b;
|
|
|
- return (__force __sum16)sum;
|
|
|
-}
|
|
|
-
|
|
|
-static __sum16 csum16_sub(__sum16 a, __sum16 b)
|
|
|
-{
|
|
|
- return csum16_add(a, csum16_complement(b));
|
|
|
-}
|
|
|
-
|
|
|
static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
|
|
|
{
|
|
|
struct ip6t_npt_tginfo *npt = par->targinfo;
|
|
|
- __sum16 src_sum = 0, dst_sum = 0;
|
|
|
+ __wsum src_sum = 0, dst_sum = 0;
|
|
|
unsigned int i;
|
|
|
|
|
|
if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64)
|
|
|
return -EINVAL;
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) {
|
|
|
- src_sum = csum16_add(src_sum,
|
|
|
- (__force __sum16)npt->src_pfx.in6.s6_addr16[i]);
|
|
|
- dst_sum = csum16_add(dst_sum,
|
|
|
- (__force __sum16)npt->dst_pfx.in6.s6_addr16[i]);
|
|
|
+ src_sum = csum_add(src_sum,
|
|
|
+ (__force __wsum)npt->src_pfx.in6.s6_addr16[i]);
|
|
|
+ dst_sum = csum_add(dst_sum,
|
|
|
+ (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]);
|
|
|
}
|
|
|
|
|
|
- npt->adjustment = csum16_sub(src_sum, dst_sum);
|
|
|
+ npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -85,7 +66,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- sum = csum16_add((__force __sum16)addr->s6_addr16[idx],
|
|
|
+ sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx],
|
|
|
npt->adjustment);
|
|
|
if (sum == CSUM_MANGLED_0)
|
|
|
sum = 0;
|