]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/ipv6/icmp.c
tcp: fix tcp_set_congestion_control() use from bpf hook
[mirror_ubuntu-bionic-kernel.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
4e64b1ed
JP
253void 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;
1da177e4 258
e5d08d71 259 skb = skb_peek(&sk->sk_write_queue);
63159f29 260 if (!skb)
4e64b1ed 261 return;
1da177e4 262
cc70ab26 263 icmp6h = icmp6_hdr(skb);
1da177e4
LT
264 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
265 icmp6h->icmp6_cksum = 0;
266
267 if (skb_queue_len(&sk->sk_write_queue) == 1) {
07f0757a 268 skb->csum = csum_partial(icmp6h,
1da177e4 269 sizeof(struct icmp6hdr), skb->csum);
4c9483b2
DM
270 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
271 &fl6->daddr,
272 len, fl6->flowi6_proto,
1da177e4
LT
273 skb->csum);
274 } else {
868c86bc 275 __wsum tmp_csum = 0;
1da177e4
LT
276
277 skb_queue_walk(&sk->sk_write_queue, skb) {
278 tmp_csum = csum_add(tmp_csum, skb->csum);
279 }
280
07f0757a 281 tmp_csum = csum_partial(icmp6h,
1da177e4 282 sizeof(struct icmp6hdr), tmp_csum);
4c9483b2
DM
283 icmp6h->icmp6_cksum = csum_ipv6_magic(&fl6->saddr,
284 &fl6->daddr,
285 len, fl6->flowi6_proto,
868c86bc 286 tmp_csum);
1da177e4 287 }
1da177e4 288 ip6_push_pending_frames(sk);
1da177e4
LT
289}
290
291struct icmpv6_msg {
292 struct sk_buff *skb;
293 int offset;
763ecff1 294 uint8_t type;
1da177e4
LT
295};
296
297static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
298{
299 struct icmpv6_msg *msg = (struct icmpv6_msg *) from;
300 struct sk_buff *org_skb = msg->skb;
5f92a738 301 __wsum csum = 0;
1da177e4
LT
302
303 csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,
304 to, len, csum);
305 skb->csum = csum_block_add(skb->csum, csum, odd);
763ecff1
YK
306 if (!(msg->type & ICMPV6_INFOMSG_MASK))
307 nf_ct_attach(skb, org_skb);
1da177e4
LT
308 return 0;
309}
310
07a93626 311#if IS_ENABLED(CONFIG_IPV6_MIP6)
79383236
MN
312static void mip6_addr_swap(struct sk_buff *skb)
313{
0660e03f 314 struct ipv6hdr *iph = ipv6_hdr(skb);
79383236
MN
315 struct inet6_skb_parm *opt = IP6CB(skb);
316 struct ipv6_destopt_hao *hao;
317 struct in6_addr tmp;
318 int off;
319
320 if (opt->dsthao) {
321 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
322 if (likely(off >= 0)) {
d56f90a7
ACM
323 hao = (struct ipv6_destopt_hao *)
324 (skb_network_header(skb) + off);
4e3fd7a0
AD
325 tmp = iph->saddr;
326 iph->saddr = hao->addr;
327 hao->addr = tmp;
79383236
MN
328 }
329 }
330}
331#else
332static inline void mip6_addr_swap(struct sk_buff *skb) {}
333#endif
334
e8243534 335static struct dst_entry *icmpv6_route_lookup(struct net *net,
336 struct sk_buff *skb,
337 struct sock *sk,
338 struct flowi6 *fl6)
b42835db
DM
339{
340 struct dst_entry *dst, *dst2;
4c9483b2 341 struct flowi6 fl2;
b42835db
DM
342 int err;
343
343d60aa 344 err = ip6_dst_lookup(net, sk, &dst, fl6);
b42835db
DM
345 if (err)
346 return ERR_PTR(err);
347
348 /*
349 * We won't send icmp if the destination is known
350 * anycast.
351 */
2647a9b0 352 if (ipv6_anycast_destination(dst, &fl6->daddr)) {
ba7a46f1 353 net_dbg_ratelimited("icmp6_send: acast source\n");
b42835db
DM
354 dst_release(dst);
355 return ERR_PTR(-EINVAL);
356 }
357
358 /* No need to clone since we're just using its address. */
359 dst2 = dst;
360
4c9483b2 361 dst = xfrm_lookup(net, dst, flowi6_to_flowi(fl6), sk, 0);
452edd59 362 if (!IS_ERR(dst)) {
b42835db
DM
363 if (dst != dst2)
364 return dst;
452edd59
DM
365 } else {
366 if (PTR_ERR(dst) == -EPERM)
367 dst = NULL;
368 else
369 return dst;
b42835db
DM
370 }
371
4c9483b2 372 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6);
b42835db
DM
373 if (err)
374 goto relookup_failed;
375
343d60aa 376 err = ip6_dst_lookup(net, sk, &dst2, &fl2);
b42835db
DM
377 if (err)
378 goto relookup_failed;
379
4c9483b2 380 dst2 = xfrm_lookup(net, dst2, flowi6_to_flowi(&fl2), sk, XFRM_LOOKUP_ICMP);
452edd59 381 if (!IS_ERR(dst2)) {
b42835db
DM
382 dst_release(dst);
383 dst = dst2;
452edd59
DM
384 } else {
385 err = PTR_ERR(dst2);
386 if (err == -EPERM) {
387 dst_release(dst);
388 return dst2;
389 } else
390 goto relookup_failed;
b42835db
DM
391 }
392
393relookup_failed:
394 if (dst)
395 return dst;
396 return ERR_PTR(err);
397}
398
1b70d792
DA
399static int icmp6_iif(const struct sk_buff *skb)
400{
401 int iif = skb->dev->ifindex;
402
403 /* for local traffic to local address, skb dev is the loopback
404 * device. Check if there is a dst attached to the skb and if so
2beb8c20
DA
405 * get the real device index. Same is needed for replies to a link
406 * local address on a device enslaved to an L3 master device
1b70d792 407 */
2beb8c20 408 if (unlikely(iif == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
1b70d792
DA
409 const struct rt6_info *rt6 = skb_rt6_info(skb);
410
411 if (rt6)
412 iif = rt6->rt6i_idev->dev->ifindex;
413 }
414
415 return iif;
416}
417
1da177e4
LT
418/*
419 * Send an ICMP message in response to a packet in error
420 */
b1cadc1a
ED
421static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
422 const struct in6_addr *force_saddr)
1da177e4
LT
423{
424 struct inet6_dev *idev = NULL;
0660e03f 425 struct ipv6hdr *hdr = ipv6_hdr(skb);
84427d53 426 struct sock *sk;
30095165 427 struct net *net;
84427d53 428 struct ipv6_pinfo *np;
b71d1d42 429 const struct in6_addr *saddr = NULL;
1da177e4
LT
430 struct dst_entry *dst;
431 struct icmp6hdr tmp_hdr;
4c9483b2 432 struct flowi6 fl6;
1da177e4 433 struct icmpv6_msg msg;
c14ac945 434 struct sockcm_cookie sockc_unused = {0};
26879da5 435 struct ipcm6_cookie ipc6;
1da177e4
LT
436 int iif = 0;
437 int addr_type = 0;
438 int len;
30095165 439 u32 mark;
1da177e4 440
27a884dc 441 if ((u8 *)hdr < skb->head ||
29a3cad5 442 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
1da177e4
LT
443 return;
444
30095165
ED
445 if (!skb->dev)
446 return;
447 net = dev_net(skb->dev);
448 mark = IP6_REPLY_MARK(net, skb->mark);
1da177e4 449 /*
1ab1457c 450 * Make sure we respect the rules
1da177e4 451 * i.e. RFC 1885 2.4(e)
5f5624cf 452 * Rule (e.1) is enforced by not using icmp6_send
1da177e4
LT
453 * in any code that processes icmp errors.
454 */
455 addr_type = ipv6_addr_type(&hdr->daddr);
456
446fab59 457 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
d94c1f92 458 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
1da177e4
LT
459 saddr = &hdr->daddr;
460
461 /*
462 * Dest addr check
463 */
464
9a6b4b39 465 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
1da177e4 466 if (type != ICMPV6_PKT_TOOBIG &&
1ab1457c
YH
467 !(type == ICMPV6_PARAMPROB &&
468 code == ICMPV6_UNK_OPTION &&
1da177e4
LT
469 (opt_unrec(skb, info))))
470 return;
471
472 saddr = NULL;
473 }
474
475 addr_type = ipv6_addr_type(&hdr->saddr);
476
477 /*
478 * Source addr check
479 */
480
4832c30d 481 if (__ipv6_addr_needs_scope_id(addr_type)) {
1b70d792 482 iif = icmp6_iif(skb);
4832c30d 483 } else {
79dc7e3f
DA
484 dst = skb_dst(skb);
485 iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
486 }
1da177e4
LT
487
488 /*
8de3351e
YH
489 * Must not send error if the source does not uniquely
490 * identify a single node (RFC2463 Section 2.4).
491 * We check unspecified / multicast addresses here,
492 * and anycast addresses will be checked later.
1da177e4
LT
493 */
494 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
4b3418fb
BM
495 net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
496 &hdr->saddr, &hdr->daddr);
1da177e4
LT
497 return;
498 }
499
1ab1457c 500 /*
1da177e4
LT
501 * Never answer to a ICMP packet.
502 */
503 if (is_ineligible(skb)) {
4b3418fb
BM
504 net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
505 &hdr->saddr, &hdr->daddr);
1da177e4
LT
506 return;
507 }
508
7ba91ecb
JDB
509 /* Needed by both icmp_global_allow and icmpv6_xmit_lock */
510 local_bh_disable();
511
512 /* Check global sysctl_icmp_msgs_per_sec ratelimit */
849a44de 513 if (!(skb->dev->flags&IFF_LOOPBACK) && !icmpv6_global_allow(type))
7ba91ecb
JDB
514 goto out_bh_enable;
515
79383236
MN
516 mip6_addr_swap(skb);
517
4c9483b2
DM
518 memset(&fl6, 0, sizeof(fl6));
519 fl6.flowi6_proto = IPPROTO_ICMPV6;
4e3fd7a0 520 fl6.daddr = hdr->saddr;
b1cadc1a
ED
521 if (force_saddr)
522 saddr = force_saddr;
1da177e4 523 if (saddr)
4e3fd7a0 524 fl6.saddr = *saddr;
e110861f 525 fl6.flowi6_mark = mark;
4c9483b2 526 fl6.flowi6_oif = iif;
1958b856
DM
527 fl6.fl6_icmp_type = type;
528 fl6.fl6_icmp_code = code;
e2d118a1 529 fl6.flowi6_uid = sock_net_uid(net, NULL);
23aebdac 530 fl6.mp_hash = rt6_multipath_hash(&fl6, skb);
4c9483b2 531 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 532
fdc0bde9 533 sk = icmpv6_xmit_lock(net);
63159f29 534 if (!sk)
7ba91ecb 535 goto out_bh_enable;
c0303efe 536
e110861f 537 sk->sk_mark = mark;
fdc0bde9 538 np = inet6_sk(sk);
405666db 539
4c9483b2 540 if (!icmpv6_xrlim_allow(sk, type, &fl6))
1da177e4
LT
541 goto out;
542
543 tmp_hdr.icmp6_type = type;
544 tmp_hdr.icmp6_code = code;
545 tmp_hdr.icmp6_cksum = 0;
546 tmp_hdr.icmp6_pointer = htonl(info);
547
4c9483b2
DM
548 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
549 fl6.flowi6_oif = np->mcast_oif;
c4062dfc
EH
550 else if (!fl6.flowi6_oif)
551 fl6.flowi6_oif = np->ucast_oif;
1da177e4 552
38b7097b
HFS
553 ipc6.tclass = np->tclass;
554 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
555
4c9483b2 556 dst = icmpv6_route_lookup(net, skb, sk, &fl6);
b42835db 557 if (IS_ERR(dst))
1da177e4 558 goto out;
8de3351e 559
26879da5 560 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
26879da5
WW
561 ipc6.dontfrag = np->dontfrag;
562 ipc6.opt = NULL;
1da177e4
LT
563
564 msg.skb = skb;
bbe735e4 565 msg.offset = skb_network_offset(skb);
763ecff1 566 msg.type = type;
1da177e4
LT
567
568 len = skb->len - msg.offset;
67ba4152 569 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
1da177e4 570 if (len < 0) {
4b3418fb
BM
571 net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
572 &hdr->saddr, &hdr->daddr);
1da177e4
LT
573 goto out_dst_release;
574 }
575
cfdf7647
ED
576 rcu_read_lock();
577 idev = __in6_dev_get(skb->dev);
1da177e4 578
4e64b1ed
JP
579 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
580 len + sizeof(struct icmp6hdr),
581 sizeof(struct icmp6hdr),
582 &ipc6, &fl6, (struct rt6_info *)dst,
583 MSG_DONTWAIT, &sockc_unused)) {
43a43b60 584 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1da177e4 585 ip6_flush_pending_frames(sk);
cfdf7647 586 } else {
4e64b1ed
JP
587 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;
e110861f 685 u32 mark = IP6_REPLY_MARK(net, skb->mark);
c14ac945 686 struct sockcm_cookie sockc_unused = {0};
1da177e4 687
0660e03f 688 saddr = &ipv6_hdr(skb)->daddr;
1da177e4 689
509aba3b 690 if (!ipv6_unicast_destination(skb) &&
ec35b61e 691 !(net->ipv6.sysctl.anycast_src_echo_reply &&
2647a9b0 692 ipv6_anycast_destination(skb_dst(skb), saddr)))
1da177e4
LT
693 saddr = NULL;
694
695 memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
696 tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
697
4c9483b2
DM
698 memset(&fl6, 0, sizeof(fl6));
699 fl6.flowi6_proto = IPPROTO_ICMPV6;
4e3fd7a0 700 fl6.daddr = ipv6_hdr(skb)->saddr;
1da177e4 701 if (saddr)
4e3fd7a0 702 fl6.saddr = *saddr;
1b70d792 703 fl6.flowi6_oif = icmp6_iif(skb);
1958b856 704 fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
e110861f 705 fl6.flowi6_mark = mark;
e2d118a1 706 fl6.flowi6_uid = sock_net_uid(net, NULL);
4c9483b2 707 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 708
7ba91ecb 709 local_bh_disable();
fdc0bde9 710 sk = icmpv6_xmit_lock(net);
63159f29 711 if (!sk)
7ba91ecb 712 goto out_bh_enable;
e110861f 713 sk->sk_mark = mark;
fdc0bde9 714 np = inet6_sk(sk);
405666db 715
4c9483b2
DM
716 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
717 fl6.flowi6_oif = np->mcast_oif;
c4062dfc
EH
718 else if (!fl6.flowi6_oif)
719 fl6.flowi6_oif = np->ucast_oif;
1da177e4 720
4e64b1ed 721 if (ip6_dst_lookup(net, sk, &dst, &fl6))
1da177e4 722 goto out;
4c9483b2 723 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
452edd59 724 if (IS_ERR(dst))
e104411b 725 goto out;
1da177e4 726
cfdf7647 727 idev = __in6_dev_get(skb->dev);
1da177e4
LT
728
729 msg.skb = skb;
730 msg.offset = 0;
763ecff1 731 msg.type = ICMPV6_ECHO_REPLY;
1da177e4 732
26879da5
WW
733 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
734 ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
735 ipc6.dontfrag = np->dontfrag;
736 ipc6.opt = NULL;
737
4e64b1ed
JP
738 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
739 skb->len + sizeof(struct icmp6hdr),
740 sizeof(struct icmp6hdr), &ipc6, &fl6,
741 (struct rt6_info *)dst, MSG_DONTWAIT,
742 &sockc_unused)) {
a16292a0 743 __ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1da177e4 744 ip6_flush_pending_frames(sk);
cfdf7647 745 } else {
4e64b1ed
JP
746 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
747 skb->len + sizeof(struct icmp6hdr));
1da177e4 748 }
1da177e4 749 dst_release(dst);
1ab1457c 750out:
405666db 751 icmpv6_xmit_unlock(sk);
7ba91ecb
JDB
752out_bh_enable:
753 local_bh_enable();
1da177e4
LT
754}
755
b94f1c09 756void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
1da177e4 757{
41135cc8 758 const struct inet6_protocol *ipprot;
1da177e4 759 int inner_offset;
75f2811c 760 __be16 frag_off;
f9242b6b 761 u8 nexthdr;
7304fe46 762 struct net *net = dev_net(skb->dev);
1da177e4
LT
763
764 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
7304fe46 765 goto out;
1da177e4
LT
766
767 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
768 if (ipv6_ext_hdr(nexthdr)) {
769 /* now skip over extension headers */
75f2811c
JG
770 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
771 &nexthdr, &frag_off);
67ba4152 772 if (inner_offset < 0)
7304fe46 773 goto out;
1da177e4
LT
774 } else {
775 inner_offset = sizeof(struct ipv6hdr);
776 }
777
778 /* Checkin header including 8 bytes of inner protocol header. */
779 if (!pskb_may_pull(skb, inner_offset+8))
7304fe46 780 goto out;
1da177e4 781
1da177e4
LT
782 /* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
783 Without this we will not able f.e. to make source routed
784 pmtu discovery.
785 Corresponding argument (opt) to notifiers is already added.
786 --ANK (980726)
787 */
788
f9242b6b 789 ipprot = rcu_dereference(inet6_protos[nexthdr]);
1da177e4
LT
790 if (ipprot && ipprot->err_handler)
791 ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
1da177e4 792
69d6da0b 793 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
7304fe46
DJ
794 return;
795
796out:
a16292a0 797 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
1da177e4 798}
1ab1457c 799
1da177e4
LT
800/*
801 * Handle icmp messages
802 */
803
e5bbef20 804static int icmpv6_rcv(struct sk_buff *skb)
1da177e4 805{
1da177e4
LT
806 struct net_device *dev = skb->dev;
807 struct inet6_dev *idev = __in6_dev_get(dev);
b71d1d42 808 const struct in6_addr *saddr, *daddr;
1da177e4 809 struct icmp6hdr *hdr;
d5fdd6ba 810 u8 type;
e3e32170 811 bool success = false;
1da177e4 812
aebcf82c 813 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
def8b4fa 814 struct sec_path *sp = skb_sec_path(skb);
8b7817f3
HX
815 int nh;
816
def8b4fa 817 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
aebcf82c
HX
818 XFRM_STATE_ICMP))
819 goto drop_no_count;
820
81aded24 821 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
8b7817f3
HX
822 goto drop_no_count;
823
824 nh = skb_network_offset(skb);
825 skb_set_network_header(skb, sizeof(*hdr));
826
827 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
828 goto drop_no_count;
829
830 skb_set_network_header(skb, nh);
831 }
832
a16292a0 833 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
1da177e4 834
0660e03f
ACM
835 saddr = &ipv6_hdr(skb)->saddr;
836 daddr = &ipv6_hdr(skb)->daddr;
1da177e4 837
39471ac8 838 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
ba7a46f1
JP
839 net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
840 saddr, daddr);
39471ac8 841 goto csum_error;
1da177e4
LT
842 }
843
8cf22943
HX
844 if (!pskb_pull(skb, sizeof(*hdr)))
845 goto discard_it;
1da177e4 846
cc70ab26 847 hdr = icmp6_hdr(skb);
1da177e4
LT
848
849 type = hdr->icmp6_type;
850
f3832ed2 851 ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
1da177e4
LT
852
853 switch (type) {
854 case ICMPV6_ECHO_REQUEST:
855 icmpv6_echo_reply(skb);
856 break;
857
858 case ICMPV6_ECHO_REPLY:
e3e32170 859 success = ping_rcv(skb);
1da177e4
LT
860 break;
861
862 case ICMPV6_PKT_TOOBIG:
863 /* BUGGG_FUTURE: if packet contains rthdr, we cannot update
864 standard destination cache. Seems, only "advanced"
865 destination cache will allow to solve this problem
866 --ANK (980726)
867 */
868 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
869 goto discard_it;
cc70ab26 870 hdr = icmp6_hdr(skb);
1da177e4 871
275757e6
GS
872 /* to notify */
873 /* fall through */
1da177e4
LT
874 case ICMPV6_DEST_UNREACH:
875 case ICMPV6_TIME_EXCEED:
876 case ICMPV6_PARAMPROB:
877 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
878 break;
879
880 case NDISC_ROUTER_SOLICITATION:
881 case NDISC_ROUTER_ADVERTISEMENT:
882 case NDISC_NEIGHBOUR_SOLICITATION:
883 case NDISC_NEIGHBOUR_ADVERTISEMENT:
884 case NDISC_REDIRECT:
885 ndisc_rcv(skb);
886 break;
887
888 case ICMPV6_MGM_QUERY:
889 igmp6_event_query(skb);
890 break;
891
892 case ICMPV6_MGM_REPORT:
893 igmp6_event_report(skb);
894 break;
895
896 case ICMPV6_MGM_REDUCTION:
897 case ICMPV6_NI_QUERY:
898 case ICMPV6_NI_REPLY:
899 case ICMPV6_MLD2_REPORT:
900 case ICMPV6_DHAAD_REQUEST:
901 case ICMPV6_DHAAD_REPLY:
902 case ICMPV6_MOBILE_PREFIX_SOL:
903 case ICMPV6_MOBILE_PREFIX_ADV:
904 break;
905
906 default:
1da177e4
LT
907 /* informational */
908 if (type & ICMPV6_INFOMSG_MASK)
909 break;
910
4b3418fb
BM
911 net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
912 saddr, daddr);
ea85a0a2 913
1ab1457c
YH
914 /*
915 * error of unknown type.
916 * must pass to upper level
1da177e4
LT
917 */
918
919 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
3ff50b79
SH
920 }
921
e3e32170
RJ
922 /* until the v6 path can be better sorted assume failure and
923 * preserve the status quo behaviour for the rest of the paths to here
924 */
925 if (success)
926 consume_skb(skb);
927 else
928 kfree_skb(skb);
929
1da177e4
LT
930 return 0;
931
6a5dc9e5 932csum_error:
a16292a0 933 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
1da177e4 934discard_it:
a16292a0 935 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
8b7817f3 936drop_no_count:
1da177e4
LT
937 kfree_skb(skb);
938 return 0;
939}
940
4c9483b2 941void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
95e41e93
YH
942 u8 type,
943 const struct in6_addr *saddr,
944 const struct in6_addr *daddr,
945 int oif)
946{
4c9483b2 947 memset(fl6, 0, sizeof(*fl6));
4e3fd7a0
AD
948 fl6->saddr = *saddr;
949 fl6->daddr = *daddr;
67ba4152 950 fl6->flowi6_proto = IPPROTO_ICMPV6;
1958b856
DM
951 fl6->fl6_icmp_type = type;
952 fl6->fl6_icmp_code = 0;
4c9483b2
DM
953 fl6->flowi6_oif = oif;
954 security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
95e41e93
YH
955}
956
98c6d1b2 957static int __net_init icmpv6_sk_init(struct net *net)
1da177e4
LT
958{
959 struct sock *sk;
960 int err, i, j;
961
98c6d1b2
DL
962 net->ipv6.icmp_sk =
963 kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
63159f29 964 if (!net->ipv6.icmp_sk)
79c91159
DL
965 return -ENOMEM;
966
6f912042 967 for_each_possible_cpu(i) {
1ed8516f
DL
968 err = inet_ctl_sock_create(&sk, PF_INET6,
969 SOCK_RAW, IPPROTO_ICMPV6, net);
1da177e4 970 if (err < 0) {
f3213831 971 pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
1da177e4
LT
972 err);
973 goto fail;
974 }
975
1ed8516f 976 net->ipv6.icmp_sk[i] = sk;
5c8cafd6 977
1da177e4
LT
978 /* Enough space for 2 64K ICMP packets, including
979 * sk_buff struct overhead.
980 */
87fb4b7b 981 sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
1da177e4 982 }
1da177e4
LT
983 return 0;
984
985 fail:
5c8cafd6 986 for (j = 0; j < i; j++)
1ed8516f 987 inet_ctl_sock_destroy(net->ipv6.icmp_sk[j]);
98c6d1b2 988 kfree(net->ipv6.icmp_sk);
1da177e4
LT
989 return err;
990}
991
98c6d1b2 992static void __net_exit icmpv6_sk_exit(struct net *net)
1da177e4
LT
993{
994 int i;
995
6f912042 996 for_each_possible_cpu(i) {
1ed8516f 997 inet_ctl_sock_destroy(net->ipv6.icmp_sk[i]);
1da177e4 998 }
98c6d1b2
DL
999 kfree(net->ipv6.icmp_sk);
1000}
1001
8ed7edce 1002static struct pernet_operations icmpv6_sk_ops = {
67ba4152
IM
1003 .init = icmpv6_sk_init,
1004 .exit = icmpv6_sk_exit,
98c6d1b2
DL
1005};
1006
1007int __init icmpv6_init(void)
1008{
1009 int err;
1010
1011 err = register_pernet_subsys(&icmpv6_sk_ops);
1012 if (err < 0)
1013 return err;
1014
1015 err = -EAGAIN;
1016 if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1017 goto fail;
5f5624cf
PS
1018
1019 err = inet6_register_icmp_sender(icmp6_send);
1020 if (err)
1021 goto sender_reg_err;
98c6d1b2
DL
1022 return 0;
1023
5f5624cf
PS
1024sender_reg_err:
1025 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
98c6d1b2 1026fail:
f3213831 1027 pr_err("Failed to register ICMP6 protocol\n");
98c6d1b2
DL
1028 unregister_pernet_subsys(&icmpv6_sk_ops);
1029 return err;
1030}
1031
8ed7edce 1032void icmpv6_cleanup(void)
98c6d1b2 1033{
5f5624cf 1034 inet6_unregister_icmp_sender(icmp6_send);
98c6d1b2 1035 unregister_pernet_subsys(&icmpv6_sk_ops);
1da177e4
LT
1036 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1037}
1038
98c6d1b2 1039
9b5b5cff 1040static const struct icmp6_err {
1da177e4
LT
1041 int err;
1042 int fatal;
1043} tab_unreach[] = {
1044 { /* NOROUTE */
1045 .err = ENETUNREACH,
1046 .fatal = 0,
1047 },
1048 { /* ADM_PROHIBITED */
1049 .err = EACCES,
1050 .fatal = 1,
1051 },
1052 { /* Was NOT_NEIGHBOUR, now reserved */
1053 .err = EHOSTUNREACH,
1054 .fatal = 0,
1055 },
1056 { /* ADDR_UNREACH */
1057 .err = EHOSTUNREACH,
1058 .fatal = 0,
1059 },
1060 { /* PORT_UNREACH */
1061 .err = ECONNREFUSED,
1062 .fatal = 1,
1063 },
61e76b17
JB
1064 { /* POLICY_FAIL */
1065 .err = EACCES,
1066 .fatal = 1,
1067 },
1068 { /* REJECT_ROUTE */
1069 .err = EACCES,
1070 .fatal = 1,
1071 },
1da177e4
LT
1072};
1073
d5fdd6ba 1074int icmpv6_err_convert(u8 type, u8 code, int *err)
1da177e4
LT
1075{
1076 int fatal = 0;
1077
1078 *err = EPROTO;
1079
1080 switch (type) {
1081 case ICMPV6_DEST_UNREACH:
1082 fatal = 1;
61e76b17 1083 if (code < ARRAY_SIZE(tab_unreach)) {
1da177e4
LT
1084 *err = tab_unreach[code].err;
1085 fatal = tab_unreach[code].fatal;
1086 }
1087 break;
1088
1089 case ICMPV6_PKT_TOOBIG:
1090 *err = EMSGSIZE;
1091 break;
1ab1457c 1092
1da177e4
LT
1093 case ICMPV6_PARAMPROB:
1094 *err = EPROTO;
1095 fatal = 1;
1096 break;
1097
1098 case ICMPV6_TIME_EXCEED:
1099 *err = EHOSTUNREACH;
1100 break;
3ff50b79 1101 }
1da177e4
LT
1102
1103 return fatal;
1104}
7159039a
YH
1105EXPORT_SYMBOL(icmpv6_err_convert);
1106
1da177e4 1107#ifdef CONFIG_SYSCTL
e8243534 1108static struct ctl_table ipv6_icmp_table_template[] = {
1da177e4 1109 {
1da177e4 1110 .procname = "ratelimit",
41a76906 1111 .data = &init_net.ipv6.sysctl.icmpv6_time,
1da177e4
LT
1112 .maxlen = sizeof(int),
1113 .mode = 0644,
6d9f239a 1114 .proc_handler = proc_dointvec_ms_jiffies,
1da177e4 1115 },
f8572d8f 1116 { },
1da177e4 1117};
760f2d01 1118
2c8c1e72 1119struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
760f2d01
DL
1120{
1121 struct ctl_table *table;
1122
1123 table = kmemdup(ipv6_icmp_table_template,
1124 sizeof(ipv6_icmp_table_template),
1125 GFP_KERNEL);
5ee09105 1126
c027aab4 1127 if (table)
5ee09105
YH
1128 table[0].data = &net->ipv6.sysctl.icmpv6_time;
1129
760f2d01
DL
1130 return table;
1131}
1da177e4 1132#endif