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