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