xref: /openbmc/linux/net/ipv6/icmp.c (revision 64d85cc9)
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 inline struct sock *icmpv6_sk(struct net *net)
79 {
80 	return *this_cpu_ptr(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 /*
233  *	an inline helper for the "simple" if statement below
234  *	checks if parameter problem report is caused by an
235  *	unrecognized IPv6 option that has the Option Type
236  *	highest-order two bits set to 10
237  */
238 
239 static bool opt_unrec(struct sk_buff *skb, __u32 offset)
240 {
241 	u8 _optval, *op;
242 
243 	offset += skb_network_offset(skb);
244 	op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
245 	if (!op)
246 		return true;
247 	return (*op & 0xC0) == 0x80;
248 }
249 
250 void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
251 				struct icmp6hdr *thdr, int len)
252 {
253 	struct sk_buff *skb;
254 	struct icmp6hdr *icmp6h;
255 
256 	skb = skb_peek(&sk->sk_write_queue);
257 	if (!skb)
258 		return;
259 
260 	icmp6h = icmp6_hdr(skb);
261 	memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
262 	icmp6h->icmp6_cksum = 0;
263 
264 	if (skb_queue_len(&sk->sk_write_queue) == 1) {
265 		skb->csum = csum_partial(icmp6h,
266 					sizeof(struct icmp6hdr), skb->csum);
267 		icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
268 						      &fl6->daddr,
269 						      len, fl6->flowi6_proto,
270 						      skb->csum);
271 	} else {
272 		__wsum tmp_csum = 0;
273 
274 		skb_queue_walk(&sk->sk_write_queue, skb) {
275 			tmp_csum = csum_add(tmp_csum, skb->csum);
276 		}
277 
278 		tmp_csum = csum_partial(icmp6h,
279 					sizeof(struct icmp6hdr), tmp_csum);
280 		icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
281 						      &fl6->daddr,
282 						      len, fl6->flowi6_proto,
283 						      tmp_csum);
284 	}
285 	ip6_push_pending_frames(sk);
286 }
287 
288 struct icmpv6_msg {
289 	struct sk_buff	*skb;
290 	int		offset;
291 	uint8_t		type;
292 };
293 
294 static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
295 {
296 	struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
297 	struct sk_buff *org_skb = msg->skb;
298 	__wsum csum = 0;
299 
300 	csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
301 				      to, len, csum);
302 	skb->csum = csum_block_add(skb->csum, csum, odd);
303 	if (!(msg->type & ICMPV6_INFOMSG_MASK))
304 		nf_ct_attach(skb, org_skb);
305 	return 0;
306 }
307 
308 #if IS_ENABLED(CONFIG_IPV6_MIP6)
309 static void mip6_addr_swap(struct sk_buff *skb)
310 {
311 	struct ipv6hdr *iph = ipv6_hdr(skb);
312 	struct inet6_skb_parm *opt = IP6CB(skb);
313 	struct ipv6_destopt_hao *hao;
314 	struct in6_addr tmp;
315 	int off;
316 
317 	if (opt->dsthao) {
318 		off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
319 		if (likely(off >= 0)) {
320 			hao = (struct ipv6_destopt_hao *)
321 					(skb_network_header(skb) + off);
322 			tmp = iph->saddr;
323 			iph->saddr = hao->addr;
324 			hao->addr = tmp;
325 		}
326 	}
327 }
328 #else
329 static inline void mip6_addr_swap(struct sk_buff *skb) {}
330 #endif
331 
332 static struct dst_entry *icmpv6_route_lookup(struct net *net,
333 					     struct sk_buff *skb,
334 					     struct sock *sk,
335 					     struct flowi6 *fl6)
336 {
337 	struct dst_entry *dst, *dst2;
338 	struct flowi6 fl2;
339 	int err;
340 
341 	err = ip6_dst_lookup(net, sk, &dst, fl6);
342 	if (err)
343 		return ERR_PTR(err);
344 
345 	/*
346 	 * We won't send icmp if the destination is known
347 	 * anycast.
348 	 */
349 	if (ipv6_anycast_destination(dst, &fl6->daddr)) {
350 		net_dbg_ratelimited("icmp6_send: acast source\n");
351 		dst_release(dst);
352 		return ERR_PTR(-EINVAL);
353 	}
354 
355 	/* No need to clone since we're just using its address. */
356 	dst2 = dst;
357 
358 	dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
359 	if (!IS_ERR(dst)) {
360 		if (dst != dst2)
361 			return dst;
362 	} else {
363 		if (PTR_ERR(dst) == -EPERM)
364 			dst = NULL;
365 		else
366 			return dst;
367 	}
368 
369 	err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
370 	if (err)
371 		goto relookup_failed;
372 
373 	err = ip6_dst_lookup(net, sk, &dst2, &fl2);
374 	if (err)
375 		goto relookup_failed;
376 
377 	dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
378 	if (!IS_ERR(dst2)) {
379 		dst_release(dst);
380 		dst = dst2;
381 	} else {
382 		err = PTR_ERR(dst2);
383 		if (err == -EPERM) {
384 			dst_release(dst);
385 			return dst2;
386 		} else
387 			goto relookup_failed;
388 	}
389 
390 relookup_failed:
391 	if (dst)
392 		return dst;
393 	return ERR_PTR(err);
394 }
395 
396 static int icmp6_iif(const struct sk_buff *skb)
397 {
398 	int iif = skb->dev->ifindex;
399 
400 	/* for local traffic to local address, skb dev is the loopback
401 	 * device. Check if there is a dst attached to the skb and if so
402 	 * get the real device index. Same is needed for replies to a link
403 	 * local address on a device enslaved to an L3 master device
404 	 */
405 	if (unlikely(iif == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
406 		const struct rt6_info *rt6 = skb_rt6_info(skb);
407 
408 		if (rt6)
409 			iif = rt6->rt6i_idev->dev->ifindex;
410 	}
411 
412 	return iif;
413 }
414 
415 /*
416  *	Send an ICMP message in response to a packet in error
417  */
418 static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
419 		       const struct in6_addr *force_saddr)
420 {
421 	struct inet6_dev *idev = NULL;
422 	struct ipv6hdr *hdr = ipv6_hdr(skb);
423 	struct sock *sk;
424 	struct net *net;
425 	struct ipv6_pinfo *np;
426 	const struct in6_addr *saddr = NULL;
427 	struct dst_entry *dst;
428 	struct icmp6hdr tmp_hdr;
429 	struct flowi6 fl6;
430 	struct icmpv6_msg msg;
431 	struct ipcm6_cookie ipc6;
432 	int iif = 0;
433 	int addr_type = 0;
434 	int len;
435 	u32 mark;
436 
437 	if ((u8 *)hdr < skb->head ||
438 	    (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
439 		return;
440 
441 	if (!skb->dev)
442 		return;
443 	net = dev_net(skb->dev);
444 	mark = IP6_REPLY_MARK(net, skb->mark);
445 	/*
446 	 *	Make sure we respect the rules
447 	 *	i.e. RFC 1885 2.4(e)
448 	 *	Rule (e.1) is enforced by not using icmp6_send
449 	 *	in any code that processes icmp errors.
450 	 */
451 	addr_type = ipv6_addr_type(&hdr->daddr);
452 
453 	if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
454 	    ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
455 		saddr = &hdr->daddr;
456 
457 	/*
458 	 *	Dest addr check
459 	 */
460 
461 	if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
462 		if (type != ICMPV6_PKT_TOOBIG &&
463 		    !(type == ICMPV6_PARAMPROB &&
464 		      code == ICMPV6_UNK_OPTION &&
465 		      (opt_unrec(skb, info))))
466 			return;
467 
468 		saddr = NULL;
469 	}
470 
471 	addr_type = ipv6_addr_type(&hdr->saddr);
472 
473 	/*
474 	 *	Source addr check
475 	 */
476 
477 	if (__ipv6_addr_needs_scope_id(addr_type)) {
478 		iif = icmp6_iif(skb);
479 	} else {
480 		dst = skb_dst(skb);
481 		iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
482 	}
483 
484 	/*
485 	 *	Must not send error if the source does not uniquely
486 	 *	identify a single node (RFC2463 Section 2.4).
487 	 *	We check unspecified / multicast addresses here,
488 	 *	and anycast addresses will be checked later.
489 	 */
490 	if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
491 		net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
492 				    &hdr->saddr, &hdr->daddr);
493 		return;
494 	}
495 
496 	/*
497 	 *	Never answer to a ICMP packet.
498 	 */
499 	if (is_ineligible(skb)) {
500 		net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
501 				    &hdr->saddr, &hdr->daddr);
502 		return;
503 	}
504 
505 	/* Needed by both icmp_global_allow and icmpv6_xmit_lock */
506 	local_bh_disable();
507 
508 	/* Check global sysctl_icmp_msgs_per_sec ratelimit */
509 	if (!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, type))
510 		goto out_bh_enable;
511 
512 	mip6_addr_swap(skb);
513 
514 	memset(&fl6, 0, sizeof(fl6));
515 	fl6.flowi6_proto = IPPROTO_ICMPV6;
516 	fl6.daddr = hdr->saddr;
517 	if (force_saddr)
518 		saddr = force_saddr;
519 	if (saddr)
520 		fl6.saddr = *saddr;
521 	fl6.flowi6_mark = mark;
522 	fl6.flowi6_oif = iif;
523 	fl6.fl6_icmp_type = type;
524 	fl6.fl6_icmp_code = code;
525 	fl6.flowi6_uid = sock_net_uid(net, NULL);
526 	fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL);
527 	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
528 
529 	sk = icmpv6_xmit_lock(net);
530 	if (!sk)
531 		goto out_bh_enable;
532 
533 	sk->sk_mark = mark;
534 	np = inet6_sk(sk);
535 
536 	if (!icmpv6_xrlim_allow(sk, type, &fl6))
537 		goto out;
538 
539 	tmp_hdr.icmp6_type = type;
540 	tmp_hdr.icmp6_code = code;
541 	tmp_hdr.icmp6_cksum = 0;
542 	tmp_hdr.icmp6_pointer = htonl(info);
543 
544 	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
545 		fl6.flowi6_oif = np->mcast_oif;
546 	else if (!fl6.flowi6_oif)
547 		fl6.flowi6_oif = np->ucast_oif;
548 
549 	ipcm6_init_sk(&ipc6, np);
550 	fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
551 
552 	dst = icmpv6_route_lookup(net, skb, sk, &fl6);
553 	if (IS_ERR(dst))
554 		goto out;
555 
556 	ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
557 
558 	msg.skb = skb;
559 	msg.offset = skb_network_offset(skb);
560 	msg.type = type;
561 
562 	len = skb->len - msg.offset;
563 	len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
564 	if (len < 0) {
565 		net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
566 				    &hdr->saddr, &hdr->daddr);
567 		goto out_dst_release;
568 	}
569 
570 	rcu_read_lock();
571 	idev = __in6_dev_get(skb->dev);
572 
573 	if (ip6_append_data(sk, icmpv6_getfrag, &msg,
574 			    len + sizeof(struct icmp6hdr),
575 			    sizeof(struct icmp6hdr),
576 			    &ipc6, &fl6, (struct rt6_info *)dst,
577 			    MSG_DONTWAIT)) {
578 		ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
579 		ip6_flush_pending_frames(sk);
580 	} else {
581 		icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
582 					   len + sizeof(struct icmp6hdr));
583 	}
584 	rcu_read_unlock();
585 out_dst_release:
586 	dst_release(dst);
587 out:
588 	icmpv6_xmit_unlock(sk);
589 out_bh_enable:
590 	local_bh_enable();
591 }
592 
593 /* Slightly more convenient version of icmp6_send.
594  */
595 void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
596 {
597 	icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL);
598 	kfree_skb(skb);
599 }
600 
601 /* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
602  * if sufficient data bytes are available
603  * @nhs is the size of the tunnel header(s) :
604  *  Either an IPv4 header for SIT encap
605  *         an IPv4 header + GRE header for GRE encap
606  */
607 int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
608 			       unsigned int data_len)
609 {
610 	struct in6_addr temp_saddr;
611 	struct rt6_info *rt;
612 	struct sk_buff *skb2;
613 	u32 info = 0;
614 
615 	if (!pskb_may_pull(skb, nhs + sizeof(struct ipv6hdr) + 8))
616 		return 1;
617 
618 	/* RFC 4884 (partial) support for ICMP extensions */
619 	if (data_len < 128 || (data_len & 7) || skb->len < data_len)
620 		data_len = 0;
621 
622 	skb2 = data_len ? skb_copy(skb, GFP_ATOMIC) : skb_clone(skb, GFP_ATOMIC);
623 
624 	if (!skb2)
625 		return 1;
626 
627 	skb_dst_drop(skb2);
628 	skb_pull(skb2, nhs);
629 	skb_reset_network_header(skb2);
630 
631 	rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0,
632 			skb, 0);
633 
634 	if (rt && rt->dst.dev)
635 		skb2->dev = rt->dst.dev;
636 
637 	ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, &temp_saddr);
638 
639 	if (data_len) {
640 		/* RFC 4884 (partial) support :
641 		 * insert 0 padding at the end, before the extensions
642 		 */
643 		__skb_push(skb2, nhs);
644 		skb_reset_network_header(skb2);
645 		memmove(skb2->data, skb2->data + nhs, data_len - nhs);
646 		memset(skb2->data + data_len - nhs, 0, nhs);
647 		/* RFC 4884 4.5 : Length is measured in 64-bit words,
648 		 * and stored in reserved[0]
649 		 */
650 		info = (data_len/8) << 24;
651 	}
652 	if (type == ICMP_TIME_EXCEEDED)
653 		icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
654 			   info, &temp_saddr);
655 	else
656 		icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
657 			   info, &temp_saddr);
658 	if (rt)
659 		ip6_rt_put(rt);
660 
661 	kfree_skb(skb2);
662 
663 	return 0;
664 }
665 EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
666 
667 static void icmpv6_echo_reply(struct sk_buff *skb)
668 {
669 	struct net *net = dev_net(skb->dev);
670 	struct sock *sk;
671 	struct inet6_dev *idev;
672 	struct ipv6_pinfo *np;
673 	const struct in6_addr *saddr = NULL;
674 	struct icmp6hdr *icmph = icmp6_hdr(skb);
675 	struct icmp6hdr tmp_hdr;
676 	struct flowi6 fl6;
677 	struct icmpv6_msg msg;
678 	struct dst_entry *dst;
679 	struct ipcm6_cookie ipc6;
680 	u32 mark = IP6_REPLY_MARK(net, skb->mark);
681 	bool acast;
682 
683 	if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) &&
684 	    net->ipv6.sysctl.icmpv6_echo_ignore_multicast)
685 		return;
686 
687 	saddr = &ipv6_hdr(skb)->daddr;
688 
689 	acast = ipv6_anycast_destination(skb_dst(skb), saddr);
690 	if (acast && net->ipv6.sysctl.icmpv6_echo_ignore_anycast)
691 		return;
692 
693 	if (!ipv6_unicast_destination(skb) &&
694 	    !(net->ipv6.sysctl.anycast_src_echo_reply && acast))
695 		saddr = NULL;
696 
697 	memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
698 	tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
699 
700 	memset(&fl6, 0, sizeof(fl6));
701 	fl6.flowi6_proto = IPPROTO_ICMPV6;
702 	fl6.daddr = ipv6_hdr(skb)->saddr;
703 	if (saddr)
704 		fl6.saddr = *saddr;
705 	fl6.flowi6_oif = icmp6_iif(skb);
706 	fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
707 	fl6.flowi6_mark = mark;
708 	fl6.flowi6_uid = sock_net_uid(net, NULL);
709 	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
710 
711 	local_bh_disable();
712 	sk = icmpv6_xmit_lock(net);
713 	if (!sk)
714 		goto out_bh_enable;
715 	sk->sk_mark = mark;
716 	np = inet6_sk(sk);
717 
718 	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
719 		fl6.flowi6_oif = np->mcast_oif;
720 	else if (!fl6.flowi6_oif)
721 		fl6.flowi6_oif = np->ucast_oif;
722 
723 	if (ip6_dst_lookup(net, sk, &dst, &fl6))
724 		goto out;
725 	dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
726 	if (IS_ERR(dst))
727 		goto out;
728 
729 	/* Check the ratelimit */
730 	if ((!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, ICMPV6_ECHO_REPLY)) ||
731 	    !icmpv6_xrlim_allow(sk, ICMPV6_ECHO_REPLY, &fl6))
732 		goto out_dst_release;
733 
734 	idev = __in6_dev_get(skb->dev);
735 
736 	msg.skb = skb;
737 	msg.offset = 0;
738 	msg.type = ICMPV6_ECHO_REPLY;
739 
740 	ipcm6_init_sk(&ipc6, np);
741 	ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
742 	ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
743 
744 	if (ip6_append_data(sk, icmpv6_getfrag, &msg,
745 			    skb->len + sizeof(struct icmp6hdr),
746 			    sizeof(struct icmp6hdr), &ipc6, &fl6,
747 			    (struct rt6_info *)dst, MSG_DONTWAIT)) {
748 		__ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
749 		ip6_flush_pending_frames(sk);
750 	} else {
751 		icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
752 					   skb->len + sizeof(struct icmp6hdr));
753 	}
754 out_dst_release:
755 	dst_release(dst);
756 out:
757 	icmpv6_xmit_unlock(sk);
758 out_bh_enable:
759 	local_bh_enable();
760 }
761 
762 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
763 {
764 	const struct inet6_protocol *ipprot;
765 	int inner_offset;
766 	__be16 frag_off;
767 	u8 nexthdr;
768 	struct net *net = dev_net(skb->dev);
769 
770 	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
771 		goto out;
772 
773 	nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
774 	if (ipv6_ext_hdr(nexthdr)) {
775 		/* now skip over extension headers */
776 		inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
777 						&nexthdr, &frag_off);
778 		if (inner_offset < 0)
779 			goto out;
780 	} else {
781 		inner_offset = sizeof(struct ipv6hdr);
782 	}
783 
784 	/* Checkin header including 8 bytes of inner protocol header. */
785 	if (!pskb_may_pull(skb, inner_offset+8))
786 		goto out;
787 
788 	/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
789 	   Without this we will not able f.e. to make source routed
790 	   pmtu discovery.
791 	   Corresponding argument (opt) to notifiers is already added.
792 	   --ANK (980726)
793 	 */
794 
795 	ipprot = rcu_dereference(inet6_protos[nexthdr]);
796 	if (ipprot && ipprot->err_handler)
797 		ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
798 
799 	raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
800 	return;
801 
802 out:
803 	__ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
804 }
805 
806 /*
807  *	Handle icmp messages
808  */
809 
810 static int icmpv6_rcv(struct sk_buff *skb)
811 {
812 	struct net *net = dev_net(skb->dev);
813 	struct net_device *dev = skb->dev;
814 	struct inet6_dev *idev = __in6_dev_get(dev);
815 	const struct in6_addr *saddr, *daddr;
816 	struct icmp6hdr *hdr;
817 	u8 type;
818 	bool success = false;
819 
820 	if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
821 		struct sec_path *sp = skb_sec_path(skb);
822 		int nh;
823 
824 		if (!(sp && sp->xvec[sp->len - 1]->props.flags &
825 				 XFRM_STATE_ICMP))
826 			goto drop_no_count;
827 
828 		if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
829 			goto drop_no_count;
830 
831 		nh = skb_network_offset(skb);
832 		skb_set_network_header(skb, sizeof(*hdr));
833 
834 		if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
835 			goto drop_no_count;
836 
837 		skb_set_network_header(skb, nh);
838 	}
839 
840 	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
841 
842 	saddr = &ipv6_hdr(skb)->saddr;
843 	daddr = &ipv6_hdr(skb)->daddr;
844 
845 	if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
846 		net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
847 				    saddr, daddr);
848 		goto csum_error;
849 	}
850 
851 	if (!pskb_pull(skb, sizeof(*hdr)))
852 		goto discard_it;
853 
854 	hdr = icmp6_hdr(skb);
855 
856 	type = hdr->icmp6_type;
857 
858 	ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
859 
860 	switch (type) {
861 	case ICMPV6_ECHO_REQUEST:
862 		if (!net->ipv6.sysctl.icmpv6_echo_ignore_all)
863 			icmpv6_echo_reply(skb);
864 		break;
865 
866 	case ICMPV6_ECHO_REPLY:
867 		success = ping_rcv(skb);
868 		break;
869 
870 	case ICMPV6_PKT_TOOBIG:
871 		/* BUGGG_FUTURE: if packet contains rthdr, we cannot update
872 		   standard destination cache. Seems, only "advanced"
873 		   destination cache will allow to solve this problem
874 		   --ANK (980726)
875 		 */
876 		if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
877 			goto discard_it;
878 		hdr = icmp6_hdr(skb);
879 
880 		/* to notify */
881 		/* fall through */
882 	case ICMPV6_DEST_UNREACH:
883 	case ICMPV6_TIME_EXCEED:
884 	case ICMPV6_PARAMPROB:
885 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
886 		break;
887 
888 	case NDISC_ROUTER_SOLICITATION:
889 	case NDISC_ROUTER_ADVERTISEMENT:
890 	case NDISC_NEIGHBOUR_SOLICITATION:
891 	case NDISC_NEIGHBOUR_ADVERTISEMENT:
892 	case NDISC_REDIRECT:
893 		ndisc_rcv(skb);
894 		break;
895 
896 	case ICMPV6_MGM_QUERY:
897 		igmp6_event_query(skb);
898 		break;
899 
900 	case ICMPV6_MGM_REPORT:
901 		igmp6_event_report(skb);
902 		break;
903 
904 	case ICMPV6_MGM_REDUCTION:
905 	case ICMPV6_NI_QUERY:
906 	case ICMPV6_NI_REPLY:
907 	case ICMPV6_MLD2_REPORT:
908 	case ICMPV6_DHAAD_REQUEST:
909 	case ICMPV6_DHAAD_REPLY:
910 	case ICMPV6_MOBILE_PREFIX_SOL:
911 	case ICMPV6_MOBILE_PREFIX_ADV:
912 		break;
913 
914 	default:
915 		/* informational */
916 		if (type & ICMPV6_INFOMSG_MASK)
917 			break;
918 
919 		net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
920 				    saddr, daddr);
921 
922 		/*
923 		 * error of unknown type.
924 		 * must pass to upper level
925 		 */
926 
927 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
928 	}
929 
930 	/* until the v6 path can be better sorted assume failure and
931 	 * preserve the status quo behaviour for the rest of the paths to here
932 	 */
933 	if (success)
934 		consume_skb(skb);
935 	else
936 		kfree_skb(skb);
937 
938 	return 0;
939 
940 csum_error:
941 	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
942 discard_it:
943 	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
944 drop_no_count:
945 	kfree_skb(skb);
946 	return 0;
947 }
948 
949 void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
950 		      u8 type,
951 		      const struct in6_addr *saddr,
952 		      const struct in6_addr *daddr,
953 		      int oif)
954 {
955 	memset(fl6, 0, sizeof(*fl6));
956 	fl6->saddr = *saddr;
957 	fl6->daddr = *daddr;
958 	fl6->flowi6_proto	= IPPROTO_ICMPV6;
959 	fl6->fl6_icmp_type	= type;
960 	fl6->fl6_icmp_code	= 0;
961 	fl6->flowi6_oif		= oif;
962 	security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
963 }
964 
965 static void __net_exit icmpv6_sk_exit(struct net *net)
966 {
967 	int i;
968 
969 	for_each_possible_cpu(i)
970 		inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv6.icmp_sk, i));
971 	free_percpu(net->ipv6.icmp_sk);
972 }
973 
974 static int __net_init icmpv6_sk_init(struct net *net)
975 {
976 	struct sock *sk;
977 	int err, i;
978 
979 	net->ipv6.icmp_sk = alloc_percpu(struct sock *);
980 	if (!net->ipv6.icmp_sk)
981 		return -ENOMEM;
982 
983 	for_each_possible_cpu(i) {
984 		err = inet_ctl_sock_create(&sk, PF_INET6,
985 					   SOCK_RAW, IPPROTO_ICMPV6, net);
986 		if (err < 0) {
987 			pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
988 			       err);
989 			goto fail;
990 		}
991 
992 		*per_cpu_ptr(net->ipv6.icmp_sk, i) = sk;
993 
994 		/* Enough space for 2 64K ICMP packets, including
995 		 * sk_buff struct overhead.
996 		 */
997 		sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
998 	}
999 	return 0;
1000 
1001  fail:
1002 	icmpv6_sk_exit(net);
1003 	return err;
1004 }
1005 
1006 static struct pernet_operations icmpv6_sk_ops = {
1007 	.init = icmpv6_sk_init,
1008 	.exit = icmpv6_sk_exit,
1009 };
1010 
1011 int __init icmpv6_init(void)
1012 {
1013 	int err;
1014 
1015 	err = register_pernet_subsys(&icmpv6_sk_ops);
1016 	if (err < 0)
1017 		return err;
1018 
1019 	err = -EAGAIN;
1020 	if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1021 		goto fail;
1022 
1023 	err = inet6_register_icmp_sender(icmp6_send);
1024 	if (err)
1025 		goto sender_reg_err;
1026 	return 0;
1027 
1028 sender_reg_err:
1029 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1030 fail:
1031 	pr_err("Failed to register ICMP6 protocol\n");
1032 	unregister_pernet_subsys(&icmpv6_sk_ops);
1033 	return err;
1034 }
1035 
1036 void icmpv6_cleanup(void)
1037 {
1038 	inet6_unregister_icmp_sender(icmp6_send);
1039 	unregister_pernet_subsys(&icmpv6_sk_ops);
1040 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1041 }
1042 
1043 
1044 static const struct icmp6_err {
1045 	int err;
1046 	int fatal;
1047 } tab_unreach[] = {
1048 	{	/* NOROUTE */
1049 		.err	= ENETUNREACH,
1050 		.fatal	= 0,
1051 	},
1052 	{	/* ADM_PROHIBITED */
1053 		.err	= EACCES,
1054 		.fatal	= 1,
1055 	},
1056 	{	/* Was NOT_NEIGHBOUR, now reserved */
1057 		.err	= EHOSTUNREACH,
1058 		.fatal	= 0,
1059 	},
1060 	{	/* ADDR_UNREACH	*/
1061 		.err	= EHOSTUNREACH,
1062 		.fatal	= 0,
1063 	},
1064 	{	/* PORT_UNREACH	*/
1065 		.err	= ECONNREFUSED,
1066 		.fatal	= 1,
1067 	},
1068 	{	/* POLICY_FAIL */
1069 		.err	= EACCES,
1070 		.fatal	= 1,
1071 	},
1072 	{	/* REJECT_ROUTE	*/
1073 		.err	= EACCES,
1074 		.fatal	= 1,
1075 	},
1076 };
1077 
1078 int icmpv6_err_convert(u8 type, u8 code, int *err)
1079 {
1080 	int fatal = 0;
1081 
1082 	*err = EPROTO;
1083 
1084 	switch (type) {
1085 	case ICMPV6_DEST_UNREACH:
1086 		fatal = 1;
1087 		if (code < ARRAY_SIZE(tab_unreach)) {
1088 			*err  = tab_unreach[code].err;
1089 			fatal = tab_unreach[code].fatal;
1090 		}
1091 		break;
1092 
1093 	case ICMPV6_PKT_TOOBIG:
1094 		*err = EMSGSIZE;
1095 		break;
1096 
1097 	case ICMPV6_PARAMPROB:
1098 		*err = EPROTO;
1099 		fatal = 1;
1100 		break;
1101 
1102 	case ICMPV6_TIME_EXCEED:
1103 		*err = EHOSTUNREACH;
1104 		break;
1105 	}
1106 
1107 	return fatal;
1108 }
1109 EXPORT_SYMBOL(icmpv6_err_convert);
1110 
1111 #ifdef CONFIG_SYSCTL
1112 static struct ctl_table ipv6_icmp_table_template[] = {
1113 	{
1114 		.procname	= "ratelimit",
1115 		.data		= &init_net.ipv6.sysctl.icmpv6_time,
1116 		.maxlen		= sizeof(int),
1117 		.mode		= 0644,
1118 		.proc_handler	= proc_dointvec_ms_jiffies,
1119 	},
1120 	{
1121 		.procname	= "echo_ignore_all",
1122 		.data		= &init_net.ipv6.sysctl.icmpv6_echo_ignore_all,
1123 		.maxlen		= sizeof(int),
1124 		.mode		= 0644,
1125 		.proc_handler = proc_dointvec,
1126 	},
1127 	{
1128 		.procname	= "echo_ignore_multicast",
1129 		.data		= &init_net.ipv6.sysctl.icmpv6_echo_ignore_multicast,
1130 		.maxlen		= sizeof(int),
1131 		.mode		= 0644,
1132 		.proc_handler = proc_dointvec,
1133 	},
1134 	{
1135 		.procname	= "echo_ignore_anycast",
1136 		.data		= &init_net.ipv6.sysctl.icmpv6_echo_ignore_anycast,
1137 		.maxlen		= sizeof(int),
1138 		.mode		= 0644,
1139 		.proc_handler = proc_dointvec,
1140 	},
1141 	{
1142 		.procname	= "ratemask",
1143 		.data		= &init_net.ipv6.sysctl.icmpv6_ratemask_ptr,
1144 		.maxlen		= ICMPV6_MSG_MAX + 1,
1145 		.mode		= 0644,
1146 		.proc_handler = proc_do_large_bitmap,
1147 	},
1148 	{ },
1149 };
1150 
1151 struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
1152 {
1153 	struct ctl_table *table;
1154 
1155 	table = kmemdup(ipv6_icmp_table_template,
1156 			sizeof(ipv6_icmp_table_template),
1157 			GFP_KERNEL);
1158 
1159 	if (table) {
1160 		table[0].data = &net->ipv6.sysctl.icmpv6_time;
1161 		table[1].data = &net->ipv6.sysctl.icmpv6_echo_ignore_all;
1162 		table[2].data = &net->ipv6.sysctl.icmpv6_echo_ignore_multicast;
1163 		table[3].data = &net->ipv6.sysctl.icmpv6_echo_ignore_anycast;
1164 		table[4].data = &net->ipv6.sysctl.icmpv6_ratemask_ptr;
1165 	}
1166 	return table;
1167 }
1168 #endif
1169