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