Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
[firefly-linux-kernel-4.4.55.git] / net / ipv6 / ipcomp6.c
index 5cb75bfe45b1b9a622792e7058a6e00e67bc7d71..7af5aee75d982327e7b258f72091780e83a01cc4 100644 (file)
@@ -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);
 }