vti6: better validate user provided tunnel names
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / net / ipv6 / icmp.c
CommitLineData
1da177e4
LT
1/*
2 * Internet Control Message Protocol (ICMPv6)
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
1da177e4
LT
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
f3213831
JP
32#define pr_fmt(fmt) "IPv6: " fmt
33
1da177e4
LT
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>
1da177e4
LT
40#include <linux/sockios.h>
41#include <linux/net.h>
42#include <linux/skbuff.h>
43#include <linux/init.h>
763ecff1 44#include <linux/netfilter.h>
5a0e3ad6 45#include <linux/slab.h>
1da177e4
LT
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>
6d0bfe22 60#include <net/ping.h>
1da177e4
LT
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>
8b7817f3 68#include <net/xfrm.h>
1ed8516f 69#include <net/inet_common.h>
825edac4 70#include <net/dsfield.h>
ca254490 71#include <net/l3mdev.h>
1da177e4 72
7c0f6ba6 73#include <linux/uaccess.h>
1da177e4 74
1da177e4
LT
75/*
76 * The ICMP socket(s). This is the most convenient way to flow control
77 * our ICMP output as well as maintain a clean interface throughout
78 * all layers. All Socketless IP sends will soon be gone.
79 *
80 * On SMP we have one ICMP socket per-cpu.
81 */
98c6d1b2
DL
82static inline struct sock *icmpv6_sk(struct net *net)
83{
84 return net->ipv6.icmp_sk[smp_processor_id()];
85}
1da177e4 86
6f809da2
SK
87static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
88 u8 type, u8 code, int offset, __be32 info)
89{
6d0bfe22
LC
90 /* icmpv6_notify checks 8 bytes can be pulled, icmp6hdr is 8 bytes */
91 struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset);
6f809da2
SK
92 struct net *net = dev_net(skb->dev);
93
94 if (type == ICMPV6_PKT_TOOBIG)
e2d118a1 95 ip6_update_pmtu(skb, net, info, 0, 0, sock_net_uid(net, NULL));
6f809da2 96 else if (type == NDISC_REDIRECT)
e2d118a1
LC
97 ip6_redirect(skb, net, skb->dev->ifindex, 0,
98 sock_net_uid(net, NULL));
6d0bfe22
LC
99
100 if (!(type & ICMPV6_INFOMSG_MASK))
101 if (icmp6->icmp6_type == ICMPV6_ECHO_REQUEST)
dcb94b88 102 ping_err(skb, offset, ntohl(info));
6f809da2
SK
103}
104
e5bbef20 105static int icmpv6_rcv(struct sk_buff *skb);
1da177e4 106
41135cc8 107static const struct inet6_protocol icmpv6_protocol = {
1da177e4 108 .handler = icmpv6_rcv,
6f809da2 109 .err_handler = icmpv6_err,
8b7817f3 110 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
1da177e4
LT
111};
112
7ba91ecb 113/* Called with BH disabled */
fdc0bde9 114static __inline__ struct sock *icmpv6_xmit_lock(struct net *net)
1da177e4 115{
fdc0bde9
DL
116 struct sock *sk;
117
fdc0bde9 118 sk = icmpv6_sk(net);
405666db 119 if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
1da177e4
LT
120 /* This can happen if the output path (f.e. SIT or
121 * ip6ip6 tunnel) signals dst_link_failure() for an
122 * outgoing ICMP6 packet.
123 */
fdc0bde9 124 return NULL;
1da177e4 125 }
fdc0bde9 126 return sk;
1da177e4
LT
127}
128
405666db 129static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
1da177e4 130{
7ba91ecb 131 spin_unlock(&sk->sk_lock.slock);
1da177e4
LT
132}
133
1da177e4
LT
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
a50feda5 145static bool is_ineligible(const struct sk_buff *skb)
1da177e4 146{
0660e03f 147 int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data;
1da177e4 148 int len = skb->len - ptr;
0660e03f 149 __u8 nexthdr = ipv6_hdr(skb)->nexthdr;
75f2811c 150 __be16 frag_off;
1da177e4
LT
151
152 if (len < 0)
a50feda5 153 return true;
1da177e4 154
75f2811c 155 ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off);
1da177e4 156 if (ptr < 0)
a50feda5 157 return false;
1da177e4
LT
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);
63159f29 163 if (!tp || !(*tp & ICMPV6_INFOMSG_MASK))
a50feda5 164 return true;
1da177e4 165 }
a50feda5 166 return false;
1da177e4
LT
167}
168
c0303efe
JDB
169static bool icmpv6_mask_allow(int type)
170{
171 /* Informational messages are not limited. */
172 if (type & ICMPV6_INFOMSG_MASK)
173 return true;
174
175 /* Do not limit pmtu discovery, it would break it. */
176 if (type == ICMPV6_PKT_TOOBIG)
177 return true;
178
179 return false;
180}
181
182static bool icmpv6_global_allow(int type)
183{
184 if (icmpv6_mask_allow(type))
185 return true;
186
187 if (icmp_global_allow())
188 return true;
189
190 return false;
191}
192
1ab1457c
YH
193/*
194 * Check the ICMP output rate limit
1da177e4 195 */
4cdf507d
ED
196static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
197 struct flowi6 *fl6)
1da177e4 198{
3b1e0a65 199 struct net *net = sock_net(sk);
4cdf507d 200 struct dst_entry *dst;
92d86829 201 bool res = false;
1da177e4 202
c0303efe 203 if (icmpv6_mask_allow(type))
92d86829 204 return true;
1da177e4 205
1ab1457c 206 /*
1da177e4
LT
207 * Look up the output route.
208 * XXX: perhaps the expire for routing entries cloned by
209 * this lookup should be more aggressive (not longer than timeout).
210 */
4c9483b2 211 dst = ip6_route_output(net, sk, fl6);
1da177e4 212 if (dst->error) {
3bd653c8 213 IP6_INC_STATS(net, ip6_dst_idev(dst),
a11d206d 214 IPSTATS_MIB_OUTNOROUTES);
1da177e4 215 } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) {
92d86829 216 res = true;
1da177e4
LT
217 } else {
218 struct rt6_info *rt = (struct rt6_info *)dst;
9a43b709 219 int tmo = net->ipv6.sysctl.icmpv6_time;
c0303efe 220 struct inet_peer *peer;
1da177e4
LT
221
222 /* Give more bandwidth to wider prefixes. */
223 if (rt->rt6i_dst.plen < 128)
224 tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
225
c0303efe
JDB
226 peer = inet_getpeer_v6(net->ipv6.peers, &fl6->daddr, 1);
227 res = inet_peer_xrlim_allow(peer, tmo);
228 if (peer)
229 inet_putpeer(peer);
1da177e4
LT
230 }
231 dst_release(dst);
232 return res;
233}
234
235/*
236 * an inline helper for the "simple" if statement below
237 * checks if parameter problem report is caused by an
1ab1457c 238 * unrecognized IPv6 option that has the Option Type
1da177e4
LT
239 * highest-order two bits set to 10
240 */
241
a50feda5 242static bool opt_unrec(struct sk_buff *skb, __u32 offset)
1da177e4
LT
243{
244 u8 _optval, *op;
245
bbe735e4 246 offset += skb_network_offset(skb);
1da177e4 247 op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
63159f29 248 if (!op)
a50feda5 249 return true;
1da177e4
LT
250 return (*op & 0xC0) == 0x80;
251}
252
6d0bfe22
LC
253int icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
254 struct icmp6hdr *thdr, int len)
1da177e4
LT
255{
256 struct sk_buff *skb;
257 struct icmp6hdr *icmp6h;
258 int err = 0;
259
e5d08d71 260 skb = skb_peek(&sk->sk_write_queue);
63159f29 261 if (!skb)
1da177e4
LT
262 goto out;
263
cc70ab26 264 icmp6h = icmp6_hdr(skb);
1da177e4
LT
265 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
266 icmp6h->icmp6_cksum = 0;
267
268 if (skb_queue_len(&sk->sk_write_queue) == 1) {
07f0757a 269 skb->csum = csum_partial(icmp6h,
1da177e4 270 sizeof(struct icmp6hdr), skb->csum);
4c9483b2
DM
271 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
272 &fl6->daddr,
273 len, fl6->flowi6_proto,
1da177e4
LT
274 skb->csum);
275 } else {
868c86bc 276 __wsum tmp_csum = 0;
1da177e4
LT
277
278 skb_queue_walk(&sk->sk_write_queue, skb) {
279 tmp_csum = csum_add(tmp_csum, skb->csum);
280 }
281
07f0757a 282 tmp_csum = csum_partial(icmp6h,
1da177e4 283 sizeof(struct icmp6hdr), tmp_csum);
4c9483b2
DM
284 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
285 &fl6->daddr,
286 len, fl6->flowi6_proto,
868c86bc 287 tmp_csum);
1da177e4 288 }
1da177e4
LT
289 ip6_push_pending_frames(sk);
290out:
291 return err;
292}
293
294struct icmpv6_msg {
295 struct sk_buff *skb;
296 int offset;
763ecff1 297 uint8_t type;
1da177e4
LT
298};
299
300static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
301{
302 struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
303 struct sk_buff *org_skb = msg->skb;
5f92a738 304 __wsum csum = 0;
1da177e4
LT
305
306 csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
307 to, len, csum);
308 skb->csum = csum_block_add(skb->csum, csum, odd);
763ecff1
YK
309 if (!(msg->type & ICMPV6_INFOMSG_MASK))
310 nf_ct_attach(skb, org_skb);
1da177e4
LT
311 return 0;
312}
313
07a93626 314#if IS_ENABLED(CONFIG_IPV6_MIP6)
79383236
MN
315static void mip6_addr_swap(struct sk_buff *skb)
316{
0660e03f 317 struct ipv6hdr *iph = ipv6_hdr(skb);
79383236
MN
318 struct inet6_skb_parm *opt = IP6CB(skb);
319 struct ipv6_destopt_hao *hao;
320 struct in6_addr tmp;
321 int off;
322
323 if (opt->dsthao) {
324 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
325 if (likely(off >= 0)) {
d56f90a7
ACM
326 hao = (struct ipv6_destopt_hao *)
327 (skb_network_header(skb) + off);
4e3fd7a0
AD
328 tmp = iph->saddr;
329 iph->saddr = hao->addr;
330 hao->addr = tmp;
79383236
MN
331 }
332 }
333}
334#else
335static inline void mip6_addr_swap(struct sk_buff *skb) {}
336#endif
337
e8243534 338static struct dst_entry *icmpv6_route_lookup(struct net *net,
339 struct sk_buff *skb,
340 struct sock *sk,
341 struct flowi6 *fl6)
b42835db
DM
342{
343 struct dst_entry *dst, *dst2;
4c9483b2 344 struct flowi6 fl2;
b42835db
DM
345 int err;
346
343d60aa 347 err = ip6_dst_lookup(net, sk, &dst, fl6);
b42835db
DM
348 if (err)
349 return ERR_PTR(err);
350
351 /*
352 * We won't send icmp if the destination is known
353 * anycast.
354 */
2647a9b0 355 if (ipv6_anycast_destination(dst, &fl6->daddr)) {
ba7a46f1 356 net_dbg_ratelimited("icmp6_send: acast source\n");
b42835db
DM
357 dst_release(dst);
358 return ERR_PTR(-EINVAL);
359 }
360
361 /* No need to clone since we're just using its address. */
362 dst2 = dst;
363
4c9483b2 364 dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
452edd59 365 if (!IS_ERR(dst)) {
b42835db
DM
366 if (dst != dst2)
367 return dst;
452edd59
DM
368 } else {
369 if (PTR_ERR(dst) == -EPERM)
370 dst = NULL;
371 else
372 return dst;
b42835db
DM
373 }
374
4c9483b2 375 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
b42835db
DM
376 if (err)
377 goto relookup_failed;
378
343d60aa 379 err = ip6_dst_lookup(net, sk, &dst2, &fl2);
b42835db
DM
380 if (err)
381 goto relookup_failed;
382
4c9483b2 383 dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
452edd59 384 if (!IS_ERR(dst2)) {
b42835db
DM
385 dst_release(dst);
386 dst = dst2;
452edd59
DM
387 } else {
388 err = PTR_ERR(dst2);
389 if (err == -EPERM) {
390 dst_release(dst);
391 return dst2;
392 } else
393 goto relookup_failed;
b42835db
DM
394 }
395
396relookup_failed:
397 if (dst)
398 return dst;
399 return ERR_PTR(err);
400}
401
1b70d792
DA
402static int icmp6_iif(const struct sk_buff *skb)
403{
404 int iif = skb->dev->ifindex;
405
406 /* for local traffic to local address, skb dev is the loopback
407 * device. Check if there is a dst attached to the skb and if so
408 * get the real device index.
409 */
410 if (unlikely(iif == LOOPBACK_IFINDEX)) {
411 const struct rt6_info *rt6 = skb_rt6_info(skb);
412
413 if (rt6)
414 iif = rt6->rt6i_idev->dev->ifindex;
415 }
416
417 return iif;
418}
419
1da177e4
LT
420/*
421 * Send an ICMP message in response to a packet in error
422 */
b1cadc1a
ED
423static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
424 const struct in6_addr *force_saddr)
1da177e4 425{
c346dca1 426 struct net *net = dev_net(skb->dev);
1da177e4 427 struct inet6_dev *idev = NULL;
0660e03f 428 struct ipv6hdr *hdr = ipv6_hdr(skb);
84427d53
YH
429 struct sock *sk;
430 struct ipv6_pinfo *np;
b71d1d42 431 const struct in6_addr *saddr = NULL;
1da177e4
LT
432 struct dst_entry *dst;
433 struct icmp6hdr tmp_hdr;
4c9483b2 434 struct flowi6 fl6;
1da177e4 435 struct icmpv6_msg msg;
c14ac945 436 struct sockcm_cookie sockc_unused = {0};
26879da5 437 struct ipcm6_cookie ipc6;
1da177e4
LT
438 int iif = 0;
439 int addr_type = 0;
440 int len;
1da177e4 441 int err = 0;
e110861f 442 u32 mark = IP6_REPLY_MARK(net, skb->mark);
1da177e4 443
27a884dc 444 if ((u8 *)hdr < skb->head ||
29a3cad5 445 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
1da177e4
LT
446 return;
447
448 /*
1ab1457c 449 * Make sure we respect the rules
1da177e4 450 * i.e. RFC 1885 2.4(e)
5f5624cf 451 * Rule (e.1) is enforced by not using icmp6_send
1da177e4
LT
452 * in any code that processes icmp errors.
453 */
454 addr_type = ipv6_addr_type(&hdr->daddr);
455
446fab59 456 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
d94c1f92 457 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
1da177e4
LT
458 saddr = &hdr->daddr;
459
460 /*
461 * Dest addr check
462 */
463
9a6b4b39 464 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
1da177e4 465 if (type != ICMPV6_PKT_TOOBIG &&
1ab1457c
YH
466 !(type == ICMPV6_PARAMPROB &&
467 code == ICMPV6_UNK_OPTION &&
1da177e4
LT
468 (opt_unrec(skb, info))))
469 return;
470
471 saddr = NULL;
472 }
473
474 addr_type = ipv6_addr_type(&hdr->saddr);
475
476 /*
477 * Source addr check
478 */
479
4832c30d 480 if (__ipv6_addr_needs_scope_id(addr_type)) {
1b70d792 481 iif = icmp6_iif(skb);
4832c30d 482 } else {
79dc7e3f
DA
483 dst = skb_dst(skb);
484 iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
485 }
1da177e4
LT
486
487 /*
8de3351e
YH
488 * Must not send error if the source does not uniquely
489 * identify a single node (RFC2463 Section 2.4).
490 * We check unspecified / multicast addresses here,
491 * and anycast addresses will be checked later.
1da177e4
LT
492 */
493 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
4b3418fb
BM
494 net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
495 &hdr->saddr, &hdr->daddr);
1da177e4
LT
496 return;
497 }
498
1ab1457c 499 /*
1da177e4
LT
500 * Never answer to a ICMP packet.
501 */
502 if (is_ineligible(skb)) {
4b3418fb
BM
503 net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
504 &hdr->saddr, &hdr->daddr);
1da177e4
LT
505 return;
506 }
507
7ba91ecb
JDB
508 /* Needed by both icmp_global_allow and icmpv6_xmit_lock */
509 local_bh_disable();
510
511 /* Check global sysctl_icmp_msgs_per_sec ratelimit */
849a44de 512 if (!(skb->dev->flags&IFF_LOOPBACK) && !icmpv6_global_allow(type))
7ba91ecb
JDB
513 goto out_bh_enable;
514
79383236
MN
515 mip6_addr_swap(skb);
516
4c9483b2
DM
517 memset(&fl6, 0, sizeof(fl6));
518 fl6.flowi6_proto = IPPROTO_ICMPV6;
4e3fd7a0 519 fl6.daddr = hdr->saddr;
b1cadc1a
ED
520 if (force_saddr)
521 saddr = force_saddr;
1da177e4 522 if (saddr)
4e3fd7a0 523 fl6.saddr = *saddr;
e110861f 524 fl6.flowi6_mark = mark;
4c9483b2 525 fl6.flowi6_oif = iif;
1958b856
DM
526 fl6.fl6_icmp_type = type;
527 fl6.fl6_icmp_code = code;
e2d118a1 528 fl6.flowi6_uid = sock_net_uid(net, NULL);
23aebdac 529 fl6.mp_hash = rt6_multipath_hash(&fl6, skb);
4c9483b2 530 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 531
fdc0bde9 532 sk = icmpv6_xmit_lock(net);
63159f29 533 if (!sk)
7ba91ecb 534 goto out_bh_enable;
c0303efe 535
e110861f 536 sk->sk_mark = mark;
fdc0bde9 537 np = inet6_sk(sk);
405666db 538
4c9483b2 539 if (!icmpv6_xrlim_allow(sk, type, &fl6))
1da177e4
LT
540 goto out;
541
542 tmp_hdr.icmp6_type = type;
543 tmp_hdr.icmp6_code = code;
544 tmp_hdr.icmp6_cksum = 0;
545 tmp_hdr.icmp6_pointer = htonl(info);
546
4c9483b2
DM
547 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
548 fl6.flowi6_oif = np->mcast_oif;
c4062dfc
EH
549 else if (!fl6.flowi6_oif)
550 fl6.flowi6_oif = np->ucast_oif;
1da177e4 551
38b7097b
HFS
552 ipc6.tclass = np->tclass;
553 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
554
4c9483b2 555 dst = icmpv6_route_lookup(net, skb, sk, &fl6);
b42835db 556 if (IS_ERR(dst))
1da177e4 557 goto out;
8de3351e 558
26879da5 559 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
26879da5
WW
560 ipc6.dontfrag = np->dontfrag;
561 ipc6.opt = NULL;
1da177e4
LT
562
563 msg.skb = skb;
bbe735e4 564 msg.offset = skb_network_offset(skb);
763ecff1 565 msg.type = type;
1da177e4
LT
566
567 len = skb->len - msg.offset;
67ba4152 568 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
1da177e4 569 if (len < 0) {
4b3418fb
BM
570 net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
571 &hdr->saddr, &hdr->daddr);
1da177e4
LT
572 goto out_dst_release;
573 }
574
cfdf7647
ED
575 rcu_read_lock();
576 idev = __in6_dev_get(skb->dev);
1da177e4
LT
577
578 err = ip6_append_data(sk, icmpv6_getfrag, &msg,
579 len + sizeof(struct icmp6hdr),
26879da5
WW
580 sizeof(struct icmp6hdr),
581 &ipc6, &fl6, (struct rt6_info *)dst,
582 MSG_DONTWAIT, &sockc_unused);
1da177e4 583 if (err) {
43a43b60 584 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1da177e4 585 ip6_flush_pending_frames(sk);
cfdf7647
ED
586 } else {
587 err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
588 len + sizeof(struct icmp6hdr));
1da177e4 589 }
cfdf7647 590 rcu_read_unlock();
1da177e4
LT
591out_dst_release:
592 dst_release(dst);
593out:
405666db 594 icmpv6_xmit_unlock(sk);
7ba91ecb
JDB
595out_bh_enable:
596 local_bh_enable();
1da177e4 597}
5f5624cf
PS
598
599/* Slightly more convenient version of icmp6_send.
600 */
601void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
602{
b1cadc1a 603 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL);
5f5624cf
PS
604 kfree_skb(skb);
605}
7159039a 606
5fbba8ac
ED
607/* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
608 * if sufficient data bytes are available
609 * @nhs is the size of the tunnel header(s) :
610 * Either an IPv4 header for SIT encap
611 * an IPv4 header + GRE header for GRE encap
612 */
20e1954f
ED
613int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
614 unsigned int data_len)
5fbba8ac 615{
2d7a3b27 616 struct in6_addr temp_saddr;
5fbba8ac
ED
617 struct rt6_info *rt;
618 struct sk_buff *skb2;
20e1954f 619 u32 info = 0;
5fbba8ac
ED
620
621 if (!pskb_may_pull(skb, nhs + sizeof(struct ipv6hdr) + 8))
622 return 1;
623
20e1954f
ED
624 /* RFC 4884 (partial) support for ICMP extensions */
625 if (data_len < 128 || (data_len & 7) || skb->len < data_len)
626 data_len = 0;
627
628 skb2 = data_len ? skb_copy(skb, GFP_ATOMIC) : skb_clone(skb, GFP_ATOMIC);
5fbba8ac
ED
629
630 if (!skb2)
631 return 1;
632
633 skb_dst_drop(skb2);
634 skb_pull(skb2, nhs);
635 skb_reset_network_header(skb2);
636
637 rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0, 0);
638
639 if (rt && rt->dst.dev)
640 skb2->dev = rt->dst.dev;
641
2d7a3b27 642 ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, &temp_saddr);
20e1954f
ED
643
644 if (data_len) {
645 /* RFC 4884 (partial) support :
646 * insert 0 padding at the end, before the extensions
647 */
648 __skb_push(skb2, nhs);
649 skb_reset_network_header(skb2);
650 memmove(skb2->data, skb2->data + nhs, data_len - nhs);
651 memset(skb2->data + data_len - nhs, 0, nhs);
652 /* RFC 4884 4.5 : Length is measured in 64-bit words,
653 * and stored in reserved[0]
654 */
655 info = (data_len/8) << 24;
656 }
2d7a3b27
ED
657 if (type == ICMP_TIME_EXCEEDED)
658 icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
20e1954f 659 info, &temp_saddr);
2d7a3b27
ED
660 else
661 icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
20e1954f 662 info, &temp_saddr);
5fbba8ac
ED
663 if (rt)
664 ip6_rt_put(rt);
665
666 kfree_skb(skb2);
667
668 return 0;
669}
670EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
671
1da177e4
LT
672static void icmpv6_echo_reply(struct sk_buff *skb)
673{
c346dca1 674 struct net *net = dev_net(skb->dev);
84427d53 675 struct sock *sk;
1da177e4 676 struct inet6_dev *idev;
84427d53 677 struct ipv6_pinfo *np;
b71d1d42 678 const struct in6_addr *saddr = NULL;
cc70ab26 679 struct icmp6hdr *icmph = icmp6_hdr(skb);
1da177e4 680 struct icmp6hdr tmp_hdr;
4c9483b2 681 struct flowi6 fl6;
1da177e4
LT
682 struct icmpv6_msg msg;
683 struct dst_entry *dst;
26879da5 684 struct ipcm6_cookie ipc6;
1da177e4 685 int err = 0;
e110861f 686 u32 mark = IP6_REPLY_MARK(net, skb->mark);
c14ac945 687 struct sockcm_cookie sockc_unused = {0};
1da177e4 688
0660e03f 689 saddr = &ipv6_hdr(skb)->daddr;
1da177e4 690
509aba3b 691 if (!ipv6_unicast_destination(skb) &&
ec35b61e 692 !(net->ipv6.sysctl.anycast_src_echo_reply &&
2647a9b0 693 ipv6_anycast_destination(skb_dst(skb), saddr)))
1da177e4
LT
694 saddr = NULL;
695
696 memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
697 tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
698
4c9483b2
DM
699 memset(&fl6, 0, sizeof(fl6));
700 fl6.flowi6_proto = IPPROTO_ICMPV6;
4e3fd7a0 701 fl6.daddr = ipv6_hdr(skb)->saddr;
1da177e4 702 if (saddr)
4e3fd7a0 703 fl6.saddr = *saddr;
1b70d792 704 fl6.flowi6_oif = icmp6_iif(skb);
1958b856 705 fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
e110861f 706 fl6.flowi6_mark = mark;
e2d118a1 707 fl6.flowi6_uid = sock_net_uid(net, NULL);
4c9483b2 708 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 709
7ba91ecb 710 local_bh_disable();
fdc0bde9 711 sk = icmpv6_xmit_lock(net);
63159f29 712 if (!sk)
7ba91ecb 713 goto out_bh_enable;
e110861f 714 sk->sk_mark = mark;
fdc0bde9 715 np = inet6_sk(sk);
405666db 716
4c9483b2
DM
717 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
718 fl6.flowi6_oif = np->mcast_oif;
c4062dfc
EH
719 else if (!fl6.flowi6_oif)
720 fl6.flowi6_oif = np->ucast_oif;
1da177e4 721
343d60aa 722 err = ip6_dst_lookup(net, sk, &dst, &fl6);
1da177e4
LT
723 if (err)
724 goto out;
4c9483b2 725 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
452edd59 726 if (IS_ERR(dst))
e104411b 727 goto out;
1da177e4 728
cfdf7647 729 idev = __in6_dev_get(skb->dev);
1da177e4
LT
730
731 msg.skb = skb;
732 msg.offset = 0;
763ecff1 733 msg.type = ICMPV6_ECHO_REPLY;
1da177e4 734
26879da5
WW
735 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
736 ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
737 ipc6.dontfrag = np->dontfrag;
738 ipc6.opt = NULL;
739
1da177e4 740 err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr),
26879da5 741 sizeof(struct icmp6hdr), &ipc6, &fl6,
a2d91a09 742 (struct rt6_info *)dst, MSG_DONTWAIT,
26879da5 743 &sockc_unused);
1da177e4
LT
744
745 if (err) {
a16292a0 746 __ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1da177e4 747 ip6_flush_pending_frames(sk);
cfdf7647
ED
748 } else {
749 err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
750 skb->len + sizeof(struct icmp6hdr));
1da177e4 751 }
1da177e4 752 dst_release(dst);
1ab1457c 753out:
405666db 754 icmpv6_xmit_unlock(sk);
7ba91ecb
JDB
755out_bh_enable:
756 local_bh_enable();
1da177e4
LT
757}
758
b94f1c09 759void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
1da177e4 760{
41135cc8 761 const struct inet6_protocol *ipprot;
1da177e4 762 int inner_offset;
75f2811c 763 __be16 frag_off;
f9242b6b 764 u8 nexthdr;
7304fe46 765 struct net *net = dev_net(skb->dev);
1da177e4
LT
766
767 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
7304fe46 768 goto out;
1da177e4
LT
769
770 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
771 if (ipv6_ext_hdr(nexthdr)) {
772 /* now skip over extension headers */
75f2811c
JG
773 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
774 &nexthdr, &frag_off);
67ba4152 775 if (inner_offset < 0)
7304fe46 776 goto out;
1da177e4
LT
777 } else {
778 inner_offset = sizeof(struct ipv6hdr);
779 }
780
781 /* Checkin header including 8 bytes of inner protocol header. */
782 if (!pskb_may_pull(skb, inner_offset+8))
7304fe46 783 goto out;
1da177e4 784
1da177e4
LT
785 /* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
786 Without this we will not able f.e. to make source routed
787 pmtu discovery.
788 Corresponding argument (opt) to notifiers is already added.
789 --ANK (980726)
790 */
791
f9242b6b 792 ipprot = rcu_dereference(inet6_protos[nexthdr]);
1da177e4
LT
793 if (ipprot && ipprot->err_handler)
794 ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
1da177e4 795
69d6da0b 796 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
7304fe46
DJ
797 return;
798
799out:
a16292a0 800 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
1da177e4 801}
1ab1457c 802
1da177e4
LT
803/*
804 * Handle icmp messages
805 */
806
e5bbef20 807static int icmpv6_rcv(struct sk_buff *skb)
1da177e4 808{
1da177e4
LT
809 struct net_device *dev = skb->dev;
810 struct inet6_dev *idev = __in6_dev_get(dev);
b71d1d42 811 const struct in6_addr *saddr, *daddr;
1da177e4 812 struct icmp6hdr *hdr;
d5fdd6ba 813 u8 type;
e3e32170 814 bool success = false;
1da177e4 815
aebcf82c 816 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
def8b4fa 817 struct sec_path *sp = skb_sec_path(skb);
8b7817f3
HX
818 int nh;
819
def8b4fa 820 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
aebcf82c
HX
821 XFRM_STATE_ICMP))
822 goto drop_no_count;
823
81aded24 824 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
8b7817f3
HX
825 goto drop_no_count;
826
827 nh = skb_network_offset(skb);
828 skb_set_network_header(skb, sizeof(*hdr));
829
830 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
831 goto drop_no_count;
832
833 skb_set_network_header(skb, nh);
834 }
835
a16292a0 836 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
1da177e4 837
0660e03f
ACM
838 saddr = &ipv6_hdr(skb)->saddr;
839 daddr = &ipv6_hdr(skb)->daddr;
1da177e4 840
39471ac8 841 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
ba7a46f1
JP
842 net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
843 saddr, daddr);
39471ac8 844 goto csum_error;
1da177e4
LT
845 }
846
8cf22943
HX
847 if (!pskb_pull(skb, sizeof(*hdr)))
848 goto discard_it;
1da177e4 849
cc70ab26 850 hdr = icmp6_hdr(skb);
1da177e4
LT
851
852 type = hdr->icmp6_type;
853
f3832ed2 854 ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
1da177e4
LT
855
856 switch (type) {
857 case ICMPV6_ECHO_REQUEST:
858 icmpv6_echo_reply(skb);
859 break;
860
861 case ICMPV6_ECHO_REPLY:
e3e32170 862 success = ping_rcv(skb);
1da177e4
LT
863 break;
864
865 case ICMPV6_PKT_TOOBIG:
866 /* BUGGG_FUTURE: if packet contains rthdr, we cannot update
867 standard destination cache. Seems, only "advanced"
868 destination cache will allow to solve this problem
869 --ANK (980726)
870 */
871 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
872 goto discard_it;
cc70ab26 873 hdr = icmp6_hdr(skb);
1da177e4
LT
874
875 /*
876 * Drop through to notify
877 */
878
879 case ICMPV6_DEST_UNREACH:
880 case ICMPV6_TIME_EXCEED:
881 case ICMPV6_PARAMPROB:
882 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
883 break;
884
885 case NDISC_ROUTER_SOLICITATION:
886 case NDISC_ROUTER_ADVERTISEMENT:
887 case NDISC_NEIGHBOUR_SOLICITATION:
888 case NDISC_NEIGHBOUR_ADVERTISEMENT:
889 case NDISC_REDIRECT:
890 ndisc_rcv(skb);
891 break;
892
893 case ICMPV6_MGM_QUERY:
894 igmp6_event_query(skb);
895 break;
896
897 case ICMPV6_MGM_REPORT:
898 igmp6_event_report(skb);
899 break;
900
901 case ICMPV6_MGM_REDUCTION:
902 case ICMPV6_NI_QUERY:
903 case ICMPV6_NI_REPLY:
904 case ICMPV6_MLD2_REPORT:
905 case ICMPV6_DHAAD_REQUEST:
906 case ICMPV6_DHAAD_REPLY:
907 case ICMPV6_MOBILE_PREFIX_SOL:
908 case ICMPV6_MOBILE_PREFIX_ADV:
909 break;
910
911 default:
1da177e4
LT
912 /* informational */
913 if (type & ICMPV6_INFOMSG_MASK)
914 break;
915
4b3418fb
BM
916 net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
917 saddr, daddr);
ea85a0a2 918
1ab1457c
YH
919 /*
920 * error of unknown type.
921 * must pass to upper level
1da177e4
LT
922 */
923
924 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
3ff50b79
SH
925 }
926
e3e32170
RJ
927 /* until the v6 path can be better sorted assume failure and
928 * preserve the status quo behaviour for the rest of the paths to here
929 */
930 if (success)
931 consume_skb(skb);
932 else
933 kfree_skb(skb);
934
1da177e4
LT
935 return 0;
936
6a5dc9e5 937csum_error:
a16292a0 938 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
1da177e4 939discard_it:
a16292a0 940 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
8b7817f3 941drop_no_count:
1da177e4
LT
942 kfree_skb(skb);
943 return 0;
944}
945
4c9483b2 946void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
95e41e93
YH
947 u8 type,
948 const struct in6_addr *saddr,
949 const struct in6_addr *daddr,
950 int oif)
951{
4c9483b2 952 memset(fl6, 0, sizeof(*fl6));
4e3fd7a0
AD
953 fl6->saddr = *saddr;
954 fl6->daddr = *daddr;
67ba4152 955 fl6->flowi6_proto = IPPROTO_ICMPV6;
1958b856
DM
956 fl6->fl6_icmp_type = type;
957 fl6->fl6_icmp_code = 0;
4c9483b2
DM
958 fl6->flowi6_oif = oif;
959 security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
95e41e93
YH
960}
961
98c6d1b2 962static int __net_init icmpv6_sk_init(struct net *net)
1da177e4
LT
963{
964 struct sock *sk;
965 int err, i, j;
966
98c6d1b2
DL
967 net->ipv6.icmp_sk =
968 kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
63159f29 969 if (!net->ipv6.icmp_sk)
79c91159
DL
970 return -ENOMEM;
971
6f912042 972 for_each_possible_cpu(i) {
1ed8516f
DL
973 err = inet_ctl_sock_create(&sk, PF_INET6,
974 SOCK_RAW, IPPROTO_ICMPV6, net);
1da177e4 975 if (err < 0) {
f3213831 976 pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
1da177e4
LT
977 err);
978 goto fail;
979 }
980
1ed8516f 981 net->ipv6.icmp_sk[i] = sk;
5c8cafd6 982
1da177e4
LT
983 /* Enough space for 2 64K ICMP packets, including
984 * sk_buff struct overhead.
985 */
87fb4b7b 986 sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
1da177e4 987 }
1da177e4
LT
988 return 0;
989
990 fail:
5c8cafd6 991 for (j = 0; j < i; j++)
1ed8516f 992 inet_ctl_sock_destroy(net->ipv6.icmp_sk[j]);
98c6d1b2 993 kfree(net->ipv6.icmp_sk);
1da177e4
LT
994 return err;
995}
996
98c6d1b2 997static void __net_exit icmpv6_sk_exit(struct net *net)
1da177e4
LT
998{
999 int i;
1000
6f912042 1001 for_each_possible_cpu(i) {
1ed8516f 1002 inet_ctl_sock_destroy(net->ipv6.icmp_sk[i]);
1da177e4 1003 }
98c6d1b2
DL
1004 kfree(net->ipv6.icmp_sk);
1005}
1006
8ed7edce 1007static struct pernet_operations icmpv6_sk_ops = {
67ba4152
IM
1008 .init = icmpv6_sk_init,
1009 .exit = icmpv6_sk_exit,
98c6d1b2
DL
1010};
1011
1012int __init icmpv6_init(void)
1013{
1014 int err;
1015
1016 err = register_pernet_subsys(&icmpv6_sk_ops);
1017 if (err < 0)
1018 return err;
1019
1020 err = -EAGAIN;
1021 if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1022 goto fail;
5f5624cf
PS
1023
1024 err = inet6_register_icmp_sender(icmp6_send);
1025 if (err)
1026 goto sender_reg_err;
98c6d1b2
DL
1027 return 0;
1028
5f5624cf
PS
1029sender_reg_err:
1030 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
98c6d1b2 1031fail:
f3213831 1032 pr_err("Failed to register ICMP6 protocol\n");
98c6d1b2
DL
1033 unregister_pernet_subsys(&icmpv6_sk_ops);
1034 return err;
1035}
1036
8ed7edce 1037void icmpv6_cleanup(void)
98c6d1b2 1038{
5f5624cf 1039 inet6_unregister_icmp_sender(icmp6_send);
98c6d1b2 1040 unregister_pernet_subsys(&icmpv6_sk_ops);
1da177e4
LT
1041 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1042}
1043
98c6d1b2 1044
9b5b5cff 1045static const struct icmp6_err {
1da177e4
LT
1046 int err;
1047 int fatal;
1048} tab_unreach[] = {
1049 { /* NOROUTE */
1050 .err = ENETUNREACH,
1051 .fatal = 0,
1052 },
1053 { /* ADM_PROHIBITED */
1054 .err = EACCES,
1055 .fatal = 1,
1056 },
1057 { /* Was NOT_NEIGHBOUR, now reserved */
1058 .err = EHOSTUNREACH,
1059 .fatal = 0,
1060 },
1061 { /* ADDR_UNREACH */
1062 .err = EHOSTUNREACH,
1063 .fatal = 0,
1064 },
1065 { /* PORT_UNREACH */
1066 .err = ECONNREFUSED,
1067 .fatal = 1,
1068 },
61e76b17
JB
1069 { /* POLICY_FAIL */
1070 .err = EACCES,
1071 .fatal = 1,
1072 },
1073 { /* REJECT_ROUTE */
1074 .err = EACCES,
1075 .fatal = 1,
1076 },
1da177e4
LT
1077};
1078
d5fdd6ba 1079int icmpv6_err_convert(u8 type, u8 code, int *err)
1da177e4
LT
1080{
1081 int fatal = 0;
1082
1083 *err = EPROTO;
1084
1085 switch (type) {
1086 case ICMPV6_DEST_UNREACH:
1087 fatal = 1;
61e76b17 1088 if (code < ARRAY_SIZE(tab_unreach)) {
1da177e4
LT
1089 *err = tab_unreach[code].err;
1090 fatal = tab_unreach[code].fatal;
1091 }
1092 break;
1093
1094 case ICMPV6_PKT_TOOBIG:
1095 *err = EMSGSIZE;
1096 break;
1ab1457c 1097
1da177e4
LT
1098 case ICMPV6_PARAMPROB:
1099 *err = EPROTO;
1100 fatal = 1;
1101 break;
1102
1103 case ICMPV6_TIME_EXCEED:
1104 *err = EHOSTUNREACH;
1105 break;
3ff50b79 1106 }
1da177e4
LT
1107
1108 return fatal;
1109}
7159039a
YH
1110EXPORT_SYMBOL(icmpv6_err_convert);
1111
1da177e4 1112#ifdef CONFIG_SYSCTL
e8243534 1113static struct ctl_table ipv6_icmp_table_template[] = {
1da177e4 1114 {
1da177e4 1115 .procname = "ratelimit",
41a76906 1116 .data = &init_net.ipv6.sysctl.icmpv6_time,
1da177e4
LT
1117 .maxlen = sizeof(int),
1118 .mode = 0644,
6d9f239a 1119 .proc_handler = proc_dointvec_ms_jiffies,
1da177e4 1120 },
f8572d8f 1121 { },
1da177e4 1122};
760f2d01 1123
2c8c1e72 1124struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
760f2d01
DL
1125{
1126 struct ctl_table *table;
1127
1128 table = kmemdup(ipv6_icmp_table_template,
1129 sizeof(ipv6_icmp_table_template),
1130 GFP_KERNEL);
5ee09105 1131
c027aab4 1132 if (table)
5ee09105
YH
1133 table[0].data = &net->ipv6.sysctl.icmpv6_time;
1134
760f2d01
DL
1135 return table;
1136}
1da177e4 1137#endif