|
@@ -200,20 +200,14 @@ ip_nat_in(unsigned int hooknum,
|
|
const struct net_device *out,
|
|
const struct net_device *out,
|
|
int (*okfn)(struct sk_buff *))
|
|
int (*okfn)(struct sk_buff *))
|
|
{
|
|
{
|
|
- struct ip_conntrack *ct;
|
|
|
|
- enum ip_conntrack_info ctinfo;
|
|
|
|
unsigned int ret;
|
|
unsigned int ret;
|
|
|
|
+ u_int32_t daddr = (*pskb)->nh.iph->daddr;
|
|
|
|
|
|
ret = ip_nat_fn(hooknum, pskb, in, out, okfn);
|
|
ret = ip_nat_fn(hooknum, pskb, in, out, okfn);
|
|
if (ret != NF_DROP && ret != NF_STOLEN
|
|
if (ret != NF_DROP && ret != NF_STOLEN
|
|
- && (ct = ip_conntrack_get(*pskb, &ctinfo)) != NULL) {
|
|
|
|
- enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
|
|
|
|
-
|
|
|
|
- if (ct->tuplehash[dir].tuple.dst.ip !=
|
|
|
|
- ct->tuplehash[!dir].tuple.src.ip) {
|
|
|
|
- dst_release((*pskb)->dst);
|
|
|
|
- (*pskb)->dst = NULL;
|
|
|
|
- }
|
|
|
|
|
|
+ && daddr != (*pskb)->nh.iph->daddr) {
|
|
|
|
+ dst_release((*pskb)->dst);
|
|
|
|
+ (*pskb)->dst = NULL;
|
|
}
|
|
}
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -276,7 +270,7 @@ ip_nat_local_fn(unsigned int hooknum,
|
|
ct->tuplehash[!dir].tuple.src.ip
|
|
ct->tuplehash[!dir].tuple.src.ip
|
|
#ifdef CONFIG_XFRM
|
|
#ifdef CONFIG_XFRM
|
|
|| ct->tuplehash[dir].tuple.dst.u.all !=
|
|
|| ct->tuplehash[dir].tuple.dst.u.all !=
|
|
- ct->tuplehash[dir].tuple.src.u.all
|
|
|
|
|
|
+ ct->tuplehash[!dir].tuple.src.u.all
|
|
#endif
|
|
#endif
|
|
)
|
|
)
|
|
return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP;
|
|
return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP;
|