xref: /linux/net/ipv6/icmp.c (revision 37744feebc086908fd89760650f458ab19071750)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *	Internet Control Message Protocol (ICMPv6)
4  *	Linux INET6 implementation
5  *
6  *	Authors:
7  *	Pedro Roque		<roque@di.fc.ul.pt>
8  *
9  *	Based on net/ipv4/icmp.c
10  *
11  *	RFC 1885
12  */
13 
14 /*
15  *	Changes:
16  *
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
21  *					fragments.
22  *	YOSHIFUJI Hideaki @USAGI:	added sysctl for icmp rate limit.
23  *	Randy Dunlap and
24  *	YOSHIFUJI Hideaki @USAGI:	Per-interface statistics support
25  *	Kazunori MIYAZAWA @USAGI:       change output process to use ip6_append_data
26  */
27 
28 #define pr_fmt(fmt) "IPv6: " fmt
29 
30 #include <linux/module.h>
31 #include <linux/errno.h>
32 #include <linux/types.h>
33 #include <linux/socket.h>
34 #include <linux/in.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>
42 
43 #ifdef CONFIG_SYSCTL
44 #include <linux/sysctl.h>
45 #endif
46 
47 #include <linux/inet.h>
48 #include <linux/netdevice.h>
49 #include <linux/icmpv6.h>
50 
51 #include <net/ip.h>
52 #include <net/sock.h>
53 
54 #include <net/ipv6.h>
55 #include <net/ip6_checksum.h>
56 #include <net/ping.h>
57 #include <net/protocol.h>
58 #include <net/raw.h>
59 #include <net/rawv6.h>
60 #include <net/transp_v6.h>
61 #include <net/ip6_route.h>
62 #include <net/addrconf.h>
63 #include <net/icmp.h>
64 #include <net/xfrm.h>
65 #include <net/inet_common.h>
66 #include <net/dsfield.h>
67 #include <net/l3mdev.h>
68 
69 #include <linux/uaccess.h>
70 
71 /*
72  *	The ICMP socket(s). This is the most convenient way to flow control
73  *	our ICMP output as well as maintain a clean interface throughout
74  *	all layers. All Socketless IP sends will soon be gone.
75  *
76  *	On SMP we have one ICMP socket per-cpu.
77  */
78 static struct sock *icmpv6_sk(struct net *net)
79 {
80 	return this_cpu_read(*net->ipv6.icmp_sk);
81 }
82 
83 static int icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
84 		       u8 type, u8 code, int offset, __be32 info)
85 {
86 	/* icmpv6_notify checks 8 bytes can be pulled, icmp6hdr is 8 bytes */
87 	struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset);
88 	struct net *net = dev_net(skb->dev);
89 
90 	if (type == ICMPV6_PKT_TOOBIG)
91 		ip6_update_pmtu(skb, net, info, skb->dev->ifindex, 0, sock_net_uid(net, NULL));
92 	else if (type == NDISC_REDIRECT)
93 		ip6_redirect(skb, net, skb->dev->ifindex, 0,
94 			     sock_net_uid(net, NULL));
95 
96 	if (!(type & ICMPV6_INFOMSG_MASK))
97 		if (icmp6->icmp6_type == ICMPV6_ECHO_REQUEST)
98 			ping_err(skb, offset, ntohl(info));
99 
100 	return 0;
101 }
102 
103 static int icmpv6_rcv(struct sk_buff *skb);
104 
105 static const struct inet6_protocol icmpv6_protocol = {
106 	.handler	=	icmpv6_rcv,
107 	.err_handler	=	icmpv6_err,
108 	.flags		=	INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
109 };
110 
111 /* Called with BH disabled */
112 static __inline__ struct sock *icmpv6_xmit_lock(struct net *net)
113 {
114 	struct sock *sk;
115 
116 	sk = icmpv6_sk(net);
117 	if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
118 		/* This can happen if the output path (f.e. SIT or
119 		 * ip6ip6 tunnel) signals dst_link_failure() for an
120 		 * outgoing ICMP6 packet.
121 		 */
122 		return NULL;
123 	}
124 	return sk;
125 }
126 
127 static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
128 {
129 	spin_unlock(&sk->sk_lock.slock);
130 }
131 
132 /*
133  * Figure out, may we reply to this packet with icmp error.
134  *
135  * We do not reply, if:
136  *	- it was icmp error message.
137  *	- it is truncated, so that it is known, that protocol is ICMPV6
138  *	  (i.e. in the middle of some exthdr)
139  *
140  *	--ANK (980726)
141  */
142 
143 static bool is_ineligible(const struct sk_buff *skb)
144 {
145 	int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data;
146 	int len = skb->len - ptr;
147 	__u8 nexthdr = ipv6_hdr(skb)->nexthdr;
148 	__be16 frag_off;
149 
150 	if (len < 0)
151 		return true;
152 
153 	ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off);
154 	if (ptr < 0)
155 		return false;
156 	if (nexthdr == IPPROTO_ICMPV6) {
157 		u8 _type, *tp;
158 		tp = skb_header_pointer(skb,
159 			ptr+offsetof(struct icmp6hdr, icmp6_type),
160 			sizeof(_type), &_type);
161 		if (!tp || !(*tp & ICMPV6_INFOMSG_MASK))
162 			return true;
163 	}
164 	return false;
165 }
166 
167 static bool icmpv6_mask_allow(struct net *net, int type)
168 {
169 	if (type > ICMPV6_MSG_MAX)
170 		return true;
171 
172 	/* Limit if icmp type is set in ratemask. */
173 	if (!test_bit(type, net->ipv6.sysctl.icmpv6_ratemask))
174 		return true;
175 
176 	return false;
177 }
178 
179 static bool icmpv6_global_allow(struct net *net, int type)
180 {
181 	if (icmpv6_mask_allow(net, type))
182 		return true;
183 
184 	if (icmp_global_allow())
185 		return true;
186 
187 	return false;
188 }
189 
190 /*
191  * Check the ICMP output rate limit
192  */
193 static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
194 			       struct flowi6 *fl6)
195 {
196 	struct net *net = sock_net(sk);
197 	struct dst_entry *dst;
198 	bool res = false;
199 
200 	if (icmpv6_mask_allow(net, type))
201 		return true;
202 
203 	/*
204 	 * Look up the output route.
205 	 * XXX: perhaps the expire for routing entries cloned by
206 	 * this lookup should be more aggressive (not longer than timeout).
207 	 */
208 	dst = ip6_route_output(net, sk, fl6);
209 	if (dst->error) {
210 		IP6_INC_STATS(net, ip6_dst_idev(dst),
211 			      IPSTATS_MIB_OUTNOROUTES);
212 	} else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) {
213 		res = true;
214 	} else {
215 		struct rt6_info *rt = (struct rt6_info *)dst;
216 		int tmo = net->ipv6.sysctl.icmpv6_time;
217 		struct inet_peer *peer;
218 
219 		/* Give more bandwidth to wider prefixes. */
220 		if (rt->rt6i_dst.plen < 128)
221 			tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
222 
223 		peer = inet_getpeer_v6(net->ipv6.peers, &fl6->daddr, 1);
224 		res = inet_peer_xrlim_allow(peer, tmo);
225 		if (peer)
226 			inet_putpeer(peer);
227 	}
228 	dst_release(dst);
229 	return res;
230 }
231 
232 static bool icmpv6_rt_has_prefsrc(struct sock *sk, u8 type,
233 				  struct flowi6 *fl6)
234 {
235 	struct net *net = sock_net(sk);
236 	struct dst_entry *dst;
237 	bool res = false;
238 
239 	dst = ip6_route_output(net, sk, fl6);
240 	if (!dst->error) {
241 		struct rt6_info *rt = (struct rt6_info *)dst;
242 		struct in6_addr prefsrc;
243 
244 		rt6_get_prefsrc(rt, &prefsrc);
245 		res = !ipv6_addr_any(&prefsrc);
246 	}
247 	dst_release(dst);
248 	return res;
249 }
250 
251 /*
252  *	an inline helper for the "simple" if statement below
253  *	checks if parameter problem report is caused by an
254  *	unrecognized IPv6 option that has the Option Type
255  *	highest-order two bits set to 10
256  */
257 
258 static bool opt_unrec(struct sk_buff *skb, __u32 offset)
259 {
260 	u8 _optval, *op;
261 
262 	offset += skb_network_offset(skb);
263 	op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
264 	if (!op)
265 		return true;
266 	return (*op & 0xC0) == 0x80;
267 }
268 
269 void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
270 				struct icmp6hdr *thdr, int len)
271 {
272 	struct sk_buff *skb;
273 	struct icmp6hdr *icmp6h;
274 
275 	skb = skb_peek(&sk->sk_write_queue);
276 	if (!skb)
277 		return;
278 
279 	icmp6h = icmp6_hdr(skb);
280 	memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
281 	icmp6h->icmp6_cksum = 0;
282 
283 	if (skb_queue_len(&sk->sk_write_queue) == 1) {
284 		skb->csum = csum_partial(icmp6h,
285 					sizeof(struct icmp6hdr), skb->csum);
286 		icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
287 						      &fl6->daddr,
288 						      len, fl6->flowi6_proto,
289 						      skb->csum);
290 	} else {
291 		__wsum tmp_csum = 0;
292 
293 		skb_queue_walk(&sk->sk_write_queue, skb) {
294 			tmp_csum = csum_add(tmp_csum, skb->csum);
295 		}
296 
297 		tmp_csum = csum_partial(icmp6h,
298 					sizeof(struct icmp6hdr), tmp_csum);
299 		icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
300 						      &fl6->daddr,
301 						      len, fl6->flowi6_proto,
302 						      tmp_csum);
303 	}
304 	ip6_push_pending_frames(sk);
305 }
306 
307 struct icmpv6_msg {
308 	struct sk_buff	*skb;
309 	int		offset;
310 	uint8_t		type;
311 };
312 
313 static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
314 {
315 	struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
316 	struct sk_buff *org_skb = msg->skb;
317 	__wsum csum = 0;
318 
319 	csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
320 				      to, len, csum);
321 	skb->csum = csum_block_add(skb->csum, csum, odd);
322 	if (!(msg->type & ICMPV6_INFOMSG_MASK))
323 		nf_ct_attach(skb, org_skb);
324 	return 0;
325 }
326 
327 #if IS_ENABLED(CONFIG_IPV6_MIP6)
328 static void mip6_addr_swap(struct sk_buff *skb)
329 {
330 	struct ipv6hdr *iph = ipv6_hdr(skb);
331 	struct inet6_skb_parm *opt = IP6CB(skb);
332 	struct ipv6_destopt_hao *hao;
333 	struct in6_addr tmp;
334 	int off;
335 
336 	if (opt->dsthao) {
337 		off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
338 		if (likely(off >= 0)) {
339 			hao = (struct ipv6_destopt_hao *)
340 					(skb_network_header(skb) + off);
341 			tmp = iph->saddr;
342 			iph->saddr = hao->addr;
343 			hao->addr = tmp;
344 		}
345 	}
346 }
347 #else
348 static inline void mip6_addr_swap(struct sk_buff *skb) {}
349 #endif
350 
351 static struct dst_entry *icmpv6_route_lookup(struct net *net,
352 					     struct sk_buff *skb,
353 					     struct sock *sk,
354 					     struct flowi6 *fl6)
355 {
356 	struct dst_entry *dst, *dst2;
357 	struct flowi6 fl2;
358 	int err;
359 
360 	err = ip6_dst_lookup(net, sk, &dst, fl6);
361 	if (err)
362 		return ERR_PTR(err);
363 
364 	/*
365 	 * We won't send icmp if the destination is known
366 	 * anycast.
367 	 */
368 	if (ipv6_anycast_destination(dst, &fl6->daddr)) {
369 		net_dbg_ratelimited("icmp6_send: acast source\n");
370 		dst_release(dst);
371 		return ERR_PTR(-EINVAL);
372 	}
373 
374 	/* No need to clone since we're just using its address. */
375 	dst2 = dst;
376 
377 	dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
378 	if (!IS_ERR(dst)) {
379 		if (dst != dst2)
380 			return dst;
381 	} else {
382 		if (PTR_ERR(dst) == -EPERM)
383 			dst = NULL;
384 		else
385 			return dst;
386 	}
387 
388 	err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
389 	if (err)
390 		goto relookup_failed;
391 
392 	err = ip6_dst_lookup(net, sk, &dst2, &fl2);
393 	if (err)
394 		goto relookup_failed;
395 
396 	dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
397 	if (!IS_ERR(dst2)) {
398 		dst_release(dst);
399 		dst = dst2;
400 	} else {
401 		err = PTR_ERR(dst2);
402 		if (err == -EPERM) {
403 			dst_release(dst);
404 			return dst2;
405 		} else
406 			goto relookup_failed;
407 	}
408 
409 relookup_failed:
410 	if (dst)
411 		return dst;
412 	return ERR_PTR(err);
413 }
414 
415 static struct net_device *icmp6_dev(const struct sk_buff *skb)
416 {
417 	struct net_device *dev = skb->dev;
418 
419 	/* for local traffic to local address, skb dev is the loopback
420 	 * device. Check if there is a dst attached to the skb and if so
421 	 * get the real device index. Same is needed for replies to a link
422 	 * local address on a device enslaved to an L3 master device
423 	 */
424 	if (unlikely(dev->ifindex == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
425 		const struct rt6_info *rt6 = skb_rt6_info(skb);
426 
427 		if (rt6)
428 			dev = rt6->rt6i_idev->dev;
429 	}
430 
431 	return dev;
432 }
433 
434 static int icmp6_iif(const struct sk_buff *skb)
435 {
436 	return icmp6_dev(skb)->ifindex;
437 }
438 
439 /*
440  *	Send an ICMP message in response to a packet in error
441  */
442 static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
443 		       const struct in6_addr *force_saddr)
444 {
445 	struct inet6_dev *idev = NULL;
446 	struct ipv6hdr *hdr = ipv6_hdr(skb);
447 	struct sock *sk;
448 	struct net *net;
449 	struct ipv6_pinfo *np;
450 	const struct in6_addr *saddr = NULL;
451 	struct dst_entry *dst;
452 	struct icmp6hdr tmp_hdr;
453 	struct flowi6 fl6;
454 	struct icmpv6_msg msg;
455 	struct ipcm6_cookie ipc6;
456 	int iif = 0;
457 	int addr_type = 0;
458 	int len;
459 	u32 mark;
460 
461 	if ((u8 *)hdr < skb->head ||
462 	    (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
463 		return;
464 
465 	if (!skb->dev)
466 		return;
467 	net = dev_net(skb->dev);
468 	mark = IP6_REPLY_MARK(net, skb->mark);
469 	/*
470 	 *	Make sure we respect the rules
471 	 *	i.e. RFC 1885 2.4(e)
472 	 *	Rule (e.1) is enforced by not using icmp6_send
473 	 *	in any code that processes icmp errors.
474 	 */
475 	addr_type = ipv6_addr_type(&hdr->daddr);
476 
477 	if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
478 	    ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
479 		saddr = &hdr->daddr;
480 
481 	/*
482 	 *	Dest addr check
483 	 */
484 
485 	if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
486 		if (type != ICMPV6_PKT_TOOBIG &&
487 		    !(type == ICMPV6_PARAMPROB &&
488 		      code == ICMPV6_UNK_OPTION &&
489 		      (opt_unrec(skb, info))))
490 			return;
491 
492 		saddr = NULL;
493 	}
494 
495 	addr_type = ipv6_addr_type(&hdr->saddr);
496 
497 	/*
498 	 *	Source addr check
499 	 */
500 
501 	if (__ipv6_addr_needs_scope_id(addr_type)) {
502 		iif = icmp6_iif(skb);
503 	} else {
504 		dst = skb_dst(skb);
505 		iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
506 	}
507 
508 	/*
509 	 *	Must not send error if the source does not uniquely
510 	 *	identify a single node (RFC2463 Section 2.4).
511 	 *	We check unspecified / multicast addresses here,
512 	 *	and anycast addresses will be checked later.
513 	 */
514 	if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
515 		net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
516 				    &hdr->saddr, &hdr->daddr);
517 		return;
518 	}
519 
520 	/*
521 	 *	Never answer to a ICMP packet.
522 	 */
523 	if (is_ineligible(skb)) {
524 		net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
525 				    &hdr->saddr, &hdr->daddr);
526 		return;
527 	}
528 
529 	/* Needed by both icmp_global_allow and icmpv6_xmit_lock */
530 	local_bh_disable();
531 
532 	/* Check global sysctl_icmp_msgs_per_sec ratelimit */
533 	if (!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, type))
534 		goto out_bh_enable;
535 
536 	mip6_addr_swap(skb);
537 
538 	sk = icmpv6_xmit_lock(net);
539 	if (!sk)
540 		goto out_bh_enable;
541 
542 	memset(&fl6, 0, sizeof(fl6));
543 	fl6.flowi6_proto = IPPROTO_ICMPV6;
544 	fl6.daddr = hdr->saddr;
545 	if (force_saddr)
546 		saddr = force_saddr;
547 	if (saddr) {
548 		fl6.saddr = *saddr;
549 	} else if (!icmpv6_rt_has_prefsrc(sk, type, &fl6)) {
550 		/* select a more meaningful saddr from input if */
551 		struct net_device *in_netdev;
552 
553 		in_netdev = dev_get_by_index(net, IP6CB(skb)->iif);
554 		if (in_netdev) {
555 			ipv6_dev_get_saddr(net, in_netdev, &fl6.daddr,
556 					   inet6_sk(sk)->srcprefs,
557 					   &fl6.saddr);
558 			dev_put(in_netdev);
559 		}
560 	}
561 	fl6.flowi6_mark = mark;
562 	fl6.flowi6_oif = iif;
563 	fl6.fl6_icmp_type = type;
564 	fl6.fl6_icmp_code = code;
565 	fl6.flowi6_uid = sock_net_uid(net, NULL);
566 	fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL);
567 	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
568 
569 	sk->sk_mark = mark;
570 	np = inet6_sk(sk);
571 
572 	if (!icmpv6_xrlim_allow(sk, type, &fl6))
573 		goto out;
574 
575 	tmp_hdr.icmp6_type = type;
576 	tmp_hdr.icmp6_code = code;
577 	tmp_hdr.icmp6_cksum = 0;
578 	tmp_hdr.icmp6_pointer = htonl(info);
579 
580 	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
581 		fl6.flowi6_oif = np->mcast_oif;
582 	else if (!fl6.flowi6_oif)
583 		fl6.flowi6_oif = np->ucast_oif;
584 
585 	ipcm6_init_sk(&ipc6, np);
586 	fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
587 
588 	dst = icmpv6_route_lookup(net, skb, sk, &fl6);
589 	if (IS_ERR(dst))
590 		goto out;
591 
592 	ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
593 
594 	msg.skb = skb;
595 	msg.offset = skb_network_offset(skb);
596 	msg.type = type;
597 
598 	len = skb->len - msg.offset;
599 	len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
600 	if (len < 0) {
601 		net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
602 				    &hdr->saddr, &hdr->daddr);
603 		goto out_dst_release;
604 	}
605 
606 	rcu_read_lock();
607 	idev = __in6_dev_get(skb->dev);
608 
609 	if (ip6_append_data(sk, icmpv6_getfrag, &msg,
610 			    len + sizeof(struct icmp6hdr),
611 			    sizeof(struct icmp6hdr),
612 			    &ipc6, &fl6, (struct rt6_info *)dst,
613 			    MSG_DONTWAIT)) {
614 		ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
615 		ip6_flush_pending_frames(sk);
616 	} else {
617 		icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
618 					   len + sizeof(struct icmp6hdr));
619 	}
620 	rcu_read_unlock();
621 out_dst_release:
622 	dst_release(dst);
623 out:
624 	icmpv6_xmit_unlock(sk);
625 out_bh_enable:
626 	local_bh_enable();
627 }
628 
629 /* Slightly more convenient version of icmp6_send.
630  */
631 void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
632 {
633 	icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL);
634 	kfree_skb(skb);
635 }
636 
637 /* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
638  * if sufficient data bytes are available
639  * @nhs is the size of the tunnel header(s) :
640  *  Either an IPv4 header for SIT encap
641  *         an IPv4 header + GRE header for GRE encap
642  */
643 int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
644 			       unsigned int data_len)
645 {
646 	struct in6_addr temp_saddr;
647 	struct rt6_info *rt;
648 	struct sk_buff *skb2;
649 	u32 info = 0;
650 
651 	if (!pskb_may_pull(skb, nhs + sizeof(struct ipv6hdr) + 8))
652 		return 1;
653 
654 	/* RFC 4884 (partial) support for ICMP extensions */
655 	if (data_len < 128 || (data_len & 7) || skb->len < data_len)
656 		data_len = 0;
657 
658 	skb2 = data_len ? skb_copy(skb, GFP_ATOMIC) : skb_clone(skb, GFP_ATOMIC);
659 
660 	if (!skb2)
661 		return 1;
662 
663 	skb_dst_drop(skb2);
664 	skb_pull(skb2, nhs);
665 	skb_reset_network_header(skb2);
666 
667 	rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0,
668 			skb, 0);
669 
670 	if (rt && rt->dst.dev)
671 		skb2->dev = rt->dst.dev;
672 
673 	ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, &temp_saddr);
674 
675 	if (data_len) {
676 		/* RFC 4884 (partial) support :
677 		 * insert 0 padding at the end, before the extensions
678 		 */
679 		__skb_push(skb2, nhs);
680 		skb_reset_network_header(skb2);
681 		memmove(skb2->data, skb2->data + nhs, data_len - nhs);
682 		memset(skb2->data + data_len - nhs, 0, nhs);
683 		/* RFC 4884 4.5 : Length is measured in 64-bit words,
684 		 * and stored in reserved[0]
685 		 */
686 		info = (data_len/8) << 24;
687 	}
688 	if (type == ICMP_TIME_EXCEEDED)
689 		icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
690 			   info, &temp_saddr);
691 	else
692 		icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
693 			   info, &temp_saddr);
694 	if (rt)
695 		ip6_rt_put(rt);
696 
697 	kfree_skb(skb2);
698 
699 	return 0;
700 }
701 EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
702 
703 static void icmpv6_echo_reply(struct sk_buff *skb)
704 {
705 	struct net *net = dev_net(skb->dev);
706 	struct sock *sk;
707 	struct inet6_dev *idev;
708 	struct ipv6_pinfo *np;
709 	const struct in6_addr *saddr = NULL;
710 	struct icmp6hdr *icmph = icmp6_hdr(skb);
711 	struct icmp6hdr tmp_hdr;
712 	struct flowi6 fl6;
713 	struct icmpv6_msg msg;
714 	struct dst_entry *dst;
715 	struct ipcm6_cookie ipc6;
716 	u32 mark = IP6_REPLY_MARK(net, skb->mark);
717 	bool acast;
718 
719 	if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) &&
720 	    net->ipv6.sysctl.icmpv6_echo_ignore_multicast)
721 		return;
722 
723 	saddr = &ipv6_hdr(skb)->daddr;
724 
725 	acast = ipv6_anycast_destination(skb_dst(skb), saddr);
726 	if (acast && net->ipv6.sysctl.icmpv6_echo_ignore_anycast)
727 		return;
728 
729 	if (!ipv6_unicast_destination(skb) &&
730 	    !(net->ipv6.sysctl.anycast_src_echo_reply && acast))
731 		saddr = NULL;
732 
733 	memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
734 	tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
735 
736 	memset(&fl6, 0, sizeof(fl6));
737 	if (net->ipv6.sysctl.flowlabel_reflect & FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES)
738 		fl6.flowlabel = ip6_flowlabel(ipv6_hdr(skb));
739 
740 	fl6.flowi6_proto = IPPROTO_ICMPV6;
741 	fl6.daddr = ipv6_hdr(skb)->saddr;
742 	if (saddr)
743 		fl6.saddr = *saddr;
744 	fl6.flowi6_oif = icmp6_iif(skb);
745 	fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
746 	fl6.flowi6_mark = mark;
747 	fl6.flowi6_uid = sock_net_uid(net, NULL);
748 	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
749 
750 	local_bh_disable();
751 	sk = icmpv6_xmit_lock(net);
752 	if (!sk)
753 		goto out_bh_enable;
754 	sk->sk_mark = mark;
755 	np = inet6_sk(sk);
756 
757 	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
758 		fl6.flowi6_oif = np->mcast_oif;
759 	else if (!fl6.flowi6_oif)
760 		fl6.flowi6_oif = np->ucast_oif;
761 
762 	if (ip6_dst_lookup(net, sk, &dst, &fl6))
763 		goto out;
764 	dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
765 	if (IS_ERR(dst))
766 		goto out;
767 
768 	/* Check the ratelimit */
769 	if ((!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, ICMPV6_ECHO_REPLY)) ||
770 	    !icmpv6_xrlim_allow(sk, ICMPV6_ECHO_REPLY, &fl6))
771 		goto out_dst_release;
772 
773 	idev = __in6_dev_get(skb->dev);
774 
775 	msg.skb = skb;
776 	msg.offset = 0;
777 	msg.type = ICMPV6_ECHO_REPLY;
778 
779 	ipcm6_init_sk(&ipc6, np);
780 	ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
781 	ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
782 
783 	if (ip6_append_data(sk, icmpv6_getfrag, &msg,
784 			    skb->len + sizeof(struct icmp6hdr),
785 			    sizeof(struct icmp6hdr), &ipc6, &fl6,
786 			    (struct rt6_info *)dst, MSG_DONTWAIT)) {
787 		__ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
788 		ip6_flush_pending_frames(sk);
789 	} else {
790 		icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
791 					   skb->len + sizeof(struct icmp6hdr));
792 	}
793 out_dst_release:
794 	dst_release(dst);
795 out:
796 	icmpv6_xmit_unlock(sk);
797 out_bh_enable:
798 	local_bh_enable();
799 }
800 
801 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
802 {
803 	const struct inet6_protocol *ipprot;
804 	int inner_offset;
805 	__be16 frag_off;
806 	u8 nexthdr;
807 	struct net *net = dev_net(skb->dev);
808 
809 	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
810 		goto out;
811 
812 	nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
813 	if (ipv6_ext_hdr(nexthdr)) {
814 		/* now skip over extension headers */
815 		inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
816 						&nexthdr, &frag_off);
817 		if (inner_offset < 0)
818 			goto out;
819 	} else {
820 		inner_offset = sizeof(struct ipv6hdr);
821 	}
822 
823 	/* Checkin header including 8 bytes of inner protocol header. */
824 	if (!pskb_may_pull(skb, inner_offset+8))
825 		goto out;
826 
827 	/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
828 	   Without this we will not able f.e. to make source routed
829 	   pmtu discovery.
830 	   Corresponding argument (opt) to notifiers is already added.
831 	   --ANK (980726)
832 	 */
833 
834 	ipprot = rcu_dereference(inet6_protos[nexthdr]);
835 	if (ipprot && ipprot->err_handler)
836 		ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
837 
838 	raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
839 	return;
840 
841 out:
842 	__ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
843 }
844 
845 /*
846  *	Handle icmp messages
847  */
848 
849 static int icmpv6_rcv(struct sk_buff *skb)
850 {
851 	struct net *net = dev_net(skb->dev);
852 	struct net_device *dev = icmp6_dev(skb);
853 	struct inet6_dev *idev = __in6_dev_get(dev);
854 	const struct in6_addr *saddr, *daddr;
855 	struct icmp6hdr *hdr;
856 	u8 type;
857 	bool success = false;
858 
859 	if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
860 		struct sec_path *sp = skb_sec_path(skb);
861 		int nh;
862 
863 		if (!(sp && sp->xvec[sp->len - 1]->props.flags &
864 				 XFRM_STATE_ICMP))
865 			goto drop_no_count;
866 
867 		if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
868 			goto drop_no_count;
869 
870 		nh = skb_network_offset(skb);
871 		skb_set_network_header(skb, sizeof(*hdr));
872 
873 		if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
874 			goto drop_no_count;
875 
876 		skb_set_network_header(skb, nh);
877 	}
878 
879 	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
880 
881 	saddr = &ipv6_hdr(skb)->saddr;
882 	daddr = &ipv6_hdr(skb)->daddr;
883 
884 	if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
885 		net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
886 				    saddr, daddr);
887 		goto csum_error;
888 	}
889 
890 	if (!pskb_pull(skb, sizeof(*hdr)))
891 		goto discard_it;
892 
893 	hdr = icmp6_hdr(skb);
894 
895 	type = hdr->icmp6_type;
896 
897 	ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
898 
899 	switch (type) {
900 	case ICMPV6_ECHO_REQUEST:
901 		if (!net->ipv6.sysctl.icmpv6_echo_ignore_all)
902 			icmpv6_echo_reply(skb);
903 		break;
904 
905 	case ICMPV6_ECHO_REPLY:
906 		success = ping_rcv(skb);
907 		break;
908 
909 	case ICMPV6_PKT_TOOBIG:
910 		/* BUGGG_FUTURE: if packet contains rthdr, we cannot update
911 		   standard destination cache. Seems, only "advanced"
912 		   destination cache will allow to solve this problem
913 		   --ANK (980726)
914 		 */
915 		if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
916 			goto discard_it;
917 		hdr = icmp6_hdr(skb);
918 
919 		/* to notify */
920 		fallthrough;
921 	case ICMPV6_DEST_UNREACH:
922 	case ICMPV6_TIME_EXCEED:
923 	case ICMPV6_PARAMPROB:
924 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
925 		break;
926 
927 	case NDISC_ROUTER_SOLICITATION:
928 	case NDISC_ROUTER_ADVERTISEMENT:
929 	case NDISC_NEIGHBOUR_SOLICITATION:
930 	case NDISC_NEIGHBOUR_ADVERTISEMENT:
931 	case NDISC_REDIRECT:
932 		ndisc_rcv(skb);
933 		break;
934 
935 	case ICMPV6_MGM_QUERY:
936 		igmp6_event_query(skb);
937 		break;
938 
939 	case ICMPV6_MGM_REPORT:
940 		igmp6_event_report(skb);
941 		break;
942 
943 	case ICMPV6_MGM_REDUCTION:
944 	case ICMPV6_NI_QUERY:
945 	case ICMPV6_NI_REPLY:
946 	case ICMPV6_MLD2_REPORT:
947 	case ICMPV6_DHAAD_REQUEST:
948 	case ICMPV6_DHAAD_REPLY:
949 	case ICMPV6_MOBILE_PREFIX_SOL:
950 	case ICMPV6_MOBILE_PREFIX_ADV:
951 		break;
952 
953 	default:
954 		/* informational */
955 		if (type & ICMPV6_INFOMSG_MASK)
956 			break;
957 
958 		net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
959 				    saddr, daddr);
960 
961 		/*
962 		 * error of unknown type.
963 		 * must pass to upper level
964 		 */
965 
966 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
967 	}
968 
969 	/* until the v6 path can be better sorted assume failure and
970 	 * preserve the status quo behaviour for the rest of the paths to here
971 	 */
972 	if (success)
973 		consume_skb(skb);
974 	else
975 		kfree_skb(skb);
976 
977 	return 0;
978 
979 csum_error:
980 	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
981 discard_it:
982 	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
983 drop_no_count:
984 	kfree_skb(skb);
985 	return 0;
986 }
987 
988 void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
989 		      u8 type,
990 		      const struct in6_addr *saddr,
991 		      const struct in6_addr *daddr,
992 		      int oif)
993 {
994 	memset(fl6, 0, sizeof(*fl6));
995 	fl6->saddr = *saddr;
996 	fl6->daddr = *daddr;
997 	fl6->flowi6_proto	= IPPROTO_ICMPV6;
998 	fl6->fl6_icmp_type	= type;
999 	fl6->fl6_icmp_code	= 0;
1000 	fl6->flowi6_oif		= oif;
1001 	security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
1002 }
1003 
1004 static void __net_exit icmpv6_sk_exit(struct net *net)
1005 {
1006 	int i;
1007 
1008 	for_each_possible_cpu(i)
1009 		inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv6.icmp_sk, i));
1010 	free_percpu(net->ipv6.icmp_sk);
1011 }
1012 
1013 static int __net_init icmpv6_sk_init(struct net *net)
1014 {
1015 	struct sock *sk;
1016 	int err, i;
1017 
1018 	net->ipv6.icmp_sk = alloc_percpu(struct sock *);
1019 	if (!net->ipv6.icmp_sk)
1020 		return -ENOMEM;
1021 
1022 	for_each_possible_cpu(i) {
1023 		err = inet_ctl_sock_create(&sk, PF_INET6,
1024 					   SOCK_RAW, IPPROTO_ICMPV6, net);
1025 		if (err < 0) {
1026 			pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
1027 			       err);
1028 			goto fail;
1029 		}
1030 
1031 		*per_cpu_ptr(net->ipv6.icmp_sk, i) = sk;
1032 
1033 		/* Enough space for 2 64K ICMP packets, including
1034 		 * sk_buff struct overhead.
1035 		 */
1036 		sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
1037 	}
1038 	return 0;
1039 
1040  fail:
1041 	icmpv6_sk_exit(net);
1042 	return err;
1043 }
1044 
1045 static struct pernet_operations icmpv6_sk_ops = {
1046 	.init = icmpv6_sk_init,
1047 	.exit = icmpv6_sk_exit,
1048 };
1049 
1050 int __init icmpv6_init(void)
1051 {
1052 	int err;
1053 
1054 	err = register_pernet_subsys(&icmpv6_sk_ops);
1055 	if (err < 0)
1056 		return err;
1057 
1058 	err = -EAGAIN;
1059 	if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1060 		goto fail;
1061 
1062 	err = inet6_register_icmp_sender(icmp6_send);
1063 	if (err)
1064 		goto sender_reg_err;
1065 	return 0;
1066 
1067 sender_reg_err:
1068 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1069 fail:
1070 	pr_err("Failed to register ICMP6 protocol\n");
1071 	unregister_pernet_subsys(&icmpv6_sk_ops);
1072 	return err;
1073 }
1074 
1075 void icmpv6_cleanup(void)
1076 {
1077 	inet6_unregister_icmp_sender(icmp6_send);
1078 	unregister_pernet_subsys(&icmpv6_sk_ops);
1079 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1080 }
1081 
1082 
1083 static const struct icmp6_err {
1084 	int err;
1085 	int fatal;
1086 } tab_unreach[] = {
1087 	{	/* NOROUTE */
1088 		.err	= ENETUNREACH,
1089 		.fatal	= 0,
1090 	},
1091 	{	/* ADM_PROHIBITED */
1092 		.err	= EACCES,
1093 		.fatal	= 1,
1094 	},
1095 	{	/* Was NOT_NEIGHBOUR, now reserved */
1096 		.err	= EHOSTUNREACH,
1097 		.fatal	= 0,
1098 	},
1099 	{	/* ADDR_UNREACH	*/
1100 		.err	= EHOSTUNREACH,
1101 		.fatal	= 0,
1102 	},
1103 	{	/* PORT_UNREACH	*/
1104 		.err	= ECONNREFUSED,
1105 		.fatal	= 1,
1106 	},
1107 	{	/* POLICY_FAIL */
1108 		.err	= EACCES,
1109 		.fatal	= 1,
1110 	},
1111 	{	/* REJECT_ROUTE	*/
1112 		.err	= EACCES,
1113 		.fatal	= 1,
1114 	},
1115 };
1116 
1117 int icmpv6_err_convert(u8 type, u8 code, int *err)
1118 {
1119 	int fatal = 0;
1120 
1121 	*err = EPROTO;
1122 
1123 	switch (type) {
1124 	case ICMPV6_DEST_UNREACH:
1125 		fatal = 1;
1126 		if (code < ARRAY_SIZE(tab_unreach)) {
1127 			*err  = tab_unreach[code].err;
1128 			fatal = tab_unreach[code].fatal;
1129 		}
1130 		break;
1131 
1132 	case ICMPV6_PKT_TOOBIG:
1133 		*err = EMSGSIZE;
1134 		break;
1135 
1136 	case ICMPV6_PARAMPROB:
1137 		*err = EPROTO;
1138 		fatal = 1;
1139 		break;
1140 
1141 	case ICMPV6_TIME_EXCEED:
1142 		*err = EHOSTUNREACH;
1143 		break;
1144 	}
1145 
1146 	return fatal;
1147 }
1148 EXPORT_SYMBOL(icmpv6_err_convert);
1149 
1150 #ifdef CONFIG_SYSCTL
1151 static struct ctl_table ipv6_icmp_table_template[] = {
1152 	{
1153 		.procname	= "ratelimit",
1154 		.data		= &init_net.ipv6.sysctl.icmpv6_time,
1155 		.maxlen		= sizeof(int),
1156 		.mode		= 0644,
1157 		.proc_handler	= proc_dointvec_ms_jiffies,
1158 	},
1159 	{
1160 		.procname	= "echo_ignore_all",
1161 		.data		= &init_net.ipv6.sysctl.icmpv6_echo_ignore_all,
1162 		.maxlen		= sizeof(int),
1163 		.mode		= 0644,
1164 		.proc_handler = proc_dointvec,
1165 	},
1166 	{
1167 		.procname	= "echo_ignore_multicast",
1168 		.data		= &init_net.ipv6.sysctl.icmpv6_echo_ignore_multicast,
1169 		.maxlen		= sizeof(int),
1170 		.mode		= 0644,
1171 		.proc_handler = proc_dointvec,
1172 	},
1173 	{
1174 		.procname	= "echo_ignore_anycast",
1175 		.data		= &init_net.ipv6.sysctl.icmpv6_echo_ignore_anycast,
1176 		.maxlen		= sizeof(int),
1177 		.mode		= 0644,
1178 		.proc_handler = proc_dointvec,
1179 	},
1180 	{
1181 		.procname	= "ratemask",
1182 		.data		= &init_net.ipv6.sysctl.icmpv6_ratemask_ptr,
1183 		.maxlen		= ICMPV6_MSG_MAX + 1,
1184 		.mode		= 0644,
1185 		.proc_handler = proc_do_large_bitmap,
1186 	},
1187 	{ },
1188 };
1189 
1190 struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
1191 {
1192 	struct ctl_table *table;
1193 
1194 	table = kmemdup(ipv6_icmp_table_template,
1195 			sizeof(ipv6_icmp_table_template),
1196 			GFP_KERNEL);
1197 
1198 	if (table) {
1199 		table[0].data = &net->ipv6.sysctl.icmpv6_time;
1200 		table[1].data = &net->ipv6.sysctl.icmpv6_echo_ignore_all;
1201 		table[2].data = &net->ipv6.sysctl.icmpv6_echo_ignore_multicast;
1202 		table[3].data = &net->ipv6.sysctl.icmpv6_echo_ignore_anycast;
1203 		table[4].data = &net->ipv6.sysctl.icmpv6_ratemask_ptr;
1204 	}
1205 	return table;
1206 }
1207 #endif
1208