diff -rup linux-2.6.1.orig/net/ipv4/ip_forward.c linux-2.6.1.naga/net/ipv4/ip_forward.c --- linux-2.6.1.orig/net/ipv4/ip_forward.c 2004-01-16 14:28:39.000000000 +0100 +++ linux-2.6.1.naga/net/ipv4/ip_forward.c 2004-01-20 16:11:09.904466001 +0100 @@ -46,12 +46,30 @@ static inline int ip_forward_finish(stru { struct ip_options * opt = &(IPCB(skb)->opt); + if (!xfrm4_route_forward(skb)) + goto drop; + +#ifdef CONFIG_NETFILTER_DEBUG + skb->nf_debug &= ~(1 << NF_IP_POST_ROUTING); +#endif + IP_INC_STATS_BH(IpForwDatagrams); if (unlikely(opt->optlen)) ip_forward_options(skb); return dst_output(skb); + +drop: + kfree_skb(skb); + return NET_RX_DROP; +} + +static inline int ip_forward_postroute(struct sk_buff *skb) +{ + struct rtable *rt = (struct rtable*)skb->dst; + + return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, skb->dev, rt->u.dst.dev, ip_forward_finish); } int ip_forward(struct sk_buff *skb) @@ -109,7 +131,7 @@ int ip_forward(struct sk_buff *skb) skb->priority = rt_tos2priority(iph->tos); return NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, rt->u.dst.dev, - ip_forward_finish); + ip_forward_postroute); sr_failed: /*