: Release dst_entry in PRE_ROUTING after NAT
PATCH 6/18 : Release dst_entry in PRE_ROUTING after NAT
Release dst_entry in PRE_ROUTING after NAT, fixes
DNAT on loopback.
# This is a BitKeeper generated diff -Nru style patch. #
# ChangeSet
# 2004/12/05 22:44:07+01:00 [email protected]
# [NETFILTER]: Release dst_entry in PRE_ROUTING after NAT
#
# Fixes NAT on loopback.
#
# Signed-off-by: Patrick McHardy <[email protected]>
#
# net/ipv4/netfilter/ip_nat_standalone.c # 2004/12/05 22:44:05+01:00 [email protected] +24 -1 # [NETFILTER]: Release dst_entry in PRE_ROUTING after NAT # # Fixes NAT on loopback. # # Signed-off-by: Patrick McHardy <[email protected]> # diff -Nru a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c --- a/net/ipv4/netfilter/ip_nat_standalone.c 2004-12-20 06:59:30 +01:00 +++ b/net/ipv4/netfilter/ip_nat_standalone.c 2004-12-20 06:59:30 +01:00 @@ -156,6 +156,29 @@ }
static unsigned int
+ip_nat_in(unsigned int hooknum,
+ struct sk_buff **pskb, + const struct net_device *in, + const struct net_device *out, + int (*okfn)(struct sk_buff *))
+{
+ u_int32_t saddr, daddr;
+ unsigned int ret;
+
+ saddr = (*pskb)->nh.iph->saddr;
+ daddr = (*pskb)->nh.iph->daddr;
+
+ ret = ip_nat_fn(hooknum, pskb, in, out, okfn);
+ if (ret != NF_DROP && ret != NF_STOLEN
+ && ((*pskb)->nh.iph->saddr != saddr
+ || (*pskb)->nh.iph->daddr != daddr)) {
+ dst_release((*pskb)->dst);
+ (*pskb)->dst = NULL;
+ }
+ return ret;
+}
+
+static unsigned int
ip_nat_out(unsigned int hooknum,
struct sk_buff **pskb,
const struct net_device *in,
@@ -217,7 +240,7 @@
/* Before packet filtering, change destination */
static struct nf_hook_ops ip_nat_in_ops
-= { { NULL, NULL }, ip_nat_fn, PF_INET, NF_IP_PRE_ROUTING, NF_IP_PRI_NAT_DST }; += { { NULL, NULL }, ip_nat_in, PF_INET, NF_IP_PRE_ROUTING, NF_IP_PRI_NAT_DST };
/* After packet filtering, change source */
static struct nf_hook_ops ip_nat_out_ops
= { { NULL, NULL }, ip_nat_out, PF_INET, NF_IP_POST_ROUTING, NF_IP_PRI_NAT_SRC};