|
@@ -124,23 +124,28 @@ nf_nat_ipv4_fn(unsigned int hooknum,
|
|
|
ret = nf_nat_rule_find(skb, hooknum, in, out, ct);
|
|
|
if (ret != NF_ACCEPT)
|
|
|
return ret;
|
|
|
- } else
|
|
|
+ } else {
|
|
|
pr_debug("Already setup manip %s for ct %p\n",
|
|
|
maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST",
|
|
|
ct);
|
|
|
+ if (nf_nat_oif_changed(hooknum, ctinfo, nat, out))
|
|
|
+ goto oif_changed;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
/* ESTABLISHED */
|
|
|
NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED ||
|
|
|
ctinfo == IP_CT_ESTABLISHED_REPLY);
|
|
|
- if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) {
|
|
|
- nf_ct_kill_acct(ct, ctinfo, skb);
|
|
|
- return NF_DROP;
|
|
|
- }
|
|
|
+ if (nf_nat_oif_changed(hooknum, ctinfo, nat, out))
|
|
|
+ goto oif_changed;
|
|
|
}
|
|
|
|
|
|
return nf_nat_packet(ct, ctinfo, hooknum, skb);
|
|
|
+
|
|
|
+oif_changed:
|
|
|
+ nf_ct_kill_acct(ct, ctinfo, skb);
|
|
|
+ return NF_DROP;
|
|
|
}
|
|
|
|
|
|
static unsigned int
|