diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/ip6_input.c | 2 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_input.c | 13 | 
2 files changed, 14 insertions, 1 deletions
| diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index 13d724150f33..29f73592e68e 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c @@ -48,7 +48,7 @@ -static inline int ip6_rcv_finish( struct sk_buff *skb)  +inline int ip6_rcv_finish( struct sk_buff *skb)   {  	if (skb->dst == NULL)  		ip6_route_input(skb); diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c index 1079e47f3933..1ca2da68ef69 100644 --- a/net/ipv6/xfrm6_input.c +++ b/net/ipv6/xfrm6_input.c @@ -11,6 +11,8 @@  #include <linux/module.h>  #include <linux/string.h> +#include <linux/netfilter.h> +#include <linux/netfilter_ipv6.h>  #include <net/dsfield.h>  #include <net/inet_ecn.h>  #include <net/ip.h> @@ -121,6 +123,8 @@ int xfrm6_rcv_spi(struct sk_buff **pskb, u32 spi)  	skb->sp->len += xfrm_nr;  	skb->ip_summed = CHECKSUM_NONE; +	nf_reset(skb); +  	if (decaps) {  		if (!(skb->dev->flags&IFF_LOOPBACK)) {  			dst_release(skb->dst); @@ -129,7 +133,16 @@ int xfrm6_rcv_spi(struct sk_buff **pskb, u32 spi)  		netif_rx(skb);  		return -1;  	} else { +#ifdef CONFIG_NETFILTER +		skb->nh.ipv6h->payload_len = htons(skb->len); +		__skb_push(skb, skb->data - skb->nh.raw); + +		NF_HOOK(PF_INET6, NF_IP6_PRE_ROUTING, skb, skb->dev, NULL, +		        ip6_rcv_finish); +		return -1; +#else  		return 1; +#endif  	}  drop_unlock: | 
