xref: /openbmc/linux/net/ipv6/icmp.c (revision 93dc544c)
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 #include <linux/module.h>
33 #include <linux/errno.h>
34 #include <linux/types.h>
35 #include <linux/socket.h>
36 #include <linux/in.h>
37 #include <linux/kernel.h>
38 #include <linux/sockios.h>
39 #include <linux/net.h>
40 #include <linux/skbuff.h>
41 #include <linux/init.h>
42 #include <linux/netfilter.h>
43 
44 #ifdef CONFIG_SYSCTL
45 #include <linux/sysctl.h>
46 #endif
47 
48 #include <linux/inet.h>
49 #include <linux/netdevice.h>
50 #include <linux/icmpv6.h>
51 
52 #include <net/ip.h>
53 #include <net/sock.h>
54 
55 #include <net/ipv6.h>
56 #include <net/ip6_checksum.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 
67 #include <asm/uaccess.h>
68 #include <asm/system.h>
69 
70 DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics) __read_mostly;
71 EXPORT_SYMBOL(icmpv6_statistics);
72 DEFINE_SNMP_STAT(struct icmpv6msg_mib, icmpv6msg_statistics) __read_mostly;
73 EXPORT_SYMBOL(icmpv6msg_statistics);
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 int icmpv6_rcv(struct sk_buff *skb);
88 
89 static struct inet6_protocol icmpv6_protocol = {
90 	.handler	=	icmpv6_rcv,
91 	.flags		=	INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
92 };
93 
94 static __inline__ int icmpv6_xmit_lock(struct sock *sk)
95 {
96 	local_bh_disable();
97 
98 	if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
99 		/* This can happen if the output path (f.e. SIT or
100 		 * ip6ip6 tunnel) signals dst_link_failure() for an
101 		 * outgoing ICMP6 packet.
102 		 */
103 		local_bh_enable();
104 		return 1;
105 	}
106 	return 0;
107 }
108 
109 static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
110 {
111 	spin_unlock_bh(&sk->sk_lock.slock);
112 }
113 
114 /*
115  * Slightly more convenient version of icmpv6_send.
116  */
117 void icmpv6_param_prob(struct sk_buff *skb, int code, int pos)
118 {
119 	icmpv6_send(skb, ICMPV6_PARAMPROB, code, pos, skb->dev);
120 	kfree_skb(skb);
121 }
122 
123 /*
124  * Figure out, may we reply to this packet with icmp error.
125  *
126  * We do not reply, if:
127  *	- it was icmp error message.
128  *	- it is truncated, so that it is known, that protocol is ICMPV6
129  *	  (i.e. in the middle of some exthdr)
130  *
131  *	--ANK (980726)
132  */
133 
134 static int is_ineligible(struct sk_buff *skb)
135 {
136 	int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data;
137 	int len = skb->len - ptr;
138 	__u8 nexthdr = ipv6_hdr(skb)->nexthdr;
139 
140 	if (len < 0)
141 		return 1;
142 
143 	ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr);
144 	if (ptr < 0)
145 		return 0;
146 	if (nexthdr == IPPROTO_ICMPV6) {
147 		u8 _type, *tp;
148 		tp = skb_header_pointer(skb,
149 			ptr+offsetof(struct icmp6hdr, icmp6_type),
150 			sizeof(_type), &_type);
151 		if (tp == NULL ||
152 		    !(*tp & ICMPV6_INFOMSG_MASK))
153 			return 1;
154 	}
155 	return 0;
156 }
157 
158 /*
159  * Check the ICMP output rate limit
160  */
161 static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
162 				     struct flowi *fl)
163 {
164 	struct dst_entry *dst;
165 	struct net *net = sock_net(sk);
166 	int res = 0;
167 
168 	/* Informational messages are not limited. */
169 	if (type & ICMPV6_INFOMSG_MASK)
170 		return 1;
171 
172 	/* Do not limit pmtu discovery, it would break it. */
173 	if (type == ICMPV6_PKT_TOOBIG)
174 		return 1;
175 
176 	/*
177 	 * Look up the output route.
178 	 * XXX: perhaps the expire for routing entries cloned by
179 	 * this lookup should be more aggressive (not longer than timeout).
180 	 */
181 	dst = ip6_route_output(net, sk, fl);
182 	if (dst->error) {
183 		IP6_INC_STATS(ip6_dst_idev(dst),
184 			      IPSTATS_MIB_OUTNOROUTES);
185 	} else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) {
186 		res = 1;
187 	} else {
188 		struct rt6_info *rt = (struct rt6_info *)dst;
189 		int tmo = net->ipv6.sysctl.icmpv6_time;
190 
191 		/* Give more bandwidth to wider prefixes. */
192 		if (rt->rt6i_dst.plen < 128)
193 			tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
194 
195 		res = xrlim_allow(dst, tmo);
196 	}
197 	dst_release(dst);
198 	return res;
199 }
200 
201 /*
202  *	an inline helper for the "simple" if statement below
203  *	checks if parameter problem report is caused by an
204  *	unrecognized IPv6 option that has the Option Type
205  *	highest-order two bits set to 10
206  */
207 
208 static __inline__ int opt_unrec(struct sk_buff *skb, __u32 offset)
209 {
210 	u8 _optval, *op;
211 
212 	offset += skb_network_offset(skb);
213 	op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
214 	if (op == NULL)
215 		return 1;
216 	return (*op & 0xC0) == 0x80;
217 }
218 
219 static int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct icmp6hdr *thdr, int len)
220 {
221 	struct sk_buff *skb;
222 	struct icmp6hdr *icmp6h;
223 	int err = 0;
224 
225 	if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
226 		goto out;
227 
228 	icmp6h = icmp6_hdr(skb);
229 	memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
230 	icmp6h->icmp6_cksum = 0;
231 
232 	if (skb_queue_len(&sk->sk_write_queue) == 1) {
233 		skb->csum = csum_partial((char *)icmp6h,
234 					sizeof(struct icmp6hdr), skb->csum);
235 		icmp6h->icmp6_cksum = csum_ipv6_magic(&fl->fl6_src,
236 						      &fl->fl6_dst,
237 						      len, fl->proto,
238 						      skb->csum);
239 	} else {
240 		__wsum tmp_csum = 0;
241 
242 		skb_queue_walk(&sk->sk_write_queue, skb) {
243 			tmp_csum = csum_add(tmp_csum, skb->csum);
244 		}
245 
246 		tmp_csum = csum_partial((char *)icmp6h,
247 					sizeof(struct icmp6hdr), tmp_csum);
248 		icmp6h->icmp6_cksum = csum_ipv6_magic(&fl->fl6_src,
249 						      &fl->fl6_dst,
250 						      len, fl->proto,
251 						      tmp_csum);
252 	}
253 	ip6_push_pending_frames(sk);
254 out:
255 	return err;
256 }
257 
258 struct icmpv6_msg {
259 	struct sk_buff	*skb;
260 	int		offset;
261 	uint8_t		type;
262 };
263 
264 static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
265 {
266 	struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
267 	struct sk_buff *org_skb = msg->skb;
268 	__wsum csum = 0;
269 
270 	csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
271 				      to, len, csum);
272 	skb->csum = csum_block_add(skb->csum, csum, odd);
273 	if (!(msg->type & ICMPV6_INFOMSG_MASK))
274 		nf_ct_attach(skb, org_skb);
275 	return 0;
276 }
277 
278 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
279 static void mip6_addr_swap(struct sk_buff *skb)
280 {
281 	struct ipv6hdr *iph = ipv6_hdr(skb);
282 	struct inet6_skb_parm *opt = IP6CB(skb);
283 	struct ipv6_destopt_hao *hao;
284 	struct in6_addr tmp;
285 	int off;
286 
287 	if (opt->dsthao) {
288 		off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
289 		if (likely(off >= 0)) {
290 			hao = (struct ipv6_destopt_hao *)
291 					(skb_network_header(skb) + off);
292 			ipv6_addr_copy(&tmp, &iph->saddr);
293 			ipv6_addr_copy(&iph->saddr, &hao->addr);
294 			ipv6_addr_copy(&hao->addr, &tmp);
295 		}
296 	}
297 }
298 #else
299 static inline void mip6_addr_swap(struct sk_buff *skb) {}
300 #endif
301 
302 /*
303  *	Send an ICMP message in response to a packet in error
304  */
305 void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
306 		 struct net_device *dev)
307 {
308 	struct net *net = dev_net(skb->dev);
309 	struct inet6_dev *idev = NULL;
310 	struct ipv6hdr *hdr = ipv6_hdr(skb);
311 	struct sock *sk;
312 	struct ipv6_pinfo *np;
313 	struct in6_addr *saddr = NULL;
314 	struct dst_entry *dst;
315 	struct dst_entry *dst2;
316 	struct icmp6hdr tmp_hdr;
317 	struct flowi fl;
318 	struct flowi fl2;
319 	struct icmpv6_msg msg;
320 	int iif = 0;
321 	int addr_type = 0;
322 	int len;
323 	int hlimit, tclass;
324 	int err = 0;
325 
326 	if ((u8 *)hdr < skb->head ||
327 	    (skb->network_header + sizeof(*hdr)) > skb->tail)
328 		return;
329 
330 	/*
331 	 *	Make sure we respect the rules
332 	 *	i.e. RFC 1885 2.4(e)
333 	 *	Rule (e.1) is enforced by not using icmpv6_send
334 	 *	in any code that processes icmp errors.
335 	 */
336 	addr_type = ipv6_addr_type(&hdr->daddr);
337 
338 	if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0))
339 		saddr = &hdr->daddr;
340 
341 	/*
342 	 *	Dest addr check
343 	 */
344 
345 	if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) {
346 		if (type != ICMPV6_PKT_TOOBIG &&
347 		    !(type == ICMPV6_PARAMPROB &&
348 		      code == ICMPV6_UNK_OPTION &&
349 		      (opt_unrec(skb, info))))
350 			return;
351 
352 		saddr = NULL;
353 	}
354 
355 	addr_type = ipv6_addr_type(&hdr->saddr);
356 
357 	/*
358 	 *	Source addr check
359 	 */
360 
361 	if (addr_type & IPV6_ADDR_LINKLOCAL)
362 		iif = skb->dev->ifindex;
363 
364 	/*
365 	 *	Must not send error if the source does not uniquely
366 	 *	identify a single node (RFC2463 Section 2.4).
367 	 *	We check unspecified / multicast addresses here,
368 	 *	and anycast addresses will be checked later.
369 	 */
370 	if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
371 		LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n");
372 		return;
373 	}
374 
375 	/*
376 	 *	Never answer to a ICMP packet.
377 	 */
378 	if (is_ineligible(skb)) {
379 		LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: no reply to icmp error\n");
380 		return;
381 	}
382 
383 	mip6_addr_swap(skb);
384 
385 	memset(&fl, 0, sizeof(fl));
386 	fl.proto = IPPROTO_ICMPV6;
387 	ipv6_addr_copy(&fl.fl6_dst, &hdr->saddr);
388 	if (saddr)
389 		ipv6_addr_copy(&fl.fl6_src, saddr);
390 	fl.oif = iif;
391 	fl.fl_icmp_type = type;
392 	fl.fl_icmp_code = code;
393 	security_skb_classify_flow(skb, &fl);
394 
395 	sk = icmpv6_sk(net);
396 	np = inet6_sk(sk);
397 
398 	if (icmpv6_xmit_lock(sk))
399 		return;
400 
401 	if (!icmpv6_xrlim_allow(sk, type, &fl))
402 		goto out;
403 
404 	tmp_hdr.icmp6_type = type;
405 	tmp_hdr.icmp6_code = code;
406 	tmp_hdr.icmp6_cksum = 0;
407 	tmp_hdr.icmp6_pointer = htonl(info);
408 
409 	if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
410 		fl.oif = np->mcast_oif;
411 
412 	err = ip6_dst_lookup(sk, &dst, &fl);
413 	if (err)
414 		goto out;
415 
416 	/*
417 	 * We won't send icmp if the destination is known
418 	 * anycast.
419 	 */
420 	if (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) {
421 		LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: acast source\n");
422 		goto out_dst_release;
423 	}
424 
425 	/* No need to clone since we're just using its address. */
426 	dst2 = dst;
427 
428 	err = xfrm_lookup(&dst, &fl, sk, 0);
429 	switch (err) {
430 	case 0:
431 		if (dst != dst2)
432 			goto route_done;
433 		break;
434 	case -EPERM:
435 		dst = NULL;
436 		break;
437 	default:
438 		goto out;
439 	}
440 
441 	if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6))
442 		goto relookup_failed;
443 
444 	if (ip6_dst_lookup(sk, &dst2, &fl))
445 		goto relookup_failed;
446 
447 	err = xfrm_lookup(&dst2, &fl, sk, XFRM_LOOKUP_ICMP);
448 	switch (err) {
449 	case 0:
450 		dst_release(dst);
451 		dst = dst2;
452 		break;
453 	case -EPERM:
454 		goto out_dst_release;
455 	default:
456 relookup_failed:
457 		if (!dst)
458 			goto out;
459 		break;
460 	}
461 
462 route_done:
463 	if (ipv6_addr_is_multicast(&fl.fl6_dst))
464 		hlimit = np->mcast_hops;
465 	else
466 		hlimit = np->hop_limit;
467 	if (hlimit < 0)
468 		hlimit = ip6_dst_hoplimit(dst);
469 
470 	tclass = np->tclass;
471 	if (tclass < 0)
472 		tclass = 0;
473 
474 	msg.skb = skb;
475 	msg.offset = skb_network_offset(skb);
476 	msg.type = type;
477 
478 	len = skb->len - msg.offset;
479 	len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr));
480 	if (len < 0) {
481 		LIMIT_NETDEBUG(KERN_DEBUG "icmp: len problem\n");
482 		goto out_dst_release;
483 	}
484 
485 	idev = in6_dev_get(skb->dev);
486 
487 	err = ip6_append_data(sk, icmpv6_getfrag, &msg,
488 			      len + sizeof(struct icmp6hdr),
489 			      sizeof(struct icmp6hdr),
490 			      hlimit, tclass, NULL, &fl, (struct rt6_info*)dst,
491 			      MSG_DONTWAIT);
492 	if (err) {
493 		ip6_flush_pending_frames(sk);
494 		goto out_put;
495 	}
496 	err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, len + sizeof(struct icmp6hdr));
497 
498 out_put:
499 	if (likely(idev != NULL))
500 		in6_dev_put(idev);
501 out_dst_release:
502 	dst_release(dst);
503 out:
504 	icmpv6_xmit_unlock(sk);
505 }
506 
507 EXPORT_SYMBOL(icmpv6_send);
508 
509 static void icmpv6_echo_reply(struct sk_buff *skb)
510 {
511 	struct net *net = dev_net(skb->dev);
512 	struct sock *sk;
513 	struct inet6_dev *idev;
514 	struct ipv6_pinfo *np;
515 	struct in6_addr *saddr = NULL;
516 	struct icmp6hdr *icmph = icmp6_hdr(skb);
517 	struct icmp6hdr tmp_hdr;
518 	struct flowi fl;
519 	struct icmpv6_msg msg;
520 	struct dst_entry *dst;
521 	int err = 0;
522 	int hlimit;
523 	int tclass;
524 
525 	saddr = &ipv6_hdr(skb)->daddr;
526 
527 	if (!ipv6_unicast_destination(skb))
528 		saddr = NULL;
529 
530 	memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
531 	tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
532 
533 	memset(&fl, 0, sizeof(fl));
534 	fl.proto = IPPROTO_ICMPV6;
535 	ipv6_addr_copy(&fl.fl6_dst, &ipv6_hdr(skb)->saddr);
536 	if (saddr)
537 		ipv6_addr_copy(&fl.fl6_src, saddr);
538 	fl.oif = skb->dev->ifindex;
539 	fl.fl_icmp_type = ICMPV6_ECHO_REPLY;
540 	security_skb_classify_flow(skb, &fl);
541 
542 	sk = icmpv6_sk(net);
543 	np = inet6_sk(sk);
544 
545 	if (icmpv6_xmit_lock(sk))
546 		return;
547 
548 	if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
549 		fl.oif = np->mcast_oif;
550 
551 	err = ip6_dst_lookup(sk, &dst, &fl);
552 	if (err)
553 		goto out;
554 	if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
555 		goto out;
556 
557 	if (ipv6_addr_is_multicast(&fl.fl6_dst))
558 		hlimit = np->mcast_hops;
559 	else
560 		hlimit = np->hop_limit;
561 	if (hlimit < 0)
562 		hlimit = ip6_dst_hoplimit(dst);
563 
564 	tclass = np->tclass;
565 	if (tclass < 0)
566 		tclass = 0;
567 
568 	idev = in6_dev_get(skb->dev);
569 
570 	msg.skb = skb;
571 	msg.offset = 0;
572 	msg.type = ICMPV6_ECHO_REPLY;
573 
574 	err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr),
575 				sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl,
576 				(struct rt6_info*)dst, MSG_DONTWAIT);
577 
578 	if (err) {
579 		ip6_flush_pending_frames(sk);
580 		goto out_put;
581 	}
582 	err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, skb->len + sizeof(struct icmp6hdr));
583 
584 out_put:
585 	if (likely(idev != NULL))
586 		in6_dev_put(idev);
587 	dst_release(dst);
588 out:
589 	icmpv6_xmit_unlock(sk);
590 }
591 
592 static void icmpv6_notify(struct sk_buff *skb, int type, int code, __be32 info)
593 {
594 	struct inet6_protocol *ipprot;
595 	int inner_offset;
596 	int hash;
597 	u8 nexthdr;
598 
599 	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
600 		return;
601 
602 	nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
603 	if (ipv6_ext_hdr(nexthdr)) {
604 		/* now skip over extension headers */
605 		inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &nexthdr);
606 		if (inner_offset<0)
607 			return;
608 	} else {
609 		inner_offset = sizeof(struct ipv6hdr);
610 	}
611 
612 	/* Checkin header including 8 bytes of inner protocol header. */
613 	if (!pskb_may_pull(skb, inner_offset+8))
614 		return;
615 
616 	/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
617 	   Without this we will not able f.e. to make source routed
618 	   pmtu discovery.
619 	   Corresponding argument (opt) to notifiers is already added.
620 	   --ANK (980726)
621 	 */
622 
623 	hash = nexthdr & (MAX_INET_PROTOS - 1);
624 
625 	rcu_read_lock();
626 	ipprot = rcu_dereference(inet6_protos[hash]);
627 	if (ipprot && ipprot->err_handler)
628 		ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
629 	rcu_read_unlock();
630 
631 	raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
632 }
633 
634 /*
635  *	Handle icmp messages
636  */
637 
638 static int icmpv6_rcv(struct sk_buff *skb)
639 {
640 	struct net_device *dev = skb->dev;
641 	struct inet6_dev *idev = __in6_dev_get(dev);
642 	struct in6_addr *saddr, *daddr;
643 	struct ipv6hdr *orig_hdr;
644 	struct icmp6hdr *hdr;
645 	int type;
646 
647 	if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
648 		int nh;
649 
650 		if (!(skb->sp && skb->sp->xvec[skb->sp->len - 1]->props.flags &
651 				 XFRM_STATE_ICMP))
652 			goto drop_no_count;
653 
654 		if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(*orig_hdr)))
655 			goto drop_no_count;
656 
657 		nh = skb_network_offset(skb);
658 		skb_set_network_header(skb, sizeof(*hdr));
659 
660 		if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
661 			goto drop_no_count;
662 
663 		skb_set_network_header(skb, nh);
664 	}
665 
666 	ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INMSGS);
667 
668 	saddr = &ipv6_hdr(skb)->saddr;
669 	daddr = &ipv6_hdr(skb)->daddr;
670 
671 	/* Perform checksum. */
672 	switch (skb->ip_summed) {
673 	case CHECKSUM_COMPLETE:
674 		if (!csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
675 				     skb->csum))
676 			break;
677 		/* fall through */
678 	case CHECKSUM_NONE:
679 		skb->csum = ~csum_unfold(csum_ipv6_magic(saddr, daddr, skb->len,
680 					     IPPROTO_ICMPV6, 0));
681 		if (__skb_checksum_complete(skb)) {
682 			LIMIT_NETDEBUG(KERN_DEBUG "ICMPv6 checksum failed [" NIP6_FMT " > " NIP6_FMT "]\n",
683 				       NIP6(*saddr), NIP6(*daddr));
684 			goto discard_it;
685 		}
686 	}
687 
688 	if (!pskb_pull(skb, sizeof(*hdr)))
689 		goto discard_it;
690 
691 	hdr = icmp6_hdr(skb);
692 
693 	type = hdr->icmp6_type;
694 
695 	ICMP6MSGIN_INC_STATS_BH(idev, type);
696 
697 	switch (type) {
698 	case ICMPV6_ECHO_REQUEST:
699 		icmpv6_echo_reply(skb);
700 		break;
701 
702 	case ICMPV6_ECHO_REPLY:
703 		/* we couldn't care less */
704 		break;
705 
706 	case ICMPV6_PKT_TOOBIG:
707 		/* BUGGG_FUTURE: if packet contains rthdr, we cannot update
708 		   standard destination cache. Seems, only "advanced"
709 		   destination cache will allow to solve this problem
710 		   --ANK (980726)
711 		 */
712 		if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
713 			goto discard_it;
714 		hdr = icmp6_hdr(skb);
715 		orig_hdr = (struct ipv6hdr *) (hdr + 1);
716 		rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev,
717 				   ntohl(hdr->icmp6_mtu));
718 
719 		/*
720 		 *	Drop through to notify
721 		 */
722 
723 	case ICMPV6_DEST_UNREACH:
724 	case ICMPV6_TIME_EXCEED:
725 	case ICMPV6_PARAMPROB:
726 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
727 		break;
728 
729 	case NDISC_ROUTER_SOLICITATION:
730 	case NDISC_ROUTER_ADVERTISEMENT:
731 	case NDISC_NEIGHBOUR_SOLICITATION:
732 	case NDISC_NEIGHBOUR_ADVERTISEMENT:
733 	case NDISC_REDIRECT:
734 		ndisc_rcv(skb);
735 		break;
736 
737 	case ICMPV6_MGM_QUERY:
738 		igmp6_event_query(skb);
739 		break;
740 
741 	case ICMPV6_MGM_REPORT:
742 		igmp6_event_report(skb);
743 		break;
744 
745 	case ICMPV6_MGM_REDUCTION:
746 	case ICMPV6_NI_QUERY:
747 	case ICMPV6_NI_REPLY:
748 	case ICMPV6_MLD2_REPORT:
749 	case ICMPV6_DHAAD_REQUEST:
750 	case ICMPV6_DHAAD_REPLY:
751 	case ICMPV6_MOBILE_PREFIX_SOL:
752 	case ICMPV6_MOBILE_PREFIX_ADV:
753 		break;
754 
755 	default:
756 		LIMIT_NETDEBUG(KERN_DEBUG "icmpv6: msg of unknown type\n");
757 
758 		/* informational */
759 		if (type & ICMPV6_INFOMSG_MASK)
760 			break;
761 
762 		/*
763 		 * error of unknown type.
764 		 * must pass to upper level
765 		 */
766 
767 		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
768 	}
769 
770 	kfree_skb(skb);
771 	return 0;
772 
773 discard_it:
774 	ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INERRORS);
775 drop_no_count:
776 	kfree_skb(skb);
777 	return 0;
778 }
779 
780 void icmpv6_flow_init(struct sock *sk, struct flowi *fl,
781 		      u8 type,
782 		      const struct in6_addr *saddr,
783 		      const struct in6_addr *daddr,
784 		      int oif)
785 {
786 	memset(fl, 0, sizeof(*fl));
787 	ipv6_addr_copy(&fl->fl6_src, saddr);
788 	ipv6_addr_copy(&fl->fl6_dst, daddr);
789 	fl->proto	 	= IPPROTO_ICMPV6;
790 	fl->fl_icmp_type	= type;
791 	fl->fl_icmp_code	= 0;
792 	fl->oif			= oif;
793 	security_sk_classify_flow(sk, fl);
794 }
795 
796 /*
797  * Special lock-class for __icmpv6_sk:
798  */
799 static struct lock_class_key icmpv6_socket_sk_dst_lock_key;
800 
801 static int __net_init icmpv6_sk_init(struct net *net)
802 {
803 	struct sock *sk;
804 	int err, i, j;
805 
806 	net->ipv6.icmp_sk =
807 		kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
808 	if (net->ipv6.icmp_sk == NULL)
809 		return -ENOMEM;
810 
811 	for_each_possible_cpu(i) {
812 		err = inet_ctl_sock_create(&sk, PF_INET6,
813 					   SOCK_RAW, IPPROTO_ICMPV6, net);
814 		if (err < 0) {
815 			printk(KERN_ERR
816 			       "Failed to initialize the ICMP6 control socket "
817 			       "(err %d).\n",
818 			       err);
819 			goto fail;
820 		}
821 
822 		net->ipv6.icmp_sk[i] = sk;
823 
824 		/*
825 		 * Split off their lock-class, because sk->sk_dst_lock
826 		 * gets used from softirqs, which is safe for
827 		 * __icmpv6_sk (because those never get directly used
828 		 * via userspace syscalls), but unsafe for normal sockets.
829 		 */
830 		lockdep_set_class(&sk->sk_dst_lock,
831 				  &icmpv6_socket_sk_dst_lock_key);
832 
833 		/* Enough space for 2 64K ICMP packets, including
834 		 * sk_buff struct overhead.
835 		 */
836 		sk->sk_sndbuf =
837 			(2 * ((64 * 1024) + sizeof(struct sk_buff)));
838 	}
839 	return 0;
840 
841  fail:
842 	for (j = 0; j < i; j++)
843 		inet_ctl_sock_destroy(net->ipv6.icmp_sk[j]);
844 	kfree(net->ipv6.icmp_sk);
845 	return err;
846 }
847 
848 static void __net_exit icmpv6_sk_exit(struct net *net)
849 {
850 	int i;
851 
852 	for_each_possible_cpu(i) {
853 		inet_ctl_sock_destroy(net->ipv6.icmp_sk[i]);
854 	}
855 	kfree(net->ipv6.icmp_sk);
856 }
857 
858 static struct pernet_operations icmpv6_sk_ops = {
859        .init = icmpv6_sk_init,
860        .exit = icmpv6_sk_exit,
861 };
862 
863 int __init icmpv6_init(void)
864 {
865 	int err;
866 
867 	err = register_pernet_subsys(&icmpv6_sk_ops);
868 	if (err < 0)
869 		return err;
870 
871 	err = -EAGAIN;
872 	if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
873 		goto fail;
874 	return 0;
875 
876 fail:
877 	printk(KERN_ERR "Failed to register ICMP6 protocol\n");
878 	unregister_pernet_subsys(&icmpv6_sk_ops);
879 	return err;
880 }
881 
882 void icmpv6_cleanup(void)
883 {
884 	unregister_pernet_subsys(&icmpv6_sk_ops);
885 	inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
886 }
887 
888 
889 static const struct icmp6_err {
890 	int err;
891 	int fatal;
892 } tab_unreach[] = {
893 	{	/* NOROUTE */
894 		.err	= ENETUNREACH,
895 		.fatal	= 0,
896 	},
897 	{	/* ADM_PROHIBITED */
898 		.err	= EACCES,
899 		.fatal	= 1,
900 	},
901 	{	/* Was NOT_NEIGHBOUR, now reserved */
902 		.err	= EHOSTUNREACH,
903 		.fatal	= 0,
904 	},
905 	{	/* ADDR_UNREACH	*/
906 		.err	= EHOSTUNREACH,
907 		.fatal	= 0,
908 	},
909 	{	/* PORT_UNREACH	*/
910 		.err	= ECONNREFUSED,
911 		.fatal	= 1,
912 	},
913 };
914 
915 int icmpv6_err_convert(int type, int code, int *err)
916 {
917 	int fatal = 0;
918 
919 	*err = EPROTO;
920 
921 	switch (type) {
922 	case ICMPV6_DEST_UNREACH:
923 		fatal = 1;
924 		if (code <= ICMPV6_PORT_UNREACH) {
925 			*err  = tab_unreach[code].err;
926 			fatal = tab_unreach[code].fatal;
927 		}
928 		break;
929 
930 	case ICMPV6_PKT_TOOBIG:
931 		*err = EMSGSIZE;
932 		break;
933 
934 	case ICMPV6_PARAMPROB:
935 		*err = EPROTO;
936 		fatal = 1;
937 		break;
938 
939 	case ICMPV6_TIME_EXCEED:
940 		*err = EHOSTUNREACH;
941 		break;
942 	}
943 
944 	return fatal;
945 }
946 
947 EXPORT_SYMBOL(icmpv6_err_convert);
948 
949 #ifdef CONFIG_SYSCTL
950 ctl_table ipv6_icmp_table_template[] = {
951 	{
952 		.ctl_name	= NET_IPV6_ICMP_RATELIMIT,
953 		.procname	= "ratelimit",
954 		.data		= &init_net.ipv6.sysctl.icmpv6_time,
955 		.maxlen		= sizeof(int),
956 		.mode		= 0644,
957 		.proc_handler	= &proc_dointvec_ms_jiffies,
958 		.strategy	= &sysctl_ms_jiffies
959 	},
960 	{ .ctl_name = 0 },
961 };
962 
963 struct ctl_table *ipv6_icmp_sysctl_init(struct net *net)
964 {
965 	struct ctl_table *table;
966 
967 	table = kmemdup(ipv6_icmp_table_template,
968 			sizeof(ipv6_icmp_table_template),
969 			GFP_KERNEL);
970 
971 	if (table)
972 		table[0].data = &net->ipv6.sysctl.icmpv6_time;
973 
974 	return table;
975 }
976 #endif
977 
978