blob: 3db10cae7b178539d0dfb4d352cc80b09b41442f [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001// SPDX-License-Identifier: GPL-2.0-or-later
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/*
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
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000012 */
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 */
David Brazdil0f672f62019-12-10 10:32:29 +000078static struct sock *icmpv6_sk(struct net *net)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000079{
David Brazdil0f672f62019-12-10 10:32:29 +000080 return this_cpu_read(*net->ipv6.icmp_sk);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000081}
82
David Brazdil0f672f62019-12-10 10:32:29 +000083static int icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000084 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));
David Brazdil0f672f62019-12-10 10:32:29 +000099
100 return 0;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000101}
102
103static int icmpv6_rcv(struct sk_buff *skb);
104
105static const struct inet6_protocol icmpv6_protocol = {
106 .handler = icmpv6_rcv,
107 .err_handler = icmpv6_err,
108 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
109};
110
111/* Called with BH disabled */
112static __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
127static __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
143static 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);
Olivier Deprez0e641232021-09-23 10:07:05 +0200161
162 /* Based on RFC 8200, Section 4.5 Fragment Header, return
163 * false if this is a fragment packet with no icmp header info.
164 */
165 if (!tp && frag_off != 0)
166 return false;
167 else if (!tp || !(*tp & ICMPV6_INFOMSG_MASK))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000168 return true;
169 }
170 return false;
171}
172
David Brazdil0f672f62019-12-10 10:32:29 +0000173static bool icmpv6_mask_allow(struct net *net, int type)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000174{
David Brazdil0f672f62019-12-10 10:32:29 +0000175 if (type > ICMPV6_MSG_MAX)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000176 return true;
177
David Brazdil0f672f62019-12-10 10:32:29 +0000178 /* Limit if icmp type is set in ratemask. */
179 if (!test_bit(type, net->ipv6.sysctl.icmpv6_ratemask))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000180 return true;
181
182 return false;
183}
184
David Brazdil0f672f62019-12-10 10:32:29 +0000185static bool icmpv6_global_allow(struct net *net, int type)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000186{
David Brazdil0f672f62019-12-10 10:32:29 +0000187 if (icmpv6_mask_allow(net, type))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000188 return true;
189
190 if (icmp_global_allow())
191 return true;
192
193 return false;
194}
195
196/*
197 * Check the ICMP output rate limit
198 */
199static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
200 struct flowi6 *fl6)
201{
202 struct net *net = sock_net(sk);
203 struct dst_entry *dst;
204 bool res = false;
205
David Brazdil0f672f62019-12-10 10:32:29 +0000206 if (icmpv6_mask_allow(net, type))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000207 return true;
208
209 /*
210 * Look up the output route.
211 * XXX: perhaps the expire for routing entries cloned by
212 * this lookup should be more aggressive (not longer than timeout).
213 */
214 dst = ip6_route_output(net, sk, fl6);
215 if (dst->error) {
216 IP6_INC_STATS(net, ip6_dst_idev(dst),
217 IPSTATS_MIB_OUTNOROUTES);
218 } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) {
219 res = true;
220 } else {
221 struct rt6_info *rt = (struct rt6_info *)dst;
222 int tmo = net->ipv6.sysctl.icmpv6_time;
223 struct inet_peer *peer;
224
225 /* Give more bandwidth to wider prefixes. */
226 if (rt->rt6i_dst.plen < 128)
227 tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
228
229 peer = inet_getpeer_v6(net->ipv6.peers, &fl6->daddr, 1);
230 res = inet_peer_xrlim_allow(peer, tmo);
231 if (peer)
232 inet_putpeer(peer);
233 }
234 dst_release(dst);
235 return res;
236}
237
238/*
239 * an inline helper for the "simple" if statement below
240 * checks if parameter problem report is caused by an
241 * unrecognized IPv6 option that has the Option Type
242 * highest-order two bits set to 10
243 */
244
245static bool opt_unrec(struct sk_buff *skb, __u32 offset)
246{
247 u8 _optval, *op;
248
249 offset += skb_network_offset(skb);
250 op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
251 if (!op)
252 return true;
253 return (*op & 0xC0) == 0x80;
254}
255
256void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
257 struct icmp6hdr *thdr, int len)
258{
259 struct sk_buff *skb;
260 struct icmp6hdr *icmp6h;
261
262 skb = skb_peek(&sk->sk_write_queue);
263 if (!skb)
264 return;
265
266 icmp6h = icmp6_hdr(skb);
267 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
268 icmp6h->icmp6_cksum = 0;
269
270 if (skb_queue_len(&sk->sk_write_queue) == 1) {
271 skb->csum = csum_partial(icmp6h,
272 sizeof(struct icmp6hdr), skb->csum);
273 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
274 &fl6->daddr,
275 len, fl6->flowi6_proto,
276 skb->csum);
277 } else {
278 __wsum tmp_csum = 0;
279
280 skb_queue_walk(&sk->sk_write_queue, skb) {
281 tmp_csum = csum_add(tmp_csum, skb->csum);
282 }
283
284 tmp_csum = csum_partial(icmp6h,
285 sizeof(struct icmp6hdr), tmp_csum);
286 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
287 &fl6->daddr,
288 len, fl6->flowi6_proto,
289 tmp_csum);
290 }
291 ip6_push_pending_frames(sk);
292}
293
294struct icmpv6_msg {
295 struct sk_buff *skb;
296 int offset;
297 uint8_t type;
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;
304 __wsum csum = 0;
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);
309 if (!(msg->type & ICMPV6_INFOMSG_MASK))
310 nf_ct_attach(skb, org_skb);
311 return 0;
312}
313
314#if IS_ENABLED(CONFIG_IPV6_MIP6)
Olivier Deprez0e641232021-09-23 10:07:05 +0200315static void mip6_addr_swap(struct sk_buff *skb, const struct inet6_skb_parm *opt)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000316{
317 struct ipv6hdr *iph = ipv6_hdr(skb);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000318 struct ipv6_destopt_hao *hao;
319 struct in6_addr tmp;
320 int off;
321
322 if (opt->dsthao) {
323 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
324 if (likely(off >= 0)) {
325 hao = (struct ipv6_destopt_hao *)
326 (skb_network_header(skb) + off);
327 tmp = iph->saddr;
328 iph->saddr = hao->addr;
329 hao->addr = tmp;
330 }
331 }
332}
333#else
Olivier Deprez0e641232021-09-23 10:07:05 +0200334static inline void mip6_addr_swap(struct sk_buff *skb, const struct inet6_skb_parm *opt) {}
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000335#endif
336
337static struct dst_entry *icmpv6_route_lookup(struct net *net,
338 struct sk_buff *skb,
339 struct sock *sk,
340 struct flowi6 *fl6)
341{
342 struct dst_entry *dst, *dst2;
343 struct flowi6 fl2;
344 int err;
345
346 err = ip6_dst_lookup(net, sk, &dst, fl6);
347 if (err)
348 return ERR_PTR(err);
349
350 /*
351 * We won't send icmp if the destination is known
352 * anycast.
353 */
354 if (ipv6_anycast_destination(dst, &fl6->daddr)) {
355 net_dbg_ratelimited("icmp6_send: acast source\n");
356 dst_release(dst);
357 return ERR_PTR(-EINVAL);
358 }
359
360 /* No need to clone since we're just using its address. */
361 dst2 = dst;
362
363 dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
364 if (!IS_ERR(dst)) {
365 if (dst != dst2)
366 return dst;
367 } else {
368 if (PTR_ERR(dst) == -EPERM)
369 dst = NULL;
370 else
371 return dst;
372 }
373
374 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
375 if (err)
376 goto relookup_failed;
377
378 err = ip6_dst_lookup(net, sk, &dst2, &fl2);
379 if (err)
380 goto relookup_failed;
381
382 dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
383 if (!IS_ERR(dst2)) {
384 dst_release(dst);
385 dst = dst2;
386 } else {
387 err = PTR_ERR(dst2);
388 if (err == -EPERM) {
389 dst_release(dst);
390 return dst2;
391 } else
392 goto relookup_failed;
393 }
394
395relookup_failed:
396 if (dst)
397 return dst;
398 return ERR_PTR(err);
399}
400
David Brazdil0f672f62019-12-10 10:32:29 +0000401static struct net_device *icmp6_dev(const struct sk_buff *skb)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000402{
David Brazdil0f672f62019-12-10 10:32:29 +0000403 struct net_device *dev = skb->dev;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000404
405 /* for local traffic to local address, skb dev is the loopback
406 * device. Check if there is a dst attached to the skb and if so
407 * get the real device index. Same is needed for replies to a link
408 * local address on a device enslaved to an L3 master device
409 */
David Brazdil0f672f62019-12-10 10:32:29 +0000410 if (unlikely(dev->ifindex == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000411 const struct rt6_info *rt6 = skb_rt6_info(skb);
412
413 if (rt6)
David Brazdil0f672f62019-12-10 10:32:29 +0000414 dev = rt6->rt6i_idev->dev;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000415 }
416
David Brazdil0f672f62019-12-10 10:32:29 +0000417 return dev;
418}
419
420static int icmp6_iif(const struct sk_buff *skb)
421{
422 return icmp6_dev(skb)->ifindex;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000423}
424
425/*
426 * Send an ICMP message in response to a packet in error
427 */
Olivier Deprez0e641232021-09-23 10:07:05 +0200428void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
429 const struct in6_addr *force_saddr,
430 const struct inet6_skb_parm *parm)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000431{
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000432 struct inet6_dev *idev = NULL;
433 struct ipv6hdr *hdr = ipv6_hdr(skb);
434 struct sock *sk;
David Brazdil0f672f62019-12-10 10:32:29 +0000435 struct net *net;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000436 struct ipv6_pinfo *np;
437 const struct in6_addr *saddr = NULL;
438 struct dst_entry *dst;
439 struct icmp6hdr tmp_hdr;
440 struct flowi6 fl6;
441 struct icmpv6_msg msg;
442 struct ipcm6_cookie ipc6;
443 int iif = 0;
444 int addr_type = 0;
445 int len;
David Brazdil0f672f62019-12-10 10:32:29 +0000446 u32 mark;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000447
448 if ((u8 *)hdr < skb->head ||
449 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
450 return;
451
David Brazdil0f672f62019-12-10 10:32:29 +0000452 if (!skb->dev)
453 return;
454 net = dev_net(skb->dev);
455 mark = IP6_REPLY_MARK(net, skb->mark);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000456 /*
457 * Make sure we respect the rules
458 * i.e. RFC 1885 2.4(e)
459 * Rule (e.1) is enforced by not using icmp6_send
460 * in any code that processes icmp errors.
461 */
462 addr_type = ipv6_addr_type(&hdr->daddr);
463
464 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
465 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
466 saddr = &hdr->daddr;
467
468 /*
469 * Dest addr check
470 */
471
472 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
473 if (type != ICMPV6_PKT_TOOBIG &&
474 !(type == ICMPV6_PARAMPROB &&
475 code == ICMPV6_UNK_OPTION &&
476 (opt_unrec(skb, info))))
477 return;
478
479 saddr = NULL;
480 }
481
482 addr_type = ipv6_addr_type(&hdr->saddr);
483
484 /*
485 * Source addr check
486 */
487
488 if (__ipv6_addr_needs_scope_id(addr_type)) {
489 iif = icmp6_iif(skb);
490 } else {
491 dst = skb_dst(skb);
492 iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
493 }
494
495 /*
496 * Must not send error if the source does not uniquely
497 * identify a single node (RFC2463 Section 2.4).
498 * We check unspecified / multicast addresses here,
499 * and anycast addresses will be checked later.
500 */
501 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
502 net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
503 &hdr->saddr, &hdr->daddr);
504 return;
505 }
506
507 /*
508 * Never answer to a ICMP packet.
509 */
510 if (is_ineligible(skb)) {
511 net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
512 &hdr->saddr, &hdr->daddr);
513 return;
514 }
515
516 /* Needed by both icmp_global_allow and icmpv6_xmit_lock */
517 local_bh_disable();
518
519 /* Check global sysctl_icmp_msgs_per_sec ratelimit */
David Brazdil0f672f62019-12-10 10:32:29 +0000520 if (!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, type))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000521 goto out_bh_enable;
522
Olivier Deprez0e641232021-09-23 10:07:05 +0200523 mip6_addr_swap(skb, parm);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000524
525 memset(&fl6, 0, sizeof(fl6));
526 fl6.flowi6_proto = IPPROTO_ICMPV6;
527 fl6.daddr = hdr->saddr;
528 if (force_saddr)
529 saddr = force_saddr;
530 if (saddr)
531 fl6.saddr = *saddr;
532 fl6.flowi6_mark = mark;
533 fl6.flowi6_oif = iif;
534 fl6.fl6_icmp_type = type;
535 fl6.fl6_icmp_code = code;
536 fl6.flowi6_uid = sock_net_uid(net, NULL);
537 fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL);
538 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
539
540 sk = icmpv6_xmit_lock(net);
541 if (!sk)
542 goto out_bh_enable;
543
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000544 np = inet6_sk(sk);
545
546 if (!icmpv6_xrlim_allow(sk, type, &fl6))
547 goto out;
548
549 tmp_hdr.icmp6_type = type;
550 tmp_hdr.icmp6_code = code;
551 tmp_hdr.icmp6_cksum = 0;
552 tmp_hdr.icmp6_pointer = htonl(info);
553
554 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
555 fl6.flowi6_oif = np->mcast_oif;
556 else if (!fl6.flowi6_oif)
557 fl6.flowi6_oif = np->ucast_oif;
558
559 ipcm6_init_sk(&ipc6, np);
Olivier Deprez0e641232021-09-23 10:07:05 +0200560 ipc6.sockc.mark = mark;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000561 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
562
563 dst = icmpv6_route_lookup(net, skb, sk, &fl6);
564 if (IS_ERR(dst))
565 goto out;
566
567 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
568
569 msg.skb = skb;
570 msg.offset = skb_network_offset(skb);
571 msg.type = type;
572
573 len = skb->len - msg.offset;
574 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
575 if (len < 0) {
576 net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
577 &hdr->saddr, &hdr->daddr);
578 goto out_dst_release;
579 }
580
581 rcu_read_lock();
582 idev = __in6_dev_get(skb->dev);
583
584 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
585 len + sizeof(struct icmp6hdr),
586 sizeof(struct icmp6hdr),
587 &ipc6, &fl6, (struct rt6_info *)dst,
588 MSG_DONTWAIT)) {
589 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
590 ip6_flush_pending_frames(sk);
591 } else {
592 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
593 len + sizeof(struct icmp6hdr));
594 }
595 rcu_read_unlock();
596out_dst_release:
597 dst_release(dst);
598out:
599 icmpv6_xmit_unlock(sk);
600out_bh_enable:
601 local_bh_enable();
602}
Olivier Deprez0e641232021-09-23 10:07:05 +0200603EXPORT_SYMBOL(icmp6_send);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000604
605/* Slightly more convenient version of icmp6_send.
606 */
607void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
608{
Olivier Deprez0e641232021-09-23 10:07:05 +0200609 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL, IP6CB(skb));
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000610 kfree_skb(skb);
611}
612
613/* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
614 * if sufficient data bytes are available
615 * @nhs is the size of the tunnel header(s) :
616 * Either an IPv4 header for SIT encap
617 * an IPv4 header + GRE header for GRE encap
618 */
619int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
620 unsigned int data_len)
621{
622 struct in6_addr temp_saddr;
623 struct rt6_info *rt;
624 struct sk_buff *skb2;
625 u32 info = 0;
626
627 if (!pskb_may_pull(skb, nhs + sizeof(struct ipv6hdr) + 8))
628 return 1;
629
630 /* RFC 4884 (partial) support for ICMP extensions */
631 if (data_len < 128 || (data_len & 7) || skb->len < data_len)
632 data_len = 0;
633
634 skb2 = data_len ? skb_copy(skb, GFP_ATOMIC) : skb_clone(skb, GFP_ATOMIC);
635
636 if (!skb2)
637 return 1;
638
639 skb_dst_drop(skb2);
640 skb_pull(skb2, nhs);
641 skb_reset_network_header(skb2);
642
643 rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0,
644 skb, 0);
645
646 if (rt && rt->dst.dev)
647 skb2->dev = rt->dst.dev;
648
649 ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, &temp_saddr);
650
651 if (data_len) {
652 /* RFC 4884 (partial) support :
653 * insert 0 padding at the end, before the extensions
654 */
655 __skb_push(skb2, nhs);
656 skb_reset_network_header(skb2);
657 memmove(skb2->data, skb2->data + nhs, data_len - nhs);
658 memset(skb2->data + data_len - nhs, 0, nhs);
659 /* RFC 4884 4.5 : Length is measured in 64-bit words,
660 * and stored in reserved[0]
661 */
662 info = (data_len/8) << 24;
663 }
664 if (type == ICMP_TIME_EXCEEDED)
665 icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
Olivier Deprez0e641232021-09-23 10:07:05 +0200666 info, &temp_saddr, IP6CB(skb2));
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000667 else
668 icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
Olivier Deprez0e641232021-09-23 10:07:05 +0200669 info, &temp_saddr, IP6CB(skb2));
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000670 if (rt)
671 ip6_rt_put(rt);
672
673 kfree_skb(skb2);
674
675 return 0;
676}
677EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
678
679static void icmpv6_echo_reply(struct sk_buff *skb)
680{
681 struct net *net = dev_net(skb->dev);
682 struct sock *sk;
683 struct inet6_dev *idev;
684 struct ipv6_pinfo *np;
685 const struct in6_addr *saddr = NULL;
686 struct icmp6hdr *icmph = icmp6_hdr(skb);
687 struct icmp6hdr tmp_hdr;
688 struct flowi6 fl6;
689 struct icmpv6_msg msg;
690 struct dst_entry *dst;
691 struct ipcm6_cookie ipc6;
692 u32 mark = IP6_REPLY_MARK(net, skb->mark);
David Brazdil0f672f62019-12-10 10:32:29 +0000693 bool acast;
694
695 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) &&
696 net->ipv6.sysctl.icmpv6_echo_ignore_multicast)
697 return;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000698
699 saddr = &ipv6_hdr(skb)->daddr;
700
David Brazdil0f672f62019-12-10 10:32:29 +0000701 acast = ipv6_anycast_destination(skb_dst(skb), saddr);
702 if (acast && net->ipv6.sysctl.icmpv6_echo_ignore_anycast)
703 return;
704
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000705 if (!ipv6_unicast_destination(skb) &&
David Brazdil0f672f62019-12-10 10:32:29 +0000706 !(net->ipv6.sysctl.anycast_src_echo_reply && acast))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000707 saddr = NULL;
708
709 memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
710 tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
711
712 memset(&fl6, 0, sizeof(fl6));
David Brazdil0f672f62019-12-10 10:32:29 +0000713 if (net->ipv6.sysctl.flowlabel_reflect & FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES)
714 fl6.flowlabel = ip6_flowlabel(ipv6_hdr(skb));
715
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000716 fl6.flowi6_proto = IPPROTO_ICMPV6;
717 fl6.daddr = ipv6_hdr(skb)->saddr;
718 if (saddr)
719 fl6.saddr = *saddr;
720 fl6.flowi6_oif = icmp6_iif(skb);
721 fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
722 fl6.flowi6_mark = mark;
723 fl6.flowi6_uid = sock_net_uid(net, NULL);
724 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
725
726 local_bh_disable();
727 sk = icmpv6_xmit_lock(net);
728 if (!sk)
729 goto out_bh_enable;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000730 np = inet6_sk(sk);
731
732 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
733 fl6.flowi6_oif = np->mcast_oif;
734 else if (!fl6.flowi6_oif)
735 fl6.flowi6_oif = np->ucast_oif;
736
737 if (ip6_dst_lookup(net, sk, &dst, &fl6))
738 goto out;
739 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
740 if (IS_ERR(dst))
741 goto out;
742
David Brazdil0f672f62019-12-10 10:32:29 +0000743 /* Check the ratelimit */
744 if ((!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, ICMPV6_ECHO_REPLY)) ||
745 !icmpv6_xrlim_allow(sk, ICMPV6_ECHO_REPLY, &fl6))
746 goto out_dst_release;
747
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000748 idev = __in6_dev_get(skb->dev);
749
750 msg.skb = skb;
751 msg.offset = 0;
752 msg.type = ICMPV6_ECHO_REPLY;
753
754 ipcm6_init_sk(&ipc6, np);
755 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
756 ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
Olivier Deprez0e641232021-09-23 10:07:05 +0200757 ipc6.sockc.mark = mark;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000758
759 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
760 skb->len + sizeof(struct icmp6hdr),
761 sizeof(struct icmp6hdr), &ipc6, &fl6,
762 (struct rt6_info *)dst, MSG_DONTWAIT)) {
763 __ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
764 ip6_flush_pending_frames(sk);
765 } else {
766 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
767 skb->len + sizeof(struct icmp6hdr));
768 }
David Brazdil0f672f62019-12-10 10:32:29 +0000769out_dst_release:
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000770 dst_release(dst);
771out:
772 icmpv6_xmit_unlock(sk);
773out_bh_enable:
774 local_bh_enable();
775}
776
777void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
778{
779 const struct inet6_protocol *ipprot;
780 int inner_offset;
781 __be16 frag_off;
782 u8 nexthdr;
783 struct net *net = dev_net(skb->dev);
784
785 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
786 goto out;
787
788 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
789 if (ipv6_ext_hdr(nexthdr)) {
790 /* now skip over extension headers */
791 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
792 &nexthdr, &frag_off);
793 if (inner_offset < 0)
794 goto out;
795 } else {
796 inner_offset = sizeof(struct ipv6hdr);
797 }
798
799 /* Checkin header including 8 bytes of inner protocol header. */
800 if (!pskb_may_pull(skb, inner_offset+8))
801 goto out;
802
803 /* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
804 Without this we will not able f.e. to make source routed
805 pmtu discovery.
806 Corresponding argument (opt) to notifiers is already added.
807 --ANK (980726)
808 */
809
810 ipprot = rcu_dereference(inet6_protos[nexthdr]);
811 if (ipprot && ipprot->err_handler)
812 ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
813
814 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
815 return;
816
817out:
818 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
819}
820
821/*
822 * Handle icmp messages
823 */
824
825static int icmpv6_rcv(struct sk_buff *skb)
826{
827 struct net *net = dev_net(skb->dev);
David Brazdil0f672f62019-12-10 10:32:29 +0000828 struct net_device *dev = icmp6_dev(skb);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000829 struct inet6_dev *idev = __in6_dev_get(dev);
830 const struct in6_addr *saddr, *daddr;
831 struct icmp6hdr *hdr;
832 u8 type;
833 bool success = false;
834
835 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
836 struct sec_path *sp = skb_sec_path(skb);
837 int nh;
838
839 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
840 XFRM_STATE_ICMP))
841 goto drop_no_count;
842
843 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
844 goto drop_no_count;
845
846 nh = skb_network_offset(skb);
847 skb_set_network_header(skb, sizeof(*hdr));
848
849 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
850 goto drop_no_count;
851
852 skb_set_network_header(skb, nh);
853 }
854
855 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
856
857 saddr = &ipv6_hdr(skb)->saddr;
858 daddr = &ipv6_hdr(skb)->daddr;
859
860 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
861 net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
862 saddr, daddr);
863 goto csum_error;
864 }
865
866 if (!pskb_pull(skb, sizeof(*hdr)))
867 goto discard_it;
868
869 hdr = icmp6_hdr(skb);
870
871 type = hdr->icmp6_type;
872
873 ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
874
875 switch (type) {
876 case ICMPV6_ECHO_REQUEST:
877 if (!net->ipv6.sysctl.icmpv6_echo_ignore_all)
878 icmpv6_echo_reply(skb);
879 break;
880
881 case ICMPV6_ECHO_REPLY:
882 success = ping_rcv(skb);
883 break;
884
885 case ICMPV6_PKT_TOOBIG:
886 /* BUGGG_FUTURE: if packet contains rthdr, we cannot update
887 standard destination cache. Seems, only "advanced"
888 destination cache will allow to solve this problem
889 --ANK (980726)
890 */
891 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
892 goto discard_it;
893 hdr = icmp6_hdr(skb);
894
895 /* to notify */
896 /* fall through */
897 case ICMPV6_DEST_UNREACH:
898 case ICMPV6_TIME_EXCEED:
899 case ICMPV6_PARAMPROB:
900 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
901 break;
902
903 case NDISC_ROUTER_SOLICITATION:
904 case NDISC_ROUTER_ADVERTISEMENT:
905 case NDISC_NEIGHBOUR_SOLICITATION:
906 case NDISC_NEIGHBOUR_ADVERTISEMENT:
907 case NDISC_REDIRECT:
908 ndisc_rcv(skb);
909 break;
910
911 case ICMPV6_MGM_QUERY:
912 igmp6_event_query(skb);
913 break;
914
915 case ICMPV6_MGM_REPORT:
916 igmp6_event_report(skb);
917 break;
918
919 case ICMPV6_MGM_REDUCTION:
920 case ICMPV6_NI_QUERY:
921 case ICMPV6_NI_REPLY:
922 case ICMPV6_MLD2_REPORT:
923 case ICMPV6_DHAAD_REQUEST:
924 case ICMPV6_DHAAD_REPLY:
925 case ICMPV6_MOBILE_PREFIX_SOL:
926 case ICMPV6_MOBILE_PREFIX_ADV:
927 break;
928
929 default:
930 /* informational */
931 if (type & ICMPV6_INFOMSG_MASK)
932 break;
933
934 net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
935 saddr, daddr);
936
937 /*
938 * error of unknown type.
939 * must pass to upper level
940 */
941
942 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
943 }
944
945 /* until the v6 path can be better sorted assume failure and
946 * preserve the status quo behaviour for the rest of the paths to here
947 */
948 if (success)
949 consume_skb(skb);
950 else
951 kfree_skb(skb);
952
953 return 0;
954
955csum_error:
956 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
957discard_it:
958 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
959drop_no_count:
960 kfree_skb(skb);
961 return 0;
962}
963
964void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
965 u8 type,
966 const struct in6_addr *saddr,
967 const struct in6_addr *daddr,
968 int oif)
969{
970 memset(fl6, 0, sizeof(*fl6));
971 fl6->saddr = *saddr;
972 fl6->daddr = *daddr;
973 fl6->flowi6_proto = IPPROTO_ICMPV6;
974 fl6->fl6_icmp_type = type;
975 fl6->fl6_icmp_code = 0;
976 fl6->flowi6_oif = oif;
977 security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
978}
979
David Brazdil0f672f62019-12-10 10:32:29 +0000980static void __net_exit icmpv6_sk_exit(struct net *net)
981{
982 int i;
983
984 for_each_possible_cpu(i)
985 inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv6.icmp_sk, i));
986 free_percpu(net->ipv6.icmp_sk);
987}
988
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000989static int __net_init icmpv6_sk_init(struct net *net)
990{
991 struct sock *sk;
David Brazdil0f672f62019-12-10 10:32:29 +0000992 int err, i;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000993
David Brazdil0f672f62019-12-10 10:32:29 +0000994 net->ipv6.icmp_sk = alloc_percpu(struct sock *);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000995 if (!net->ipv6.icmp_sk)
996 return -ENOMEM;
997
998 for_each_possible_cpu(i) {
999 err = inet_ctl_sock_create(&sk, PF_INET6,
1000 SOCK_RAW, IPPROTO_ICMPV6, net);
1001 if (err < 0) {
1002 pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
1003 err);
1004 goto fail;
1005 }
1006
David Brazdil0f672f62019-12-10 10:32:29 +00001007 *per_cpu_ptr(net->ipv6.icmp_sk, i) = sk;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001008
1009 /* Enough space for 2 64K ICMP packets, including
1010 * sk_buff struct overhead.
1011 */
1012 sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
1013 }
1014 return 0;
1015
1016 fail:
David Brazdil0f672f62019-12-10 10:32:29 +00001017 icmpv6_sk_exit(net);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001018 return err;
1019}
1020
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001021static struct pernet_operations icmpv6_sk_ops = {
1022 .init = icmpv6_sk_init,
1023 .exit = icmpv6_sk_exit,
1024};
1025
1026int __init icmpv6_init(void)
1027{
1028 int err;
1029
1030 err = register_pernet_subsys(&icmpv6_sk_ops);
1031 if (err < 0)
1032 return err;
1033
1034 err = -EAGAIN;
1035 if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1036 goto fail;
1037
1038 err = inet6_register_icmp_sender(icmp6_send);
1039 if (err)
1040 goto sender_reg_err;
1041 return 0;
1042
1043sender_reg_err:
1044 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1045fail:
1046 pr_err("Failed to register ICMP6 protocol\n");
1047 unregister_pernet_subsys(&icmpv6_sk_ops);
1048 return err;
1049}
1050
1051void icmpv6_cleanup(void)
1052{
1053 inet6_unregister_icmp_sender(icmp6_send);
1054 unregister_pernet_subsys(&icmpv6_sk_ops);
1055 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1056}
1057
1058
1059static const struct icmp6_err {
1060 int err;
1061 int fatal;
1062} tab_unreach[] = {
1063 { /* NOROUTE */
1064 .err = ENETUNREACH,
1065 .fatal = 0,
1066 },
1067 { /* ADM_PROHIBITED */
1068 .err = EACCES,
1069 .fatal = 1,
1070 },
1071 { /* Was NOT_NEIGHBOUR, now reserved */
1072 .err = EHOSTUNREACH,
1073 .fatal = 0,
1074 },
1075 { /* ADDR_UNREACH */
1076 .err = EHOSTUNREACH,
1077 .fatal = 0,
1078 },
1079 { /* PORT_UNREACH */
1080 .err = ECONNREFUSED,
1081 .fatal = 1,
1082 },
1083 { /* POLICY_FAIL */
1084 .err = EACCES,
1085 .fatal = 1,
1086 },
1087 { /* REJECT_ROUTE */
1088 .err = EACCES,
1089 .fatal = 1,
1090 },
1091};
1092
1093int icmpv6_err_convert(u8 type, u8 code, int *err)
1094{
1095 int fatal = 0;
1096
1097 *err = EPROTO;
1098
1099 switch (type) {
1100 case ICMPV6_DEST_UNREACH:
1101 fatal = 1;
1102 if (code < ARRAY_SIZE(tab_unreach)) {
1103 *err = tab_unreach[code].err;
1104 fatal = tab_unreach[code].fatal;
1105 }
1106 break;
1107
1108 case ICMPV6_PKT_TOOBIG:
1109 *err = EMSGSIZE;
1110 break;
1111
1112 case ICMPV6_PARAMPROB:
1113 *err = EPROTO;
1114 fatal = 1;
1115 break;
1116
1117 case ICMPV6_TIME_EXCEED:
1118 *err = EHOSTUNREACH;
1119 break;
1120 }
1121
1122 return fatal;
1123}
1124EXPORT_SYMBOL(icmpv6_err_convert);
1125
1126#ifdef CONFIG_SYSCTL
1127static struct ctl_table ipv6_icmp_table_template[] = {
1128 {
1129 .procname = "ratelimit",
1130 .data = &init_net.ipv6.sysctl.icmpv6_time,
1131 .maxlen = sizeof(int),
1132 .mode = 0644,
1133 .proc_handler = proc_dointvec_ms_jiffies,
1134 },
1135 {
1136 .procname = "echo_ignore_all",
1137 .data = &init_net.ipv6.sysctl.icmpv6_echo_ignore_all,
1138 .maxlen = sizeof(int),
1139 .mode = 0644,
1140 .proc_handler = proc_dointvec,
1141 },
David Brazdil0f672f62019-12-10 10:32:29 +00001142 {
1143 .procname = "echo_ignore_multicast",
1144 .data = &init_net.ipv6.sysctl.icmpv6_echo_ignore_multicast,
1145 .maxlen = sizeof(int),
1146 .mode = 0644,
1147 .proc_handler = proc_dointvec,
1148 },
1149 {
1150 .procname = "echo_ignore_anycast",
1151 .data = &init_net.ipv6.sysctl.icmpv6_echo_ignore_anycast,
1152 .maxlen = sizeof(int),
1153 .mode = 0644,
1154 .proc_handler = proc_dointvec,
1155 },
1156 {
1157 .procname = "ratemask",
1158 .data = &init_net.ipv6.sysctl.icmpv6_ratemask_ptr,
1159 .maxlen = ICMPV6_MSG_MAX + 1,
1160 .mode = 0644,
1161 .proc_handler = proc_do_large_bitmap,
1162 },
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001163 { },
1164};
1165
1166struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
1167{
1168 struct ctl_table *table;
1169
1170 table = kmemdup(ipv6_icmp_table_template,
1171 sizeof(ipv6_icmp_table_template),
1172 GFP_KERNEL);
1173
1174 if (table) {
1175 table[0].data = &net->ipv6.sysctl.icmpv6_time;
1176 table[1].data = &net->ipv6.sysctl.icmpv6_echo_ignore_all;
David Brazdil0f672f62019-12-10 10:32:29 +00001177 table[2].data = &net->ipv6.sysctl.icmpv6_echo_ignore_multicast;
1178 table[3].data = &net->ipv6.sysctl.icmpv6_echo_ignore_anycast;
1179 table[4].data = &net->ipv6.sysctl.icmpv6_ratemask_ptr;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001180 }
1181 return table;
1182}
1183#endif