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