1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Internet Control Message Protocol (ICMPv6)
4 * Linux INET6 implementation
9 * Based on net/ipv4/icmp.c
17 * Andi Kleen : exception handling
18 * Andi Kleen add rate limits. never reply to a icmp.
19 * add more length checks and other fixes.
20 * yoshfuji : ensure to sent parameter problem for
22 * YOSHIFUJI Hideaki @USAGI: added sysctl for icmp rate limit.
24 * YOSHIFUJI Hideaki @USAGI: Per-interface statistics support
25 * Kazunori MIYAZAWA @USAGI: change output process to use ip6_append_data
28 #define pr_fmt(fmt) "IPv6: " fmt
30 #include <linux/module.h>
31 #include <linux/errno.h>
32 #include <linux/types.h>
33 #include <linux/socket.h>
35 #include <linux/kernel.h>
36 #include <linux/sockios.h>
37 #include <linux/net.h>
38 #include <linux/skbuff.h>
39 #include <linux/init.h>
40 #include <linux/netfilter.h>
41 #include <linux/slab.h>
44 #include <linux/sysctl.h>
47 #include <linux/inet.h>
48 #include <linux/netdevice.h>
49 #include <linux/icmpv6.h>
55 #include <net/ip6_checksum.h>
57 #include <net/protocol.h>
59 #include <net/rawv6.h>
61 #include <net/transp_v6.h>
62 #include <net/ip6_route.h>
63 #include <net/addrconf.h>
66 #include <net/inet_common.h>
67 #include <net/dsfield.h>
68 #include <net/l3mdev.h>
70 #include <linux/uaccess.h>
73 * The ICMP socket(s). This is the most convenient way to flow control
74 * our ICMP output as well as maintain a clean interface throughout
75 * all layers. All Socketless IP sends will soon be gone.
77 * On SMP we have one ICMP socket per-cpu.
79 static struct sock *icmpv6_sk(struct net *net)
81 return this_cpu_read(*net->ipv6.icmp_sk);
84 static int icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
85 u8 type, u8 code, int offset, __be32 info)
87 /* icmpv6_notify checks 8 bytes can be pulled, icmp6hdr is 8 bytes */
88 struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset);
89 struct net *net = dev_net(skb->dev);
91 if (type == ICMPV6_PKT_TOOBIG)
92 ip6_update_pmtu(skb, net, info, skb->dev->ifindex, 0, sock_net_uid(net, NULL));
93 else if (type == NDISC_REDIRECT)
94 ip6_redirect(skb, net, skb->dev->ifindex, 0,
95 sock_net_uid(net, NULL));
97 if (!(type & ICMPV6_INFOMSG_MASK))
98 if (icmp6->icmp6_type == ICMPV6_ECHO_REQUEST)
99 ping_err(skb, offset, ntohl(info));
104 static int icmpv6_rcv(struct sk_buff *skb);
106 static const struct inet6_protocol icmpv6_protocol = {
107 .handler = icmpv6_rcv,
108 .err_handler = icmpv6_err,
109 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
112 /* Called with BH disabled */
113 static __inline__ struct sock *icmpv6_xmit_lock(struct net *net)
118 if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
119 /* This can happen if the output path (f.e. SIT or
120 * ip6ip6 tunnel) signals dst_link_failure() for an
121 * outgoing ICMP6 packet.
128 static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
130 spin_unlock(&sk->sk_lock.slock);
134 * Figure out, may we reply to this packet with icmp error.
136 * We do not reply, if:
137 * - it was icmp error message.
138 * - it is truncated, so that it is known, that protocol is ICMPV6
139 * (i.e. in the middle of some exthdr)
144 static bool is_ineligible(const struct sk_buff *skb)
146 int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data;
147 int len = skb->len - ptr;
148 __u8 nexthdr = ipv6_hdr(skb)->nexthdr;
154 ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off);
157 if (nexthdr == IPPROTO_ICMPV6) {
159 tp = skb_header_pointer(skb,
160 ptr+offsetof(struct icmp6hdr, icmp6_type),
161 sizeof(_type), &_type);
163 /* Based on RFC 8200, Section 4.5 Fragment Header, return
164 * false if this is a fragment packet with no icmp header info.
166 if (!tp && frag_off != 0)
168 else if (!tp || !(*tp & ICMPV6_INFOMSG_MASK))
174 static bool icmpv6_mask_allow(struct net *net, int type)
176 if (type > ICMPV6_MSG_MAX)
179 /* Limit if icmp type is set in ratemask. */
180 if (!test_bit(type, net->ipv6.sysctl.icmpv6_ratemask))
186 static bool icmpv6_global_allow(struct net *net, int type)
188 if (icmpv6_mask_allow(net, type))
191 if (icmp_global_allow())
198 * Check the ICMP output rate limit
200 static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
203 struct net *net = sock_net(sk);
204 struct dst_entry *dst;
207 if (icmpv6_mask_allow(net, type))
211 * Look up the output route.
212 * XXX: perhaps the expire for routing entries cloned by
213 * this lookup should be more aggressive (not longer than timeout).
215 dst = ip6_route_output(net, sk, fl6);
217 IP6_INC_STATS(net, ip6_dst_idev(dst),
218 IPSTATS_MIB_OUTNOROUTES);
219 } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) {
222 struct rt6_info *rt = (struct rt6_info *)dst;
223 int tmo = net->ipv6.sysctl.icmpv6_time;
224 struct inet_peer *peer;
226 /* Give more bandwidth to wider prefixes. */
227 if (rt->rt6i_dst.plen < 128)
228 tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
230 peer = inet_getpeer_v6(net->ipv6.peers, &fl6->daddr, 1);
231 res = inet_peer_xrlim_allow(peer, tmo);
239 static bool icmpv6_rt_has_prefsrc(struct sock *sk, u8 type,
242 struct net *net = sock_net(sk);
243 struct dst_entry *dst;
246 dst = ip6_route_output(net, sk, fl6);
248 struct rt6_info *rt = (struct rt6_info *)dst;
249 struct in6_addr prefsrc;
251 rt6_get_prefsrc(rt, &prefsrc);
252 res = !ipv6_addr_any(&prefsrc);
259 * an inline helper for the "simple" if statement below
260 * checks if parameter problem report is caused by an
261 * unrecognized IPv6 option that has the Option Type
262 * highest-order two bits set to 10
265 static bool opt_unrec(struct sk_buff *skb, __u32 offset)
269 offset += skb_network_offset(skb);
270 op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
273 return (*op & 0xC0) == 0x80;
276 void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
277 struct icmp6hdr *thdr, int len)
280 struct icmp6hdr *icmp6h;
282 skb = skb_peek(&sk->sk_write_queue);
286 icmp6h = icmp6_hdr(skb);
287 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
288 icmp6h->icmp6_cksum = 0;
290 if (skb_queue_len(&sk->sk_write_queue) == 1) {
291 skb->csum = csum_partial(icmp6h,
292 sizeof(struct icmp6hdr), skb->csum);
293 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
295 len, fl6->flowi6_proto,
300 skb_queue_walk(&sk->sk_write_queue, skb) {
301 tmp_csum = csum_add(tmp_csum, skb->csum);
304 tmp_csum = csum_partial(icmp6h,
305 sizeof(struct icmp6hdr), tmp_csum);
306 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
308 len, fl6->flowi6_proto,
311 ip6_push_pending_frames(sk);
320 static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
322 struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
323 struct sk_buff *org_skb = msg->skb;
326 csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
328 skb->csum = csum_block_add(skb->csum, csum, odd);
329 if (!(msg->type & ICMPV6_INFOMSG_MASK))
330 nf_ct_attach(skb, org_skb);
334 #if IS_ENABLED(CONFIG_IPV6_MIP6)
335 static void mip6_addr_swap(struct sk_buff *skb, const struct inet6_skb_parm *opt)
337 struct ipv6hdr *iph = ipv6_hdr(skb);
338 struct ipv6_destopt_hao *hao;
343 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
344 if (likely(off >= 0)) {
345 hao = (struct ipv6_destopt_hao *)
346 (skb_network_header(skb) + off);
348 iph->saddr = hao->addr;
354 static inline void mip6_addr_swap(struct sk_buff *skb, const struct inet6_skb_parm *opt) {}
357 static struct dst_entry *icmpv6_route_lookup(struct net *net,
362 struct dst_entry *dst, *dst2;
366 err = ip6_dst_lookup(net, sk, &dst, fl6);
371 * We won't send icmp if the destination is known
374 if (ipv6_anycast_destination(dst, &fl6->daddr)) {
375 net_dbg_ratelimited("icmp6_send: acast source\n");
377 return ERR_PTR(-EINVAL);
380 /* No need to clone since we're just using its address. */
383 dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
388 if (PTR_ERR(dst) == -EPERM)
394 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
396 goto relookup_failed;
398 err = ip6_dst_lookup(net, sk, &dst2, &fl2);
400 goto relookup_failed;
402 dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
412 goto relookup_failed;
421 static struct net_device *icmp6_dev(const struct sk_buff *skb)
423 struct net_device *dev = skb->dev;
425 /* for local traffic to local address, skb dev is the loopback
426 * device. Check if there is a dst attached to the skb and if so
427 * get the real device index. Same is needed for replies to a link
428 * local address on a device enslaved to an L3 master device
430 if (unlikely(dev->ifindex == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
431 const struct rt6_info *rt6 = skb_rt6_info(skb);
434 dev = rt6->rt6i_idev->dev;
440 static int icmp6_iif(const struct sk_buff *skb)
442 return icmp6_dev(skb)->ifindex;
446 * Send an ICMP message in response to a packet in error
448 void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
449 const struct in6_addr *force_saddr,
450 const struct inet6_skb_parm *parm)
452 struct inet6_dev *idev = NULL;
453 struct ipv6hdr *hdr = ipv6_hdr(skb);
456 struct ipv6_pinfo *np;
457 const struct in6_addr *saddr = NULL;
458 struct dst_entry *dst;
459 struct icmp6hdr tmp_hdr;
461 struct icmpv6_msg msg;
462 struct ipcm6_cookie ipc6;
468 if ((u8 *)hdr < skb->head ||
469 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
474 net = dev_net(skb->dev);
475 mark = IP6_REPLY_MARK(net, skb->mark);
477 * Make sure we respect the rules
478 * i.e. RFC 1885 2.4(e)
479 * Rule (e.1) is enforced by not using icmp6_send
480 * in any code that processes icmp errors.
482 addr_type = ipv6_addr_type(&hdr->daddr);
484 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
485 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
492 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
493 if (type != ICMPV6_PKT_TOOBIG &&
494 !(type == ICMPV6_PARAMPROB &&
495 code == ICMPV6_UNK_OPTION &&
496 (opt_unrec(skb, info))))
502 addr_type = ipv6_addr_type(&hdr->saddr);
508 if (__ipv6_addr_needs_scope_id(addr_type)) {
509 iif = icmp6_iif(skb);
512 * The source device is used for looking up which routing table
513 * to use for sending an ICMP error.
515 iif = l3mdev_master_ifindex(skb->dev);
519 * Must not send error if the source does not uniquely
520 * identify a single node (RFC2463 Section 2.4).
521 * We check unspecified / multicast addresses here,
522 * and anycast addresses will be checked later.
524 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
525 net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
526 &hdr->saddr, &hdr->daddr);
531 * Never answer to a ICMP packet.
533 if (is_ineligible(skb)) {
534 net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
535 &hdr->saddr, &hdr->daddr);
539 /* Needed by both icmp_global_allow and icmpv6_xmit_lock */
542 /* Check global sysctl_icmp_msgs_per_sec ratelimit */
543 if (!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, type))
546 mip6_addr_swap(skb, parm);
548 sk = icmpv6_xmit_lock(net);
552 memset(&fl6, 0, sizeof(fl6));
553 fl6.flowi6_proto = IPPROTO_ICMPV6;
554 fl6.daddr = hdr->saddr;
559 } else if (!icmpv6_rt_has_prefsrc(sk, type, &fl6)) {
560 /* select a more meaningful saddr from input if */
561 struct net_device *in_netdev;
563 in_netdev = dev_get_by_index(net, parm->iif);
565 ipv6_dev_get_saddr(net, in_netdev, &fl6.daddr,
566 inet6_sk(sk)->srcprefs,
571 fl6.flowi6_mark = mark;
572 fl6.flowi6_oif = iif;
573 fl6.fl6_icmp_type = type;
574 fl6.fl6_icmp_code = code;
575 fl6.flowi6_uid = sock_net_uid(net, NULL);
576 fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL);
577 security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6));
581 if (!icmpv6_xrlim_allow(sk, type, &fl6))
584 tmp_hdr.icmp6_type = type;
585 tmp_hdr.icmp6_code = code;
586 tmp_hdr.icmp6_cksum = 0;
587 tmp_hdr.icmp6_pointer = htonl(info);
589 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
590 fl6.flowi6_oif = np->mcast_oif;
591 else if (!fl6.flowi6_oif)
592 fl6.flowi6_oif = np->ucast_oif;
594 ipcm6_init_sk(&ipc6, np);
595 ipc6.sockc.mark = mark;
596 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
598 dst = icmpv6_route_lookup(net, skb, sk, &fl6);
602 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
605 msg.offset = skb_network_offset(skb);
608 len = skb->len - msg.offset;
609 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
611 net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
612 &hdr->saddr, &hdr->daddr);
613 goto out_dst_release;
617 idev = __in6_dev_get(skb->dev);
619 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
620 len + sizeof(struct icmp6hdr),
621 sizeof(struct icmp6hdr),
622 &ipc6, &fl6, (struct rt6_info *)dst,
624 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
625 ip6_flush_pending_frames(sk);
627 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
628 len + sizeof(struct icmp6hdr));
634 icmpv6_xmit_unlock(sk);
638 EXPORT_SYMBOL(icmp6_send);
640 /* Slightly more convenient version of icmp6_send.
642 void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
644 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL, IP6CB(skb));
648 /* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
649 * if sufficient data bytes are available
650 * @nhs is the size of the tunnel header(s) :
651 * Either an IPv4 header for SIT encap
652 * an IPv4 header + GRE header for GRE encap
654 int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
655 unsigned int data_len)
657 struct in6_addr temp_saddr;
659 struct sk_buff *skb2;
662 if (!pskb_may_pull(skb, nhs + sizeof(struct ipv6hdr) + 8))
665 /* RFC 4884 (partial) support for ICMP extensions */
666 if (data_len < 128 || (data_len & 7) || skb->len < data_len)
669 skb2 = data_len ? skb_copy(skb, GFP_ATOMIC) : skb_clone(skb, GFP_ATOMIC);
676 skb_reset_network_header(skb2);
678 rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0,
681 if (rt && rt->dst.dev)
682 skb2->dev = rt->dst.dev;
684 ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, &temp_saddr);
687 /* RFC 4884 (partial) support :
688 * insert 0 padding at the end, before the extensions
690 __skb_push(skb2, nhs);
691 skb_reset_network_header(skb2);
692 memmove(skb2->data, skb2->data + nhs, data_len - nhs);
693 memset(skb2->data + data_len - nhs, 0, nhs);
694 /* RFC 4884 4.5 : Length is measured in 64-bit words,
695 * and stored in reserved[0]
697 info = (data_len/8) << 24;
699 if (type == ICMP_TIME_EXCEEDED)
700 icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
701 info, &temp_saddr, IP6CB(skb2));
703 icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
704 info, &temp_saddr, IP6CB(skb2));
712 EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
714 static void icmpv6_echo_reply(struct sk_buff *skb)
716 struct net *net = dev_net(skb->dev);
718 struct inet6_dev *idev;
719 struct ipv6_pinfo *np;
720 const struct in6_addr *saddr = NULL;
721 struct icmp6hdr *icmph = icmp6_hdr(skb);
722 struct icmp6hdr tmp_hdr;
724 struct icmpv6_msg msg;
725 struct dst_entry *dst;
726 struct ipcm6_cookie ipc6;
727 u32 mark = IP6_REPLY_MARK(net, skb->mark);
731 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) &&
732 net->ipv6.sysctl.icmpv6_echo_ignore_multicast)
735 saddr = &ipv6_hdr(skb)->daddr;
737 acast = ipv6_anycast_destination(skb_dst(skb), saddr);
738 if (acast && net->ipv6.sysctl.icmpv6_echo_ignore_anycast)
741 if (!ipv6_unicast_destination(skb) &&
742 !(net->ipv6.sysctl.anycast_src_echo_reply && acast))
745 if (icmph->icmp6_type == ICMPV6_EXT_ECHO_REQUEST)
746 type = ICMPV6_EXT_ECHO_REPLY;
748 type = ICMPV6_ECHO_REPLY;
750 memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
751 tmp_hdr.icmp6_type = type;
753 memset(&fl6, 0, sizeof(fl6));
754 if (net->ipv6.sysctl.flowlabel_reflect & FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES)
755 fl6.flowlabel = ip6_flowlabel(ipv6_hdr(skb));
757 fl6.flowi6_proto = IPPROTO_ICMPV6;
758 fl6.daddr = ipv6_hdr(skb)->saddr;
761 fl6.flowi6_oif = icmp6_iif(skb);
762 fl6.fl6_icmp_type = type;
763 fl6.flowi6_mark = mark;
764 fl6.flowi6_uid = sock_net_uid(net, NULL);
765 security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6));
768 sk = icmpv6_xmit_lock(net);
773 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
774 fl6.flowi6_oif = np->mcast_oif;
775 else if (!fl6.flowi6_oif)
776 fl6.flowi6_oif = np->ucast_oif;
778 if (ip6_dst_lookup(net, sk, &dst, &fl6))
780 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
784 /* Check the ratelimit */
785 if ((!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, ICMPV6_ECHO_REPLY)) ||
786 !icmpv6_xrlim_allow(sk, ICMPV6_ECHO_REPLY, &fl6))
787 goto out_dst_release;
789 idev = __in6_dev_get(skb->dev);
795 ipcm6_init_sk(&ipc6, np);
796 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
797 ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
798 ipc6.sockc.mark = mark;
800 if (icmph->icmp6_type == ICMPV6_EXT_ECHO_REQUEST)
801 if (!icmp_build_probe(skb, (struct icmphdr *)&tmp_hdr))
802 goto out_dst_release;
804 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
805 skb->len + sizeof(struct icmp6hdr),
806 sizeof(struct icmp6hdr), &ipc6, &fl6,
807 (struct rt6_info *)dst, MSG_DONTWAIT)) {
808 __ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
809 ip6_flush_pending_frames(sk);
811 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
812 skb->len + sizeof(struct icmp6hdr));
817 icmpv6_xmit_unlock(sk);
822 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
824 struct inet6_skb_parm *opt = IP6CB(skb);
825 const struct inet6_protocol *ipprot;
829 struct net *net = dev_net(skb->dev);
831 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
834 seg6_icmp_srh(skb, opt);
836 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
837 if (ipv6_ext_hdr(nexthdr)) {
838 /* now skip over extension headers */
839 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
840 &nexthdr, &frag_off);
841 if (inner_offset < 0)
844 inner_offset = sizeof(struct ipv6hdr);
847 /* Checkin header including 8 bytes of inner protocol header. */
848 if (!pskb_may_pull(skb, inner_offset+8))
851 /* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
852 Without this we will not able f.e. to make source routed
854 Corresponding argument (opt) to notifiers is already added.
858 ipprot = rcu_dereference(inet6_protos[nexthdr]);
859 if (ipprot && ipprot->err_handler)
860 ipprot->err_handler(skb, opt, type, code, inner_offset, info);
862 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
866 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
870 * Handle icmp messages
873 static int icmpv6_rcv(struct sk_buff *skb)
875 struct net *net = dev_net(skb->dev);
876 struct net_device *dev = icmp6_dev(skb);
877 struct inet6_dev *idev = __in6_dev_get(dev);
878 const struct in6_addr *saddr, *daddr;
879 struct icmp6hdr *hdr;
881 bool success = false;
883 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
884 struct sec_path *sp = skb_sec_path(skb);
887 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
891 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
894 nh = skb_network_offset(skb);
895 skb_set_network_header(skb, sizeof(*hdr));
897 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
900 skb_set_network_header(skb, nh);
903 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
905 saddr = &ipv6_hdr(skb)->saddr;
906 daddr = &ipv6_hdr(skb)->daddr;
908 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
909 net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
914 if (!pskb_pull(skb, sizeof(*hdr)))
917 hdr = icmp6_hdr(skb);
919 type = hdr->icmp6_type;
921 ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
924 case ICMPV6_ECHO_REQUEST:
925 if (!net->ipv6.sysctl.icmpv6_echo_ignore_all)
926 icmpv6_echo_reply(skb);
928 case ICMPV6_EXT_ECHO_REQUEST:
929 if (!net->ipv6.sysctl.icmpv6_echo_ignore_all &&
930 net->ipv4.sysctl_icmp_echo_enable_probe)
931 icmpv6_echo_reply(skb);
934 case ICMPV6_ECHO_REPLY:
935 success = ping_rcv(skb);
938 case ICMPV6_EXT_ECHO_REPLY:
939 success = ping_rcv(skb);
942 case ICMPV6_PKT_TOOBIG:
943 /* BUGGG_FUTURE: if packet contains rthdr, we cannot update
944 standard destination cache. Seems, only "advanced"
945 destination cache will allow to solve this problem
948 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
950 hdr = icmp6_hdr(skb);
954 case ICMPV6_DEST_UNREACH:
955 case ICMPV6_TIME_EXCEED:
956 case ICMPV6_PARAMPROB:
957 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
960 case NDISC_ROUTER_SOLICITATION:
961 case NDISC_ROUTER_ADVERTISEMENT:
962 case NDISC_NEIGHBOUR_SOLICITATION:
963 case NDISC_NEIGHBOUR_ADVERTISEMENT:
968 case ICMPV6_MGM_QUERY:
969 igmp6_event_query(skb);
972 case ICMPV6_MGM_REPORT:
973 igmp6_event_report(skb);
976 case ICMPV6_MGM_REDUCTION:
977 case ICMPV6_NI_QUERY:
978 case ICMPV6_NI_REPLY:
979 case ICMPV6_MLD2_REPORT:
980 case ICMPV6_DHAAD_REQUEST:
981 case ICMPV6_DHAAD_REPLY:
982 case ICMPV6_MOBILE_PREFIX_SOL:
983 case ICMPV6_MOBILE_PREFIX_ADV:
988 if (type & ICMPV6_INFOMSG_MASK)
991 net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
995 * error of unknown type.
996 * must pass to upper level
999 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
1002 /* until the v6 path can be better sorted assume failure and
1003 * preserve the status quo behaviour for the rest of the paths to here
1013 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
1015 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
1021 void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
1023 const struct in6_addr *saddr,
1024 const struct in6_addr *daddr,
1027 memset(fl6, 0, sizeof(*fl6));
1028 fl6->saddr = *saddr;
1029 fl6->daddr = *daddr;
1030 fl6->flowi6_proto = IPPROTO_ICMPV6;
1031 fl6->fl6_icmp_type = type;
1032 fl6->fl6_icmp_code = 0;
1033 fl6->flowi6_oif = oif;
1034 security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6));
1037 static void __net_exit icmpv6_sk_exit(struct net *net)
1041 for_each_possible_cpu(i)
1042 inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv6.icmp_sk, i));
1043 free_percpu(net->ipv6.icmp_sk);
1046 static int __net_init icmpv6_sk_init(struct net *net)
1051 net->ipv6.icmp_sk = alloc_percpu(struct sock *);
1052 if (!net->ipv6.icmp_sk)
1055 for_each_possible_cpu(i) {
1056 err = inet_ctl_sock_create(&sk, PF_INET6,
1057 SOCK_RAW, IPPROTO_ICMPV6, net);
1059 pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
1064 *per_cpu_ptr(net->ipv6.icmp_sk, i) = sk;
1066 /* Enough space for 2 64K ICMP packets, including
1067 * sk_buff struct overhead.
1069 sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
1074 icmpv6_sk_exit(net);
1078 static struct pernet_operations icmpv6_sk_ops = {
1079 .init = icmpv6_sk_init,
1080 .exit = icmpv6_sk_exit,
1083 int __init icmpv6_init(void)
1087 err = register_pernet_subsys(&icmpv6_sk_ops);
1092 if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1095 err = inet6_register_icmp_sender(icmp6_send);
1097 goto sender_reg_err;
1101 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1103 pr_err("Failed to register ICMP6 protocol\n");
1104 unregister_pernet_subsys(&icmpv6_sk_ops);
1108 void icmpv6_cleanup(void)
1110 inet6_unregister_icmp_sender(icmp6_send);
1111 unregister_pernet_subsys(&icmpv6_sk_ops);
1112 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1116 static const struct icmp6_err {
1124 { /* ADM_PROHIBITED */
1128 { /* Was NOT_NEIGHBOUR, now reserved */
1129 .err = EHOSTUNREACH,
1132 { /* ADDR_UNREACH */
1133 .err = EHOSTUNREACH,
1136 { /* PORT_UNREACH */
1137 .err = ECONNREFUSED,
1144 { /* REJECT_ROUTE */
1150 int icmpv6_err_convert(u8 type, u8 code, int *err)
1157 case ICMPV6_DEST_UNREACH:
1159 if (code < ARRAY_SIZE(tab_unreach)) {
1160 *err = tab_unreach[code].err;
1161 fatal = tab_unreach[code].fatal;
1165 case ICMPV6_PKT_TOOBIG:
1169 case ICMPV6_PARAMPROB:
1174 case ICMPV6_TIME_EXCEED:
1175 *err = EHOSTUNREACH;
1181 EXPORT_SYMBOL(icmpv6_err_convert);
1183 #ifdef CONFIG_SYSCTL
1184 static struct ctl_table ipv6_icmp_table_template[] = {
1186 .procname = "ratelimit",
1187 .data = &init_net.ipv6.sysctl.icmpv6_time,
1188 .maxlen = sizeof(int),
1190 .proc_handler = proc_dointvec_ms_jiffies,
1193 .procname = "echo_ignore_all",
1194 .data = &init_net.ipv6.sysctl.icmpv6_echo_ignore_all,
1195 .maxlen = sizeof(u8),
1197 .proc_handler = proc_dou8vec_minmax,
1200 .procname = "echo_ignore_multicast",
1201 .data = &init_net.ipv6.sysctl.icmpv6_echo_ignore_multicast,
1202 .maxlen = sizeof(u8),
1204 .proc_handler = proc_dou8vec_minmax,
1207 .procname = "echo_ignore_anycast",
1208 .data = &init_net.ipv6.sysctl.icmpv6_echo_ignore_anycast,
1209 .maxlen = sizeof(u8),
1211 .proc_handler = proc_dou8vec_minmax,
1214 .procname = "ratemask",
1215 .data = &init_net.ipv6.sysctl.icmpv6_ratemask_ptr,
1216 .maxlen = ICMPV6_MSG_MAX + 1,
1218 .proc_handler = proc_do_large_bitmap,
1223 struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
1225 struct ctl_table *table;
1227 table = kmemdup(ipv6_icmp_table_template,
1228 sizeof(ipv6_icmp_table_template),
1232 table[0].data = &net->ipv6.sysctl.icmpv6_time;
1233 table[1].data = &net->ipv6.sysctl.icmpv6_echo_ignore_all;
1234 table[2].data = &net->ipv6.sysctl.icmpv6_echo_ignore_multicast;
1235 table[3].data = &net->ipv6.sysctl.icmpv6_echo_ignore_anycast;
1236 table[4].data = &net->ipv6.sysctl.icmpv6_ratemask_ptr;