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