Skip to contentSkip to conversation

: Release dst_entry in PRE_ROUTING after NAT

PATCH In review Patrick McHardy 1 participant 1 message Nov 28, 2004 netfilter

lore
Share & tools
lore
#0 lore raw

PATCH 1/5 : Release dst_entry in PRE_ROUTING after NAT

Release dst_entry in PRE_ROUTING after NAT. The loopback driver doesn't release the dst_entry itself and ip_rcv_finish only routes the packet if it doesn't already have a dst_entry. Fixes DNAT on loopback.

# This is a BitKeeper generated diff -Nru style patch. #
# ChangeSet
# 2004/11/27 12:14:54+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/11/27 12:14:47+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-11-28 21:36:33 +01:00
+++ b/net/ipv4/netfilter/ip_nat_standalone.c	2004-11-28 21:36:33 +01:00
@@ -180,6 +180,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,
@@ -243,7 +266,7 @@

/* Before packet filtering, change destination */ static struct nf_hook_ops ip_nat_in_ops = {
- .hook = ip_nat_fn,
+ .hook = ip_nat_in,
.owner = THIS_MODULE,
.pf = PF_INET,
.hooknum = NF_IP_PRE_ROUTING,