diff options
Diffstat (limited to 'net/ipv6/ipcomp6.c')
| -rw-r--r-- | net/ipv6/ipcomp6.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 5cb75bfe45b..7af5aee75d9 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c @@ -46,6 +46,7 @@  #include <linux/list.h>  #include <linux/vmalloc.h>  #include <linux/rtnetlink.h> +#include <net/ip6_route.h>  #include <net/icmp.h>  #include <net/ipv6.h>  #include <net/protocol.h> @@ -63,7 +64,9 @@ static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  		(struct ip_comp_hdr *)(skb->data + offset);  	struct xfrm_state *x; -	if (type != ICMPV6_DEST_UNREACH && type != ICMPV6_PKT_TOOBIG) +	if (type != ICMPV6_DEST_UNREACH && +	    type != ICMPV6_PKT_TOOBIG && +	    type != NDISC_REDIRECT)  		return;  	spi = htonl(ntohs(ipcomph->cpi)); @@ -72,8 +75,10 @@ static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  	if (!x)  		return; -	pr_debug("pmtu discovery on SA IPCOMP/%08x/%pI6\n", -		 spi, &iph->daddr); +	if (type == NDISC_REDIRECT) +		ip6_redirect(skb, net, 0, 0); +	else +		ip6_update_pmtu(skb, net, info, 0, 0);  	xfrm_state_put(x);  }  |