1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
76
77
78
79
80
81static inline struct sock *icmpv6_sk(struct net *net)
82{
83 return net->ipv6.icmp_sk[smp_processor_id()];
84}
85
86static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
87 u8 type, u8 code, int offset, __be32 info)
88{
89
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
103static int icmpv6_rcv(struct sk_buff *skb);
104
105static 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
111static __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
120
121
122
123 local_bh_enable();
124 return NULL;
125 }
126 return sk;
127}
128
129static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
130{
131 spin_unlock_bh(&sk->sk_lock.slock);
132}
133
134
135
136
137
138
139
140
141
142
143
144
145static 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
172
173static inline bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
174 struct flowi6 *fl6)
175{
176 struct dst_entry *dst;
177 struct net *net = sock_net(sk);
178 bool res = false;
179
180
181 if (type & ICMPV6_INFOMSG_MASK)
182 return true;
183
184
185 if (type == ICMPV6_PKT_TOOBIG)
186 return true;
187
188
189
190
191
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 struct inet_peer *peer;
203
204
205 if (rt->rt6i_dst.plen < 128)
206 tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
207
208 peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
209 res = inet_peer_xrlim_allow(peer, tmo);
210 if (peer)
211 inet_putpeer(peer);
212 }
213 dst_release(dst);
214 return res;
215}
216
217
218
219
220
221
222
223
224static bool opt_unrec(struct sk_buff *skb, __u32 offset)
225{
226 u8 _optval, *op;
227
228 offset += skb_network_offset(skb);
229 op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
230 if (op == NULL)
231 return true;
232 return (*op & 0xC0) == 0x80;
233}
234
235int icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
236 struct icmp6hdr *thdr, int len)
237{
238 struct sk_buff *skb;
239 struct icmp6hdr *icmp6h;
240 int err = 0;
241
242 if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
243 goto out;
244
245 icmp6h = icmp6_hdr(skb);
246 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
247 icmp6h->icmp6_cksum = 0;
248
249 if (skb_queue_len(&sk->sk_write_queue) == 1) {
250 skb->csum = csum_partial(icmp6h,
251 sizeof(struct icmp6hdr), skb->csum);
252 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
253 &fl6->daddr,
254 len, fl6->flowi6_proto,
255 skb->csum);
256 } else {
257 __wsum tmp_csum = 0;
258
259 skb_queue_walk(&sk->sk_write_queue, skb) {
260 tmp_csum = csum_add(tmp_csum, skb->csum);
261 }
262
263 tmp_csum = csum_partial(icmp6h,
264 sizeof(struct icmp6hdr), tmp_csum);
265 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
266 &fl6->daddr,
267 len, fl6->flowi6_proto,
268 tmp_csum);
269 }
270 ip6_push_pending_frames(sk);
271out:
272 return err;
273}
274
275struct icmpv6_msg {
276 struct sk_buff *skb;
277 int offset;
278 uint8_t type;
279};
280
281static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
282{
283 struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
284 struct sk_buff *org_skb = msg->skb;
285 __wsum csum = 0;
286
287 csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
288 to, len, csum);
289 skb->csum = csum_block_add(skb->csum, csum, odd);
290 if (!(msg->type & ICMPV6_INFOMSG_MASK))
291 nf_ct_attach(skb, org_skb);
292 return 0;
293}
294
295#if IS_ENABLED(CONFIG_IPV6_MIP6)
296static void mip6_addr_swap(struct sk_buff *skb)
297{
298 struct ipv6hdr *iph = ipv6_hdr(skb);
299 struct inet6_skb_parm *opt = IP6CB(skb);
300 struct ipv6_destopt_hao *hao;
301 struct in6_addr tmp;
302 int off;
303
304 if (opt->dsthao) {
305 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
306 if (likely(off >= 0)) {
307 hao = (struct ipv6_destopt_hao *)
308 (skb_network_header(skb) + off);
309 tmp = iph->saddr;
310 iph->saddr = hao->addr;
311 hao->addr = tmp;
312 }
313 }
314}
315#else
316static inline void mip6_addr_swap(struct sk_buff *skb) {}
317#endif
318
319static struct dst_entry *icmpv6_route_lookup(struct net *net,
320 struct sk_buff *skb,
321 struct sock *sk,
322 struct flowi6 *fl6)
323{
324 struct dst_entry *dst, *dst2;
325 struct flowi6 fl2;
326 int err;
327
328 err = ip6_dst_lookup(sk, &dst, fl6);
329 if (err)
330 return ERR_PTR(err);
331
332
333
334
335
336 if (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) {
337 LIMIT_NETDEBUG(KERN_DEBUG "icmp6_send: acast source\n");
338 dst_release(dst);
339 return ERR_PTR(-EINVAL);
340 }
341
342
343 dst2 = dst;
344
345 dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
346 if (!IS_ERR(dst)) {
347 if (dst != dst2)
348 return dst;
349 } else {
350 if (PTR_ERR(dst) == -EPERM)
351 dst = NULL;
352 else
353 return dst;
354 }
355
356 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
357 if (err)
358 goto relookup_failed;
359
360 err = ip6_dst_lookup(sk, &dst2, &fl2);
361 if (err)
362 goto relookup_failed;
363
364 dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
365 if (!IS_ERR(dst2)) {
366 dst_release(dst);
367 dst = dst2;
368 } else {
369 err = PTR_ERR(dst2);
370 if (err == -EPERM) {
371 dst_release(dst);
372 return dst2;
373 } else
374 goto relookup_failed;
375 }
376
377relookup_failed:
378 if (dst)
379 return dst;
380 return ERR_PTR(err);
381}
382
383
384
385
386static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
387{
388 struct net *net = dev_net(skb->dev);
389 struct inet6_dev *idev = NULL;
390 struct ipv6hdr *hdr = ipv6_hdr(skb);
391 struct sock *sk;
392 struct ipv6_pinfo *np;
393 const struct in6_addr *saddr = NULL;
394 struct dst_entry *dst;
395 struct icmp6hdr tmp_hdr;
396 struct flowi6 fl6;
397 struct icmpv6_msg msg;
398 int iif = 0;
399 int addr_type = 0;
400 int len;
401 int hlimit;
402 int err = 0;
403 u32 mark = IP6_REPLY_MARK(net, skb->mark);
404
405 if ((u8 *)hdr < skb->head ||
406 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
407 return;
408
409
410
411
412
413
414
415 addr_type = ipv6_addr_type(&hdr->daddr);
416
417 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
418 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
419 saddr = &hdr->daddr;
420
421
422
423
424
425 if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) {
426 if (type != ICMPV6_PKT_TOOBIG &&
427 !(type == ICMPV6_PARAMPROB &&
428 code == ICMPV6_UNK_OPTION &&
429 (opt_unrec(skb, info))))
430 return;
431
432 saddr = NULL;
433 }
434
435 addr_type = ipv6_addr_type(&hdr->saddr);
436
437
438
439
440
441 if (__ipv6_addr_needs_scope_id(addr_type))
442 iif = skb->dev->ifindex;
443
444
445
446
447
448
449
450 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
451 LIMIT_NETDEBUG(KERN_DEBUG "icmp6_send: addr_any/mcast source\n");
452 return;
453 }
454
455
456
457
458 if (is_ineligible(skb)) {
459 LIMIT_NETDEBUG(KERN_DEBUG "icmp6_send: no reply to icmp error\n");
460 return;
461 }
462
463 mip6_addr_swap(skb);
464
465 memset(&fl6, 0, sizeof(fl6));
466 fl6.flowi6_proto = IPPROTO_ICMPV6;
467 fl6.daddr = hdr->saddr;
468 if (saddr)
469 fl6.saddr = *saddr;
470 fl6.flowi6_mark = mark;
471 fl6.flowi6_oif = iif;
472 fl6.fl6_icmp_type = type;
473 fl6.fl6_icmp_code = code;
474 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
475
476 sk = icmpv6_xmit_lock(net);
477 if (sk == NULL)
478 return;
479 sk->sk_mark = mark;
480 np = inet6_sk(sk);
481
482 if (!icmpv6_xrlim_allow(sk, type, &fl6))
483 goto out;
484
485 tmp_hdr.icmp6_type = type;
486 tmp_hdr.icmp6_code = code;
487 tmp_hdr.icmp6_cksum = 0;
488 tmp_hdr.icmp6_pointer = htonl(info);
489
490 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
491 fl6.flowi6_oif = np->mcast_oif;
492 else if (!fl6.flowi6_oif)
493 fl6.flowi6_oif = np->ucast_oif;
494
495 dst = icmpv6_route_lookup(net, skb, sk, &fl6);
496 if (IS_ERR(dst))
497 goto out;
498
499 hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
500
501 msg.skb = skb;
502 msg.offset = skb_network_offset(skb);
503 msg.type = type;
504
505 len = skb->len - msg.offset;
506 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr));
507 if (len < 0) {
508 LIMIT_NETDEBUG(KERN_DEBUG "icmp: len problem\n");
509 goto out_dst_release;
510 }
511
512 rcu_read_lock();
513 idev = __in6_dev_get(skb->dev);
514
515 err = ip6_append_data(sk, icmpv6_getfrag, &msg,
516 len + sizeof(struct icmp6hdr),
517 sizeof(struct icmp6hdr), hlimit,
518 np->tclass, NULL, &fl6, (struct rt6_info *)dst,
519 MSG_DONTWAIT, np->dontfrag);
520 if (err) {
521 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
522 ip6_flush_pending_frames(sk);
523 } else {
524 err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
525 len + sizeof(struct icmp6hdr));
526 }
527 rcu_read_unlock();
528out_dst_release:
529 dst_release(dst);
530out:
531 icmpv6_xmit_unlock(sk);
532}
533
534
535
536void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
537{
538 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos);
539 kfree_skb(skb);
540}
541
542static void icmpv6_echo_reply(struct sk_buff *skb)
543{
544 struct net *net = dev_net(skb->dev);
545 struct sock *sk;
546 struct inet6_dev *idev;
547 struct ipv6_pinfo *np;
548 const struct in6_addr *saddr = NULL;
549 struct icmp6hdr *icmph = icmp6_hdr(skb);
550 struct icmp6hdr tmp_hdr;
551 struct flowi6 fl6;
552 struct icmpv6_msg msg;
553 struct dst_entry *dst;
554 int err = 0;
555 int hlimit;
556 u8 tclass;
557 u32 mark = IP6_REPLY_MARK(net, skb->mark);
558
559 saddr = &ipv6_hdr(skb)->daddr;
560
561 if (!ipv6_unicast_destination(skb) &&
562 !(net->ipv6.sysctl.anycast_src_echo_reply &&
563 ipv6_anycast_destination(skb)))
564 saddr = NULL;
565
566 memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
567 tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
568
569 memset(&fl6, 0, sizeof(fl6));
570 fl6.flowi6_proto = IPPROTO_ICMPV6;
571 fl6.daddr = ipv6_hdr(skb)->saddr;
572 if (saddr)
573 fl6.saddr = *saddr;
574 fl6.flowi6_oif = skb->dev->ifindex;
575 fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
576 fl6.flowi6_mark = mark;
577 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
578
579 sk = icmpv6_xmit_lock(net);
580 if (sk == NULL)
581 return;
582 sk->sk_mark = mark;
583 np = inet6_sk(sk);
584
585 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
586 fl6.flowi6_oif = np->mcast_oif;
587 else if (!fl6.flowi6_oif)
588 fl6.flowi6_oif = np->ucast_oif;
589
590 err = ip6_dst_lookup(sk, &dst, &fl6);
591 if (err)
592 goto out;
593 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
594 if (IS_ERR(dst))
595 goto out;
596
597 hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
598
599 idev = __in6_dev_get(skb->dev);
600
601 msg.skb = skb;
602 msg.offset = 0;
603 msg.type = ICMPV6_ECHO_REPLY;
604
605 tclass = ipv6_get_dsfield(ipv6_hdr(skb));
606 err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr),
607 sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl6,
608 (struct rt6_info *)dst, MSG_DONTWAIT,
609 np->dontfrag);
610
611 if (err) {
612 ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTERRORS);
613 ip6_flush_pending_frames(sk);
614 } else {
615 err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
616 skb->len + sizeof(struct icmp6hdr));
617 }
618 dst_release(dst);
619out:
620 icmpv6_xmit_unlock(sk);
621}
622
623void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
624{
625 const struct inet6_protocol *ipprot;
626 int inner_offset;
627 __be16 frag_off;
628 u8 nexthdr;
629
630 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
631 return;
632
633 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
634 if (ipv6_ext_hdr(nexthdr)) {
635
636 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
637 &nexthdr, &frag_off);
638 if (inner_offset<0)
639 return;
640 } else {
641 inner_offset = sizeof(struct ipv6hdr);
642 }
643
644
645 if (!pskb_may_pull(skb, inner_offset+8))
646 return;
647
648
649
650
651
652
653
654
655 rcu_read_lock();
656 ipprot = rcu_dereference(inet6_protos[nexthdr]);
657 if (ipprot && ipprot->err_handler)
658 ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
659 rcu_read_unlock();
660
661 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
662}
663
664
665
666
667
668static int icmpv6_rcv(struct sk_buff *skb)
669{
670 struct net_device *dev = skb->dev;
671 struct inet6_dev *idev = __in6_dev_get(dev);
672 const struct in6_addr *saddr, *daddr;
673 struct icmp6hdr *hdr;
674 u8 type;
675
676 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
677 struct sec_path *sp = skb_sec_path(skb);
678 int nh;
679
680 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
681 XFRM_STATE_ICMP))
682 goto drop_no_count;
683
684 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
685 goto drop_no_count;
686
687 nh = skb_network_offset(skb);
688 skb_set_network_header(skb, sizeof(*hdr));
689
690 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
691 goto drop_no_count;
692
693 skb_set_network_header(skb, nh);
694 }
695
696 ICMP6_INC_STATS_BH(dev_net(dev), idev, ICMP6_MIB_INMSGS);
697
698 saddr = &ipv6_hdr(skb)->saddr;
699 daddr = &ipv6_hdr(skb)->daddr;
700
701 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
702 LIMIT_NETDEBUG(KERN_DEBUG
703 "ICMPv6 checksum failed [%pI6c > %pI6c]\n",
704 saddr, daddr);
705 goto csum_error;
706 }
707
708 if (!pskb_pull(skb, sizeof(*hdr)))
709 goto discard_it;
710
711 hdr = icmp6_hdr(skb);
712
713 type = hdr->icmp6_type;
714
715 ICMP6MSGIN_INC_STATS_BH(dev_net(dev), idev, type);
716
717 switch (type) {
718 case ICMPV6_ECHO_REQUEST:
719 icmpv6_echo_reply(skb);
720 break;
721
722 case ICMPV6_ECHO_REPLY:
723 ping_rcv(skb);
724 break;
725
726 case ICMPV6_PKT_TOOBIG:
727
728
729
730
731
732 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
733 goto discard_it;
734 hdr = icmp6_hdr(skb);
735
736
737
738
739
740 case ICMPV6_DEST_UNREACH:
741 case ICMPV6_TIME_EXCEED:
742 case ICMPV6_PARAMPROB:
743 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
744 break;
745
746 case NDISC_ROUTER_SOLICITATION:
747 case NDISC_ROUTER_ADVERTISEMENT:
748 case NDISC_NEIGHBOUR_SOLICITATION:
749 case NDISC_NEIGHBOUR_ADVERTISEMENT:
750 case NDISC_REDIRECT:
751 ndisc_rcv(skb);
752 break;
753
754 case ICMPV6_MGM_QUERY:
755 igmp6_event_query(skb);
756 break;
757
758 case ICMPV6_MGM_REPORT:
759 igmp6_event_report(skb);
760 break;
761
762 case ICMPV6_MGM_REDUCTION:
763 case ICMPV6_NI_QUERY:
764 case ICMPV6_NI_REPLY:
765 case ICMPV6_MLD2_REPORT:
766 case ICMPV6_DHAAD_REQUEST:
767 case ICMPV6_DHAAD_REPLY:
768 case ICMPV6_MOBILE_PREFIX_SOL:
769 case ICMPV6_MOBILE_PREFIX_ADV:
770 break;
771
772 default:
773 LIMIT_NETDEBUG(KERN_DEBUG "icmpv6: msg of unknown type\n");
774
775
776 if (type & ICMPV6_INFOMSG_MASK)
777 break;
778
779
780
781
782
783
784 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
785 }
786
787 kfree_skb(skb);
788 return 0;
789
790csum_error:
791 ICMP6_INC_STATS_BH(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
792discard_it:
793 ICMP6_INC_STATS_BH(dev_net(dev), idev, ICMP6_MIB_INERRORS);
794drop_no_count:
795 kfree_skb(skb);
796 return 0;
797}
798
799void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
800 u8 type,
801 const struct in6_addr *saddr,
802 const struct in6_addr *daddr,
803 int oif)
804{
805 memset(fl6, 0, sizeof(*fl6));
806 fl6->saddr = *saddr;
807 fl6->daddr = *daddr;
808 fl6->flowi6_proto = IPPROTO_ICMPV6;
809 fl6->fl6_icmp_type = type;
810 fl6->fl6_icmp_code = 0;
811 fl6->flowi6_oif = oif;
812 security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
813}
814
815
816
817
818static struct lock_class_key icmpv6_socket_sk_dst_lock_key;
819
820static int __net_init icmpv6_sk_init(struct net *net)
821{
822 struct sock *sk;
823 int err, i, j;
824
825 net->ipv6.icmp_sk =
826 kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
827 if (net->ipv6.icmp_sk == NULL)
828 return -ENOMEM;
829
830 for_each_possible_cpu(i) {
831 err = inet_ctl_sock_create(&sk, PF_INET6,
832 SOCK_RAW, IPPROTO_ICMPV6, net);
833 if (err < 0) {
834 pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
835 err);
836 goto fail;
837 }
838
839 net->ipv6.icmp_sk[i] = sk;
840
841
842
843
844
845
846
847 lockdep_set_class(&sk->sk_dst_lock,
848 &icmpv6_socket_sk_dst_lock_key);
849
850
851
852
853 sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
854 }
855 return 0;
856
857 fail:
858 for (j = 0; j < i; j++)
859 inet_ctl_sock_destroy(net->ipv6.icmp_sk[j]);
860 kfree(net->ipv6.icmp_sk);
861 return err;
862}
863
864static void __net_exit icmpv6_sk_exit(struct net *net)
865{
866 int i;
867
868 for_each_possible_cpu(i) {
869 inet_ctl_sock_destroy(net->ipv6.icmp_sk[i]);
870 }
871 kfree(net->ipv6.icmp_sk);
872}
873
874static struct pernet_operations icmpv6_sk_ops = {
875 .init = icmpv6_sk_init,
876 .exit = icmpv6_sk_exit,
877};
878
879int __init icmpv6_init(void)
880{
881 int err;
882
883 err = register_pernet_subsys(&icmpv6_sk_ops);
884 if (err < 0)
885 return err;
886
887 err = -EAGAIN;
888 if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
889 goto fail;
890
891 err = inet6_register_icmp_sender(icmp6_send);
892 if (err)
893 goto sender_reg_err;
894 return 0;
895
896sender_reg_err:
897 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
898fail:
899 pr_err("Failed to register ICMP6 protocol\n");
900 unregister_pernet_subsys(&icmpv6_sk_ops);
901 return err;
902}
903
904void icmpv6_cleanup(void)
905{
906 inet6_unregister_icmp_sender(icmp6_send);
907 unregister_pernet_subsys(&icmpv6_sk_ops);
908 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
909}
910
911
912static const struct icmp6_err {
913 int err;
914 int fatal;
915} tab_unreach[] = {
916 {
917 .err = ENETUNREACH,
918 .fatal = 0,
919 },
920 {
921 .err = EACCES,
922 .fatal = 1,
923 },
924 {
925 .err = EHOSTUNREACH,
926 .fatal = 0,
927 },
928 {
929 .err = EHOSTUNREACH,
930 .fatal = 0,
931 },
932 {
933 .err = ECONNREFUSED,
934 .fatal = 1,
935 },
936 {
937 .err = EACCES,
938 .fatal = 1,
939 },
940 {
941 .err = EACCES,
942 .fatal = 1,
943 },
944};
945
946int icmpv6_err_convert(u8 type, u8 code, int *err)
947{
948 int fatal = 0;
949
950 *err = EPROTO;
951
952 switch (type) {
953 case ICMPV6_DEST_UNREACH:
954 fatal = 1;
955 if (code < ARRAY_SIZE(tab_unreach)) {
956 *err = tab_unreach[code].err;
957 fatal = tab_unreach[code].fatal;
958 }
959 break;
960
961 case ICMPV6_PKT_TOOBIG:
962 *err = EMSGSIZE;
963 break;
964
965 case ICMPV6_PARAMPROB:
966 *err = EPROTO;
967 fatal = 1;
968 break;
969
970 case ICMPV6_TIME_EXCEED:
971 *err = EHOSTUNREACH;
972 break;
973 }
974
975 return fatal;
976}
977EXPORT_SYMBOL(icmpv6_err_convert);
978
979#ifdef CONFIG_SYSCTL
980static struct ctl_table ipv6_icmp_table_template[] = {
981 {
982 .procname = "ratelimit",
983 .data = &init_net.ipv6.sysctl.icmpv6_time,
984 .maxlen = sizeof(int),
985 .mode = 0644,
986 .proc_handler = proc_dointvec_ms_jiffies,
987 },
988 { },
989};
990
991struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
992{
993 struct ctl_table *table;
994
995 table = kmemdup(ipv6_icmp_table_template,
996 sizeof(ipv6_icmp_table_template),
997 GFP_KERNEL);
998
999 if (table)
1000 table[0].data = &net->ipv6.sysctl.icmpv6_time;
1001
1002 return table;
1003}
1004#endif
1005
1006