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