|
@@ -176,6 +176,7 @@ nf_nat_ipv4_out(unsigned int hooknum,
|
|
|
#ifdef CONFIG_XFRM
|
|
|
const struct nf_conn *ct;
|
|
|
enum ip_conntrack_info ctinfo;
|
|
|
+ int err;
|
|
|
#endif
|
|
|
unsigned int ret;
|
|
|
|
|
@@ -195,9 +196,11 @@ nf_nat_ipv4_out(unsigned int hooknum,
|
|
|
ct->tuplehash[!dir].tuple.dst.u3.ip) ||
|
|
|
(ct->tuplehash[dir].tuple.dst.protonum != IPPROTO_ICMP &&
|
|
|
ct->tuplehash[dir].tuple.src.u.all !=
|
|
|
- ct->tuplehash[!dir].tuple.dst.u.all))
|
|
|
- if (nf_xfrm_me_harder(skb, AF_INET) < 0)
|
|
|
- ret = NF_DROP;
|
|
|
+ ct->tuplehash[!dir].tuple.dst.u.all)) {
|
|
|
+ err = nf_xfrm_me_harder(skb, AF_INET);
|
|
|
+ if (err < 0)
|
|
|
+ ret = NF_DROP_ERR(err);
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|
|
|
return ret;
|
|
@@ -213,6 +216,7 @@ nf_nat_ipv4_local_fn(unsigned int hooknum,
|
|
|
const struct nf_conn *ct;
|
|
|
enum ip_conntrack_info ctinfo;
|
|
|
unsigned int ret;
|
|
|
+ int err;
|
|
|
|
|
|
/* root is playing with raw sockets. */
|
|
|
if (skb->len < sizeof(struct iphdr) ||
|
|
@@ -226,16 +230,19 @@ nf_nat_ipv4_local_fn(unsigned int hooknum,
|
|
|
|
|
|
if (ct->tuplehash[dir].tuple.dst.u3.ip !=
|
|
|
ct->tuplehash[!dir].tuple.src.u3.ip) {
|
|
|
- if (ip_route_me_harder(skb, RTN_UNSPEC))
|
|
|
- ret = NF_DROP;
|
|
|
+ err = ip_route_me_harder(skb, RTN_UNSPEC);
|
|
|
+ if (err < 0)
|
|
|
+ ret = NF_DROP_ERR(err);
|
|
|
}
|
|
|
#ifdef CONFIG_XFRM
|
|
|
else if (!(IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED) &&
|
|
|
ct->tuplehash[dir].tuple.dst.protonum != IPPROTO_ICMP &&
|
|
|
ct->tuplehash[dir].tuple.dst.u.all !=
|
|
|
- ct->tuplehash[!dir].tuple.src.u.all)
|
|
|
- if (nf_xfrm_me_harder(skb, AF_INET) < 0)
|
|
|
- ret = NF_DROP;
|
|
|
+ ct->tuplehash[!dir].tuple.src.u.all) {
|
|
|
+ err = nf_xfrm_me_harder(skb, AF_INET);
|
|
|
+ if (err < 0)
|
|
|
+ ret = NF_DROP_ERR(err);
|
|
|
+ }
|
|
|
#endif
|
|
|
}
|
|
|
return ret;
|