xref: /openbmc/linux/net/ipv6/icmp.c (revision e5d08d71)
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 
72 #include <asm/uaccess.h>
73 
74 /*
75  *	The ICMP socket(s). This is the most convenient way to flow control
76  *	our ICMP output as well as maintain a clean interface throughout
77  *	all layers. All Socketless IP sends will soon be gone.
78  *
79  *	On SMP we have one ICMP socket per-cpu.
80  */
81 static inline struct sock *icmpv6_sk(struct net *net)
82 {
83 	return net->ipv6.icmp_sk[smp_processor_id()];
84 }
85 
86 static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
87 		       u8 type, u8 code, int offset, __be32 info)
88 {
89 	/* icmpv6_notify checks 8 bytes can be pulled, icmp6hdr is 8 bytes */
90 	struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset);
91 	struct net *net = dev_net(skb->dev);
92 
93 	if (type == ICMPV6_PKT_TOOBIG)
94 		ip6_update_pmtu(skb, net, info, 0, 0);
95 	else if (type == NDISC_REDIRECT)
96 		ip6_redirect(skb, net, skb->dev->ifindex, 0);
97 
98 	if (!(type & ICMPV6_INFOMSG_MASK))
99 		if (icmp6->icmp6_type == ICMPV6_ECHO_REQUEST)
100 			ping_err(skb, offset, info);
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 static __inline__ struct sock *icmpv6_xmit_lock(struct net *net)
112 {
113 	struct sock *sk;
114 
115 	local_bh_disable();
116 
117 	sk = icmpv6_sk(net);
118 	if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
119 		/* This can happen if the output path (f.e. SIT or
120 		 * ip6ip6 tunnel) signals dst_link_failure() for an
121 		 * outgoing ICMP6 packet.
122 		 */
123 		local_bh_enable();
124 		return NULL;
125 	}
126 	return sk;
127 }
128 
129 static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
130 {
131 	spin_unlock_bh(&sk->sk_lock.slock);
132 }
133 
134 /*
135  * Figure out, may we reply to this packet with icmp error.
136  *
137  * We do not reply, if:
138  *	- it was icmp error message.
139  *	- it is truncated, so that it is known, that protocol is ICMPV6
140  *	  (i.e. in the middle of some exthdr)
141  *
142  *	--ANK (980726)
143  */
144 
145 static bool is_ineligible(const struct sk_buff *skb)
146 {
147 	int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data;
148 	int len = skb->len - ptr;
149 	__u8 nexthdr = ipv6_hdr(skb)->nexthdr;
150 	__be16 frag_off;
151 
152 	if (len < 0)
153 		return true;
154 
155 	ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off);
156 	if (ptr < 0)
157 		return false;
158 	if (nexthdr == IPPROTO_ICMPV6) {
159 		u8 _type, *tp;
160 		tp = skb_header_pointer(skb,
161 			ptr+offsetof(struct icmp6hdr, icmp6_type),
162 			sizeof(_type), &_type);
163 		if (tp == NULL ||
164 		    !(*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 					       &rt->rt6i_dst.addr, 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 == NULL)
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 == NULL)
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(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 (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) {
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(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 {
393 	struct net *net = dev_net(skb->dev);
394 	struct inet6_dev *idev = NULL;
395 	struct ipv6hdr *hdr = ipv6_hdr(skb);
396 	struct sock *sk;
397 	struct ipv6_pinfo *np;
398 	const struct in6_addr *saddr = NULL;
399 	struct dst_entry *dst;
400 	struct icmp6hdr tmp_hdr;
401 	struct flowi6 fl6;
402 	struct icmpv6_msg msg;
403 	int iif = 0;
404 	int addr_type = 0;
405 	int len;
406 	int hlimit;
407 	int err = 0;
408 	u32 mark = IP6_REPLY_MARK(net, skb->mark);
409 
410 	if ((u8 *)hdr < skb->head ||
411 	    (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
412 		return;
413 
414 	/*
415 	 *	Make sure we respect the rules
416 	 *	i.e. RFC 1885 2.4(e)
417 	 *	Rule (e.1) is enforced by not using icmp6_send
418 	 *	in any code that processes icmp errors.
419 	 */
420 	addr_type = ipv6_addr_type(&hdr->daddr);
421 
422 	if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
423 	    ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
424 		saddr = &hdr->daddr;
425 
426 	/*
427 	 *	Dest addr check
428 	 */
429 
430 	if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) {
431 		if (type != ICMPV6_PKT_TOOBIG &&
432 		    !(type == ICMPV6_PARAMPROB &&
433 		      code == ICMPV6_UNK_OPTION &&
434 		      (opt_unrec(skb, info))))
435 			return;
436 
437 		saddr = NULL;
438 	}
439 
440 	addr_type = ipv6_addr_type(&hdr->saddr);
441 
442 	/*
443 	 *	Source addr check
444 	 */
445 
446 	if (__ipv6_addr_needs_scope_id(addr_type))
447 		iif = skb->dev->ifindex;
448 
449 	/*
450 	 *	Must not send error if the source does not uniquely
451 	 *	identify a single node (RFC2463 Section 2.4).
452 	 *	We check unspecified / multicast addresses here,
453 	 *	and anycast addresses will be checked later.
454 	 */
455 	if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
456 		net_dbg_ratelimited("icmp6_send: addr_any/mcast source\n");
457 		return;
458 	}
459 
460 	/*
461 	 *	Never answer to a ICMP packet.
462 	 */
463 	if (is_ineligible(skb)) {
464 		net_dbg_ratelimited("icmp6_send: no reply to icmp error\n");
465 		return;
466 	}
467 
468 	mip6_addr_swap(skb);
469 
470 	memset(&fl6, 0, sizeof(fl6));
471 	fl6.flowi6_proto = IPPROTO_ICMPV6;
472 	fl6.daddr = hdr->saddr;
473 	if (saddr)
474 		fl6.saddr = *saddr;
475 	fl6.flowi6_mark = mark;
476 	fl6.flowi6_oif = iif;
477 	fl6.fl6_icmp_type = type;
478 	fl6.fl6_icmp_code = code;
479 	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
480 
481 	sk = icmpv6_xmit_lock(net);
482 	if (sk == NULL)
483 		return;
484 	sk->sk_mark = mark;
485 	np = inet6_sk(sk);
486 
487 	if (!icmpv6_xrlim_allow(sk, type, &fl6))
488 		goto out;
489 
490 	tmp_hdr.icmp6_type = type;
491 	tmp_hdr.icmp6_code = code;
492 	tmp_hdr.icmp6_cksum = 0;
493 	tmp_hdr.icmp6_pointer = htonl(info);
494 
495 	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
496 		fl6.flowi6_oif = np->mcast_oif;
497 	else if (!fl6.flowi6_oif)
498 		fl6.flowi6_oif = np->ucast_oif;
499 
500 	dst = icmpv6_route_lookup(net, skb, sk, &fl6);
501 	if (IS_ERR(dst))
502 		goto out;
503 
504 	hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
505 
506 	msg.skb = skb;
507 	msg.offset = skb_network_offset(skb);
508 	msg.type = type;
509 
510 	len = skb->len - msg.offset;
511 	len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
512 	if (len < 0) {
513 		net_dbg_ratelimited("icmp: len problem\n");
514 		goto out_dst_release;
515 	}
516 
517 	rcu_read_lock();
518 	idev = __in6_dev_get(skb->dev);
519 
520 	err = ip6_append_data(sk, icmpv6_getfrag, &msg,
521 			      len + sizeof(struct icmp6hdr),
522 			      sizeof(struct icmp6hdr), hlimit,
523 			      np->tclass, NULL, &fl6, (struct rt6_info *)dst,
524 			      MSG_DONTWAIT, np->dontfrag);
525 	if (err) {
526 		ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
527 		ip6_flush_pending_frames(sk);
528 	} else {
529 		err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
530 						 len + sizeof(struct icmp6hdr));
531 	}
532 	rcu_read_unlock();
533 out_dst_release:
534 	dst_release(dst);
535 out:
536 	icmpv6_xmit_unlock(sk);
537 }
538 
539 /* Slightly more convenient version of icmp6_send.
540  */
541 void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
542 {
543 	icmp6_send(skb, ICMPV6_PARAMPROB, code, pos);
544 	kfree_skb(skb);
545 }
546 
547 static void icmpv6_echo_reply(struct sk_buff *skb)
548 {
549 	struct net *net = dev_net(skb->dev);
550 	struct sock *sk;
551 	struct inet6_dev *idev;
552 	struct ipv6_pinfo *np;
553 	const struct in6_addr *saddr = NULL;
554 	struct icmp6hdr *icmph = icmp6_hdr(skb);
555 	struct icmp6hdr tmp_hdr;
556 	struct flowi6 fl6;
557 	struct icmpv6_msg msg;
558 	struct dst_entry *dst;
559 	int err = 0;
560 	int hlimit;
561 	u8 tclass;
562 	u32 mark = IP6_REPLY_MARK(net, skb->mark);
563 
564 	saddr = &ipv6_hdr(skb)->daddr;
565 
566 	if (!ipv6_unicast_destination(skb) &&
567 	    !(net->ipv6.sysctl.anycast_src_echo_reply &&
568 	      ipv6_anycast_destination(skb)))
569 		saddr = NULL;
570 
571 	memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
572 	tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
573 
574 	memset(&fl6, 0, sizeof(fl6));
575 	fl6.flowi6_proto = IPPROTO_ICMPV6;
576 	fl6.daddr = ipv6_hdr(skb)->saddr;
577 	if (saddr)
578 		fl6.saddr = *saddr;
579 	fl6.flowi6_oif = skb->dev->ifindex;
580 	fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
581 	fl6.flowi6_mark = mark;
582 	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
583 
584 	sk = icmpv6_xmit_lock(net);
585 	if (sk == NULL)
586 		return;
587 	sk->sk_mark = mark;
588 	np = inet6_sk(sk);
589 
590 	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
591 		fl6.flowi6_oif = np->mcast_oif;
592 	else if (!fl6.flowi6_oif)
593 		fl6.flowi6_oif = np->ucast_oif;
594 
595 	err = ip6_dst_lookup(sk, &dst, &fl6);
596 	if (err)
597 		goto out;
598 	dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
599 	if (IS_ERR(dst))
600 		goto out;
601 
602 	hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
603 
604 	idev = __in6_dev_get(skb->dev);
605 
606 	msg.skb = skb;
607 	msg.offset = 0;
608 	msg.type = ICMPV6_ECHO_REPLY;
609 
610 	tclass = ipv6_get_dsfield(ipv6_hdr(skb));
611 	err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr),
612 				sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl6,
613 				(struct rt6_info *)dst, MSG_DONTWAIT,
614 				np->dontfrag);
615 
616 	if (err) {
617 		ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTERRORS);
618 		ip6_flush_pending_frames(sk);
619 	} else {
620 		err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
621 						 skb->len + sizeof(struct icmp6hdr));
622 	}
623 	dst_release(dst);
624 out:
625 	icmpv6_xmit_unlock(sk);
626 }
627 
628 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
629 {
630 	const struct inet6_protocol *ipprot;
631 	int inner_offset;
632 	__be16 frag_off;
633 	u8 nexthdr;
634 	struct net *net = dev_net(skb->dev);
635 
636 	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
637 		goto out;
638 
639 	nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
640 	if (ipv6_ext_hdr(nexthdr)) {
641 		/* now skip over extension headers */
642 		inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
643 						&nexthdr, &frag_off);
644 		if (inner_offset < 0)
645 			goto out;
646 	} else {
647 		inner_offset = sizeof(struct ipv6hdr);
648 	}
649 
650 	/* Checkin header including 8 bytes of inner protocol header. */
651 	if (!pskb_may_pull(skb, inner_offset+8))
652 		goto out;
653 
654 	/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
655 	   Without this we will not able f.e. to make source routed
656 	   pmtu discovery.
657 	   Corresponding argument (opt) to notifiers is already added.
658 	   --ANK (980726)
659 	 */
660 
661 	ipprot = rcu_dereference(inet6_protos[nexthdr]);
662 	if (ipprot && ipprot->err_handler)
663 		ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
664 
665 	raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
666 	return;
667 
668 out:
669 	ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
670 }
671 
672 /*
673  *	Handle icmp messages
674  */
675 
676 static int icmpv6_rcv(struct sk_buff *skb)
677 {
678 	struct net_device *dev = skb->dev;
679 	struct inet6_dev *idev = __in6_dev_get(dev);
680 	const struct in6_addr *saddr, *daddr;
681 	struct icmp6hdr *hdr;
682 	u8 type;
683 	bool success = false;
684 
685 	if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
686 		struct sec_path *sp = skb_sec_path(skb);
687 		int nh;
688 
689 		if (!(sp && sp->xvec[sp->len - 1]->props.flags &
690 				 XFRM_STATE_ICMP))
691 			goto drop_no_count;
692 
693 		if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
694 			goto drop_no_count;
695 
696 		nh = skb_network_offset(skb);
697 		skb_set_network_header(skb, sizeof(*hdr));
698 
699 		if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
700 			goto drop_no_count;
701 
702 		skb_set_network_header(skb, nh);
703 	}
704 
705 	ICMP6_INC_STATS_BH(dev_net(dev), idev, ICMP6_MIB_INMSGS);
706 
707 	saddr = &ipv6_hdr(skb)->saddr;
708 	daddr = &ipv6_hdr(skb)->daddr;
709 
710 	if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
711 		net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
712 				    saddr, daddr);
713 		goto csum_error;
714 	}
715 
716 	if (!pskb_pull(skb, sizeof(*hdr)))
717 		goto discard_it;
718 
719 	hdr = icmp6_hdr(skb);
720 
721 	type = hdr->icmp6_type;
722 
723 	ICMP6MSGIN_INC_STATS_BH(dev_net(dev), idev, type);
724 
725 	switch (type) {
726 	case ICMPV6_ECHO_REQUEST:
727 		icmpv6_echo_reply(skb);
728 		break;
729 
730 	case ICMPV6_ECHO_REPLY:
731 		success = ping_rcv(skb);
732 		break;
733 
734 	case ICMPV6_PKT_TOOBIG:
735 		/* BUGGG_FUTURE: if packet contains rthdr, we cannot update
736 		   standard destination cache. Seems, only "advanced"
737 		   destination cache will allow to solve this problem
738 		   --ANK (980726)
739 		 */
740 		if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
741 			goto discard_it;
742 		hdr = icmp6_hdr(skb);
743 
744 		/*
745 		 *	Drop through to notify
746 		 */
747 
748 	case ICMPV6_DEST_UNREACH:
749 	case ICMPV6_TIME_EXCEED:
750 	case ICMPV6_PARAMPROB:
751 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
752 		break;
753 
754 	case NDISC_ROUTER_SOLICITATION:
755 	case NDISC_ROUTER_ADVERTISEMENT:
756 	case NDISC_NEIGHBOUR_SOLICITATION:
757 	case NDISC_NEIGHBOUR_ADVERTISEMENT:
758 	case NDISC_REDIRECT:
759 		ndisc_rcv(skb);
760 		break;
761 
762 	case ICMPV6_MGM_QUERY:
763 		igmp6_event_query(skb);
764 		break;
765 
766 	case ICMPV6_MGM_REPORT:
767 		igmp6_event_report(skb);
768 		break;
769 
770 	case ICMPV6_MGM_REDUCTION:
771 	case ICMPV6_NI_QUERY:
772 	case ICMPV6_NI_REPLY:
773 	case ICMPV6_MLD2_REPORT:
774 	case ICMPV6_DHAAD_REQUEST:
775 	case ICMPV6_DHAAD_REPLY:
776 	case ICMPV6_MOBILE_PREFIX_SOL:
777 	case ICMPV6_MOBILE_PREFIX_ADV:
778 		break;
779 
780 	default:
781 		/* informational */
782 		if (type & ICMPV6_INFOMSG_MASK)
783 			break;
784 
785 		net_dbg_ratelimited("icmpv6: msg of unknown type\n");
786 
787 		/*
788 		 * error of unknown type.
789 		 * must pass to upper level
790 		 */
791 
792 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
793 	}
794 
795 	/* until the v6 path can be better sorted assume failure and
796 	 * preserve the status quo behaviour for the rest of the paths to here
797 	 */
798 	if (success)
799 		consume_skb(skb);
800 	else
801 		kfree_skb(skb);
802 
803 	return 0;
804 
805 csum_error:
806 	ICMP6_INC_STATS_BH(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
807 discard_it:
808 	ICMP6_INC_STATS_BH(dev_net(dev), idev, ICMP6_MIB_INERRORS);
809 drop_no_count:
810 	kfree_skb(skb);
811 	return 0;
812 }
813 
814 void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
815 		      u8 type,
816 		      const struct in6_addr *saddr,
817 		      const struct in6_addr *daddr,
818 		      int oif)
819 {
820 	memset(fl6, 0, sizeof(*fl6));
821 	fl6->saddr = *saddr;
822 	fl6->daddr = *daddr;
823 	fl6->flowi6_proto	= IPPROTO_ICMPV6;
824 	fl6->fl6_icmp_type	= type;
825 	fl6->fl6_icmp_code	= 0;
826 	fl6->flowi6_oif		= oif;
827 	security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
828 }
829 
830 /*
831  * Special lock-class for __icmpv6_sk:
832  */
833 static struct lock_class_key icmpv6_socket_sk_dst_lock_key;
834 
835 static int __net_init icmpv6_sk_init(struct net *net)
836 {
837 	struct sock *sk;
838 	int err, i, j;
839 
840 	net->ipv6.icmp_sk =
841 		kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
842 	if (net->ipv6.icmp_sk == NULL)
843 		return -ENOMEM;
844 
845 	for_each_possible_cpu(i) {
846 		err = inet_ctl_sock_create(&sk, PF_INET6,
847 					   SOCK_RAW, IPPROTO_ICMPV6, net);
848 		if (err < 0) {
849 			pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
850 			       err);
851 			goto fail;
852 		}
853 
854 		net->ipv6.icmp_sk[i] = sk;
855 
856 		/*
857 		 * Split off their lock-class, because sk->sk_dst_lock
858 		 * gets used from softirqs, which is safe for
859 		 * __icmpv6_sk (because those never get directly used
860 		 * via userspace syscalls), but unsafe for normal sockets.
861 		 */
862 		lockdep_set_class(&sk->sk_dst_lock,
863 				  &icmpv6_socket_sk_dst_lock_key);
864 
865 		/* Enough space for 2 64K ICMP packets, including
866 		 * sk_buff struct overhead.
867 		 */
868 		sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
869 	}
870 	return 0;
871 
872  fail:
873 	for (j = 0; j < i; j++)
874 		inet_ctl_sock_destroy(net->ipv6.icmp_sk[j]);
875 	kfree(net->ipv6.icmp_sk);
876 	return err;
877 }
878 
879 static void __net_exit icmpv6_sk_exit(struct net *net)
880 {
881 	int i;
882 
883 	for_each_possible_cpu(i) {
884 		inet_ctl_sock_destroy(net->ipv6.icmp_sk[i]);
885 	}
886 	kfree(net->ipv6.icmp_sk);
887 }
888 
889 static struct pernet_operations icmpv6_sk_ops = {
890 	.init = icmpv6_sk_init,
891 	.exit = icmpv6_sk_exit,
892 };
893 
894 int __init icmpv6_init(void)
895 {
896 	int err;
897 
898 	err = register_pernet_subsys(&icmpv6_sk_ops);
899 	if (err < 0)
900 		return err;
901 
902 	err = -EAGAIN;
903 	if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
904 		goto fail;
905 
906 	err = inet6_register_icmp_sender(icmp6_send);
907 	if (err)
908 		goto sender_reg_err;
909 	return 0;
910 
911 sender_reg_err:
912 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
913 fail:
914 	pr_err("Failed to register ICMP6 protocol\n");
915 	unregister_pernet_subsys(&icmpv6_sk_ops);
916 	return err;
917 }
918 
919 void icmpv6_cleanup(void)
920 {
921 	inet6_unregister_icmp_sender(icmp6_send);
922 	unregister_pernet_subsys(&icmpv6_sk_ops);
923 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
924 }
925 
926 
927 static const struct icmp6_err {
928 	int err;
929 	int fatal;
930 } tab_unreach[] = {
931 	{	/* NOROUTE */
932 		.err	= ENETUNREACH,
933 		.fatal	= 0,
934 	},
935 	{	/* ADM_PROHIBITED */
936 		.err	= EACCES,
937 		.fatal	= 1,
938 	},
939 	{	/* Was NOT_NEIGHBOUR, now reserved */
940 		.err	= EHOSTUNREACH,
941 		.fatal	= 0,
942 	},
943 	{	/* ADDR_UNREACH	*/
944 		.err	= EHOSTUNREACH,
945 		.fatal	= 0,
946 	},
947 	{	/* PORT_UNREACH	*/
948 		.err	= ECONNREFUSED,
949 		.fatal	= 1,
950 	},
951 	{	/* POLICY_FAIL */
952 		.err	= EACCES,
953 		.fatal	= 1,
954 	},
955 	{	/* REJECT_ROUTE	*/
956 		.err	= EACCES,
957 		.fatal	= 1,
958 	},
959 };
960 
961 int icmpv6_err_convert(u8 type, u8 code, int *err)
962 {
963 	int fatal = 0;
964 
965 	*err = EPROTO;
966 
967 	switch (type) {
968 	case ICMPV6_DEST_UNREACH:
969 		fatal = 1;
970 		if (code < ARRAY_SIZE(tab_unreach)) {
971 			*err  = tab_unreach[code].err;
972 			fatal = tab_unreach[code].fatal;
973 		}
974 		break;
975 
976 	case ICMPV6_PKT_TOOBIG:
977 		*err = EMSGSIZE;
978 		break;
979 
980 	case ICMPV6_PARAMPROB:
981 		*err = EPROTO;
982 		fatal = 1;
983 		break;
984 
985 	case ICMPV6_TIME_EXCEED:
986 		*err = EHOSTUNREACH;
987 		break;
988 	}
989 
990 	return fatal;
991 }
992 EXPORT_SYMBOL(icmpv6_err_convert);
993 
994 #ifdef CONFIG_SYSCTL
995 static struct ctl_table ipv6_icmp_table_template[] = {
996 	{
997 		.procname	= "ratelimit",
998 		.data		= &init_net.ipv6.sysctl.icmpv6_time,
999 		.maxlen		= sizeof(int),
1000 		.mode		= 0644,
1001 		.proc_handler	= proc_dointvec_ms_jiffies,
1002 	},
1003 	{ },
1004 };
1005 
1006 struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
1007 {
1008 	struct ctl_table *table;
1009 
1010 	table = kmemdup(ipv6_icmp_table_template,
1011 			sizeof(ipv6_icmp_table_template),
1012 			GFP_KERNEL);
1013 
1014 	if (table)
1015 		table[0].data = &net->ipv6.sysctl.icmpv6_time;
1016 
1017 	return table;
1018 }
1019 #endif
1020