]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/ipv6/icmp.c
net/ipv6: Fix linklocal to global address with VRF
[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 423{
c346dca1 424 struct net *net = dev_net(skb->dev);
1da177e4 425 struct inet6_dev *idev = NULL;
0660e03f 426 struct ipv6hdr *hdr = ipv6_hdr(skb);
84427d53
YH
427 struct sock *sk;
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;
e110861f 439 u32 mark = IP6_REPLY_MARK(net, skb->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
445 /*
1ab1457c 446 * Make sure we respect the rules
1da177e4 447 * i.e. RFC 1885 2.4(e)
5f5624cf 448 * Rule (e.1) is enforced by not using icmp6_send
1da177e4
LT
449 * in any code that processes icmp errors.
450 */
451 addr_type = ipv6_addr_type(&hdr->daddr);
452
446fab59 453 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) ||
d94c1f92 454 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr))
1da177e4
LT
455 saddr = &hdr->daddr;
456
457 /*
458 * Dest addr check
459 */
460
9a6b4b39 461 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) {
1da177e4 462 if (type != ICMPV6_PKT_TOOBIG &&
1ab1457c
YH
463 !(type == ICMPV6_PARAMPROB &&
464 code == ICMPV6_UNK_OPTION &&
1da177e4
LT
465 (opt_unrec(skb, info))))
466 return;
467
468 saddr = NULL;
469 }
470
471 addr_type = ipv6_addr_type(&hdr->saddr);
472
473 /*
474 * Source addr check
475 */
476
4832c30d 477 if (__ipv6_addr_needs_scope_id(addr_type)) {
1b70d792 478 iif = icmp6_iif(skb);
4832c30d 479 } else {
79dc7e3f
DA
480 dst = skb_dst(skb);
481 iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
482 }
1da177e4
LT
483
484 /*
8de3351e
YH
485 * Must not send error if the source does not uniquely
486 * identify a single node (RFC2463 Section 2.4).
487 * We check unspecified / multicast addresses here,
488 * and anycast addresses will be checked later.
1da177e4
LT
489 */
490 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
4b3418fb
BM
491 net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
492 &hdr->saddr, &hdr->daddr);
1da177e4
LT
493 return;
494 }
495
1ab1457c 496 /*
1da177e4
LT
497 * Never answer to a ICMP packet.
498 */
499 if (is_ineligible(skb)) {
4b3418fb
BM
500 net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
501 &hdr->saddr, &hdr->daddr);
1da177e4
LT
502 return;
503 }
504
7ba91ecb
JDB
505 /* Needed by both icmp_global_allow and icmpv6_xmit_lock */
506 local_bh_disable();
507
508 /* Check global sysctl_icmp_msgs_per_sec ratelimit */
849a44de 509 if (!(skb->dev->flags&IFF_LOOPBACK) && !icmpv6_global_allow(type))
7ba91ecb
JDB
510 goto out_bh_enable;
511
79383236
MN
512 mip6_addr_swap(skb);
513
4c9483b2
DM
514 memset(&fl6, 0, sizeof(fl6));
515 fl6.flowi6_proto = IPPROTO_ICMPV6;
4e3fd7a0 516 fl6.daddr = hdr->saddr;
b1cadc1a
ED
517 if (force_saddr)
518 saddr = force_saddr;
1da177e4 519 if (saddr)
4e3fd7a0 520 fl6.saddr = *saddr;
e110861f 521 fl6.flowi6_mark = mark;
4c9483b2 522 fl6.flowi6_oif = iif;
1958b856
DM
523 fl6.fl6_icmp_type = type;
524 fl6.fl6_icmp_code = code;
e2d118a1 525 fl6.flowi6_uid = sock_net_uid(net, NULL);
23aebdac 526 fl6.mp_hash = rt6_multipath_hash(&fl6, skb);
4c9483b2 527 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 528
fdc0bde9 529 sk = icmpv6_xmit_lock(net);
63159f29 530 if (!sk)
7ba91ecb 531 goto out_bh_enable;
c0303efe 532
e110861f 533 sk->sk_mark = mark;
fdc0bde9 534 np = inet6_sk(sk);
405666db 535
4c9483b2 536 if (!icmpv6_xrlim_allow(sk, type, &fl6))
1da177e4
LT
537 goto out;
538
539 tmp_hdr.icmp6_type = type;
540 tmp_hdr.icmp6_code = code;
541 tmp_hdr.icmp6_cksum = 0;
542 tmp_hdr.icmp6_pointer = htonl(info);
543
4c9483b2
DM
544 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
545 fl6.flowi6_oif = np->mcast_oif;
c4062dfc
EH
546 else if (!fl6.flowi6_oif)
547 fl6.flowi6_oif = np->ucast_oif;
1da177e4 548
38b7097b
HFS
549 ipc6.tclass = np->tclass;
550 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
551
4c9483b2 552 dst = icmpv6_route_lookup(net, skb, sk, &fl6);
b42835db 553 if (IS_ERR(dst))
1da177e4 554 goto out;
8de3351e 555
26879da5 556 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
26879da5
WW
557 ipc6.dontfrag = np->dontfrag;
558 ipc6.opt = NULL;
1da177e4
LT
559
560 msg.skb = skb;
bbe735e4 561 msg.offset = skb_network_offset(skb);
763ecff1 562 msg.type = type;
1da177e4
LT
563
564 len = skb->len - msg.offset;
67ba4152 565 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
1da177e4 566 if (len < 0) {
4b3418fb
BM
567 net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n",
568 &hdr->saddr, &hdr->daddr);
1da177e4
LT
569 goto out_dst_release;
570 }
571
cfdf7647
ED
572 rcu_read_lock();
573 idev = __in6_dev_get(skb->dev);
1da177e4 574
4e64b1ed
JP
575 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
576 len + sizeof(struct icmp6hdr),
577 sizeof(struct icmp6hdr),
578 &ipc6, &fl6, (struct rt6_info *)dst,
579 MSG_DONTWAIT, &sockc_unused)) {
43a43b60 580 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1da177e4 581 ip6_flush_pending_frames(sk);
cfdf7647 582 } else {
4e64b1ed
JP
583 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
584 len + sizeof(struct icmp6hdr));
1da177e4 585 }
cfdf7647 586 rcu_read_unlock();
1da177e4
LT
587out_dst_release:
588 dst_release(dst);
589out:
405666db 590 icmpv6_xmit_unlock(sk);
7ba91ecb
JDB
591out_bh_enable:
592 local_bh_enable();
1da177e4 593}
5f5624cf
PS
594
595/* Slightly more convenient version of icmp6_send.
596 */
597void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
598{
b1cadc1a 599 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL);
5f5624cf
PS
600 kfree_skb(skb);
601}
7159039a 602
5fbba8ac
ED
603/* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
604 * if sufficient data bytes are available
605 * @nhs is the size of the tunnel header(s) :
606 * Either an IPv4 header for SIT encap
607 * an IPv4 header + GRE header for GRE encap
608 */
20e1954f
ED
609int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
610 unsigned int data_len)
5fbba8ac 611{
2d7a3b27 612 struct in6_addr temp_saddr;
5fbba8ac
ED
613 struct rt6_info *rt;
614 struct sk_buff *skb2;
20e1954f 615 u32 info = 0;
5fbba8ac
ED
616
617 if (!pskb_may_pull(skb, nhs + sizeof(struct ipv6hdr) + 8))
618 return 1;
619
20e1954f
ED
620 /* RFC 4884 (partial) support for ICMP extensions */
621 if (data_len < 128 || (data_len & 7) || skb->len < data_len)
622 data_len = 0;
623
624 skb2 = data_len ? skb_copy(skb, GFP_ATOMIC) : skb_clone(skb, GFP_ATOMIC);
5fbba8ac
ED
625
626 if (!skb2)
627 return 1;
628
629 skb_dst_drop(skb2);
630 skb_pull(skb2, nhs);
631 skb_reset_network_header(skb2);
632
633 rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0, 0);
634
635 if (rt && rt->dst.dev)
636 skb2->dev = rt->dst.dev;
637
2d7a3b27 638 ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, &temp_saddr);
20e1954f
ED
639
640 if (data_len) {
641 /* RFC 4884 (partial) support :
642 * insert 0 padding at the end, before the extensions
643 */
644 __skb_push(skb2, nhs);
645 skb_reset_network_header(skb2);
646 memmove(skb2->data, skb2->data + nhs, data_len - nhs);
647 memset(skb2->data + data_len - nhs, 0, nhs);
648 /* RFC 4884 4.5 : Length is measured in 64-bit words,
649 * and stored in reserved[0]
650 */
651 info = (data_len/8) << 24;
652 }
2d7a3b27
ED
653 if (type == ICMP_TIME_EXCEEDED)
654 icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
20e1954f 655 info, &temp_saddr);
2d7a3b27
ED
656 else
657 icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
20e1954f 658 info, &temp_saddr);
5fbba8ac
ED
659 if (rt)
660 ip6_rt_put(rt);
661
662 kfree_skb(skb2);
663
664 return 0;
665}
666EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
667
1da177e4
LT
668static void icmpv6_echo_reply(struct sk_buff *skb)
669{
c346dca1 670 struct net *net = dev_net(skb->dev);
84427d53 671 struct sock *sk;
1da177e4 672 struct inet6_dev *idev;
84427d53 673 struct ipv6_pinfo *np;
b71d1d42 674 const struct in6_addr *saddr = NULL;
cc70ab26 675 struct icmp6hdr *icmph = icmp6_hdr(skb);
1da177e4 676 struct icmp6hdr tmp_hdr;
4c9483b2 677 struct flowi6 fl6;
1da177e4
LT
678 struct icmpv6_msg msg;
679 struct dst_entry *dst;
26879da5 680 struct ipcm6_cookie ipc6;
e110861f 681 u32 mark = IP6_REPLY_MARK(net, skb->mark);
c14ac945 682 struct sockcm_cookie sockc_unused = {0};
1da177e4 683
0660e03f 684 saddr = &ipv6_hdr(skb)->daddr;
1da177e4 685
509aba3b 686 if (!ipv6_unicast_destination(skb) &&
ec35b61e 687 !(net->ipv6.sysctl.anycast_src_echo_reply &&
2647a9b0 688 ipv6_anycast_destination(skb_dst(skb), saddr)))
1da177e4
LT
689 saddr = NULL;
690
691 memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr));
692 tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY;
693
4c9483b2
DM
694 memset(&fl6, 0, sizeof(fl6));
695 fl6.flowi6_proto = IPPROTO_ICMPV6;
4e3fd7a0 696 fl6.daddr = ipv6_hdr(skb)->saddr;
1da177e4 697 if (saddr)
4e3fd7a0 698 fl6.saddr = *saddr;
1b70d792 699 fl6.flowi6_oif = icmp6_iif(skb);
1958b856 700 fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
e110861f 701 fl6.flowi6_mark = mark;
e2d118a1 702 fl6.flowi6_uid = sock_net_uid(net, NULL);
4c9483b2 703 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
1da177e4 704
7ba91ecb 705 local_bh_disable();
fdc0bde9 706 sk = icmpv6_xmit_lock(net);
63159f29 707 if (!sk)
7ba91ecb 708 goto out_bh_enable;
e110861f 709 sk->sk_mark = mark;
fdc0bde9 710 np = inet6_sk(sk);
405666db 711
4c9483b2
DM
712 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
713 fl6.flowi6_oif = np->mcast_oif;
c4062dfc
EH
714 else if (!fl6.flowi6_oif)
715 fl6.flowi6_oif = np->ucast_oif;
1da177e4 716
4e64b1ed 717 if (ip6_dst_lookup(net, sk, &dst, &fl6))
1da177e4 718 goto out;
4c9483b2 719 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
452edd59 720 if (IS_ERR(dst))
e104411b 721 goto out;
1da177e4 722
cfdf7647 723 idev = __in6_dev_get(skb->dev);
1da177e4
LT
724
725 msg.skb = skb;
726 msg.offset = 0;
763ecff1 727 msg.type = ICMPV6_ECHO_REPLY;
1da177e4 728
26879da5
WW
729 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
730 ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
731 ipc6.dontfrag = np->dontfrag;
732 ipc6.opt = NULL;
733
4e64b1ed
JP
734 if (ip6_append_data(sk, icmpv6_getfrag, &msg,
735 skb->len + sizeof(struct icmp6hdr),
736 sizeof(struct icmp6hdr), &ipc6, &fl6,
737 (struct rt6_info *)dst, MSG_DONTWAIT,
738 &sockc_unused)) {
a16292a0 739 __ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1da177e4 740 ip6_flush_pending_frames(sk);
cfdf7647 741 } else {
4e64b1ed
JP
742 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
743 skb->len + sizeof(struct icmp6hdr));
1da177e4 744 }
1da177e4 745 dst_release(dst);
1ab1457c 746out:
405666db 747 icmpv6_xmit_unlock(sk);
7ba91ecb
JDB
748out_bh_enable:
749 local_bh_enable();
1da177e4
LT
750}
751
b94f1c09 752void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
1da177e4 753{
41135cc8 754 const struct inet6_protocol *ipprot;
1da177e4 755 int inner_offset;
75f2811c 756 __be16 frag_off;
f9242b6b 757 u8 nexthdr;
7304fe46 758 struct net *net = dev_net(skb->dev);
1da177e4
LT
759
760 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
7304fe46 761 goto out;
1da177e4
LT
762
763 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
764 if (ipv6_ext_hdr(nexthdr)) {
765 /* now skip over extension headers */
75f2811c
JG
766 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
767 &nexthdr, &frag_off);
67ba4152 768 if (inner_offset < 0)
7304fe46 769 goto out;
1da177e4
LT
770 } else {
771 inner_offset = sizeof(struct ipv6hdr);
772 }
773
774 /* Checkin header including 8 bytes of inner protocol header. */
775 if (!pskb_may_pull(skb, inner_offset+8))
7304fe46 776 goto out;
1da177e4 777
1da177e4
LT
778 /* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
779 Without this we will not able f.e. to make source routed
780 pmtu discovery.
781 Corresponding argument (opt) to notifiers is already added.
782 --ANK (980726)
783 */
784
f9242b6b 785 ipprot = rcu_dereference(inet6_protos[nexthdr]);
1da177e4
LT
786 if (ipprot && ipprot->err_handler)
787 ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
1da177e4 788
69d6da0b 789 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
7304fe46
DJ
790 return;
791
792out:
a16292a0 793 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
1da177e4 794}
1ab1457c 795
1da177e4
LT
796/*
797 * Handle icmp messages
798 */
799
e5bbef20 800static int icmpv6_rcv(struct sk_buff *skb)
1da177e4 801{
1da177e4
LT
802 struct net_device *dev = skb->dev;
803 struct inet6_dev *idev = __in6_dev_get(dev);
b71d1d42 804 const struct in6_addr *saddr, *daddr;
1da177e4 805 struct icmp6hdr *hdr;
d5fdd6ba 806 u8 type;
e3e32170 807 bool success = false;
1da177e4 808
aebcf82c 809 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
def8b4fa 810 struct sec_path *sp = skb_sec_path(skb);
8b7817f3
HX
811 int nh;
812
def8b4fa 813 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
aebcf82c
HX
814 XFRM_STATE_ICMP))
815 goto drop_no_count;
816
81aded24 817 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
8b7817f3
HX
818 goto drop_no_count;
819
820 nh = skb_network_offset(skb);
821 skb_set_network_header(skb, sizeof(*hdr));
822
823 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
824 goto drop_no_count;
825
826 skb_set_network_header(skb, nh);
827 }
828
a16292a0 829 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
1da177e4 830
0660e03f
ACM
831 saddr = &ipv6_hdr(skb)->saddr;
832 daddr = &ipv6_hdr(skb)->daddr;
1da177e4 833
39471ac8 834 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) {
ba7a46f1
JP
835 net_dbg_ratelimited("ICMPv6 checksum failed [%pI6c > %pI6c]\n",
836 saddr, daddr);
39471ac8 837 goto csum_error;
1da177e4
LT
838 }
839
8cf22943
HX
840 if (!pskb_pull(skb, sizeof(*hdr)))
841 goto discard_it;
1da177e4 842
cc70ab26 843 hdr = icmp6_hdr(skb);
1da177e4
LT
844
845 type = hdr->icmp6_type;
846
f3832ed2 847 ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
1da177e4
LT
848
849 switch (type) {
850 case ICMPV6_ECHO_REQUEST:
851 icmpv6_echo_reply(skb);
852 break;
853
854 case ICMPV6_ECHO_REPLY:
e3e32170 855 success = ping_rcv(skb);
1da177e4
LT
856 break;
857
858 case ICMPV6_PKT_TOOBIG:
859 /* BUGGG_FUTURE: if packet contains rthdr, we cannot update
860 standard destination cache. Seems, only "advanced"
861 destination cache will allow to solve this problem
862 --ANK (980726)
863 */
864 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
865 goto discard_it;
cc70ab26 866 hdr = icmp6_hdr(skb);
1da177e4 867
275757e6
GS
868 /* to notify */
869 /* fall through */
1da177e4
LT
870 case ICMPV6_DEST_UNREACH:
871 case ICMPV6_TIME_EXCEED:
872 case ICMPV6_PARAMPROB:
873 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
874 break;
875
876 case NDISC_ROUTER_SOLICITATION:
877 case NDISC_ROUTER_ADVERTISEMENT:
878 case NDISC_NEIGHBOUR_SOLICITATION:
879 case NDISC_NEIGHBOUR_ADVERTISEMENT:
880 case NDISC_REDIRECT:
881 ndisc_rcv(skb);
882 break;
883
884 case ICMPV6_MGM_QUERY:
885 igmp6_event_query(skb);
886 break;
887
888 case ICMPV6_MGM_REPORT:
889 igmp6_event_report(skb);
890 break;
891
892 case ICMPV6_MGM_REDUCTION:
893 case ICMPV6_NI_QUERY:
894 case ICMPV6_NI_REPLY:
895 case ICMPV6_MLD2_REPORT:
896 case ICMPV6_DHAAD_REQUEST:
897 case ICMPV6_DHAAD_REPLY:
898 case ICMPV6_MOBILE_PREFIX_SOL:
899 case ICMPV6_MOBILE_PREFIX_ADV:
900 break;
901
902 default:
1da177e4
LT
903 /* informational */
904 if (type & ICMPV6_INFOMSG_MASK)
905 break;
906
4b3418fb
BM
907 net_dbg_ratelimited("icmpv6: msg of unknown type [%pI6c > %pI6c]\n",
908 saddr, daddr);
ea85a0a2 909
1ab1457c
YH
910 /*
911 * error of unknown type.
912 * must pass to upper level
1da177e4
LT
913 */
914
915 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
3ff50b79
SH
916 }
917
e3e32170
RJ
918 /* until the v6 path can be better sorted assume failure and
919 * preserve the status quo behaviour for the rest of the paths to here
920 */
921 if (success)
922 consume_skb(skb);
923 else
924 kfree_skb(skb);
925
1da177e4
LT
926 return 0;
927
6a5dc9e5 928csum_error:
a16292a0 929 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
1da177e4 930discard_it:
a16292a0 931 __ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
8b7817f3 932drop_no_count:
1da177e4
LT
933 kfree_skb(skb);
934 return 0;
935}
936
4c9483b2 937void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
95e41e93
YH
938 u8 type,
939 const struct in6_addr *saddr,
940 const struct in6_addr *daddr,
941 int oif)
942{
4c9483b2 943 memset(fl6, 0, sizeof(*fl6));
4e3fd7a0
AD
944 fl6->saddr = *saddr;
945 fl6->daddr = *daddr;
67ba4152 946 fl6->flowi6_proto = IPPROTO_ICMPV6;
1958b856
DM
947 fl6->fl6_icmp_type = type;
948 fl6->fl6_icmp_code = 0;
4c9483b2
DM
949 fl6->flowi6_oif = oif;
950 security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
95e41e93
YH
951}
952
98c6d1b2 953static int __net_init icmpv6_sk_init(struct net *net)
1da177e4
LT
954{
955 struct sock *sk;
956 int err, i, j;
957
98c6d1b2
DL
958 net->ipv6.icmp_sk =
959 kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
63159f29 960 if (!net->ipv6.icmp_sk)
79c91159
DL
961 return -ENOMEM;
962
6f912042 963 for_each_possible_cpu(i) {
1ed8516f
DL
964 err = inet_ctl_sock_create(&sk, PF_INET6,
965 SOCK_RAW, IPPROTO_ICMPV6, net);
1da177e4 966 if (err < 0) {
f3213831 967 pr_err("Failed to initialize the ICMP6 control socket (err %d)\n",
1da177e4
LT
968 err);
969 goto fail;
970 }
971
1ed8516f 972 net->ipv6.icmp_sk[i] = sk;
5c8cafd6 973
1da177e4
LT
974 /* Enough space for 2 64K ICMP packets, including
975 * sk_buff struct overhead.
976 */
87fb4b7b 977 sk->sk_sndbuf = 2 * SKB_TRUESIZE(64 * 1024);
1da177e4 978 }
1da177e4
LT
979 return 0;
980
981 fail:
5c8cafd6 982 for (j = 0; j < i; j++)
1ed8516f 983 inet_ctl_sock_destroy(net->ipv6.icmp_sk[j]);
98c6d1b2 984 kfree(net->ipv6.icmp_sk);
1da177e4
LT
985 return err;
986}
987
98c6d1b2 988static void __net_exit icmpv6_sk_exit(struct net *net)
1da177e4
LT
989{
990 int i;
991
6f912042 992 for_each_possible_cpu(i) {
1ed8516f 993 inet_ctl_sock_destroy(net->ipv6.icmp_sk[i]);
1da177e4 994 }
98c6d1b2
DL
995 kfree(net->ipv6.icmp_sk);
996}
997
8ed7edce 998static struct pernet_operations icmpv6_sk_ops = {
67ba4152
IM
999 .init = icmpv6_sk_init,
1000 .exit = icmpv6_sk_exit,
98c6d1b2
DL
1001};
1002
1003int __init icmpv6_init(void)
1004{
1005 int err;
1006
1007 err = register_pernet_subsys(&icmpv6_sk_ops);
1008 if (err < 0)
1009 return err;
1010
1011 err = -EAGAIN;
1012 if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
1013 goto fail;
5f5624cf
PS
1014
1015 err = inet6_register_icmp_sender(icmp6_send);
1016 if (err)
1017 goto sender_reg_err;
98c6d1b2
DL
1018 return 0;
1019
5f5624cf
PS
1020sender_reg_err:
1021 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
98c6d1b2 1022fail:
f3213831 1023 pr_err("Failed to register ICMP6 protocol\n");
98c6d1b2
DL
1024 unregister_pernet_subsys(&icmpv6_sk_ops);
1025 return err;
1026}
1027
8ed7edce 1028void icmpv6_cleanup(void)
98c6d1b2 1029{
5f5624cf 1030 inet6_unregister_icmp_sender(icmp6_send);
98c6d1b2 1031 unregister_pernet_subsys(&icmpv6_sk_ops);
1da177e4
LT
1032 inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
1033}
1034
98c6d1b2 1035
9b5b5cff 1036static const struct icmp6_err {
1da177e4
LT
1037 int err;
1038 int fatal;
1039} tab_unreach[] = {
1040 { /* NOROUTE */
1041 .err = ENETUNREACH,
1042 .fatal = 0,
1043 },
1044 { /* ADM_PROHIBITED */
1045 .err = EACCES,
1046 .fatal = 1,
1047 },
1048 { /* Was NOT_NEIGHBOUR, now reserved */
1049 .err = EHOSTUNREACH,
1050 .fatal = 0,
1051 },
1052 { /* ADDR_UNREACH */
1053 .err = EHOSTUNREACH,
1054 .fatal = 0,
1055 },
1056 { /* PORT_UNREACH */
1057 .err = ECONNREFUSED,
1058 .fatal = 1,
1059 },
61e76b17
JB
1060 { /* POLICY_FAIL */
1061 .err = EACCES,
1062 .fatal = 1,
1063 },
1064 { /* REJECT_ROUTE */
1065 .err = EACCES,
1066 .fatal = 1,
1067 },
1da177e4
LT
1068};
1069
d5fdd6ba 1070int icmpv6_err_convert(u8 type, u8 code, int *err)
1da177e4
LT
1071{
1072 int fatal = 0;
1073
1074 *err = EPROTO;
1075
1076 switch (type) {
1077 case ICMPV6_DEST_UNREACH:
1078 fatal = 1;
61e76b17 1079 if (code < ARRAY_SIZE(tab_unreach)) {
1da177e4
LT
1080 *err = tab_unreach[code].err;
1081 fatal = tab_unreach[code].fatal;
1082 }
1083 break;
1084
1085 case ICMPV6_PKT_TOOBIG:
1086 *err = EMSGSIZE;
1087 break;
1ab1457c 1088
1da177e4
LT
1089 case ICMPV6_PARAMPROB:
1090 *err = EPROTO;
1091 fatal = 1;
1092 break;
1093
1094 case ICMPV6_TIME_EXCEED:
1095 *err = EHOSTUNREACH;
1096 break;
3ff50b79 1097 }
1da177e4
LT
1098
1099 return fatal;
1100}
7159039a
YH
1101EXPORT_SYMBOL(icmpv6_err_convert);
1102
1da177e4 1103#ifdef CONFIG_SYSCTL
e8243534 1104static struct ctl_table ipv6_icmp_table_template[] = {
1da177e4 1105 {
1da177e4 1106 .procname = "ratelimit",
41a76906 1107 .data = &init_net.ipv6.sysctl.icmpv6_time,
1da177e4
LT
1108 .maxlen = sizeof(int),
1109 .mode = 0644,
6d9f239a 1110 .proc_handler = proc_dointvec_ms_jiffies,
1da177e4 1111 },
f8572d8f 1112 { },
1da177e4 1113};
760f2d01 1114
2c8c1e72 1115struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
760f2d01
DL
1116{
1117 struct ctl_table *table;
1118
1119 table = kmemdup(ipv6_icmp_table_template,
1120 sizeof(ipv6_icmp_table_template),
1121 GFP_KERNEL);
5ee09105 1122
c027aab4 1123 if (table)
5ee09105
YH
1124 table[0].data = &net->ipv6.sysctl.icmpv6_time;
1125
760f2d01
DL
1126 return table;
1127}
1da177e4 1128#endif