ndisc.c revision a61bbcf28a8cb0ba56f8193d512f7222e711a294
1/* 2 * Neighbour Discovery for IPv6 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * Mike Shaver <shaver@ingenia.com> 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 12 * 2 of the License, or (at your option) any later version. 13 */ 14 15/* 16 * Changes: 17 * 18 * Lars Fenneberg : fixed MTU setting on receipt 19 * of an RA. 20 * 21 * Janos Farkas : kmalloc failure checks 22 * Alexey Kuznetsov : state machine reworked 23 * and moved to net/core. 24 * Pekka Savola : RFC2461 validation 25 * YOSHIFUJI Hideaki @USAGI : Verify ND options properly 26 */ 27 28/* Set to 3 to get tracing... */ 29#define ND_DEBUG 1 30 31#define ND_PRINTK(fmt, args...) do { if (net_ratelimit()) { printk(fmt, ## args); } } while(0) 32#define ND_NOPRINTK(x...) do { ; } while(0) 33#define ND_PRINTK0 ND_PRINTK 34#define ND_PRINTK1 ND_NOPRINTK 35#define ND_PRINTK2 ND_NOPRINTK 36#define ND_PRINTK3 ND_NOPRINTK 37#if ND_DEBUG >= 1 38#undef ND_PRINTK1 39#define ND_PRINTK1 ND_PRINTK 40#endif 41#if ND_DEBUG >= 2 42#undef ND_PRINTK2 43#define ND_PRINTK2 ND_PRINTK 44#endif 45#if ND_DEBUG >= 3 46#undef ND_PRINTK3 47#define ND_PRINTK3 ND_PRINTK 48#endif 49 50#include <linux/module.h> 51#include <linux/config.h> 52#include <linux/errno.h> 53#include <linux/types.h> 54#include <linux/socket.h> 55#include <linux/sockios.h> 56#include <linux/sched.h> 57#include <linux/net.h> 58#include <linux/in6.h> 59#include <linux/route.h> 60#include <linux/init.h> 61#include <linux/rcupdate.h> 62#ifdef CONFIG_SYSCTL 63#include <linux/sysctl.h> 64#endif 65 66#include <linux/if_arp.h> 67#include <linux/ipv6.h> 68#include <linux/icmpv6.h> 69#include <linux/jhash.h> 70 71#include <net/sock.h> 72#include <net/snmp.h> 73 74#include <net/ipv6.h> 75#include <net/protocol.h> 76#include <net/ndisc.h> 77#include <net/ip6_route.h> 78#include <net/addrconf.h> 79#include <net/icmp.h> 80 81#include <net/flow.h> 82#include <net/ip6_checksum.h> 83#include <linux/proc_fs.h> 84 85#include <linux/netfilter.h> 86#include <linux/netfilter_ipv6.h> 87 88static struct socket *ndisc_socket; 89 90static u32 ndisc_hash(const void *pkey, const struct net_device *dev); 91static int ndisc_constructor(struct neighbour *neigh); 92static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb); 93static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb); 94static int pndisc_constructor(struct pneigh_entry *n); 95static void pndisc_destructor(struct pneigh_entry *n); 96static void pndisc_redo(struct sk_buff *skb); 97 98static struct neigh_ops ndisc_generic_ops = { 99 .family = AF_INET6, 100 .solicit = ndisc_solicit, 101 .error_report = ndisc_error_report, 102 .output = neigh_resolve_output, 103 .connected_output = neigh_connected_output, 104 .hh_output = dev_queue_xmit, 105 .queue_xmit = dev_queue_xmit, 106}; 107 108static struct neigh_ops ndisc_hh_ops = { 109 .family = AF_INET6, 110 .solicit = ndisc_solicit, 111 .error_report = ndisc_error_report, 112 .output = neigh_resolve_output, 113 .connected_output = neigh_resolve_output, 114 .hh_output = dev_queue_xmit, 115 .queue_xmit = dev_queue_xmit, 116}; 117 118 119static struct neigh_ops ndisc_direct_ops = { 120 .family = AF_INET6, 121 .output = dev_queue_xmit, 122 .connected_output = dev_queue_xmit, 123 .hh_output = dev_queue_xmit, 124 .queue_xmit = dev_queue_xmit, 125}; 126 127struct neigh_table nd_tbl = { 128 .family = AF_INET6, 129 .entry_size = sizeof(struct neighbour) + sizeof(struct in6_addr), 130 .key_len = sizeof(struct in6_addr), 131 .hash = ndisc_hash, 132 .constructor = ndisc_constructor, 133 .pconstructor = pndisc_constructor, 134 .pdestructor = pndisc_destructor, 135 .proxy_redo = pndisc_redo, 136 .id = "ndisc_cache", 137 .parms = { 138 .tbl = &nd_tbl, 139 .base_reachable_time = 30 * HZ, 140 .retrans_time = 1 * HZ, 141 .gc_staletime = 60 * HZ, 142 .reachable_time = 30 * HZ, 143 .delay_probe_time = 5 * HZ, 144 .queue_len = 3, 145 .ucast_probes = 3, 146 .mcast_probes = 3, 147 .anycast_delay = 1 * HZ, 148 .proxy_delay = (8 * HZ) / 10, 149 .proxy_qlen = 64, 150 }, 151 .gc_interval = 30 * HZ, 152 .gc_thresh1 = 128, 153 .gc_thresh2 = 512, 154 .gc_thresh3 = 1024, 155}; 156 157/* ND options */ 158struct ndisc_options { 159 struct nd_opt_hdr *nd_opt_array[__ND_OPT_MAX]; 160}; 161 162#define nd_opts_src_lladdr nd_opt_array[ND_OPT_SOURCE_LL_ADDR] 163#define nd_opts_tgt_lladdr nd_opt_array[ND_OPT_TARGET_LL_ADDR] 164#define nd_opts_pi nd_opt_array[ND_OPT_PREFIX_INFO] 165#define nd_opts_pi_end nd_opt_array[__ND_OPT_PREFIX_INFO_END] 166#define nd_opts_rh nd_opt_array[ND_OPT_REDIRECT_HDR] 167#define nd_opts_mtu nd_opt_array[ND_OPT_MTU] 168 169#define NDISC_OPT_SPACE(len) (((len)+2+7)&~7) 170 171/* 172 * Return the padding between the option length and the start of the 173 * link addr. Currently only IP-over-InfiniBand needs this, although 174 * if RFC 3831 IPv6-over-Fibre Channel is ever implemented it may 175 * also need a pad of 2. 176 */ 177static int ndisc_addr_option_pad(unsigned short type) 178{ 179 switch (type) { 180 case ARPHRD_INFINIBAND: return 2; 181 default: return 0; 182 } 183} 184 185static inline int ndisc_opt_addr_space(struct net_device *dev) 186{ 187 return NDISC_OPT_SPACE(dev->addr_len + ndisc_addr_option_pad(dev->type)); 188} 189 190static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len, 191 unsigned short addr_type) 192{ 193 int space = NDISC_OPT_SPACE(data_len); 194 int pad = ndisc_addr_option_pad(addr_type); 195 196 opt[0] = type; 197 opt[1] = space>>3; 198 199 memset(opt + 2, 0, pad); 200 opt += pad; 201 space -= pad; 202 203 memcpy(opt+2, data, data_len); 204 data_len += 2; 205 opt += data_len; 206 if ((space -= data_len) > 0) 207 memset(opt, 0, space); 208 return opt + space; 209} 210 211static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur, 212 struct nd_opt_hdr *end) 213{ 214 int type; 215 if (!cur || !end || cur >= end) 216 return NULL; 217 type = cur->nd_opt_type; 218 do { 219 cur = ((void *)cur) + (cur->nd_opt_len << 3); 220 } while(cur < end && cur->nd_opt_type != type); 221 return (cur <= end && cur->nd_opt_type == type ? cur : NULL); 222} 223 224static struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len, 225 struct ndisc_options *ndopts) 226{ 227 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt; 228 229 if (!nd_opt || opt_len < 0 || !ndopts) 230 return NULL; 231 memset(ndopts, 0, sizeof(*ndopts)); 232 while (opt_len) { 233 int l; 234 if (opt_len < sizeof(struct nd_opt_hdr)) 235 return NULL; 236 l = nd_opt->nd_opt_len << 3; 237 if (opt_len < l || l == 0) 238 return NULL; 239 switch (nd_opt->nd_opt_type) { 240 case ND_OPT_SOURCE_LL_ADDR: 241 case ND_OPT_TARGET_LL_ADDR: 242 case ND_OPT_MTU: 243 case ND_OPT_REDIRECT_HDR: 244 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) { 245 ND_PRINTK2(KERN_WARNING 246 "%s(): duplicated ND6 option found: type=%d\n", 247 __FUNCTION__, 248 nd_opt->nd_opt_type); 249 } else { 250 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; 251 } 252 break; 253 case ND_OPT_PREFIX_INFO: 254 ndopts->nd_opts_pi_end = nd_opt; 255 if (ndopts->nd_opt_array[nd_opt->nd_opt_type] == 0) 256 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; 257 break; 258 default: 259 /* 260 * Unknown options must be silently ignored, 261 * to accommodate future extension to the protocol. 262 */ 263 ND_PRINTK2(KERN_NOTICE 264 "%s(): ignored unsupported option; type=%d, len=%d\n", 265 __FUNCTION__, 266 nd_opt->nd_opt_type, nd_opt->nd_opt_len); 267 } 268 opt_len -= l; 269 nd_opt = ((void *)nd_opt) + l; 270 } 271 return ndopts; 272} 273 274static inline u8 *ndisc_opt_addr_data(struct nd_opt_hdr *p, 275 struct net_device *dev) 276{ 277 u8 *lladdr = (u8 *)(p + 1); 278 int lladdrlen = p->nd_opt_len << 3; 279 int prepad = ndisc_addr_option_pad(dev->type); 280 if (lladdrlen != NDISC_OPT_SPACE(dev->addr_len + prepad)) 281 return NULL; 282 return (lladdr + prepad); 283} 284 285int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir) 286{ 287 switch (dev->type) { 288 case ARPHRD_ETHER: 289 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */ 290 case ARPHRD_FDDI: 291 ipv6_eth_mc_map(addr, buf); 292 return 0; 293 case ARPHRD_IEEE802_TR: 294 ipv6_tr_mc_map(addr,buf); 295 return 0; 296 case ARPHRD_ARCNET: 297 ipv6_arcnet_mc_map(addr, buf); 298 return 0; 299 case ARPHRD_INFINIBAND: 300 ipv6_ib_mc_map(addr, buf); 301 return 0; 302 default: 303 if (dir) { 304 memcpy(buf, dev->broadcast, dev->addr_len); 305 return 0; 306 } 307 } 308 return -EINVAL; 309} 310 311static u32 ndisc_hash(const void *pkey, const struct net_device *dev) 312{ 313 const u32 *p32 = pkey; 314 u32 addr_hash, i; 315 316 addr_hash = 0; 317 for (i = 0; i < (sizeof(struct in6_addr) / sizeof(u32)); i++) 318 addr_hash ^= *p32++; 319 320 return jhash_2words(addr_hash, dev->ifindex, nd_tbl.hash_rnd); 321} 322 323static int ndisc_constructor(struct neighbour *neigh) 324{ 325 struct in6_addr *addr = (struct in6_addr*)&neigh->primary_key; 326 struct net_device *dev = neigh->dev; 327 struct inet6_dev *in6_dev; 328 struct neigh_parms *parms; 329 int is_multicast = ipv6_addr_is_multicast(addr); 330 331 rcu_read_lock(); 332 in6_dev = in6_dev_get(dev); 333 if (in6_dev == NULL) { 334 rcu_read_unlock(); 335 return -EINVAL; 336 } 337 338 parms = in6_dev->nd_parms; 339 __neigh_parms_put(neigh->parms); 340 neigh->parms = neigh_parms_clone(parms); 341 rcu_read_unlock(); 342 343 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; 344 if (dev->hard_header == NULL) { 345 neigh->nud_state = NUD_NOARP; 346 neigh->ops = &ndisc_direct_ops; 347 neigh->output = neigh->ops->queue_xmit; 348 } else { 349 if (is_multicast) { 350 neigh->nud_state = NUD_NOARP; 351 ndisc_mc_map(addr, neigh->ha, dev, 1); 352 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) { 353 neigh->nud_state = NUD_NOARP; 354 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); 355 if (dev->flags&IFF_LOOPBACK) 356 neigh->type = RTN_LOCAL; 357 } else if (dev->flags&IFF_POINTOPOINT) { 358 neigh->nud_state = NUD_NOARP; 359 memcpy(neigh->ha, dev->broadcast, dev->addr_len); 360 } 361 if (dev->hard_header_cache) 362 neigh->ops = &ndisc_hh_ops; 363 else 364 neigh->ops = &ndisc_generic_ops; 365 if (neigh->nud_state&NUD_VALID) 366 neigh->output = neigh->ops->connected_output; 367 else 368 neigh->output = neigh->ops->output; 369 } 370 in6_dev_put(in6_dev); 371 return 0; 372} 373 374static int pndisc_constructor(struct pneigh_entry *n) 375{ 376 struct in6_addr *addr = (struct in6_addr*)&n->key; 377 struct in6_addr maddr; 378 struct net_device *dev = n->dev; 379 380 if (dev == NULL || __in6_dev_get(dev) == NULL) 381 return -EINVAL; 382 addrconf_addr_solict_mult(addr, &maddr); 383 ipv6_dev_mc_inc(dev, &maddr); 384 return 0; 385} 386 387static void pndisc_destructor(struct pneigh_entry *n) 388{ 389 struct in6_addr *addr = (struct in6_addr*)&n->key; 390 struct in6_addr maddr; 391 struct net_device *dev = n->dev; 392 393 if (dev == NULL || __in6_dev_get(dev) == NULL) 394 return; 395 addrconf_addr_solict_mult(addr, &maddr); 396 ipv6_dev_mc_dec(dev, &maddr); 397} 398 399/* 400 * Send a Neighbour Advertisement 401 */ 402 403static inline void ndisc_flow_init(struct flowi *fl, u8 type, 404 struct in6_addr *saddr, struct in6_addr *daddr) 405{ 406 memset(fl, 0, sizeof(*fl)); 407 ipv6_addr_copy(&fl->fl6_src, saddr); 408 ipv6_addr_copy(&fl->fl6_dst, daddr); 409 fl->proto = IPPROTO_ICMPV6; 410 fl->fl_icmp_type = type; 411 fl->fl_icmp_code = 0; 412} 413 414static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, 415 struct in6_addr *daddr, struct in6_addr *solicited_addr, 416 int router, int solicited, int override, int inc_opt) 417{ 418 struct in6_addr tmpaddr; 419 struct inet6_ifaddr *ifp; 420 struct inet6_dev *idev; 421 struct flowi fl; 422 struct dst_entry* dst; 423 struct sock *sk = ndisc_socket->sk; 424 struct in6_addr *src_addr; 425 struct nd_msg *msg; 426 int len; 427 struct sk_buff *skb; 428 int err; 429 430 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); 431 432 /* for anycast or proxy, solicited_addr != src_addr */ 433 ifp = ipv6_get_ifaddr(solicited_addr, dev, 1); 434 if (ifp) { 435 src_addr = solicited_addr; 436 in6_ifa_put(ifp); 437 } else { 438 if (ipv6_dev_get_saddr(dev, daddr, &tmpaddr)) 439 return; 440 src_addr = &tmpaddr; 441 } 442 443 ndisc_flow_init(&fl, NDISC_NEIGHBOUR_ADVERTISEMENT, src_addr, daddr); 444 445 dst = ndisc_dst_alloc(dev, neigh, daddr, ip6_output); 446 if (!dst) 447 return; 448 449 err = xfrm_lookup(&dst, &fl, NULL, 0); 450 if (err < 0) { 451 dst_release(dst); 452 return; 453 } 454 455 if (inc_opt) { 456 if (dev->addr_len) 457 len += ndisc_opt_addr_space(dev); 458 else 459 inc_opt = 0; 460 } 461 462 skb = sock_alloc_send_skb(sk, MAX_HEADER + len + LL_RESERVED_SPACE(dev), 463 1, &err); 464 465 if (skb == NULL) { 466 ND_PRINTK0(KERN_ERR 467 "ICMPv6 NA: %s() failed to allocate an skb.\n", 468 __FUNCTION__); 469 dst_release(dst); 470 return; 471 } 472 473 skb_reserve(skb, LL_RESERVED_SPACE(dev)); 474 ip6_nd_hdr(sk, skb, dev, src_addr, daddr, IPPROTO_ICMPV6, len); 475 476 msg = (struct nd_msg *)skb_put(skb, len); 477 skb->h.raw = (unsigned char*)msg; 478 479 msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; 480 msg->icmph.icmp6_code = 0; 481 msg->icmph.icmp6_cksum = 0; 482 483 msg->icmph.icmp6_unused = 0; 484 msg->icmph.icmp6_router = router; 485 msg->icmph.icmp6_solicited = solicited; 486 msg->icmph.icmp6_override = !!override; 487 488 /* Set the target address. */ 489 ipv6_addr_copy(&msg->target, solicited_addr); 490 491 if (inc_opt) 492 ndisc_fill_addr_option(msg->opt, ND_OPT_TARGET_LL_ADDR, dev->dev_addr, 493 dev->addr_len, dev->type); 494 495 /* checksum */ 496 msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, len, 497 IPPROTO_ICMPV6, 498 csum_partial((__u8 *) msg, 499 len, 0)); 500 501 skb->dst = dst; 502 idev = in6_dev_get(dst->dev); 503 IP6_INC_STATS(IPSTATS_MIB_OUTREQUESTS); 504 err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); 505 if (!err) { 506 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTNEIGHBORADVERTISEMENTS); 507 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS); 508 } 509 510 if (likely(idev != NULL)) 511 in6_dev_put(idev); 512} 513 514void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh, 515 struct in6_addr *solicit, 516 struct in6_addr *daddr, struct in6_addr *saddr) 517{ 518 struct flowi fl; 519 struct dst_entry* dst; 520 struct inet6_dev *idev; 521 struct sock *sk = ndisc_socket->sk; 522 struct sk_buff *skb; 523 struct nd_msg *msg; 524 struct in6_addr addr_buf; 525 int len; 526 int err; 527 int send_llinfo; 528 529 if (saddr == NULL) { 530 if (ipv6_get_lladdr(dev, &addr_buf)) 531 return; 532 saddr = &addr_buf; 533 } 534 535 ndisc_flow_init(&fl, NDISC_NEIGHBOUR_SOLICITATION, saddr, daddr); 536 537 dst = ndisc_dst_alloc(dev, neigh, daddr, ip6_output); 538 if (!dst) 539 return; 540 541 err = xfrm_lookup(&dst, &fl, NULL, 0); 542 if (err < 0) { 543 dst_release(dst); 544 return; 545 } 546 547 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); 548 send_llinfo = dev->addr_len && !ipv6_addr_any(saddr); 549 if (send_llinfo) 550 len += ndisc_opt_addr_space(dev); 551 552 skb = sock_alloc_send_skb(sk, MAX_HEADER + len + LL_RESERVED_SPACE(dev), 553 1, &err); 554 if (skb == NULL) { 555 ND_PRINTK0(KERN_ERR 556 "ICMPv6 NA: %s() failed to allocate an skb.\n", 557 __FUNCTION__); 558 dst_release(dst); 559 return; 560 } 561 562 skb_reserve(skb, LL_RESERVED_SPACE(dev)); 563 ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); 564 565 msg = (struct nd_msg *)skb_put(skb, len); 566 skb->h.raw = (unsigned char*)msg; 567 msg->icmph.icmp6_type = NDISC_NEIGHBOUR_SOLICITATION; 568 msg->icmph.icmp6_code = 0; 569 msg->icmph.icmp6_cksum = 0; 570 msg->icmph.icmp6_unused = 0; 571 572 /* Set the target address. */ 573 ipv6_addr_copy(&msg->target, solicit); 574 575 if (send_llinfo) 576 ndisc_fill_addr_option(msg->opt, ND_OPT_SOURCE_LL_ADDR, dev->dev_addr, 577 dev->addr_len, dev->type); 578 579 /* checksum */ 580 msg->icmph.icmp6_cksum = csum_ipv6_magic(&skb->nh.ipv6h->saddr, 581 daddr, len, 582 IPPROTO_ICMPV6, 583 csum_partial((__u8 *) msg, 584 len, 0)); 585 /* send it! */ 586 skb->dst = dst; 587 idev = in6_dev_get(dst->dev); 588 IP6_INC_STATS(IPSTATS_MIB_OUTREQUESTS); 589 err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); 590 if (!err) { 591 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTNEIGHBORSOLICITS); 592 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS); 593 } 594 595 if (likely(idev != NULL)) 596 in6_dev_put(idev); 597} 598 599void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr, 600 struct in6_addr *daddr) 601{ 602 struct flowi fl; 603 struct dst_entry* dst; 604 struct inet6_dev *idev; 605 struct sock *sk = ndisc_socket->sk; 606 struct sk_buff *skb; 607 struct icmp6hdr *hdr; 608 __u8 * opt; 609 int len; 610 int err; 611 612 ndisc_flow_init(&fl, NDISC_ROUTER_SOLICITATION, saddr, daddr); 613 614 dst = ndisc_dst_alloc(dev, NULL, daddr, ip6_output); 615 if (!dst) 616 return; 617 618 err = xfrm_lookup(&dst, &fl, NULL, 0); 619 if (err < 0) { 620 dst_release(dst); 621 return; 622 } 623 624 len = sizeof(struct icmp6hdr); 625 if (dev->addr_len) 626 len += ndisc_opt_addr_space(dev); 627 628 skb = sock_alloc_send_skb(sk, MAX_HEADER + len + LL_RESERVED_SPACE(dev), 629 1, &err); 630 if (skb == NULL) { 631 ND_PRINTK0(KERN_ERR 632 "ICMPv6 RS: %s() failed to allocate an skb.\n", 633 __FUNCTION__); 634 dst_release(dst); 635 return; 636 } 637 638 skb_reserve(skb, LL_RESERVED_SPACE(dev)); 639 ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); 640 641 hdr = (struct icmp6hdr *)skb_put(skb, len); 642 skb->h.raw = (unsigned char*)hdr; 643 hdr->icmp6_type = NDISC_ROUTER_SOLICITATION; 644 hdr->icmp6_code = 0; 645 hdr->icmp6_cksum = 0; 646 hdr->icmp6_unused = 0; 647 648 opt = (u8*) (hdr + 1); 649 650 if (dev->addr_len) 651 ndisc_fill_addr_option(opt, ND_OPT_SOURCE_LL_ADDR, dev->dev_addr, 652 dev->addr_len, dev->type); 653 654 /* checksum */ 655 hdr->icmp6_cksum = csum_ipv6_magic(&skb->nh.ipv6h->saddr, daddr, len, 656 IPPROTO_ICMPV6, 657 csum_partial((__u8 *) hdr, len, 0)); 658 659 /* send it! */ 660 skb->dst = dst; 661 idev = in6_dev_get(dst->dev); 662 IP6_INC_STATS(IPSTATS_MIB_OUTREQUESTS); 663 err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); 664 if (!err) { 665 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTROUTERSOLICITS); 666 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS); 667 } 668 669 if (likely(idev != NULL)) 670 in6_dev_put(idev); 671} 672 673 674static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) 675{ 676 /* 677 * "The sender MUST return an ICMP 678 * destination unreachable" 679 */ 680 dst_link_failure(skb); 681 kfree_skb(skb); 682} 683 684/* Called with locked neigh: either read or both */ 685 686static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb) 687{ 688 struct in6_addr *saddr = NULL; 689 struct in6_addr mcaddr; 690 struct net_device *dev = neigh->dev; 691 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; 692 int probes = atomic_read(&neigh->probes); 693 694 if (skb && ipv6_chk_addr(&skb->nh.ipv6h->saddr, dev, 1)) 695 saddr = &skb->nh.ipv6h->saddr; 696 697 if ((probes -= neigh->parms->ucast_probes) < 0) { 698 if (!(neigh->nud_state & NUD_VALID)) { 699 ND_PRINTK1(KERN_DEBUG 700 "%s(): trying to ucast probe in NUD_INVALID: " 701 "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", 702 __FUNCTION__, 703 NIP6(*target)); 704 } 705 ndisc_send_ns(dev, neigh, target, target, saddr); 706 } else if ((probes -= neigh->parms->app_probes) < 0) { 707#ifdef CONFIG_ARPD 708 neigh_app_ns(neigh); 709#endif 710 } else { 711 addrconf_addr_solict_mult(target, &mcaddr); 712 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr); 713 } 714} 715 716static void ndisc_recv_ns(struct sk_buff *skb) 717{ 718 struct nd_msg *msg = (struct nd_msg *)skb->h.raw; 719 struct in6_addr *saddr = &skb->nh.ipv6h->saddr; 720 struct in6_addr *daddr = &skb->nh.ipv6h->daddr; 721 u8 *lladdr = NULL; 722 u32 ndoptlen = skb->tail - msg->opt; 723 struct ndisc_options ndopts; 724 struct net_device *dev = skb->dev; 725 struct inet6_ifaddr *ifp; 726 struct inet6_dev *idev = NULL; 727 struct neighbour *neigh; 728 int dad = ipv6_addr_any(saddr); 729 int inc; 730 731 if (ipv6_addr_is_multicast(&msg->target)) { 732 ND_PRINTK2(KERN_WARNING 733 "ICMPv6 NS: multicast target address"); 734 return; 735 } 736 737 /* 738 * RFC2461 7.1.1: 739 * DAD has to be destined for solicited node multicast address. 740 */ 741 if (dad && 742 !(daddr->s6_addr32[0] == htonl(0xff020000) && 743 daddr->s6_addr32[1] == htonl(0x00000000) && 744 daddr->s6_addr32[2] == htonl(0x00000001) && 745 daddr->s6_addr [12] == 0xff )) { 746 ND_PRINTK2(KERN_WARNING 747 "ICMPv6 NS: bad DAD packet (wrong destination)\n"); 748 return; 749 } 750 751 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) { 752 ND_PRINTK2(KERN_WARNING 753 "ICMPv6 NS: invalid ND options\n"); 754 return; 755 } 756 757 if (ndopts.nd_opts_src_lladdr) { 758 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev); 759 if (!lladdr) { 760 ND_PRINTK2(KERN_WARNING 761 "ICMPv6 NS: invalid link-layer address length\n"); 762 return; 763 } 764 765 /* RFC2461 7.1.1: 766 * If the IP source address is the unspecified address, 767 * there MUST NOT be source link-layer address option 768 * in the message. 769 */ 770 if (dad) { 771 ND_PRINTK2(KERN_WARNING 772 "ICMPv6 NS: bad DAD packet (link-layer address option)\n"); 773 return; 774 } 775 } 776 777 inc = ipv6_addr_is_multicast(daddr); 778 779 if ((ifp = ipv6_get_ifaddr(&msg->target, dev, 1)) != NULL) { 780 if (ifp->flags & IFA_F_TENTATIVE) { 781 /* Address is tentative. If the source 782 is unspecified address, it is someone 783 does DAD, otherwise we ignore solicitations 784 until DAD timer expires. 785 */ 786 if (!dad) 787 goto out; 788 if (dev->type == ARPHRD_IEEE802_TR) { 789 unsigned char *sadr = skb->mac.raw; 790 if (((sadr[8] ^ dev->dev_addr[0]) & 0x7f) == 0 && 791 sadr[9] == dev->dev_addr[1] && 792 sadr[10] == dev->dev_addr[2] && 793 sadr[11] == dev->dev_addr[3] && 794 sadr[12] == dev->dev_addr[4] && 795 sadr[13] == dev->dev_addr[5]) { 796 /* looped-back to us */ 797 goto out; 798 } 799 } 800 addrconf_dad_failure(ifp); 801 return; 802 } 803 804 idev = ifp->idev; 805 } else { 806 idev = in6_dev_get(dev); 807 if (!idev) { 808 /* XXX: count this drop? */ 809 return; 810 } 811 812 if (ipv6_chk_acast_addr(dev, &msg->target) || 813 (idev->cnf.forwarding && 814 pneigh_lookup(&nd_tbl, &msg->target, dev, 0))) { 815 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && 816 skb->pkt_type != PACKET_HOST && 817 inc != 0 && 818 idev->nd_parms->proxy_delay != 0) { 819 /* 820 * for anycast or proxy, 821 * sender should delay its response 822 * by a random time between 0 and 823 * MAX_ANYCAST_DELAY_TIME seconds. 824 * (RFC2461) -- yoshfuji 825 */ 826 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC); 827 if (n) 828 pneigh_enqueue(&nd_tbl, idev->nd_parms, n); 829 goto out; 830 } 831 } else 832 goto out; 833 } 834 835 if (dad) { 836 struct in6_addr maddr; 837 838 ipv6_addr_all_nodes(&maddr); 839 ndisc_send_na(dev, NULL, &maddr, &msg->target, 840 idev->cnf.forwarding, 0, (ifp != NULL), 1); 841 goto out; 842 } 843 844 if (inc) 845 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast); 846 else 847 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast); 848 849 /* 850 * update / create cache entry 851 * for the source address 852 */ 853 neigh = __neigh_lookup(&nd_tbl, saddr, dev, 854 !inc || lladdr || !dev->addr_len); 855 if (neigh) 856 neigh_update(neigh, lladdr, NUD_STALE, 857 NEIGH_UPDATE_F_WEAK_OVERRIDE| 858 NEIGH_UPDATE_F_OVERRIDE); 859 if (neigh || !dev->hard_header) { 860 ndisc_send_na(dev, neigh, saddr, &msg->target, 861 idev->cnf.forwarding, 862 1, (ifp != NULL && inc), inc); 863 if (neigh) 864 neigh_release(neigh); 865 } 866 867out: 868 if (ifp) 869 in6_ifa_put(ifp); 870 else 871 in6_dev_put(idev); 872 873 return; 874} 875 876static void ndisc_recv_na(struct sk_buff *skb) 877{ 878 struct nd_msg *msg = (struct nd_msg *)skb->h.raw; 879 struct in6_addr *saddr = &skb->nh.ipv6h->saddr; 880 struct in6_addr *daddr = &skb->nh.ipv6h->daddr; 881 u8 *lladdr = NULL; 882 u32 ndoptlen = skb->tail - msg->opt; 883 struct ndisc_options ndopts; 884 struct net_device *dev = skb->dev; 885 struct inet6_ifaddr *ifp; 886 struct neighbour *neigh; 887 888 if (skb->len < sizeof(struct nd_msg)) { 889 ND_PRINTK2(KERN_WARNING 890 "ICMPv6 NA: packet too short\n"); 891 return; 892 } 893 894 if (ipv6_addr_is_multicast(&msg->target)) { 895 ND_PRINTK2(KERN_WARNING 896 "ICMPv6 NA: target address is multicast.\n"); 897 return; 898 } 899 900 if (ipv6_addr_is_multicast(daddr) && 901 msg->icmph.icmp6_solicited) { 902 ND_PRINTK2(KERN_WARNING 903 "ICMPv6 NA: solicited NA is multicasted.\n"); 904 return; 905 } 906 907 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) { 908 ND_PRINTK2(KERN_WARNING 909 "ICMPv6 NS: invalid ND option\n"); 910 return; 911 } 912 if (ndopts.nd_opts_tgt_lladdr) { 913 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev); 914 if (!lladdr) { 915 ND_PRINTK2(KERN_WARNING 916 "ICMPv6 NA: invalid link-layer address length\n"); 917 return; 918 } 919 } 920 if ((ifp = ipv6_get_ifaddr(&msg->target, dev, 1))) { 921 if (ifp->flags & IFA_F_TENTATIVE) { 922 addrconf_dad_failure(ifp); 923 return; 924 } 925 /* What should we make now? The advertisement 926 is invalid, but ndisc specs say nothing 927 about it. It could be misconfiguration, or 928 an smart proxy agent tries to help us :-) 929 */ 930 ND_PRINTK1(KERN_WARNING 931 "ICMPv6 NA: someone advertises our address on %s!\n", 932 ifp->idev->dev->name); 933 in6_ifa_put(ifp); 934 return; 935 } 936 neigh = neigh_lookup(&nd_tbl, &msg->target, dev); 937 938 if (neigh) { 939 u8 old_flags = neigh->flags; 940 941 if (neigh->nud_state & NUD_FAILED) 942 goto out; 943 944 neigh_update(neigh, lladdr, 945 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE, 946 NEIGH_UPDATE_F_WEAK_OVERRIDE| 947 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)| 948 NEIGH_UPDATE_F_OVERRIDE_ISROUTER| 949 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0)); 950 951 if ((old_flags & ~neigh->flags) & NTF_ROUTER) { 952 /* 953 * Change: router to host 954 */ 955 struct rt6_info *rt; 956 rt = rt6_get_dflt_router(saddr, dev); 957 if (rt) 958 ip6_del_rt(rt, NULL, NULL, NULL); 959 } 960 961out: 962 neigh_release(neigh); 963 } 964} 965 966static void ndisc_recv_rs(struct sk_buff *skb) 967{ 968 struct rs_msg *rs_msg = (struct rs_msg *) skb->h.raw; 969 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); 970 struct neighbour *neigh; 971 struct inet6_dev *idev; 972 struct in6_addr *saddr = &skb->nh.ipv6h->saddr; 973 struct ndisc_options ndopts; 974 u8 *lladdr = NULL; 975 976 if (skb->len < sizeof(*rs_msg)) 977 return; 978 979 idev = in6_dev_get(skb->dev); 980 if (!idev) { 981 if (net_ratelimit()) 982 ND_PRINTK1("ICMP6 RS: can't find in6 device\n"); 983 return; 984 } 985 986 /* Don't accept RS if we're not in router mode */ 987 if (!idev->cnf.forwarding) 988 goto out; 989 990 /* 991 * Don't update NCE if src = ::; 992 * this implies that the source node has no ip address assigned yet. 993 */ 994 if (ipv6_addr_any(saddr)) 995 goto out; 996 997 /* Parse ND options */ 998 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) { 999 if (net_ratelimit()) 1000 ND_PRINTK2("ICMP6 NS: invalid ND option, ignored\n"); 1001 goto out; 1002 } 1003 1004 if (ndopts.nd_opts_src_lladdr) { 1005 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, 1006 skb->dev); 1007 if (!lladdr) 1008 goto out; 1009 } 1010 1011 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); 1012 if (neigh) { 1013 neigh_update(neigh, lladdr, NUD_STALE, 1014 NEIGH_UPDATE_F_WEAK_OVERRIDE| 1015 NEIGH_UPDATE_F_OVERRIDE| 1016 NEIGH_UPDATE_F_OVERRIDE_ISROUTER); 1017 neigh_release(neigh); 1018 } 1019out: 1020 in6_dev_put(idev); 1021} 1022 1023static void ndisc_router_discovery(struct sk_buff *skb) 1024{ 1025 struct ra_msg *ra_msg = (struct ra_msg *) skb->h.raw; 1026 struct neighbour *neigh = NULL; 1027 struct inet6_dev *in6_dev; 1028 struct rt6_info *rt; 1029 int lifetime; 1030 struct ndisc_options ndopts; 1031 int optlen; 1032 1033 __u8 * opt = (__u8 *)(ra_msg + 1); 1034 1035 optlen = (skb->tail - skb->h.raw) - sizeof(struct ra_msg); 1036 1037 if (!(ipv6_addr_type(&skb->nh.ipv6h->saddr) & IPV6_ADDR_LINKLOCAL)) { 1038 ND_PRINTK2(KERN_WARNING 1039 "ICMPv6 RA: source address is not link-local.\n"); 1040 return; 1041 } 1042 if (optlen < 0) { 1043 ND_PRINTK2(KERN_WARNING 1044 "ICMPv6 RA: packet too short\n"); 1045 return; 1046 } 1047 1048 /* 1049 * set the RA_RECV flag in the interface 1050 */ 1051 1052 in6_dev = in6_dev_get(skb->dev); 1053 if (in6_dev == NULL) { 1054 ND_PRINTK0(KERN_ERR 1055 "ICMPv6 RA: can't find inet6 device for %s.\n", 1056 skb->dev->name); 1057 return; 1058 } 1059 if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) { 1060 in6_dev_put(in6_dev); 1061 return; 1062 } 1063 1064 if (!ndisc_parse_options(opt, optlen, &ndopts)) { 1065 in6_dev_put(in6_dev); 1066 ND_PRINTK2(KERN_WARNING 1067 "ICMP6 RA: invalid ND options\n"); 1068 return; 1069 } 1070 1071 if (in6_dev->if_flags & IF_RS_SENT) { 1072 /* 1073 * flag that an RA was received after an RS was sent 1074 * out on this interface. 1075 */ 1076 in6_dev->if_flags |= IF_RA_RCVD; 1077 } 1078 1079 /* 1080 * Remember the managed/otherconf flags from most recently 1081 * received RA message (RFC 2462) -- yoshfuji 1082 */ 1083 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | 1084 IF_RA_OTHERCONF)) | 1085 (ra_msg->icmph.icmp6_addrconf_managed ? 1086 IF_RA_MANAGED : 0) | 1087 (ra_msg->icmph.icmp6_addrconf_other ? 1088 IF_RA_OTHERCONF : 0); 1089 1090 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); 1091 1092 rt = rt6_get_dflt_router(&skb->nh.ipv6h->saddr, skb->dev); 1093 1094 if (rt) 1095 neigh = rt->rt6i_nexthop; 1096 1097 if (rt && lifetime == 0) { 1098 neigh_clone(neigh); 1099 ip6_del_rt(rt, NULL, NULL, NULL); 1100 rt = NULL; 1101 } 1102 1103 if (rt == NULL && lifetime) { 1104 ND_PRINTK3(KERN_DEBUG 1105 "ICMPv6 RA: adding default router.\n"); 1106 1107 rt = rt6_add_dflt_router(&skb->nh.ipv6h->saddr, skb->dev); 1108 if (rt == NULL) { 1109 ND_PRINTK0(KERN_ERR 1110 "ICMPv6 RA: %s() failed to add default route.\n", 1111 __FUNCTION__); 1112 in6_dev_put(in6_dev); 1113 return; 1114 } 1115 1116 neigh = rt->rt6i_nexthop; 1117 if (neigh == NULL) { 1118 ND_PRINTK0(KERN_ERR 1119 "ICMPv6 RA: %s() got default router without neighbour.\n", 1120 __FUNCTION__); 1121 dst_release(&rt->u.dst); 1122 in6_dev_put(in6_dev); 1123 return; 1124 } 1125 neigh->flags |= NTF_ROUTER; 1126 } 1127 1128 if (rt) 1129 rt->rt6i_expires = jiffies + (HZ * lifetime); 1130 1131 if (ra_msg->icmph.icmp6_hop_limit) { 1132 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; 1133 if (rt) 1134 rt->u.dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit; 1135 } 1136 1137 /* 1138 * Update Reachable Time and Retrans Timer 1139 */ 1140 1141 if (in6_dev->nd_parms) { 1142 unsigned long rtime = ntohl(ra_msg->retrans_timer); 1143 1144 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) { 1145 rtime = (rtime*HZ)/1000; 1146 if (rtime < HZ/10) 1147 rtime = HZ/10; 1148 in6_dev->nd_parms->retrans_time = rtime; 1149 in6_dev->tstamp = jiffies; 1150 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); 1151 } 1152 1153 rtime = ntohl(ra_msg->reachable_time); 1154 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) { 1155 rtime = (rtime*HZ)/1000; 1156 1157 if (rtime < HZ/10) 1158 rtime = HZ/10; 1159 1160 if (rtime != in6_dev->nd_parms->base_reachable_time) { 1161 in6_dev->nd_parms->base_reachable_time = rtime; 1162 in6_dev->nd_parms->gc_staletime = 3 * rtime; 1163 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); 1164 in6_dev->tstamp = jiffies; 1165 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); 1166 } 1167 } 1168 } 1169 1170 /* 1171 * Process options. 1172 */ 1173 1174 if (!neigh) 1175 neigh = __neigh_lookup(&nd_tbl, &skb->nh.ipv6h->saddr, 1176 skb->dev, 1); 1177 if (neigh) { 1178 u8 *lladdr = NULL; 1179 if (ndopts.nd_opts_src_lladdr) { 1180 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, 1181 skb->dev); 1182 if (!lladdr) { 1183 ND_PRINTK2(KERN_WARNING 1184 "ICMPv6 RA: invalid link-layer address length\n"); 1185 goto out; 1186 } 1187 } 1188 neigh_update(neigh, lladdr, NUD_STALE, 1189 NEIGH_UPDATE_F_WEAK_OVERRIDE| 1190 NEIGH_UPDATE_F_OVERRIDE| 1191 NEIGH_UPDATE_F_OVERRIDE_ISROUTER| 1192 NEIGH_UPDATE_F_ISROUTER); 1193 } 1194 1195 if (ndopts.nd_opts_pi) { 1196 struct nd_opt_hdr *p; 1197 for (p = ndopts.nd_opts_pi; 1198 p; 1199 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) { 1200 addrconf_prefix_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3); 1201 } 1202 } 1203 1204 if (ndopts.nd_opts_mtu) { 1205 u32 mtu; 1206 1207 memcpy(&mtu, ((u8*)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu)); 1208 mtu = ntohl(mtu); 1209 1210 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { 1211 ND_PRINTK2(KERN_WARNING 1212 "ICMPv6 RA: invalid mtu: %d\n", 1213 mtu); 1214 } else if (in6_dev->cnf.mtu6 != mtu) { 1215 in6_dev->cnf.mtu6 = mtu; 1216 1217 if (rt) 1218 rt->u.dst.metrics[RTAX_MTU-1] = mtu; 1219 1220 rt6_mtu_change(skb->dev, mtu); 1221 } 1222 } 1223 1224 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) { 1225 ND_PRINTK2(KERN_WARNING 1226 "ICMPv6 RA: invalid RA options"); 1227 } 1228out: 1229 if (rt) 1230 dst_release(&rt->u.dst); 1231 else if (neigh) 1232 neigh_release(neigh); 1233 in6_dev_put(in6_dev); 1234} 1235 1236static void ndisc_redirect_rcv(struct sk_buff *skb) 1237{ 1238 struct inet6_dev *in6_dev; 1239 struct icmp6hdr *icmph; 1240 struct in6_addr *dest; 1241 struct in6_addr *target; /* new first hop to destination */ 1242 struct neighbour *neigh; 1243 int on_link = 0; 1244 struct ndisc_options ndopts; 1245 int optlen; 1246 u8 *lladdr = NULL; 1247 1248 if (!(ipv6_addr_type(&skb->nh.ipv6h->saddr) & IPV6_ADDR_LINKLOCAL)) { 1249 ND_PRINTK2(KERN_WARNING 1250 "ICMPv6 Redirect: source address is not link-local.\n"); 1251 return; 1252 } 1253 1254 optlen = skb->tail - skb->h.raw; 1255 optlen -= sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr); 1256 1257 if (optlen < 0) { 1258 ND_PRINTK2(KERN_WARNING 1259 "ICMPv6 Redirect: packet too short\n"); 1260 return; 1261 } 1262 1263 icmph = (struct icmp6hdr *) skb->h.raw; 1264 target = (struct in6_addr *) (icmph + 1); 1265 dest = target + 1; 1266 1267 if (ipv6_addr_is_multicast(dest)) { 1268 ND_PRINTK2(KERN_WARNING 1269 "ICMPv6 Redirect: destination address is multicast.\n"); 1270 return; 1271 } 1272 1273 if (ipv6_addr_equal(dest, target)) { 1274 on_link = 1; 1275 } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) { 1276 ND_PRINTK2(KERN_WARNING 1277 "ICMPv6 Redirect: target address is not link-local.\n"); 1278 return; 1279 } 1280 1281 in6_dev = in6_dev_get(skb->dev); 1282 if (!in6_dev) 1283 return; 1284 if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects) { 1285 in6_dev_put(in6_dev); 1286 return; 1287 } 1288 1289 /* RFC2461 8.1: 1290 * The IP source address of the Redirect MUST be the same as the current 1291 * first-hop router for the specified ICMP Destination Address. 1292 */ 1293 1294 if (!ndisc_parse_options((u8*)(dest + 1), optlen, &ndopts)) { 1295 ND_PRINTK2(KERN_WARNING 1296 "ICMPv6 Redirect: invalid ND options\n"); 1297 in6_dev_put(in6_dev); 1298 return; 1299 } 1300 if (ndopts.nd_opts_tgt_lladdr) { 1301 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, 1302 skb->dev); 1303 if (!lladdr) { 1304 ND_PRINTK2(KERN_WARNING 1305 "ICMPv6 Redirect: invalid link-layer address length\n"); 1306 in6_dev_put(in6_dev); 1307 return; 1308 } 1309 } 1310 1311 neigh = __neigh_lookup(&nd_tbl, target, skb->dev, 1); 1312 if (neigh) { 1313 rt6_redirect(dest, &skb->nh.ipv6h->saddr, neigh, lladdr, 1314 on_link); 1315 neigh_release(neigh); 1316 } 1317 in6_dev_put(in6_dev); 1318} 1319 1320void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, 1321 struct in6_addr *target) 1322{ 1323 struct sock *sk = ndisc_socket->sk; 1324 int len = sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr); 1325 struct sk_buff *buff; 1326 struct icmp6hdr *icmph; 1327 struct in6_addr saddr_buf; 1328 struct in6_addr *addrp; 1329 struct net_device *dev; 1330 struct rt6_info *rt; 1331 struct dst_entry *dst; 1332 struct inet6_dev *idev; 1333 struct flowi fl; 1334 u8 *opt; 1335 int rd_len; 1336 int err; 1337 int hlen; 1338 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL; 1339 1340 dev = skb->dev; 1341 1342 if (ipv6_get_lladdr(dev, &saddr_buf)) { 1343 ND_PRINTK2(KERN_WARNING 1344 "ICMPv6 Redirect: no link-local address on %s\n", 1345 dev->name); 1346 return; 1347 } 1348 1349 ndisc_flow_init(&fl, NDISC_REDIRECT, &saddr_buf, &skb->nh.ipv6h->saddr); 1350 1351 dst = ip6_route_output(NULL, &fl); 1352 if (dst == NULL) 1353 return; 1354 1355 err = xfrm_lookup(&dst, &fl, NULL, 0); 1356 if (err) { 1357 dst_release(dst); 1358 return; 1359 } 1360 1361 rt = (struct rt6_info *) dst; 1362 1363 if (rt->rt6i_flags & RTF_GATEWAY) { 1364 ND_PRINTK2(KERN_WARNING 1365 "ICMPv6 Redirect: destination is not a neighbour.\n"); 1366 dst_release(dst); 1367 return; 1368 } 1369 if (!xrlim_allow(dst, 1*HZ)) { 1370 dst_release(dst); 1371 return; 1372 } 1373 1374 if (dev->addr_len) { 1375 read_lock_bh(&neigh->lock); 1376 if (neigh->nud_state & NUD_VALID) { 1377 memcpy(ha_buf, neigh->ha, dev->addr_len); 1378 read_unlock_bh(&neigh->lock); 1379 ha = ha_buf; 1380 len += ndisc_opt_addr_space(dev); 1381 } else 1382 read_unlock_bh(&neigh->lock); 1383 } 1384 1385 rd_len = min_t(unsigned int, 1386 IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8); 1387 rd_len &= ~0x7; 1388 len += rd_len; 1389 1390 buff = sock_alloc_send_skb(sk, MAX_HEADER + len + LL_RESERVED_SPACE(dev), 1391 1, &err); 1392 if (buff == NULL) { 1393 ND_PRINTK0(KERN_ERR 1394 "ICMPv6 Redirect: %s() failed to allocate an skb.\n", 1395 __FUNCTION__); 1396 dst_release(dst); 1397 return; 1398 } 1399 1400 hlen = 0; 1401 1402 skb_reserve(buff, LL_RESERVED_SPACE(dev)); 1403 ip6_nd_hdr(sk, buff, dev, &saddr_buf, &skb->nh.ipv6h->saddr, 1404 IPPROTO_ICMPV6, len); 1405 1406 icmph = (struct icmp6hdr *)skb_put(buff, len); 1407 buff->h.raw = (unsigned char*)icmph; 1408 1409 memset(icmph, 0, sizeof(struct icmp6hdr)); 1410 icmph->icmp6_type = NDISC_REDIRECT; 1411 1412 /* 1413 * copy target and destination addresses 1414 */ 1415 1416 addrp = (struct in6_addr *)(icmph + 1); 1417 ipv6_addr_copy(addrp, target); 1418 addrp++; 1419 ipv6_addr_copy(addrp, &skb->nh.ipv6h->daddr); 1420 1421 opt = (u8*) (addrp + 1); 1422 1423 /* 1424 * include target_address option 1425 */ 1426 1427 if (ha) 1428 opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha, 1429 dev->addr_len, dev->type); 1430 1431 /* 1432 * build redirect option and copy skb over to the new packet. 1433 */ 1434 1435 memset(opt, 0, 8); 1436 *(opt++) = ND_OPT_REDIRECT_HDR; 1437 *(opt++) = (rd_len >> 3); 1438 opt += 6; 1439 1440 memcpy(opt, skb->nh.ipv6h, rd_len - 8); 1441 1442 icmph->icmp6_cksum = csum_ipv6_magic(&saddr_buf, &skb->nh.ipv6h->saddr, 1443 len, IPPROTO_ICMPV6, 1444 csum_partial((u8 *) icmph, len, 0)); 1445 1446 buff->dst = dst; 1447 idev = in6_dev_get(dst->dev); 1448 IP6_INC_STATS(IPSTATS_MIB_OUTREQUESTS); 1449 err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, buff, NULL, dst->dev, dst_output); 1450 if (!err) { 1451 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTREDIRECTS); 1452 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS); 1453 } 1454 1455 if (likely(idev != NULL)) 1456 in6_dev_put(idev); 1457} 1458 1459static void pndisc_redo(struct sk_buff *skb) 1460{ 1461 ndisc_rcv(skb); 1462 kfree_skb(skb); 1463} 1464 1465int ndisc_rcv(struct sk_buff *skb) 1466{ 1467 struct nd_msg *msg; 1468 1469 if (!pskb_may_pull(skb, skb->len)) 1470 return 0; 1471 1472 msg = (struct nd_msg *) skb->h.raw; 1473 1474 __skb_push(skb, skb->data-skb->h.raw); 1475 1476 if (skb->nh.ipv6h->hop_limit != 255) { 1477 ND_PRINTK2(KERN_WARNING 1478 "ICMPv6 NDISC: invalid hop-limit: %d\n", 1479 skb->nh.ipv6h->hop_limit); 1480 return 0; 1481 } 1482 1483 if (msg->icmph.icmp6_code != 0) { 1484 ND_PRINTK2(KERN_WARNING 1485 "ICMPv6 NDISC: invalid ICMPv6 code: %d\n", 1486 msg->icmph.icmp6_code); 1487 return 0; 1488 } 1489 1490 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); 1491 1492 switch (msg->icmph.icmp6_type) { 1493 case NDISC_NEIGHBOUR_SOLICITATION: 1494 ndisc_recv_ns(skb); 1495 break; 1496 1497 case NDISC_NEIGHBOUR_ADVERTISEMENT: 1498 ndisc_recv_na(skb); 1499 break; 1500 1501 case NDISC_ROUTER_SOLICITATION: 1502 ndisc_recv_rs(skb); 1503 break; 1504 1505 case NDISC_ROUTER_ADVERTISEMENT: 1506 ndisc_router_discovery(skb); 1507 break; 1508 1509 case NDISC_REDIRECT: 1510 ndisc_redirect_rcv(skb); 1511 break; 1512 }; 1513 1514 return 0; 1515} 1516 1517static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) 1518{ 1519 struct net_device *dev = ptr; 1520 1521 switch (event) { 1522 case NETDEV_CHANGEADDR: 1523 neigh_changeaddr(&nd_tbl, dev); 1524 fib6_run_gc(~0UL); 1525 break; 1526 case NETDEV_DOWN: 1527 neigh_ifdown(&nd_tbl, dev); 1528 fib6_run_gc(~0UL); 1529 break; 1530 default: 1531 break; 1532 } 1533 1534 return NOTIFY_DONE; 1535} 1536 1537static struct notifier_block ndisc_netdev_notifier = { 1538 .notifier_call = ndisc_netdev_event, 1539}; 1540 1541#ifdef CONFIG_SYSCTL 1542static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl, 1543 const char *func, const char *dev_name) 1544{ 1545 static char warncomm[TASK_COMM_LEN]; 1546 static int warned; 1547 if (strcmp(warncomm, current->comm) && warned < 5) { 1548 strcpy(warncomm, current->comm); 1549 printk(KERN_WARNING 1550 "process `%s' is using deprecated sysctl (%s) " 1551 "net.ipv6.neigh.%s.%s; " 1552 "Use net.ipv6.neigh.%s.%s_ms " 1553 "instead.\n", 1554 warncomm, func, 1555 dev_name, ctl->procname, 1556 dev_name, ctl->procname); 1557 warned++; 1558 } 1559} 1560 1561int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, struct file * filp, void __user *buffer, size_t *lenp, loff_t *ppos) 1562{ 1563 struct net_device *dev = ctl->extra1; 1564 struct inet6_dev *idev; 1565 int ret; 1566 1567 if (ctl->ctl_name == NET_NEIGH_RETRANS_TIME || 1568 ctl->ctl_name == NET_NEIGH_REACHABLE_TIME) 1569 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default"); 1570 1571 switch (ctl->ctl_name) { 1572 case NET_NEIGH_RETRANS_TIME: 1573 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos); 1574 break; 1575 case NET_NEIGH_REACHABLE_TIME: 1576 ret = proc_dointvec_jiffies(ctl, write, 1577 filp, buffer, lenp, ppos); 1578 break; 1579 case NET_NEIGH_RETRANS_TIME_MS: 1580 case NET_NEIGH_REACHABLE_TIME_MS: 1581 ret = proc_dointvec_ms_jiffies(ctl, write, 1582 filp, buffer, lenp, ppos); 1583 break; 1584 default: 1585 ret = -1; 1586 } 1587 1588 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) { 1589 if (ctl->ctl_name == NET_NEIGH_REACHABLE_TIME || 1590 ctl->ctl_name == NET_NEIGH_REACHABLE_TIME_MS) 1591 idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time); 1592 idev->tstamp = jiffies; 1593 inet6_ifinfo_notify(RTM_NEWLINK, idev); 1594 in6_dev_put(idev); 1595 } 1596 return ret; 1597} 1598 1599static int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name, 1600 int nlen, void __user *oldval, 1601 size_t __user *oldlenp, 1602 void __user *newval, size_t newlen, 1603 void **context) 1604{ 1605 struct net_device *dev = ctl->extra1; 1606 struct inet6_dev *idev; 1607 int ret; 1608 1609 if (ctl->ctl_name == NET_NEIGH_RETRANS_TIME || 1610 ctl->ctl_name == NET_NEIGH_REACHABLE_TIME) 1611 ndisc_warn_deprecated_sysctl(ctl, "procfs", dev ? dev->name : "default"); 1612 1613 switch (ctl->ctl_name) { 1614 case NET_NEIGH_REACHABLE_TIME: 1615 ret = sysctl_jiffies(ctl, name, nlen, 1616 oldval, oldlenp, newval, newlen, 1617 context); 1618 break; 1619 case NET_NEIGH_RETRANS_TIME_MS: 1620 case NET_NEIGH_REACHABLE_TIME_MS: 1621 ret = sysctl_ms_jiffies(ctl, name, nlen, 1622 oldval, oldlenp, newval, newlen, 1623 context); 1624 break; 1625 default: 1626 ret = 0; 1627 } 1628 1629 if (newval && newlen && ret > 0 && 1630 dev && (idev = in6_dev_get(dev)) != NULL) { 1631 if (ctl->ctl_name == NET_NEIGH_REACHABLE_TIME || 1632 ctl->ctl_name == NET_NEIGH_REACHABLE_TIME_MS) 1633 idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time); 1634 idev->tstamp = jiffies; 1635 inet6_ifinfo_notify(RTM_NEWLINK, idev); 1636 in6_dev_put(idev); 1637 } 1638 1639 return ret; 1640} 1641 1642#endif 1643 1644int __init ndisc_init(struct net_proto_family *ops) 1645{ 1646 struct ipv6_pinfo *np; 1647 struct sock *sk; 1648 int err; 1649 1650 err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket); 1651 if (err < 0) { 1652 ND_PRINTK0(KERN_ERR 1653 "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n", 1654 err); 1655 ndisc_socket = NULL; /* For safety. */ 1656 return err; 1657 } 1658 1659 sk = ndisc_socket->sk; 1660 np = inet6_sk(sk); 1661 sk->sk_allocation = GFP_ATOMIC; 1662 np->hop_limit = 255; 1663 /* Do not loopback ndisc messages */ 1664 np->mc_loop = 0; 1665 sk->sk_prot->unhash(sk); 1666 1667 /* 1668 * Initialize the neighbour table 1669 */ 1670 1671 neigh_table_init(&nd_tbl); 1672 1673#ifdef CONFIG_SYSCTL 1674 neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH, 1675 "ipv6", 1676 &ndisc_ifinfo_sysctl_change, 1677 &ndisc_ifinfo_sysctl_strategy); 1678#endif 1679 1680 register_netdevice_notifier(&ndisc_netdev_notifier); 1681 return 0; 1682} 1683 1684void ndisc_cleanup(void) 1685{ 1686#ifdef CONFIG_SYSCTL 1687 neigh_sysctl_unregister(&nd_tbl.parms); 1688#endif 1689 neigh_table_clear(&nd_tbl); 1690 sock_release(ndisc_socket); 1691 ndisc_socket = NULL; /* For safety. */ 1692} 1693