ARC: [plat-hsdk]: unify memory apertures configuration
[linux-2.6-microblaze.git] / net / ipv6 / icmp.c
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