|
@@ -81,10 +81,22 @@ static inline struct sock *icmpv6_sk(struct net *net)
|
|
|
return net->ipv6.icmp_sk[smp_processor_id()];
|
|
|
}
|
|
|
|
|
|
+static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|
|
+ u8 type, u8 code, int offset, __be32 info)
|
|
|
+{
|
|
|
+ struct net *net = dev_net(skb->dev);
|
|
|
+
|
|
|
+ if (type == ICMPV6_PKT_TOOBIG)
|
|
|
+ ip6_update_pmtu(skb, net, info, 0, 0);
|
|
|
+ else if (type == NDISC_REDIRECT)
|
|
|
+ ip6_redirect(skb, net, 0, 0);
|
|
|
+}
|
|
|
+
|
|
|
static int icmpv6_rcv(struct sk_buff *skb);
|
|
|
|
|
|
static const struct inet6_protocol icmpv6_protocol = {
|
|
|
.handler = icmpv6_rcv,
|
|
|
+ .err_handler = icmpv6_err,
|
|
|
.flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
|
|
|
};
|
|
|
|