Showing error 1468

User: Jiri Slaby
Error type: Leaving function in locked state
Error type description: Some lock is not unlocked on all paths of a function, so it is leaked
File location: net/core/neighbour.c
Line in file: 2374
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2012-05-21 20:30:05 UTC


Source:

   1/*
   2 *        Generic address resolution entity
   3 *
   4 *        Authors:
   5 *        Pedro Roque                <roque@di.fc.ul.pt>
   6 *        Alexey Kuznetsov        <kuznet@ms2.inr.ac.ru>
   7 *
   8 *        This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License
  10 *      as published by the Free Software Foundation; either version
  11 *      2 of the License, or (at your option) any later version.
  12 *
  13 *        Fixes:
  14 *        Vitaly E. Lavrov        releasing NULL neighbor in neigh_add.
  15 *        Harald Welte                Add neighbour cache statistics like rtstat
  16 */
  17
  18#include <linux/types.h>
  19#include <linux/kernel.h>
  20#include <linux/module.h>
  21#include <linux/socket.h>
  22#include <linux/netdevice.h>
  23#include <linux/proc_fs.h>
  24#ifdef CONFIG_SYSCTL
  25#include <linux/sysctl.h>
  26#endif
  27#include <linux/times.h>
  28#include <net/net_namespace.h>
  29#include <net/neighbour.h>
  30#include <net/dst.h>
  31#include <net/sock.h>
  32#include <net/netevent.h>
  33#include <net/netlink.h>
  34#include <linux/rtnetlink.h>
  35#include <linux/random.h>
  36#include <linux/string.h>
  37#include <linux/log2.h>
  38
  39#define NEIGH_DEBUG 1
  40
  41#define NEIGH_PRINTK(x...) printk(x)
  42#define NEIGH_NOPRINTK(x...) do { ; } while(0)
  43#define NEIGH_PRINTK0 NEIGH_PRINTK
  44#define NEIGH_PRINTK1 NEIGH_NOPRINTK
  45#define NEIGH_PRINTK2 NEIGH_NOPRINTK
  46
  47#if NEIGH_DEBUG >= 1
  48#undef NEIGH_PRINTK1
  49#define NEIGH_PRINTK1 NEIGH_PRINTK
  50#endif
  51#if NEIGH_DEBUG >= 2
  52#undef NEIGH_PRINTK2
  53#define NEIGH_PRINTK2 NEIGH_PRINTK
  54#endif
  55
  56#define PNEIGH_HASHMASK                0xF
  57
  58static void neigh_timer_handler(unsigned long arg);
  59static void __neigh_notify(struct neighbour *n, int type, int flags);
  60static void neigh_update_notify(struct neighbour *neigh);
  61static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
  62
  63static struct neigh_table *neigh_tables;
  64#ifdef CONFIG_PROC_FS
  65static const struct file_operations neigh_stat_seq_fops;
  66#endif
  67
  68/*
  69   Neighbour hash table buckets are protected with rwlock tbl->lock.
  70
  71   - All the scans/updates to hash buckets MUST be made under this lock.
  72   - NOTHING clever should be made under this lock: no callbacks
  73     to protocol backends, no attempts to send something to network.
  74     It will result in deadlocks, if backend/driver wants to use neighbour
  75     cache.
  76   - If the entry requires some non-trivial actions, increase
  77     its reference count and release table lock.
  78
  79   Neighbour entries are protected:
  80   - with reference count.
  81   - with rwlock neigh->lock
  82
  83   Reference count prevents destruction.
  84
  85   neigh->lock mainly serializes ll address data and its validity state.
  86   However, the same lock is used to protect another entry fields:
  87    - timer
  88    - resolution queue
  89
  90   Again, nothing clever shall be made under neigh->lock,
  91   the most complicated procedure, which we allow is dev->hard_header.
  92   It is supposed, that dev->hard_header is simplistic and does
  93   not make callbacks to neighbour tables.
  94
  95   The last lock is neigh_tbl_lock. It is pure SMP lock, protecting
  96   list of neighbour tables. This list is used only in process context,
  97 */
  98
  99static DEFINE_RWLOCK(neigh_tbl_lock);
 100
 101static int neigh_blackhole(struct sk_buff *skb)
 102{
 103        kfree_skb(skb);
 104        return -ENETDOWN;
 105}
 106
 107static void neigh_cleanup_and_release(struct neighbour *neigh)
 108{
 109        if (neigh->parms->neigh_cleanup)
 110                neigh->parms->neigh_cleanup(neigh);
 111
 112        __neigh_notify(neigh, RTM_DELNEIGH, 0);
 113        neigh_release(neigh);
 114}
 115
 116/*
 117 * It is random distribution in the interval (1/2)*base...(3/2)*base.
 118 * It corresponds to default IPv6 settings and is not overridable,
 119 * because it is really reasonable choice.
 120 */
 121
 122unsigned long neigh_rand_reach_time(unsigned long base)
 123{
 124        return (base ? (net_random() % base) + (base >> 1) : 0);
 125}
 126EXPORT_SYMBOL(neigh_rand_reach_time);
 127
 128
 129static int neigh_forced_gc(struct neigh_table *tbl)
 130{
 131        int shrunk = 0;
 132        int i;
 133
 134        NEIGH_CACHE_STAT_INC(tbl, forced_gc_runs);
 135
 136        write_lock_bh(&tbl->lock);
 137        for (i = 0; i <= tbl->hash_mask; i++) {
 138                struct neighbour *n, **np;
 139
 140                np = &tbl->hash_buckets[i];
 141                while ((n = *np) != NULL) {
 142                        /* Neighbour record may be discarded if:
 143                         * - nobody refers to it.
 144                         * - it is not permanent
 145                         */
 146                        write_lock(&n->lock);
 147                        if (atomic_read(&n->refcnt) == 1 &&
 148                            !(n->nud_state & NUD_PERMANENT)) {
 149                                *np        = n->next;
 150                                n->dead = 1;
 151                                shrunk        = 1;
 152                                write_unlock(&n->lock);
 153                                neigh_cleanup_and_release(n);
 154                                continue;
 155                        }
 156                        write_unlock(&n->lock);
 157                        np = &n->next;
 158                }
 159        }
 160
 161        tbl->last_flush = jiffies;
 162
 163        write_unlock_bh(&tbl->lock);
 164
 165        return shrunk;
 166}
 167
 168static void neigh_add_timer(struct neighbour *n, unsigned long when)
 169{
 170        neigh_hold(n);
 171        if (unlikely(mod_timer(&n->timer, when))) {
 172                printk("NEIGH: BUG, double timer add, state is %x\n",
 173                       n->nud_state);
 174                dump_stack();
 175        }
 176}
 177
 178static int neigh_del_timer(struct neighbour *n)
 179{
 180        if ((n->nud_state & NUD_IN_TIMER) &&
 181            del_timer(&n->timer)) {
 182                neigh_release(n);
 183                return 1;
 184        }
 185        return 0;
 186}
 187
 188static void pneigh_queue_purge(struct sk_buff_head *list)
 189{
 190        struct sk_buff *skb;
 191
 192        while ((skb = skb_dequeue(list)) != NULL) {
 193                dev_put(skb->dev);
 194                kfree_skb(skb);
 195        }
 196}
 197
 198static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev)
 199{
 200        int i;
 201
 202        for (i = 0; i <= tbl->hash_mask; i++) {
 203                struct neighbour *n, **np = &tbl->hash_buckets[i];
 204
 205                while ((n = *np) != NULL) {
 206                        if (dev && n->dev != dev) {
 207                                np = &n->next;
 208                                continue;
 209                        }
 210                        *np = n->next;
 211                        write_lock(&n->lock);
 212                        neigh_del_timer(n);
 213                        n->dead = 1;
 214
 215                        if (atomic_read(&n->refcnt) != 1) {
 216                                /* The most unpleasant situation.
 217                                   We must destroy neighbour entry,
 218                                   but someone still uses it.
 219
 220                                   The destroy will be delayed until
 221                                   the last user releases us, but
 222                                   we must kill timers etc. and move
 223                                   it to safe state.
 224                                 */
 225                                skb_queue_purge(&n->arp_queue);
 226                                n->output = neigh_blackhole;
 227                                if (n->nud_state & NUD_VALID)
 228                                        n->nud_state = NUD_NOARP;
 229                                else
 230                                        n->nud_state = NUD_NONE;
 231                                NEIGH_PRINTK2("neigh %p is stray.\n", n);
 232                        }
 233                        write_unlock(&n->lock);
 234                        neigh_cleanup_and_release(n);
 235                }
 236        }
 237}
 238
 239void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
 240{
 241        write_lock_bh(&tbl->lock);
 242        neigh_flush_dev(tbl, dev);
 243        write_unlock_bh(&tbl->lock);
 244}
 245EXPORT_SYMBOL(neigh_changeaddr);
 246
 247int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
 248{
 249        write_lock_bh(&tbl->lock);
 250        neigh_flush_dev(tbl, dev);
 251        pneigh_ifdown(tbl, dev);
 252        write_unlock_bh(&tbl->lock);
 253
 254        del_timer_sync(&tbl->proxy_timer);
 255        pneigh_queue_purge(&tbl->proxy_queue);
 256        return 0;
 257}
 258EXPORT_SYMBOL(neigh_ifdown);
 259
 260static struct neighbour *neigh_alloc(struct neigh_table *tbl)
 261{
 262        struct neighbour *n = NULL;
 263        unsigned long now = jiffies;
 264        int entries;
 265
 266        entries = atomic_inc_return(&tbl->entries) - 1;
 267        if (entries >= tbl->gc_thresh3 ||
 268            (entries >= tbl->gc_thresh2 &&
 269             time_after(now, tbl->last_flush + 5 * HZ))) {
 270                if (!neigh_forced_gc(tbl) &&
 271                    entries >= tbl->gc_thresh3)
 272                        goto out_entries;
 273        }
 274
 275        n = kmem_cache_zalloc(tbl->kmem_cachep, GFP_ATOMIC);
 276        if (!n)
 277                goto out_entries;
 278
 279        skb_queue_head_init(&n->arp_queue);
 280        rwlock_init(&n->lock);
 281        n->updated          = n->used = now;
 282        n->nud_state          = NUD_NONE;
 283        n->output          = neigh_blackhole;
 284        n->parms          = neigh_parms_clone(&tbl->parms);
 285        setup_timer(&n->timer, neigh_timer_handler, (unsigned long)n);
 286
 287        NEIGH_CACHE_STAT_INC(tbl, allocs);
 288        n->tbl                  = tbl;
 289        atomic_set(&n->refcnt, 1);
 290        n->dead                  = 1;
 291out:
 292        return n;
 293
 294out_entries:
 295        atomic_dec(&tbl->entries);
 296        goto out;
 297}
 298
 299static struct neighbour **neigh_hash_alloc(unsigned int entries)
 300{
 301        unsigned long size = entries * sizeof(struct neighbour *);
 302        struct neighbour **ret;
 303
 304        if (size <= PAGE_SIZE) {
 305                ret = kzalloc(size, GFP_ATOMIC);
 306        } else {
 307                ret = (struct neighbour **)
 308                      __get_free_pages(GFP_ATOMIC|__GFP_ZERO, get_order(size));
 309        }
 310        return ret;
 311}
 312
 313static void neigh_hash_free(struct neighbour **hash, unsigned int entries)
 314{
 315        unsigned long size = entries * sizeof(struct neighbour *);
 316
 317        if (size <= PAGE_SIZE)
 318                kfree(hash);
 319        else
 320                free_pages((unsigned long)hash, get_order(size));
 321}
 322
 323static void neigh_hash_grow(struct neigh_table *tbl, unsigned long new_entries)
 324{
 325        struct neighbour **new_hash, **old_hash;
 326        unsigned int i, new_hash_mask, old_entries;
 327
 328        NEIGH_CACHE_STAT_INC(tbl, hash_grows);
 329
 330        BUG_ON(!is_power_of_2(new_entries));
 331        new_hash = neigh_hash_alloc(new_entries);
 332        if (!new_hash)
 333                return;
 334
 335        old_entries = tbl->hash_mask + 1;
 336        new_hash_mask = new_entries - 1;
 337        old_hash = tbl->hash_buckets;
 338
 339        get_random_bytes(&tbl->hash_rnd, sizeof(tbl->hash_rnd));
 340        for (i = 0; i < old_entries; i++) {
 341                struct neighbour *n, *next;
 342
 343                for (n = old_hash[i]; n; n = next) {
 344                        unsigned int hash_val = tbl->hash(n->primary_key, n->dev);
 345
 346                        hash_val &= new_hash_mask;
 347                        next = n->next;
 348
 349                        n->next = new_hash[hash_val];
 350                        new_hash[hash_val] = n;
 351                }
 352        }
 353        tbl->hash_buckets = new_hash;
 354        tbl->hash_mask = new_hash_mask;
 355
 356        neigh_hash_free(old_hash, old_entries);
 357}
 358
 359struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
 360                               struct net_device *dev)
 361{
 362        struct neighbour *n;
 363        int key_len = tbl->key_len;
 364        u32 hash_val;
 365
 366        NEIGH_CACHE_STAT_INC(tbl, lookups);
 367
 368        read_lock_bh(&tbl->lock);
 369        hash_val = tbl->hash(pkey, dev);
 370        for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
 371                if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len)) {
 372                        neigh_hold(n);
 373                        NEIGH_CACHE_STAT_INC(tbl, hits);
 374                        break;
 375                }
 376        }
 377        read_unlock_bh(&tbl->lock);
 378        return n;
 379}
 380EXPORT_SYMBOL(neigh_lookup);
 381
 382struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
 383                                     const void *pkey)
 384{
 385        struct neighbour *n;
 386        int key_len = tbl->key_len;
 387        u32 hash_val;
 388
 389        NEIGH_CACHE_STAT_INC(tbl, lookups);
 390
 391        read_lock_bh(&tbl->lock);
 392        hash_val = tbl->hash(pkey, NULL);
 393        for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
 394                if (!memcmp(n->primary_key, pkey, key_len) &&
 395                    net_eq(dev_net(n->dev), net)) {
 396                        neigh_hold(n);
 397                        NEIGH_CACHE_STAT_INC(tbl, hits);
 398                        break;
 399                }
 400        }
 401        read_unlock_bh(&tbl->lock);
 402        return n;
 403}
 404EXPORT_SYMBOL(neigh_lookup_nodev);
 405
 406struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey,
 407                               struct net_device *dev)
 408{
 409        u32 hash_val;
 410        int key_len = tbl->key_len;
 411        int error;
 412        struct neighbour *n1, *rc, *n = neigh_alloc(tbl);
 413
 414        if (!n) {
 415                rc = ERR_PTR(-ENOBUFS);
 416                goto out;
 417        }
 418
 419        memcpy(n->primary_key, pkey, key_len);
 420        n->dev = dev;
 421        dev_hold(dev);
 422
 423        /* Protocol specific setup. */
 424        if (tbl->constructor &&        (error = tbl->constructor(n)) < 0) {
 425                rc = ERR_PTR(error);
 426                goto out_neigh_release;
 427        }
 428
 429        /* Device specific setup. */
 430        if (n->parms->neigh_setup &&
 431            (error = n->parms->neigh_setup(n)) < 0) {
 432                rc = ERR_PTR(error);
 433                goto out_neigh_release;
 434        }
 435
 436        n->confirmed = jiffies - (n->parms->base_reachable_time << 1);
 437
 438        write_lock_bh(&tbl->lock);
 439
 440        if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1))
 441                neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1);
 442
 443        hash_val = tbl->hash(pkey, dev) & tbl->hash_mask;
 444
 445        if (n->parms->dead) {
 446                rc = ERR_PTR(-EINVAL);
 447                goto out_tbl_unlock;
 448        }
 449
 450        for (n1 = tbl->hash_buckets[hash_val]; n1; n1 = n1->next) {
 451                if (dev == n1->dev && !memcmp(n1->primary_key, pkey, key_len)) {
 452                        neigh_hold(n1);
 453                        rc = n1;
 454                        goto out_tbl_unlock;
 455                }
 456        }
 457
 458        n->next = tbl->hash_buckets[hash_val];
 459        tbl->hash_buckets[hash_val] = n;
 460        n->dead = 0;
 461        neigh_hold(n);
 462        write_unlock_bh(&tbl->lock);
 463        NEIGH_PRINTK2("neigh %p is created.\n", n);
 464        rc = n;
 465out:
 466        return rc;
 467out_tbl_unlock:
 468        write_unlock_bh(&tbl->lock);
 469out_neigh_release:
 470        neigh_release(n);
 471        goto out;
 472}
 473EXPORT_SYMBOL(neigh_create);
 474
 475static u32 pneigh_hash(const void *pkey, int key_len)
 476{
 477        u32 hash_val = *(u32 *)(pkey + key_len - 4);
 478        hash_val ^= (hash_val >> 16);
 479        hash_val ^= hash_val >> 8;
 480        hash_val ^= hash_val >> 4;
 481        hash_val &= PNEIGH_HASHMASK;
 482        return hash_val;
 483}
 484
 485static struct pneigh_entry *__pneigh_lookup_1(struct pneigh_entry *n,
 486                                              struct net *net,
 487                                              const void *pkey,
 488                                              int key_len,
 489                                              struct net_device *dev)
 490{
 491        while (n) {
 492                if (!memcmp(n->key, pkey, key_len) &&
 493                    net_eq(pneigh_net(n), net) &&
 494                    (n->dev == dev || !n->dev))
 495                        return n;
 496                n = n->next;
 497        }
 498        return NULL;
 499}
 500
 501struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
 502                struct net *net, const void *pkey, struct net_device *dev)
 503{
 504        int key_len = tbl->key_len;
 505        u32 hash_val = pneigh_hash(pkey, key_len);
 506
 507        return __pneigh_lookup_1(tbl->phash_buckets[hash_val],
 508                                 net, pkey, key_len, dev);
 509}
 510EXPORT_SYMBOL_GPL(__pneigh_lookup);
 511
 512struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
 513                                    struct net *net, const void *pkey,
 514                                    struct net_device *dev, int creat)
 515{
 516        struct pneigh_entry *n;
 517        int key_len = tbl->key_len;
 518        u32 hash_val = pneigh_hash(pkey, key_len);
 519
 520        read_lock_bh(&tbl->lock);
 521        n = __pneigh_lookup_1(tbl->phash_buckets[hash_val],
 522                              net, pkey, key_len, dev);
 523        read_unlock_bh(&tbl->lock);
 524
 525        if (n || !creat)
 526                goto out;
 527
 528        ASSERT_RTNL();
 529
 530        n = kmalloc(sizeof(*n) + key_len, GFP_KERNEL);
 531        if (!n)
 532                goto out;
 533
 534#ifdef CONFIG_NET_NS
 535        n->net = hold_net(net);
 536#endif
 537        memcpy(n->key, pkey, key_len);
 538        n->dev = dev;
 539        if (dev)
 540                dev_hold(dev);
 541
 542        if (tbl->pconstructor && tbl->pconstructor(n)) {
 543                if (dev)
 544                        dev_put(dev);
 545                release_net(net);
 546                kfree(n);
 547                n = NULL;
 548                goto out;
 549        }
 550
 551        write_lock_bh(&tbl->lock);
 552        n->next = tbl->phash_buckets[hash_val];
 553        tbl->phash_buckets[hash_val] = n;
 554        write_unlock_bh(&tbl->lock);
 555out:
 556        return n;
 557}
 558EXPORT_SYMBOL(pneigh_lookup);
 559
 560
 561int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey,
 562                  struct net_device *dev)
 563{
 564        struct pneigh_entry *n, **np;
 565        int key_len = tbl->key_len;
 566        u32 hash_val = pneigh_hash(pkey, key_len);
 567
 568        write_lock_bh(&tbl->lock);
 569        for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL;
 570             np = &n->next) {
 571                if (!memcmp(n->key, pkey, key_len) && n->dev == dev &&
 572                    net_eq(pneigh_net(n), net)) {
 573                        *np = n->next;
 574                        write_unlock_bh(&tbl->lock);
 575                        if (tbl->pdestructor)
 576                                tbl->pdestructor(n);
 577                        if (n->dev)
 578                                dev_put(n->dev);
 579                        release_net(pneigh_net(n));
 580                        kfree(n);
 581                        return 0;
 582                }
 583        }
 584        write_unlock_bh(&tbl->lock);
 585        return -ENOENT;
 586}
 587
 588static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
 589{
 590        struct pneigh_entry *n, **np;
 591        u32 h;
 592
 593        for (h = 0; h <= PNEIGH_HASHMASK; h++) {
 594                np = &tbl->phash_buckets[h];
 595                while ((n = *np) != NULL) {
 596                        if (!dev || n->dev == dev) {
 597                                *np = n->next;
 598                                if (tbl->pdestructor)
 599                                        tbl->pdestructor(n);
 600                                if (n->dev)
 601                                        dev_put(n->dev);
 602                                release_net(pneigh_net(n));
 603                                kfree(n);
 604                                continue;
 605                        }
 606                        np = &n->next;
 607                }
 608        }
 609        return -ENOENT;
 610}
 611
 612static void neigh_parms_destroy(struct neigh_parms *parms);
 613
 614static inline void neigh_parms_put(struct neigh_parms *parms)
 615{
 616        if (atomic_dec_and_test(&parms->refcnt))
 617                neigh_parms_destroy(parms);
 618}
 619
 620/*
 621 *        neighbour must already be out of the table;
 622 *
 623 */
 624void neigh_destroy(struct neighbour *neigh)
 625{
 626        struct hh_cache *hh;
 627
 628        NEIGH_CACHE_STAT_INC(neigh->tbl, destroys);
 629
 630        if (!neigh->dead) {
 631                printk(KERN_WARNING
 632                       "Destroying alive neighbour %p\n", neigh);
 633                dump_stack();
 634                return;
 635        }
 636
 637        if (neigh_del_timer(neigh))
 638                printk(KERN_WARNING "Impossible event.\n");
 639
 640        while ((hh = neigh->hh) != NULL) {
 641                neigh->hh = hh->hh_next;
 642                hh->hh_next = NULL;
 643
 644                write_seqlock_bh(&hh->hh_lock);
 645                hh->hh_output = neigh_blackhole;
 646                write_sequnlock_bh(&hh->hh_lock);
 647                if (atomic_dec_and_test(&hh->hh_refcnt))
 648                        kfree(hh);
 649        }
 650
 651        skb_queue_purge(&neigh->arp_queue);
 652
 653        dev_put(neigh->dev);
 654        neigh_parms_put(neigh->parms);
 655
 656        NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh);
 657
 658        atomic_dec(&neigh->tbl->entries);
 659        kmem_cache_free(neigh->tbl->kmem_cachep, neigh);
 660}
 661EXPORT_SYMBOL(neigh_destroy);
 662
 663/* Neighbour state is suspicious;
 664   disable fast path.
 665
 666   Called with write_locked neigh.
 667 */
 668static void neigh_suspect(struct neighbour *neigh)
 669{
 670        struct hh_cache *hh;
 671
 672        NEIGH_PRINTK2("neigh %p is suspected.\n", neigh);
 673
 674        neigh->output = neigh->ops->output;
 675
 676        for (hh = neigh->hh; hh; hh = hh->hh_next)
 677                hh->hh_output = neigh->ops->output;
 678}
 679
 680/* Neighbour state is OK;
 681   enable fast path.
 682
 683   Called with write_locked neigh.
 684 */
 685static void neigh_connect(struct neighbour *neigh)
 686{
 687        struct hh_cache *hh;
 688
 689        NEIGH_PRINTK2("neigh %p is connected.\n", neigh);
 690
 691        neigh->output = neigh->ops->connected_output;
 692
 693        for (hh = neigh->hh; hh; hh = hh->hh_next)
 694                hh->hh_output = neigh->ops->hh_output;
 695}
 696
 697static void neigh_periodic_timer(unsigned long arg)
 698{
 699        struct neigh_table *tbl = (struct neigh_table *)arg;
 700        struct neighbour *n, **np;
 701        unsigned long expire, now = jiffies;
 702
 703        NEIGH_CACHE_STAT_INC(tbl, periodic_gc_runs);
 704
 705        write_lock(&tbl->lock);
 706
 707        /*
 708         *        periodically recompute ReachableTime from random function
 709         */
 710
 711        if (time_after(now, tbl->last_rand + 300 * HZ)) {
 712                struct neigh_parms *p;
 713                tbl->last_rand = now;
 714                for (p = &tbl->parms; p; p = p->next)
 715                        p->reachable_time =
 716                                neigh_rand_reach_time(p->base_reachable_time);
 717        }
 718
 719        np = &tbl->hash_buckets[tbl->hash_chain_gc];
 720        tbl->hash_chain_gc = ((tbl->hash_chain_gc + 1) & tbl->hash_mask);
 721
 722        while ((n = *np) != NULL) {
 723                unsigned int state;
 724
 725                write_lock(&n->lock);
 726
 727                state = n->nud_state;
 728                if (state & (NUD_PERMANENT | NUD_IN_TIMER)) {
 729                        write_unlock(&n->lock);
 730                        goto next_elt;
 731                }
 732
 733                if (time_before(n->used, n->confirmed))
 734                        n->used = n->confirmed;
 735
 736                if (atomic_read(&n->refcnt) == 1 &&
 737                    (state == NUD_FAILED ||
 738                     time_after(now, n->used + n->parms->gc_staletime))) {
 739                        *np = n->next;
 740                        n->dead = 1;
 741                        write_unlock(&n->lock);
 742                        neigh_cleanup_and_release(n);
 743                        continue;
 744                }
 745                write_unlock(&n->lock);
 746
 747next_elt:
 748                np = &n->next;
 749        }
 750
 751        /* Cycle through all hash buckets every base_reachable_time/2 ticks.
 752         * ARP entry timeouts range from 1/2 base_reachable_time to 3/2
 753         * base_reachable_time.
 754         */
 755        expire = tbl->parms.base_reachable_time >> 1;
 756        expire /= (tbl->hash_mask + 1);
 757        if (!expire)
 758                expire = 1;
 759
 760        if (expire>HZ)
 761                mod_timer(&tbl->gc_timer, round_jiffies(now + expire));
 762        else
 763                mod_timer(&tbl->gc_timer, now + expire);
 764
 765        write_unlock(&tbl->lock);
 766}
 767
 768static __inline__ int neigh_max_probes(struct neighbour *n)
 769{
 770        struct neigh_parms *p = n->parms;
 771        return (n->nud_state & NUD_PROBE ?
 772                p->ucast_probes :
 773                p->ucast_probes + p->app_probes + p->mcast_probes);
 774}
 775
 776/* Called when a timer expires for a neighbour entry. */
 777
 778static void neigh_timer_handler(unsigned long arg)
 779{
 780        unsigned long now, next;
 781        struct neighbour *neigh = (struct neighbour *)arg;
 782        unsigned state;
 783        int notify = 0;
 784
 785        write_lock(&neigh->lock);
 786
 787        state = neigh->nud_state;
 788        now = jiffies;
 789        next = now + HZ;
 790
 791        if (!(state & NUD_IN_TIMER)) {
 792#ifndef CONFIG_SMP
 793                printk(KERN_WARNING "neigh: timer & !nud_in_timer\n");
 794#endif
 795                goto out;
 796        }
 797
 798        if (state & NUD_REACHABLE) {
 799                if (time_before_eq(now,
 800                                   neigh->confirmed + neigh->parms->reachable_time)) {
 801                        NEIGH_PRINTK2("neigh %p is still alive.\n", neigh);
 802                        next = neigh->confirmed + neigh->parms->reachable_time;
 803                } else if (time_before_eq(now,
 804                                          neigh->used + neigh->parms->delay_probe_time)) {
 805                        NEIGH_PRINTK2("neigh %p is delayed.\n", neigh);
 806                        neigh->nud_state = NUD_DELAY;
 807                        neigh->updated = jiffies;
 808                        neigh_suspect(neigh);
 809                        next = now + neigh->parms->delay_probe_time;
 810                } else {
 811                        NEIGH_PRINTK2("neigh %p is suspected.\n", neigh);
 812                        neigh->nud_state = NUD_STALE;
 813                        neigh->updated = jiffies;
 814                        neigh_suspect(neigh);
 815                        notify = 1;
 816                }
 817        } else if (state & NUD_DELAY) {
 818                if (time_before_eq(now,
 819                                   neigh->confirmed + neigh->parms->delay_probe_time)) {
 820                        NEIGH_PRINTK2("neigh %p is now reachable.\n", neigh);
 821                        neigh->nud_state = NUD_REACHABLE;
 822                        neigh->updated = jiffies;
 823                        neigh_connect(neigh);
 824                        notify = 1;
 825                        next = neigh->confirmed + neigh->parms->reachable_time;
 826                } else {
 827                        NEIGH_PRINTK2("neigh %p is probed.\n", neigh);
 828                        neigh->nud_state = NUD_PROBE;
 829                        neigh->updated = jiffies;
 830                        atomic_set(&neigh->probes, 0);
 831                        next = now + neigh->parms->retrans_time;
 832                }
 833        } else {
 834                /* NUD_PROBE|NUD_INCOMPLETE */
 835                next = now + neigh->parms->retrans_time;
 836        }
 837
 838        if ((neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) &&
 839            atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) {
 840                struct sk_buff *skb;
 841
 842                neigh->nud_state = NUD_FAILED;
 843                neigh->updated = jiffies;
 844                notify = 1;
 845                NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed);
 846                NEIGH_PRINTK2("neigh %p is failed.\n", neigh);
 847
 848                /* It is very thin place. report_unreachable is very complicated
 849                   routine. Particularly, it can hit the same neighbour entry!
 850
 851                   So that, we try to be accurate and avoid dead loop. --ANK
 852                 */
 853                while (neigh->nud_state == NUD_FAILED &&
 854                       (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
 855                        write_unlock(&neigh->lock);
 856                        neigh->ops->error_report(neigh, skb);
 857                        write_lock(&neigh->lock);
 858                }
 859                skb_queue_purge(&neigh->arp_queue);
 860        }
 861
 862        if (neigh->nud_state & NUD_IN_TIMER) {
 863                if (time_before(next, jiffies + HZ/2))
 864                        next = jiffies + HZ/2;
 865                if (!mod_timer(&neigh->timer, next))
 866                        neigh_hold(neigh);
 867        }
 868        if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
 869                struct sk_buff *skb = skb_peek(&neigh->arp_queue);
 870                /* keep skb alive even if arp_queue overflows */
 871                if (skb)
 872                        skb = skb_copy(skb, GFP_ATOMIC);
 873                write_unlock(&neigh->lock);
 874                neigh->ops->solicit(neigh, skb);
 875                atomic_inc(&neigh->probes);
 876                if (skb)
 877                        kfree_skb(skb);
 878        } else {
 879out:
 880                write_unlock(&neigh->lock);
 881        }
 882
 883        if (notify)
 884                neigh_update_notify(neigh);
 885
 886        neigh_release(neigh);
 887}
 888
 889int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
 890{
 891        int rc;
 892        unsigned long now;
 893
 894        write_lock_bh(&neigh->lock);
 895
 896        rc = 0;
 897        if (neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE))
 898                goto out_unlock_bh;
 899
 900        now = jiffies;
 901
 902        if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) {
 903                if (neigh->parms->mcast_probes + neigh->parms->app_probes) {
 904                        atomic_set(&neigh->probes, neigh->parms->ucast_probes);
 905                        neigh->nud_state     = NUD_INCOMPLETE;
 906                        neigh->updated = jiffies;
 907                        neigh_add_timer(neigh, now + 1);
 908                } else {
 909                        neigh->nud_state = NUD_FAILED;
 910                        neigh->updated = jiffies;
 911                        write_unlock_bh(&neigh->lock);
 912
 913                        if (skb)
 914                                kfree_skb(skb);
 915                        return 1;
 916                }
 917        } else if (neigh->nud_state & NUD_STALE) {
 918                NEIGH_PRINTK2("neigh %p is delayed.\n", neigh);
 919                neigh->nud_state = NUD_DELAY;
 920                neigh->updated = jiffies;
 921                neigh_add_timer(neigh,
 922                                jiffies + neigh->parms->delay_probe_time);
 923        }
 924
 925        if (neigh->nud_state == NUD_INCOMPLETE) {
 926                if (skb) {
 927                        if (skb_queue_len(&neigh->arp_queue) >=
 928                            neigh->parms->queue_len) {
 929                                struct sk_buff *buff;
 930                                buff = __skb_dequeue(&neigh->arp_queue);
 931                                kfree_skb(buff);
 932                                NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards);
 933                        }
 934                        __skb_queue_tail(&neigh->arp_queue, skb);
 935                }
 936                rc = 1;
 937        }
 938out_unlock_bh:
 939        write_unlock_bh(&neigh->lock);
 940        return rc;
 941}
 942EXPORT_SYMBOL(__neigh_event_send);
 943
 944static void neigh_update_hhs(struct neighbour *neigh)
 945{
 946        struct hh_cache *hh;
 947        void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *)
 948                = neigh->dev->header_ops->cache_update;
 949
 950        if (update) {
 951                for (hh = neigh->hh; hh; hh = hh->hh_next) {
 952                        write_seqlock_bh(&hh->hh_lock);
 953                        update(hh, neigh->dev, neigh->ha);
 954                        write_sequnlock_bh(&hh->hh_lock);
 955                }
 956        }
 957}
 958
 959
 960
 961/* Generic update routine.
 962   -- lladdr is new lladdr or NULL, if it is not supplied.
 963   -- new    is new state.
 964   -- flags
 965        NEIGH_UPDATE_F_OVERRIDE allows to override existing lladdr,
 966                                if it is different.
 967        NEIGH_UPDATE_F_WEAK_OVERRIDE will suspect existing "connected"
 968                                lladdr instead of overriding it
 969                                if it is different.
 970                                It also allows to retain current state
 971                                if lladdr is unchanged.
 972        NEIGH_UPDATE_F_ADMIN        means that the change is administrative.
 973
 974        NEIGH_UPDATE_F_OVERRIDE_ISROUTER allows to override existing
 975                                NTF_ROUTER flag.
 976        NEIGH_UPDATE_F_ISROUTER        indicates if the neighbour is known as
 977                                a router.
 978
 979   Caller MUST hold reference count on the entry.
 980 */
 981
 982int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
 983                 u32 flags)
 984{
 985        u8 old;
 986        int err;
 987        int notify = 0;
 988        struct net_device *dev;
 989        int update_isrouter = 0;
 990
 991        write_lock_bh(&neigh->lock);
 992
 993        dev    = neigh->dev;
 994        old    = neigh->nud_state;
 995        err    = -EPERM;
 996
 997        if (!(flags & NEIGH_UPDATE_F_ADMIN) &&
 998            (old & (NUD_NOARP | NUD_PERMANENT)))
 999                goto out;
1000
1001        if (!(new & NUD_VALID)) {
1002                neigh_del_timer(neigh);
1003                if (old & NUD_CONNECTED)
1004                        neigh_suspect(neigh);
1005                neigh->nud_state = new;
1006                err = 0;
1007                notify = old & NUD_VALID;
1008                goto out;
1009        }
1010
1011        /* Compare new lladdr with cached one */
1012        if (!dev->addr_len) {
1013                /* First case: device needs no address. */
1014                lladdr = neigh->ha;
1015        } else if (lladdr) {
1016                /* The second case: if something is already cached
1017                   and a new address is proposed:
1018                   - compare new & old
1019                   - if they are different, check override flag
1020                 */
1021                if ((old & NUD_VALID) &&
1022                    !memcmp(lladdr, neigh->ha, dev->addr_len))
1023                        lladdr = neigh->ha;
1024        } else {
1025                /* No address is supplied; if we know something,
1026                   use it, otherwise discard the request.
1027                 */
1028                err = -EINVAL;
1029                if (!(old & NUD_VALID))
1030                        goto out;
1031                lladdr = neigh->ha;
1032        }
1033
1034        if (new & NUD_CONNECTED)
1035                neigh->confirmed = jiffies;
1036        neigh->updated = jiffies;
1037
1038        /* If entry was valid and address is not changed,
1039           do not change entry state, if new one is STALE.
1040         */
1041        err = 0;
1042        update_isrouter = flags & NEIGH_UPDATE_F_OVERRIDE_ISROUTER;
1043        if (old & NUD_VALID) {
1044                if (lladdr != neigh->ha && !(flags & NEIGH_UPDATE_F_OVERRIDE)) {
1045                        update_isrouter = 0;
1046                        if ((flags & NEIGH_UPDATE_F_WEAK_OVERRIDE) &&
1047                            (old & NUD_CONNECTED)) {
1048                                lladdr = neigh->ha;
1049                                new = NUD_STALE;
1050                        } else
1051                                goto out;
1052                } else {
1053                        if (lladdr == neigh->ha && new == NUD_STALE &&
1054                            ((flags & NEIGH_UPDATE_F_WEAK_OVERRIDE) ||
1055                             (old & NUD_CONNECTED))
1056                            )
1057                                new = old;
1058                }
1059        }
1060
1061        if (new != old) {
1062                neigh_del_timer(neigh);
1063                if (new & NUD_IN_TIMER)
1064                        neigh_add_timer(neigh, (jiffies +
1065                                                ((new & NUD_REACHABLE) ?
1066                                                 neigh->parms->reachable_time :
1067                                                 0)));
1068                neigh->nud_state = new;
1069        }
1070
1071        if (lladdr != neigh->ha) {
1072                memcpy(&neigh->ha, lladdr, dev->addr_len);
1073                neigh_update_hhs(neigh);
1074                if (!(new & NUD_CONNECTED))
1075                        neigh->confirmed = jiffies -
1076                                      (neigh->parms->base_reachable_time << 1);
1077                notify = 1;
1078        }
1079        if (new == old)
1080                goto out;
1081        if (new & NUD_CONNECTED)
1082                neigh_connect(neigh);
1083        else
1084                neigh_suspect(neigh);
1085        if (!(old & NUD_VALID)) {
1086                struct sk_buff *skb;
1087
1088                /* Again: avoid dead loop if something went wrong */
1089
1090                while (neigh->nud_state & NUD_VALID &&
1091                       (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
1092                        struct neighbour *n1 = neigh;
1093                        write_unlock_bh(&neigh->lock);
1094                        /* On shaper/eql skb->dst->neighbour != neigh :( */
1095                        if (skb->dst && skb->dst->neighbour)
1096                                n1 = skb->dst->neighbour;
1097                        n1->output(skb);
1098                        write_lock_bh(&neigh->lock);
1099                }
1100                skb_queue_purge(&neigh->arp_queue);
1101        }
1102out:
1103        if (update_isrouter) {
1104                neigh->flags = (flags & NEIGH_UPDATE_F_ISROUTER) ?
1105                        (neigh->flags | NTF_ROUTER) :
1106                        (neigh->flags & ~NTF_ROUTER);
1107        }
1108        write_unlock_bh(&neigh->lock);
1109
1110        if (notify)
1111                neigh_update_notify(neigh);
1112
1113        return err;
1114}
1115EXPORT_SYMBOL(neigh_update);
1116
1117struct neighbour *neigh_event_ns(struct neigh_table *tbl,
1118                                 u8 *lladdr, void *saddr,
1119                                 struct net_device *dev)
1120{
1121        struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev,
1122                                                 lladdr || !dev->addr_len);
1123        if (neigh)
1124                neigh_update(neigh, lladdr, NUD_STALE,
1125                             NEIGH_UPDATE_F_OVERRIDE);
1126        return neigh;
1127}
1128EXPORT_SYMBOL(neigh_event_ns);
1129
1130static void neigh_hh_init(struct neighbour *n, struct dst_entry *dst,
1131                          __be16 protocol)
1132{
1133        struct hh_cache        *hh;
1134        struct net_device *dev = dst->dev;
1135
1136        for (hh = n->hh; hh; hh = hh->hh_next)
1137                if (hh->hh_type == protocol)
1138                        break;
1139
1140        if (!hh && (hh = kzalloc(sizeof(*hh), GFP_ATOMIC)) != NULL) {
1141                seqlock_init(&hh->hh_lock);
1142                hh->hh_type = protocol;
1143                atomic_set(&hh->hh_refcnt, 0);
1144                hh->hh_next = NULL;
1145
1146                if (dev->header_ops->cache(n, hh)) {
1147                        kfree(hh);
1148                        hh = NULL;
1149                } else {
1150                        atomic_inc(&hh->hh_refcnt);
1151                        hh->hh_next = n->hh;
1152                        n->hh            = hh;
1153                        if (n->nud_state & NUD_CONNECTED)
1154                                hh->hh_output = n->ops->hh_output;
1155                        else
1156                                hh->hh_output = n->ops->output;
1157                }
1158        }
1159        if (hh)        {
1160                atomic_inc(&hh->hh_refcnt);
1161                dst->hh = hh;
1162        }
1163}
1164
1165/* This function can be used in contexts, where only old dev_queue_xmit
1166   worked, f.e. if you want to override normal output path (eql, shaper),
1167   but resolution is not made yet.
1168 */
1169
1170int neigh_compat_output(struct sk_buff *skb)
1171{
1172        struct net_device *dev = skb->dev;
1173
1174        __skb_pull(skb, skb_network_offset(skb));
1175
1176        if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
1177                            skb->len) < 0 &&
1178            dev->header_ops->rebuild(skb))
1179                return 0;
1180
1181        return dev_queue_xmit(skb);
1182}
1183EXPORT_SYMBOL(neigh_compat_output);
1184
1185/* Slow and careful. */
1186
1187int neigh_resolve_output(struct sk_buff *skb)
1188{
1189        struct dst_entry *dst = skb->dst;
1190        struct neighbour *neigh;
1191        int rc = 0;
1192
1193        if (!dst || !(neigh = dst->neighbour))
1194                goto discard;
1195
1196        __skb_pull(skb, skb_network_offset(skb));
1197
1198        if (!neigh_event_send(neigh, skb)) {
1199                int err;
1200                struct net_device *dev = neigh->dev;
1201                if (dev->header_ops->cache && !dst->hh) {
1202                        write_lock_bh(&neigh->lock);
1203                        if (!dst->hh)
1204                                neigh_hh_init(neigh, dst, dst->ops->protocol);
1205                        err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1206                                              neigh->ha, NULL, skb->len);
1207                        write_unlock_bh(&neigh->lock);
1208                } else {
1209                        read_lock_bh(&neigh->lock);
1210                        err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1211                                              neigh->ha, NULL, skb->len);
1212                        read_unlock_bh(&neigh->lock);
1213                }
1214                if (err >= 0)
1215                        rc = neigh->ops->queue_xmit(skb);
1216                else
1217                        goto out_kfree_skb;
1218        }
1219out:
1220        return rc;
1221discard:
1222        NEIGH_PRINTK1("neigh_resolve_output: dst=%p neigh=%p\n",
1223                      dst, dst ? dst->neighbour : NULL);
1224out_kfree_skb:
1225        rc = -EINVAL;
1226        kfree_skb(skb);
1227        goto out;
1228}
1229EXPORT_SYMBOL(neigh_resolve_output);
1230
1231/* As fast as possible without hh cache */
1232
1233int neigh_connected_output(struct sk_buff *skb)
1234{
1235        int err;
1236        struct dst_entry *dst = skb->dst;
1237        struct neighbour *neigh = dst->neighbour;
1238        struct net_device *dev = neigh->dev;
1239
1240        __skb_pull(skb, skb_network_offset(skb));
1241
1242        read_lock_bh(&neigh->lock);
1243        err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1244                              neigh->ha, NULL, skb->len);
1245        read_unlock_bh(&neigh->lock);
1246        if (err >= 0)
1247                err = neigh->ops->queue_xmit(skb);
1248        else {
1249                err = -EINVAL;
1250                kfree_skb(skb);
1251        }
1252        return err;
1253}
1254EXPORT_SYMBOL(neigh_connected_output);
1255
1256static void neigh_proxy_process(unsigned long arg)
1257{
1258        struct neigh_table *tbl = (struct neigh_table *)arg;
1259        long sched_next = 0;
1260        unsigned long now = jiffies;
1261        struct sk_buff *skb, *n;
1262
1263        spin_lock(&tbl->proxy_queue.lock);
1264
1265        skb_queue_walk_safe(&tbl->proxy_queue, skb, n) {
1266                long tdif = NEIGH_CB(skb)->sched_next - now;
1267
1268                if (tdif <= 0) {
1269                        struct net_device *dev = skb->dev;
1270                        __skb_unlink(skb, &tbl->proxy_queue);
1271                        if (tbl->proxy_redo && netif_running(dev))
1272                                tbl->proxy_redo(skb);
1273                        else
1274                                kfree_skb(skb);
1275
1276                        dev_put(dev);
1277                } else if (!sched_next || tdif < sched_next)
1278                        sched_next = tdif;
1279        }
1280        del_timer(&tbl->proxy_timer);
1281        if (sched_next)
1282                mod_timer(&tbl->proxy_timer, jiffies + sched_next);
1283        spin_unlock(&tbl->proxy_queue.lock);
1284}
1285
1286void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
1287                    struct sk_buff *skb)
1288{
1289        unsigned long now = jiffies;
1290        unsigned long sched_next = now + (net_random() % p->proxy_delay);
1291
1292        if (tbl->proxy_queue.qlen > p->proxy_qlen) {
1293                kfree_skb(skb);
1294                return;
1295        }
1296
1297        NEIGH_CB(skb)->sched_next = sched_next;
1298        NEIGH_CB(skb)->flags |= LOCALLY_ENQUEUED;
1299
1300        spin_lock(&tbl->proxy_queue.lock);
1301        if (del_timer(&tbl->proxy_timer)) {
1302                if (time_before(tbl->proxy_timer.expires, sched_next))
1303                        sched_next = tbl->proxy_timer.expires;
1304        }
1305        dst_release(skb->dst);
1306        skb->dst = NULL;
1307        dev_hold(skb->dev);
1308        __skb_queue_tail(&tbl->proxy_queue, skb);
1309        mod_timer(&tbl->proxy_timer, sched_next);
1310        spin_unlock(&tbl->proxy_queue.lock);
1311}
1312EXPORT_SYMBOL(pneigh_enqueue);
1313
1314static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
1315                                                      struct net *net, int ifindex)
1316{
1317        struct neigh_parms *p;
1318
1319        for (p = &tbl->parms; p; p = p->next) {
1320                if ((p->dev && p->dev->ifindex == ifindex && net_eq(neigh_parms_net(p), net)) ||
1321                    (!p->dev && !ifindex))
1322                        return p;
1323        }
1324
1325        return NULL;
1326}
1327
1328struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
1329                                      struct neigh_table *tbl)
1330{
1331        struct neigh_parms *p, *ref;
1332        struct net *net;
1333
1334        net = dev_net(dev);
1335        ref = lookup_neigh_params(tbl, net, 0);
1336        if (!ref)
1337                return NULL;
1338
1339        p = kmemdup(ref, sizeof(*p), GFP_KERNEL);
1340        if (p) {
1341                p->tbl                  = tbl;
1342                atomic_set(&p->refcnt, 1);
1343                INIT_RCU_HEAD(&p->rcu_head);
1344                p->reachable_time =
1345                                neigh_rand_reach_time(p->base_reachable_time);
1346
1347                if (dev->neigh_setup && dev->neigh_setup(dev, p)) {
1348                        kfree(p);
1349                        return NULL;
1350                }
1351
1352                dev_hold(dev);
1353                p->dev = dev;
1354#ifdef CONFIG_NET_NS
1355                p->net = hold_net(net);
1356#endif
1357                p->sysctl_table = NULL;
1358                write_lock_bh(&tbl->lock);
1359                p->next                = tbl->parms.next;
1360                tbl->parms.next = p;
1361                write_unlock_bh(&tbl->lock);
1362        }
1363        return p;
1364}
1365EXPORT_SYMBOL(neigh_parms_alloc);
1366
1367static void neigh_rcu_free_parms(struct rcu_head *head)
1368{
1369        struct neigh_parms *parms =
1370                container_of(head, struct neigh_parms, rcu_head);
1371
1372        neigh_parms_put(parms);
1373}
1374
1375void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
1376{
1377        struct neigh_parms **p;
1378
1379        if (!parms || parms == &tbl->parms)
1380                return;
1381        write_lock_bh(&tbl->lock);
1382        for (p = &tbl->parms.next; *p; p = &(*p)->next) {
1383                if (*p == parms) {
1384                        *p = parms->next;
1385                        parms->dead = 1;
1386                        write_unlock_bh(&tbl->lock);
1387                        if (parms->dev)
1388                                dev_put(parms->dev);
1389                        call_rcu(&parms->rcu_head, neigh_rcu_free_parms);
1390                        return;
1391                }
1392        }
1393        write_unlock_bh(&tbl->lock);
1394        NEIGH_PRINTK1("neigh_parms_release: not found\n");
1395}
1396EXPORT_SYMBOL(neigh_parms_release);
1397
1398static void neigh_parms_destroy(struct neigh_parms *parms)
1399{
1400        release_net(neigh_parms_net(parms));
1401        kfree(parms);
1402}
1403
1404static struct lock_class_key neigh_table_proxy_queue_class;
1405
1406void neigh_table_init_no_netlink(struct neigh_table *tbl)
1407{
1408        unsigned long now = jiffies;
1409        unsigned long phsize;
1410
1411#ifdef CONFIG_NET_NS
1412        tbl->parms.net = &init_net;
1413#endif
1414        atomic_set(&tbl->parms.refcnt, 1);
1415        INIT_RCU_HEAD(&tbl->parms.rcu_head);
1416        tbl->parms.reachable_time =
1417                          neigh_rand_reach_time(tbl->parms.base_reachable_time);
1418
1419        if (!tbl->kmem_cachep)
1420                tbl->kmem_cachep =
1421                        kmem_cache_create(tbl->id, tbl->entry_size, 0,
1422                                          SLAB_HWCACHE_ALIGN|SLAB_PANIC,
1423                                          NULL);
1424        tbl->stats = alloc_percpu(struct neigh_statistics);
1425        if (!tbl->stats)
1426                panic("cannot create neighbour cache statistics");
1427
1428#ifdef CONFIG_PROC_FS
1429        tbl->pde = proc_create_data(tbl->id, 0, init_net.proc_net_stat,
1430                                    &neigh_stat_seq_fops, tbl);
1431        if (!tbl->pde)
1432                panic("cannot create neighbour proc dir entry");
1433#endif
1434
1435        tbl->hash_mask = 1;
1436        tbl->hash_buckets = neigh_hash_alloc(tbl->hash_mask + 1);
1437
1438        phsize = (PNEIGH_HASHMASK + 1) * sizeof(struct pneigh_entry *);
1439        tbl->phash_buckets = kzalloc(phsize, GFP_KERNEL);
1440
1441        if (!tbl->hash_buckets || !tbl->phash_buckets)
1442                panic("cannot allocate neighbour cache hashes");
1443
1444        get_random_bytes(&tbl->hash_rnd, sizeof(tbl->hash_rnd));
1445
1446        rwlock_init(&tbl->lock);
1447        setup_timer(&tbl->gc_timer, neigh_periodic_timer, (unsigned long)tbl);
1448        tbl->gc_timer.expires  = now + 1;
1449        add_timer(&tbl->gc_timer);
1450
1451        setup_timer(&tbl->proxy_timer, neigh_proxy_process, (unsigned long)tbl);
1452        skb_queue_head_init_class(&tbl->proxy_queue,
1453                        &neigh_table_proxy_queue_class);
1454
1455        tbl->last_flush = now;
1456        tbl->last_rand        = now + tbl->parms.reachable_time * 20;
1457}
1458EXPORT_SYMBOL(neigh_table_init_no_netlink);
1459
1460void neigh_table_init(struct neigh_table *tbl)
1461{
1462        struct neigh_table *tmp;
1463
1464        neigh_table_init_no_netlink(tbl);
1465        write_lock(&neigh_tbl_lock);
1466        for (tmp = neigh_tables; tmp; tmp = tmp->next) {
1467                if (tmp->family == tbl->family)
1468                        break;
1469        }
1470        tbl->next        = neigh_tables;
1471        neigh_tables        = tbl;
1472        write_unlock(&neigh_tbl_lock);
1473
1474        if (unlikely(tmp)) {
1475                printk(KERN_ERR "NEIGH: Registering multiple tables for "
1476                       "family %d\n", tbl->family);
1477                dump_stack();
1478        }
1479}
1480EXPORT_SYMBOL(neigh_table_init);
1481
1482int neigh_table_clear(struct neigh_table *tbl)
1483{
1484        struct neigh_table **tp;
1485
1486        /* It is not clean... Fix it to unload IPv6 module safely */
1487        del_timer_sync(&tbl->gc_timer);
1488        del_timer_sync(&tbl->proxy_timer);
1489        pneigh_queue_purge(&tbl->proxy_queue);
1490        neigh_ifdown(tbl, NULL);
1491        if (atomic_read(&tbl->entries))
1492                printk(KERN_CRIT "neighbour leakage\n");
1493        write_lock(&neigh_tbl_lock);
1494        for (tp = &neigh_tables; *tp; tp = &(*tp)->next) {
1495                if (*tp == tbl) {
1496                        *tp = tbl->next;
1497                        break;
1498                }
1499        }
1500        write_unlock(&neigh_tbl_lock);
1501
1502        neigh_hash_free(tbl->hash_buckets, tbl->hash_mask + 1);
1503        tbl->hash_buckets = NULL;
1504
1505        kfree(tbl->phash_buckets);
1506        tbl->phash_buckets = NULL;
1507
1508        remove_proc_entry(tbl->id, init_net.proc_net_stat);
1509
1510        free_percpu(tbl->stats);
1511        tbl->stats = NULL;
1512
1513        kmem_cache_destroy(tbl->kmem_cachep);
1514        tbl->kmem_cachep = NULL;
1515
1516        return 0;
1517}
1518EXPORT_SYMBOL(neigh_table_clear);
1519
1520static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1521{
1522        struct net *net = sock_net(skb->sk);
1523        struct ndmsg *ndm;
1524        struct nlattr *dst_attr;
1525        struct neigh_table *tbl;
1526        struct net_device *dev = NULL;
1527        int err = -EINVAL;
1528
1529        if (nlmsg_len(nlh) < sizeof(*ndm))
1530                goto out;
1531
1532        dst_attr = nlmsg_find_attr(nlh, sizeof(*ndm), NDA_DST);
1533        if (dst_attr == NULL)
1534                goto out;
1535
1536        ndm = nlmsg_data(nlh);
1537        if (ndm->ndm_ifindex) {
1538                dev = dev_get_by_index(net, ndm->ndm_ifindex);
1539                if (dev == NULL) {
1540                        err = -ENODEV;
1541                        goto out;
1542                }
1543        }
1544
1545        read_lock(&neigh_tbl_lock);
1546        for (tbl = neigh_tables; tbl; tbl = tbl->next) {
1547                struct neighbour *neigh;
1548
1549                if (tbl->family != ndm->ndm_family)
1550                        continue;
1551                read_unlock(&neigh_tbl_lock);
1552
1553                if (nla_len(dst_attr) < tbl->key_len)
1554                        goto out_dev_put;
1555
1556                if (ndm->ndm_flags & NTF_PROXY) {
1557                        err = pneigh_delete(tbl, net, nla_data(dst_attr), dev);
1558                        goto out_dev_put;
1559                }
1560
1561                if (dev == NULL)
1562                        goto out_dev_put;
1563
1564                neigh = neigh_lookup(tbl, nla_data(dst_attr), dev);
1565                if (neigh == NULL) {
1566                        err = -ENOENT;
1567                        goto out_dev_put;
1568                }
1569
1570                err = neigh_update(neigh, NULL, NUD_FAILED,
1571                                   NEIGH_UPDATE_F_OVERRIDE |
1572                                   NEIGH_UPDATE_F_ADMIN);
1573                neigh_release(neigh);
1574                goto out_dev_put;
1575        }
1576        read_unlock(&neigh_tbl_lock);
1577        err = -EAFNOSUPPORT;
1578
1579out_dev_put:
1580        if (dev)
1581                dev_put(dev);
1582out:
1583        return err;
1584}
1585
1586static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1587{
1588        struct net *net = sock_net(skb->sk);
1589        struct ndmsg *ndm;
1590        struct nlattr *tb[NDA_MAX+1];
1591        struct neigh_table *tbl;
1592        struct net_device *dev = NULL;
1593        int err;
1594
1595        err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL);
1596        if (err < 0)
1597                goto out;
1598
1599        err = -EINVAL;
1600        if (tb[NDA_DST] == NULL)
1601                goto out;
1602
1603        ndm = nlmsg_data(nlh);
1604        if (ndm->ndm_ifindex) {
1605                dev = dev_get_by_index(net, ndm->ndm_ifindex);
1606                if (dev == NULL) {
1607                        err = -ENODEV;
1608                        goto out;
1609                }
1610
1611                if (tb[NDA_LLADDR] && nla_len(tb[NDA_LLADDR]) < dev->addr_len)
1612                        goto out_dev_put;
1613        }
1614
1615        read_lock(&neigh_tbl_lock);
1616        for (tbl = neigh_tables; tbl; tbl = tbl->next) {
1617                int flags = NEIGH_UPDATE_F_ADMIN | NEIGH_UPDATE_F_OVERRIDE;
1618                struct neighbour *neigh;
1619                void *dst, *lladdr;
1620
1621                if (tbl->family != ndm->ndm_family)
1622                        continue;
1623                read_unlock(&neigh_tbl_lock);
1624
1625                if (nla_len(tb[NDA_DST]) < tbl->key_len)
1626                        goto out_dev_put;
1627                dst = nla_data(tb[NDA_DST]);
1628                lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
1629
1630                if (ndm->ndm_flags & NTF_PROXY) {
1631                        struct pneigh_entry *pn;
1632
1633                        err = -ENOBUFS;
1634                        pn = pneigh_lookup(tbl, net, dst, dev, 1);
1635                        if (pn) {
1636                                pn->flags = ndm->ndm_flags;
1637                                err = 0;
1638                        }
1639                        goto out_dev_put;
1640                }
1641
1642                if (dev == NULL)
1643                        goto out_dev_put;
1644
1645                neigh = neigh_lookup(tbl, dst, dev);
1646                if (neigh == NULL) {
1647                        if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
1648                                err = -ENOENT;
1649                                goto out_dev_put;
1650                        }
1651
1652                        neigh = __neigh_lookup_errno(tbl, dst, dev);
1653                        if (IS_ERR(neigh)) {
1654                                err = PTR_ERR(neigh);
1655                                goto out_dev_put;
1656                        }
1657                } else {
1658                        if (nlh->nlmsg_flags & NLM_F_EXCL) {
1659                                err = -EEXIST;
1660                                neigh_release(neigh);
1661                                goto out_dev_put;
1662                        }
1663
1664                        if (!(nlh->nlmsg_flags & NLM_F_REPLACE))
1665                                flags &= ~NEIGH_UPDATE_F_OVERRIDE;
1666                }
1667
1668                err = neigh_update(neigh, lladdr, ndm->ndm_state, flags);
1669                neigh_release(neigh);
1670                goto out_dev_put;
1671        }
1672
1673        read_unlock(&neigh_tbl_lock);
1674        err = -EAFNOSUPPORT;
1675
1676out_dev_put:
1677        if (dev)
1678                dev_put(dev);
1679out:
1680        return err;
1681}
1682
1683static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
1684{
1685        struct nlattr *nest;
1686
1687        nest = nla_nest_start(skb, NDTA_PARMS);
1688        if (nest == NULL)
1689                return -ENOBUFS;
1690
1691        if (parms->dev)
1692                NLA_PUT_U32(skb, NDTPA_IFINDEX, parms->dev->ifindex);
1693
1694        NLA_PUT_U32(skb, NDTPA_REFCNT, atomic_read(&parms->refcnt));
1695        NLA_PUT_U32(skb, NDTPA_QUEUE_LEN, parms->queue_len);
1696        NLA_PUT_U32(skb, NDTPA_PROXY_QLEN, parms->proxy_qlen);
1697        NLA_PUT_U32(skb, NDTPA_APP_PROBES, parms->app_probes);
1698        NLA_PUT_U32(skb, NDTPA_UCAST_PROBES, parms->ucast_probes);
1699        NLA_PUT_U32(skb, NDTPA_MCAST_PROBES, parms->mcast_probes);
1700        NLA_PUT_MSECS(skb, NDTPA_REACHABLE_TIME, parms->reachable_time);
1701        NLA_PUT_MSECS(skb, NDTPA_BASE_REACHABLE_TIME,
1702                      parms->base_reachable_time);
1703        NLA_PUT_MSECS(skb, NDTPA_GC_STALETIME, parms->gc_staletime);
1704        NLA_PUT_MSECS(skb, NDTPA_DELAY_PROBE_TIME, parms->delay_probe_time);
1705        NLA_PUT_MSECS(skb, NDTPA_RETRANS_TIME, parms->retrans_time);
1706        NLA_PUT_MSECS(skb, NDTPA_ANYCAST_DELAY, parms->anycast_delay);
1707        NLA_PUT_MSECS(skb, NDTPA_PROXY_DELAY, parms->proxy_delay);
1708        NLA_PUT_MSECS(skb, NDTPA_LOCKTIME, parms->locktime);
1709
1710        return nla_nest_end(skb, nest);
1711
1712nla_put_failure:
1713        nla_nest_cancel(skb, nest);
1714        return -EMSGSIZE;
1715}
1716
1717static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl,
1718                              u32 pid, u32 seq, int type, int flags)
1719{
1720        struct nlmsghdr *nlh;
1721        struct ndtmsg *ndtmsg;
1722
1723        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndtmsg), flags);
1724        if (nlh == NULL)
1725                return -EMSGSIZE;
1726
1727        ndtmsg = nlmsg_data(nlh);
1728
1729        read_lock_bh(&tbl->lock);
1730        ndtmsg->ndtm_family = tbl->family;
1731        ndtmsg->ndtm_pad1   = 0;
1732        ndtmsg->ndtm_pad2   = 0;
1733
1734        NLA_PUT_STRING(skb, NDTA_NAME, tbl->id);
1735        NLA_PUT_MSECS(skb, NDTA_GC_INTERVAL, tbl->gc_interval);
1736        NLA_PUT_U32(skb, NDTA_THRESH1, tbl->gc_thresh1);
1737        NLA_PUT_U32(skb, NDTA_THRESH2, tbl->gc_thresh2);
1738        NLA_PUT_U32(skb, NDTA_THRESH3, tbl->gc_thresh3);
1739
1740        {
1741                unsigned long now = jiffies;
1742                unsigned int flush_delta = now - tbl->last_flush;
1743                unsigned int rand_delta = now - tbl->last_rand;
1744
1745                struct ndt_config ndc = {
1746                        .ndtc_key_len                = tbl->key_len,
1747                        .ndtc_entry_size        = tbl->entry_size,
1748                        .ndtc_entries                = atomic_read(&tbl->entries),
1749                        .ndtc_last_flush        = jiffies_to_msecs(flush_delta),
1750                        .ndtc_last_rand                = jiffies_to_msecs(rand_delta),
1751                        .ndtc_hash_rnd                = tbl->hash_rnd,
1752                        .ndtc_hash_mask                = tbl->hash_mask,
1753                        .ndtc_hash_chain_gc        = tbl->hash_chain_gc,
1754                        .ndtc_proxy_qlen        = tbl->proxy_queue.qlen,
1755                };
1756
1757                NLA_PUT(skb, NDTA_CONFIG, sizeof(ndc), &ndc);
1758        }
1759
1760        {
1761                int cpu;
1762                struct ndt_stats ndst;
1763
1764                memset(&ndst, 0, sizeof(ndst));
1765
1766                for_each_possible_cpu(cpu) {
1767                        struct neigh_statistics        *st;
1768
1769                        st = per_cpu_ptr(tbl->stats, cpu);
1770                        ndst.ndts_allocs                += st->allocs;
1771                        ndst.ndts_destroys                += st->destroys;
1772                        ndst.ndts_hash_grows                += st->hash_grows;
1773                        ndst.ndts_res_failed                += st->res_failed;
1774                        ndst.ndts_lookups                += st->lookups;
1775                        ndst.ndts_hits                        += st->hits;
1776                        ndst.ndts_rcv_probes_mcast        += st->rcv_probes_mcast;
1777                        ndst.ndts_rcv_probes_ucast        += st->rcv_probes_ucast;
1778                        ndst.ndts_periodic_gc_runs        += st->periodic_gc_runs;
1779                        ndst.ndts_forced_gc_runs        += st->forced_gc_runs;
1780                }
1781
1782                NLA_PUT(skb, NDTA_STATS, sizeof(ndst), &ndst);
1783        }
1784
1785        BUG_ON(tbl->parms.dev);
1786        if (neightbl_fill_parms(skb, &tbl->parms) < 0)
1787                goto nla_put_failure;
1788
1789        read_unlock_bh(&tbl->lock);
1790        return nlmsg_end(skb, nlh);
1791
1792nla_put_failure:
1793        read_unlock_bh(&tbl->lock);
1794        nlmsg_cancel(skb, nlh);
1795        return -EMSGSIZE;
1796}
1797
1798static int neightbl_fill_param_info(struct sk_buff *skb,
1799                                    struct neigh_table *tbl,
1800                                    struct neigh_parms *parms,
1801                                    u32 pid, u32 seq, int type,
1802                                    unsigned int flags)
1803{
1804        struct ndtmsg *ndtmsg;
1805        struct nlmsghdr *nlh;
1806
1807        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndtmsg), flags);
1808        if (nlh == NULL)
1809                return -EMSGSIZE;
1810
1811        ndtmsg = nlmsg_data(nlh);
1812
1813        read_lock_bh(&tbl->lock);
1814        ndtmsg->ndtm_family = tbl->family;
1815        ndtmsg->ndtm_pad1   = 0;
1816        ndtmsg->ndtm_pad2   = 0;
1817
1818        if (nla_put_string(skb, NDTA_NAME, tbl->id) < 0 ||
1819            neightbl_fill_parms(skb, parms) < 0)
1820                goto errout;
1821
1822        read_unlock_bh(&tbl->lock);
1823        return nlmsg_end(skb, nlh);
1824errout:
1825        read_unlock_bh(&tbl->lock);
1826        nlmsg_cancel(skb, nlh);
1827        return -EMSGSIZE;
1828}
1829
1830static const struct nla_policy nl_neightbl_policy[NDTA_MAX+1] = {
1831        [NDTA_NAME]                = { .type = NLA_STRING },
1832        [NDTA_THRESH1]                = { .type = NLA_U32 },
1833        [NDTA_THRESH2]                = { .type = NLA_U32 },
1834        [NDTA_THRESH3]                = { .type = NLA_U32 },
1835        [NDTA_GC_INTERVAL]        = { .type = NLA_U64 },
1836        [NDTA_PARMS]                = { .type = NLA_NESTED },
1837};
1838
1839static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
1840        [NDTPA_IFINDEX]                        = { .type = NLA_U32 },
1841        [NDTPA_QUEUE_LEN]                = { .type = NLA_U32 },
1842        [NDTPA_PROXY_QLEN]                = { .type = NLA_U32 },
1843        [NDTPA_APP_PROBES]                = { .type = NLA_U32 },
1844        [NDTPA_UCAST_PROBES]                = { .type = NLA_U32 },
1845        [NDTPA_MCAST_PROBES]                = { .type = NLA_U32 },
1846        [NDTPA_BASE_REACHABLE_TIME]        = { .type = NLA_U64 },
1847        [NDTPA_GC_STALETIME]                = { .type = NLA_U64 },
1848        [NDTPA_DELAY_PROBE_TIME]        = { .type = NLA_U64 },
1849        [NDTPA_RETRANS_TIME]                = { .type = NLA_U64 },
1850        [NDTPA_ANYCAST_DELAY]                = { .type = NLA_U64 },
1851        [NDTPA_PROXY_DELAY]                = { .type = NLA_U64 },
1852        [NDTPA_LOCKTIME]                = { .type = NLA_U64 },
1853};
1854
1855static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1856{
1857        struct net *net = sock_net(skb->sk);
1858        struct neigh_table *tbl;
1859        struct ndtmsg *ndtmsg;
1860        struct nlattr *tb[NDTA_MAX+1];
1861        int err;
1862
1863        err = nlmsg_parse(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
1864                          nl_neightbl_policy);
1865        if (err < 0)
1866                goto errout;
1867
1868        if (tb[NDTA_NAME] == NULL) {
1869                err = -EINVAL;
1870                goto errout;
1871        }
1872
1873        ndtmsg = nlmsg_data(nlh);
1874        read_lock(&neigh_tbl_lock);
1875        for (tbl = neigh_tables; tbl; tbl = tbl->next) {
1876                if (ndtmsg->ndtm_family && tbl->family != ndtmsg->ndtm_family)
1877                        continue;
1878
1879                if (nla_strcmp(tb[NDTA_NAME], tbl->id) == 0)
1880                        break;
1881        }
1882
1883        if (tbl == NULL) {
1884                err = -ENOENT;
1885                goto errout_locked;
1886        }
1887
1888        /*
1889         * We acquire tbl->lock to be nice to the periodic timers and
1890         * make sure they always see a consistent set of values.
1891         */
1892        write_lock_bh(&tbl->lock);
1893
1894        if (tb[NDTA_PARMS]) {
1895                struct nlattr *tbp[NDTPA_MAX+1];
1896                struct neigh_parms *p;
1897                int i, ifindex = 0;
1898
1899                err = nla_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS],
1900                                       nl_ntbl_parm_policy);
1901                if (err < 0)
1902                        goto errout_tbl_lock;
1903
1904                if (tbp[NDTPA_IFINDEX])
1905                        ifindex = nla_get_u32(tbp[NDTPA_IFINDEX]);
1906
1907                p = lookup_neigh_params(tbl, net, ifindex);
1908                if (p == NULL) {
1909                        err = -ENOENT;
1910                        goto errout_tbl_lock;
1911                }
1912
1913                for (i = 1; i <= NDTPA_MAX; i++) {
1914                        if (tbp[i] == NULL)
1915                                continue;
1916
1917                        switch (i) {
1918                        case NDTPA_QUEUE_LEN:
1919                                p->queue_len = nla_get_u32(tbp[i]);
1920                                break;
1921                        case NDTPA_PROXY_QLEN:
1922                                p->proxy_qlen = nla_get_u32(tbp[i]);
1923                                break;
1924                        case NDTPA_APP_PROBES:
1925                                p->app_probes = nla_get_u32(tbp[i]);
1926                                break;
1927                        case NDTPA_UCAST_PROBES:
1928                                p->ucast_probes = nla_get_u32(tbp[i]);
1929                                break;
1930                        case NDTPA_MCAST_PROBES:
1931                                p->mcast_probes = nla_get_u32(tbp[i]);
1932                                break;
1933                        case NDTPA_BASE_REACHABLE_TIME:
1934                                p->base_reachable_time = nla_get_msecs(tbp[i]);
1935                                break;
1936                        case NDTPA_GC_STALETIME:
1937                                p->gc_staletime = nla_get_msecs(tbp[i]);
1938                                break;
1939                        case NDTPA_DELAY_PROBE_TIME:
1940                                p->delay_probe_time = nla_get_msecs(tbp[i]);
1941                                break;
1942                        case NDTPA_RETRANS_TIME:
1943                                p->retrans_time = nla_get_msecs(tbp[i]);
1944                                break;
1945                        case NDTPA_ANYCAST_DELAY:
1946                                p->anycast_delay = nla_get_msecs(tbp[i]);
1947                                break;
1948                        case NDTPA_PROXY_DELAY:
1949                                p->proxy_delay = nla_get_msecs(tbp[i]);
1950                                break;
1951                        case NDTPA_LOCKTIME:
1952                                p->locktime = nla_get_msecs(tbp[i]);
1953                                break;
1954                        }
1955                }
1956        }
1957
1958        if (tb[NDTA_THRESH1])
1959                tbl->gc_thresh1 = nla_get_u32(tb[NDTA_THRESH1]);
1960
1961        if (tb[NDTA_THRESH2])
1962                tbl->gc_thresh2 = nla_get_u32(tb[NDTA_THRESH2]);
1963
1964        if (tb[NDTA_THRESH3])
1965                tbl->gc_thresh3 = nla_get_u32(tb[NDTA_THRESH3]);
1966
1967        if (tb[NDTA_GC_INTERVAL])
1968                tbl->gc_interval = nla_get_msecs(tb[NDTA_GC_INTERVAL]);
1969
1970        err = 0;
1971
1972errout_tbl_lock:
1973        write_unlock_bh(&tbl->lock);
1974errout_locked:
1975        read_unlock(&neigh_tbl_lock);
1976errout:
1977        return err;
1978}
1979
1980static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
1981{
1982        struct net *net = sock_net(skb->sk);
1983        int family, tidx, nidx = 0;
1984        int tbl_skip = cb->args[0];
1985        int neigh_skip = cb->args[1];
1986        struct neigh_table *tbl;
1987
1988        family = ((struct rtgenmsg *) nlmsg_data(cb->nlh))->rtgen_family;
1989
1990        read_lock(&neigh_tbl_lock);
1991        for (tbl = neigh_tables, tidx = 0; tbl; tbl = tbl->next, tidx++) {
1992                struct neigh_parms *p;
1993
1994                if (tidx < tbl_skip || (family && tbl->family != family))
1995                        continue;
1996
1997                if (neightbl_fill_info(skb, tbl, NETLINK_CB(cb->skb).pid,
1998                                       cb->nlh->nlmsg_seq, RTM_NEWNEIGHTBL,
1999                                       NLM_F_MULTI) <= 0)
2000                        break;
2001
2002                for (nidx = 0, p = tbl->parms.next; p; p = p->next) {
2003                        if (!net_eq(neigh_parms_net(p), net))
2004                                continue;
2005
2006                        if (nidx++ < neigh_skip)
2007                                continue;
2008
2009                        if (neightbl_fill_param_info(skb, tbl, p,
2010                                                     NETLINK_CB(cb->skb).pid,
2011                                                     cb->nlh->nlmsg_seq,
2012                                                     RTM_NEWNEIGHTBL,
2013                                                     NLM_F_MULTI) <= 0)
2014                                goto out;
2015                }
2016
2017                neigh_skip = 0;
2018        }
2019out:
2020        read_unlock(&neigh_tbl_lock);
2021        cb->args[0] = tidx;
2022        cb->args[1] = nidx;
2023
2024        return skb->len;
2025}
2026
2027static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh,
2028                           u32 pid, u32 seq, int type, unsigned int flags)
2029{
2030        unsigned long now = jiffies;
2031        struct nda_cacheinfo ci;
2032        struct nlmsghdr *nlh;
2033        struct ndmsg *ndm;
2034
2035        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
2036        if (nlh == NULL)
2037                return -EMSGSIZE;
2038
2039        ndm = nlmsg_data(nlh);
2040        ndm->ndm_family         = neigh->ops->family;
2041        ndm->ndm_pad1    = 0;
2042        ndm->ndm_pad2    = 0;
2043        ndm->ndm_flags         = neigh->flags;
2044        ndm->ndm_type         = neigh->type;
2045        ndm->ndm_ifindex = neigh->dev->ifindex;
2046
2047        NLA_PUT(skb, NDA_DST, neigh->tbl->key_len, neigh->primary_key);
2048
2049        read_lock_bh(&neigh->lock);
2050        ndm->ndm_state         = neigh->nud_state;
2051        if ((neigh->nud_state & NUD_VALID) &&
2052            nla_put(skb, NDA_LLADDR, neigh->dev->addr_len, neigh->ha) < 0) {
2053                read_unlock_bh(&neigh->lock);
2054                goto nla_put_failure;
2055        }
2056
2057        ci.ndm_used         = jiffies_to_clock_t(now - neigh->used);
2058        ci.ndm_confirmed = jiffies_to_clock_t(now - neigh->confirmed);
2059        ci.ndm_updated         = jiffies_to_clock_t(now - neigh->updated);
2060        ci.ndm_refcnt         = atomic_read(&neigh->refcnt) - 1;
2061        read_unlock_bh(&neigh->lock);
2062
2063        NLA_PUT_U32(skb, NDA_PROBES, atomic_read(&neigh->probes));
2064        NLA_PUT(skb, NDA_CACHEINFO, sizeof(ci), &ci);
2065
2066        return nlmsg_end(skb, nlh);
2067
2068nla_put_failure:
2069        nlmsg_cancel(skb, nlh);
2070        return -EMSGSIZE;
2071}
2072
2073static void neigh_update_notify(struct neighbour *neigh)
2074{
2075        call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
2076        __neigh_notify(neigh, RTM_NEWNEIGH, 0);
2077}
2078
2079static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
2080                            struct netlink_callback *cb)
2081{
2082        struct net * net = sock_net(skb->sk);
2083        struct neighbour *n;
2084        int rc, h, s_h = cb->args[1];
2085        int idx, s_idx = idx = cb->args[2];
2086
2087        read_lock_bh(&tbl->lock);
2088        for (h = 0; h <= tbl->hash_mask; h++) {
2089                if (h < s_h)
2090                        continue;
2091                if (h > s_h)
2092                        s_idx = 0;
2093                for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
2094                        int lidx;
2095                        if (dev_net(n->dev) != net)
2096                                continue;
2097                        lidx = idx++;
2098                        if (lidx < s_idx)
2099                                continue;
2100                        if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid,
2101                                            cb->nlh->nlmsg_seq,
2102                                            RTM_NEWNEIGH,
2103                                            NLM_F_MULTI) <= 0) {
2104                                read_unlock_bh(&tbl->lock);
2105                                rc = -1;
2106                                goto out;
2107                        }
2108                }
2109        }
2110        read_unlock_bh(&tbl->lock);
2111        rc = skb->len;
2112out:
2113        cb->args[1] = h;
2114        cb->args[2] = idx;
2115        return rc;
2116}
2117
2118static int neigh_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
2119{
2120        struct neigh_table *tbl;
2121        int t, family, s_t;
2122
2123        read_lock(&neigh_tbl_lock);
2124        family = ((struct rtgenmsg *) nlmsg_data(cb->nlh))->rtgen_family;
2125        s_t = cb->args[0];
2126
2127        for (tbl = neigh_tables, t = 0; tbl; tbl = tbl->next, t++) {
2128                if (t < s_t || (family && tbl->family != family))
2129                        continue;
2130                if (t > s_t)
2131                        memset(&cb->args[1], 0, sizeof(cb->args) -
2132                                                sizeof(cb->args[0]));
2133                if (neigh_dump_table(tbl, skb, cb) < 0)
2134                        break;
2135        }
2136        read_unlock(&neigh_tbl_lock);
2137
2138        cb->args[0] = t;
2139        return skb->len;
2140}
2141
2142void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie)
2143{
2144        int chain;
2145
2146        read_lock_bh(&tbl->lock);
2147        for (chain = 0; chain <= tbl->hash_mask; chain++) {
2148                struct neighbour *n;
2149
2150                for (n = tbl->hash_buckets[chain]; n; n = n->next)
2151                        cb(n, cookie);
2152        }
2153        read_unlock_bh(&tbl->lock);
2154}
2155EXPORT_SYMBOL(neigh_for_each);
2156
2157/* The tbl->lock must be held as a writer and BH disabled. */
2158void __neigh_for_each_release(struct neigh_table *tbl,
2159                              int (*cb)(struct neighbour *))
2160{
2161        int chain;
2162
2163        for (chain = 0; chain <= tbl->hash_mask; chain++) {
2164                struct neighbour *n, **np;
2165
2166                np = &tbl->hash_buckets[chain];
2167                while ((n = *np) != NULL) {
2168                        int release;
2169
2170                        write_lock(&n->lock);
2171                        release = cb(n);
2172                        if (release) {
2173                                *np = n->next;
2174                                n->dead = 1;
2175                        } else
2176                                np = &n->next;
2177                        write_unlock(&n->lock);
2178                        if (release)
2179                                neigh_cleanup_and_release(n);
2180                }
2181        }
2182}
2183EXPORT_SYMBOL(__neigh_for_each_release);
2184
2185#ifdef CONFIG_PROC_FS
2186
2187static struct neighbour *neigh_get_first(struct seq_file *seq)
2188{
2189        struct neigh_seq_state *state = seq->private;
2190        struct net *net = seq_file_net(seq);
2191        struct neigh_table *tbl = state->tbl;
2192        struct neighbour *n = NULL;
2193        int bucket = state->bucket;
2194
2195        state->flags &= ~NEIGH_SEQ_IS_PNEIGH;
2196        for (bucket = 0; bucket <= tbl->hash_mask; bucket++) {
2197                n = tbl->hash_buckets[bucket];
2198
2199                while (n) {
2200                        if (!net_eq(dev_net(n->dev), net))
2201                                goto next;
2202                        if (state->neigh_sub_iter) {
2203                                loff_t fakep = 0;
2204                                void *v;
2205
2206                                v = state->neigh_sub_iter(state, n, &fakep);
2207                                if (!v)
2208                                        goto next;
2209                        }
2210                        if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))
2211                                break;
2212                        if (n->nud_state & ~NUD_NOARP)
2213                                break;
2214                next:
2215                        n = n->next;
2216                }
2217
2218                if (n)
2219                        break;
2220        }
2221        state->bucket = bucket;
2222
2223        return n;
2224}
2225
2226static struct neighbour *neigh_get_next(struct seq_file *seq,
2227                                        struct neighbour *n,
2228                                        loff_t *pos)
2229{
2230        struct neigh_seq_state *state = seq->private;
2231        struct net *net = seq_file_net(seq);
2232        struct neigh_table *tbl = state->tbl;
2233
2234        if (state->neigh_sub_iter) {
2235                void *v = state->neigh_sub_iter(state, n, pos);
2236                if (v)
2237                        return n;
2238        }
2239        n = n->next;
2240
2241        while (1) {
2242                while (n) {
2243                        if (!net_eq(dev_net(n->dev), net))
2244                                goto next;
2245                        if (state->neigh_sub_iter) {
2246                                void *v = state->neigh_sub_iter(state, n, pos);
2247                                if (v)
2248                                        return n;
2249                                goto next;
2250                        }
2251                        if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))
2252                                break;
2253
2254                        if (n->nud_state & ~NUD_NOARP)
2255                                break;
2256                next:
2257                        n = n->next;
2258                }
2259
2260                if (n)
2261                        break;
2262
2263                if (++state->bucket > tbl->hash_mask)
2264                        break;
2265
2266                n = tbl->hash_buckets[state->bucket];
2267        }
2268
2269        if (n && pos)
2270                --(*pos);
2271        return n;
2272}
2273
2274static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos)
2275{
2276        struct neighbour *n = neigh_get_first(seq);
2277
2278        if (n) {
2279                --(*pos);
2280                while (*pos) {
2281                        n = neigh_get_next(seq, n, pos);
2282                        if (!n)
2283                                break;
2284                }
2285        }
2286        return *pos ? NULL : n;
2287}
2288
2289static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
2290{
2291        struct neigh_seq_state *state = seq->private;
2292        struct net *net = seq_file_net(seq);
2293        struct neigh_table *tbl = state->tbl;
2294        struct pneigh_entry *pn = NULL;
2295        int bucket = state->bucket;
2296
2297        state->flags |= NEIGH_SEQ_IS_PNEIGH;
2298        for (bucket = 0; bucket <= PNEIGH_HASHMASK; bucket++) {
2299                pn = tbl->phash_buckets[bucket];
2300                while (pn && !net_eq(pneigh_net(pn), net))
2301                        pn = pn->next;
2302                if (pn)
2303                        break;
2304        }
2305        state->bucket = bucket;
2306
2307        return pn;
2308}
2309
2310static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
2311                                            struct pneigh_entry *pn,
2312                                            loff_t *pos)
2313{
2314        struct neigh_seq_state *state = seq->private;
2315        struct net *net = seq_file_net(seq);
2316        struct neigh_table *tbl = state->tbl;
2317
2318        pn = pn->next;
2319        while (!pn) {
2320                if (++state->bucket > PNEIGH_HASHMASK)
2321                        break;
2322                pn = tbl->phash_buckets[state->bucket];
2323                while (pn && !net_eq(pneigh_net(pn), net))
2324                        pn = pn->next;
2325                if (pn)
2326                        break;
2327        }
2328
2329        if (pn && pos)
2330                --(*pos);
2331
2332        return pn;
2333}
2334
2335static struct pneigh_entry *pneigh_get_idx(struct seq_file *seq, loff_t *pos)
2336{
2337        struct pneigh_entry *pn = pneigh_get_first(seq);
2338
2339        if (pn) {
2340                --(*pos);
2341                while (*pos) {
2342                        pn = pneigh_get_next(seq, pn, pos);
2343                        if (!pn)
2344                                break;
2345                }
2346        }
2347        return *pos ? NULL : pn;
2348}
2349
2350static void *neigh_get_idx_any(struct seq_file *seq, loff_t *pos)
2351{
2352        struct neigh_seq_state *state = seq->private;
2353        void *rc;
2354        loff_t idxpos = *pos;
2355
2356        rc = neigh_get_idx(seq, &idxpos);
2357        if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY))
2358                rc = pneigh_get_idx(seq, &idxpos);
2359
2360        return rc;
2361}
2362
2363void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags)
2364        __acquires(tbl->lock)
2365{
2366        struct neigh_seq_state *state = seq->private;
2367
2368        state->tbl = tbl;
2369        state->bucket = 0;
2370        state->flags = (neigh_seq_flags & ~NEIGH_SEQ_IS_PNEIGH);
2371
2372        read_lock_bh(&tbl->lock);
2373
2374        return *pos ? neigh_get_idx_any(seq, pos) : SEQ_START_TOKEN;
2375}
2376EXPORT_SYMBOL(neigh_seq_start);
2377
2378void *neigh_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2379{
2380        struct neigh_seq_state *state;
2381        void *rc;
2382
2383        if (v == SEQ_START_TOKEN) {
2384                rc = neigh_get_first(seq);
2385                goto out;
2386        }
2387
2388        state = seq->private;
2389        if (!(state->flags & NEIGH_SEQ_IS_PNEIGH)) {
2390                rc = neigh_get_next(seq, v, NULL);
2391                if (rc)
2392                        goto out;
2393                if (!(state->flags & NEIGH_SEQ_NEIGH_ONLY))
2394                        rc = pneigh_get_first(seq);
2395        } else {
2396                BUG_ON(state->flags & NEIGH_SEQ_NEIGH_ONLY);
2397                rc = pneigh_get_next(seq, v, NULL);
2398        }
2399out:
2400        ++(*pos);
2401        return rc;
2402}
2403EXPORT_SYMBOL(neigh_seq_next);
2404
2405void neigh_seq_stop(struct seq_file *seq, void *v)
2406        __releases(tbl->lock)
2407{
2408        struct neigh_seq_state *state = seq->private;
2409        struct neigh_table *tbl = state->tbl;
2410
2411        read_unlock_bh(&tbl->lock);
2412}
2413EXPORT_SYMBOL(neigh_seq_stop);
2414
2415/* statistics via seq_file */
2416
2417static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos)
2418{
2419        struct proc_dir_entry *pde = seq->private;
2420        struct neigh_table *tbl = pde->data;
2421        int cpu;
2422
2423        if (*pos == 0)
2424                return SEQ_START_TOKEN;
2425
2426        for (cpu = *pos-1; cpu < NR_CPUS; ++cpu) {
2427                if (!cpu_possible(cpu))
2428                        continue;
2429                *pos = cpu+1;
2430                return per_cpu_ptr(tbl->stats, cpu);
2431        }
2432        return NULL;
2433}
2434
2435static void *neigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2436{
2437        struct proc_dir_entry *pde = seq->private;
2438        struct neigh_table *tbl = pde->data;
2439        int cpu;
2440
2441        for (cpu = *pos; cpu < NR_CPUS; ++cpu) {
2442                if (!cpu_possible(cpu))
2443                        continue;
2444                *pos = cpu+1;
2445                return per_cpu_ptr(tbl->stats, cpu);
2446        }
2447        return NULL;
2448}
2449
2450static void neigh_stat_seq_stop(struct seq_file *seq, void *v)
2451{
2452
2453}
2454
2455static int neigh_stat_seq_show(struct seq_file *seq, void *v)
2456{
2457        struct proc_dir_entry *pde = seq->private;
2458        struct neigh_table *tbl = pde->data;
2459        struct neigh_statistics *st = v;
2460
2461        if (v == SEQ_START_TOKEN) {
2462                seq_printf(seq, "entries  allocs destroys hash_grows  lookups hits  res_failed  rcv_probes_mcast rcv_probes_ucast  periodic_gc_runs forced_gc_runs unresolved_discards\n");
2463                return 0;
2464        }
2465
2466        seq_printf(seq, "%08x  %08lx %08lx %08lx  %08lx %08lx  %08lx  "
2467                        "%08lx %08lx  %08lx %08lx %08lx\n",
2468                   atomic_read(&tbl->entries),
2469
2470                   st->allocs,
2471                   st->destroys,
2472                   st->hash_grows,
2473
2474                   st->lookups,
2475                   st->hits,
2476
2477                   st->res_failed,
2478
2479                   st->rcv_probes_mcast,
2480                   st->rcv_probes_ucast,
2481
2482                   st->periodic_gc_runs,
2483                   st->forced_gc_runs,
2484                   st->unres_discards
2485                   );
2486
2487        return 0;
2488}
2489
2490static const struct seq_operations neigh_stat_seq_ops = {
2491        .start        = neigh_stat_seq_start,
2492        .next        = neigh_stat_seq_next,
2493        .stop        = neigh_stat_seq_stop,
2494        .show        = neigh_stat_seq_show,
2495};
2496
2497static int neigh_stat_seq_open(struct inode *inode, struct file *file)
2498{
2499        int ret = seq_open(file, &neigh_stat_seq_ops);
2500
2501        if (!ret) {
2502                struct seq_file *sf = file->private_data;
2503                sf->private = PDE(inode);
2504        }
2505        return ret;
2506};
2507
2508static const struct file_operations neigh_stat_seq_fops = {
2509        .owner         = THIS_MODULE,
2510        .open          = neigh_stat_seq_open,
2511        .read         = seq_read,
2512        .llseek         = seq_lseek,
2513        .release = seq_release,
2514};
2515
2516#endif /* CONFIG_PROC_FS */
2517
2518static inline size_t neigh_nlmsg_size(void)
2519{
2520        return NLMSG_ALIGN(sizeof(struct ndmsg))
2521               + nla_total_size(MAX_ADDR_LEN) /* NDA_DST */
2522               + nla_total_size(MAX_ADDR_LEN) /* NDA_LLADDR */
2523               + nla_total_size(sizeof(struct nda_cacheinfo))
2524               + nla_total_size(4); /* NDA_PROBES */
2525}
2526
2527static void __neigh_notify(struct neighbour *n, int type, int flags)
2528{
2529        struct net *net = dev_net(n->dev);
2530        struct sk_buff *skb;
2531        int err = -ENOBUFS;
2532
2533        skb = nlmsg_new(neigh_nlmsg_size(), GFP_ATOMIC);
2534        if (skb == NULL)
2535                goto errout;
2536
2537        err = neigh_fill_info(skb, n, 0, 0, type, flags);
2538        if (err < 0) {
2539                /* -EMSGSIZE implies BUG in neigh_nlmsg_size() */
2540                WARN_ON(err == -EMSGSIZE);
2541                kfree_skb(skb);
2542                goto errout;
2543        }
2544        err = rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
2545errout:
2546        if (err < 0)
2547                rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
2548}
2549
2550#ifdef CONFIG_ARPD
2551void neigh_app_ns(struct neighbour *n)
2552{
2553        __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST);
2554}
2555EXPORT_SYMBOL(neigh_app_ns);
2556#endif /* CONFIG_ARPD */
2557
2558#ifdef CONFIG_SYSCTL
2559
2560static struct neigh_sysctl_table {
2561        struct ctl_table_header *sysctl_header;
2562        struct ctl_table neigh_vars[__NET_NEIGH_MAX];
2563        char *dev_name;
2564} neigh_sysctl_template __read_mostly = {
2565        .neigh_vars = {
2566                {
2567                        .ctl_name        = NET_NEIGH_MCAST_SOLICIT,
2568                        .procname        = "mcast_solicit",
2569                        .maxlen                = sizeof(int),
2570                        .mode                = 0644,
2571                        .proc_handler        = &proc_dointvec,
2572                },
2573                {
2574                        .ctl_name        = NET_NEIGH_UCAST_SOLICIT,
2575                        .procname        = "ucast_solicit",
2576                        .maxlen                = sizeof(int),
2577                        .mode                = 0644,
2578                        .proc_handler        = &proc_dointvec,
2579                },
2580                {
2581                        .ctl_name        = NET_NEIGH_APP_SOLICIT,
2582                        .procname        = "app_solicit",
2583                        .maxlen                = sizeof(int),
2584                        .mode                = 0644,
2585                        .proc_handler        = &proc_dointvec,
2586                },
2587                {
2588                        .procname        = "retrans_time",
2589                        .maxlen                = sizeof(int),
2590                        .mode                = 0644,
2591                        .proc_handler        = &proc_dointvec_userhz_jiffies,
2592                },
2593                {
2594                        .ctl_name        = NET_NEIGH_REACHABLE_TIME,
2595                        .procname        = "base_reachable_time",
2596                        .maxlen                = sizeof(int),
2597                        .mode                = 0644,
2598                        .proc_handler        = &proc_dointvec_jiffies,
2599                        .strategy        = &sysctl_jiffies,
2600                },
2601                {
2602                        .ctl_name        = NET_NEIGH_DELAY_PROBE_TIME,
2603                        .procname        = "delay_first_probe_time",
2604                        .maxlen                = sizeof(int),
2605                        .mode                = 0644,
2606                        .proc_handler        = &proc_dointvec_jiffies,
2607                        .strategy        = &sysctl_jiffies,
2608                },
2609                {
2610                        .ctl_name        = NET_NEIGH_GC_STALE_TIME,
2611                        .procname        = "gc_stale_time",
2612                        .maxlen                = sizeof(int),
2613                        .mode                = 0644,
2614                        .proc_handler        = &proc_dointvec_jiffies,
2615                        .strategy        = &sysctl_jiffies,
2616                },
2617                {
2618                        .ctl_name        = NET_NEIGH_UNRES_QLEN,
2619                        .procname        = "unres_qlen",
2620                        .maxlen                = sizeof(int),
2621                        .mode                = 0644,
2622                        .proc_handler        = &proc_dointvec,
2623                },
2624                {
2625                        .ctl_name        = NET_NEIGH_PROXY_QLEN,
2626                        .procname        = "proxy_qlen",
2627                        .maxlen                = sizeof(int),
2628                        .mode                = 0644,
2629                        .proc_handler        = &proc_dointvec,
2630                },
2631                {
2632                        .procname        = "anycast_delay",
2633                        .maxlen                = sizeof(int),
2634                        .mode                = 0644,
2635                        .proc_handler        = &proc_dointvec_userhz_jiffies,
2636                },
2637                {
2638                        .procname        = "proxy_delay",
2639                        .maxlen                = sizeof(int),
2640                        .mode                = 0644,
2641                        .proc_handler        = &proc_dointvec_userhz_jiffies,
2642                },
2643                {
2644                        .procname        = "locktime",
2645                        .maxlen                = sizeof(int),
2646                        .mode                = 0644,
2647                        .proc_handler        = &proc_dointvec_userhz_jiffies,
2648                },
2649                {
2650                        .ctl_name        = NET_NEIGH_RETRANS_TIME_MS,
2651                        .procname        = "retrans_time_ms",
2652                        .maxlen                = sizeof(int),
2653                        .mode                = 0644,
2654                        .proc_handler        = &proc_dointvec_ms_jiffies,
2655                        .strategy        = &sysctl_ms_jiffies,
2656                },
2657                {
2658                        .ctl_name        = NET_NEIGH_REACHABLE_TIME_MS,
2659                        .procname        = "base_reachable_time_ms",
2660                        .maxlen                = sizeof(int),
2661                        .mode                = 0644,
2662                        .proc_handler        = &proc_dointvec_ms_jiffies,
2663                        .strategy        = &sysctl_ms_jiffies,
2664                },
2665                {
2666                        .ctl_name        = NET_NEIGH_GC_INTERVAL,
2667                        .procname        = "gc_interval",
2668                        .maxlen                = sizeof(int),
2669                        .mode                = 0644,
2670                        .proc_handler        = &proc_dointvec_jiffies,
2671                        .strategy        = &sysctl_jiffies,
2672                },
2673                {
2674                        .ctl_name        = NET_NEIGH_GC_THRESH1,
2675                        .procname        = "gc_thresh1",
2676                        .maxlen                = sizeof(int),
2677                        .mode                = 0644,
2678                        .proc_handler        = &proc_dointvec,
2679                },
2680                {
2681                        .ctl_name        = NET_NEIGH_GC_THRESH2,
2682                        .procname        = "gc_thresh2",
2683                        .maxlen                = sizeof(int),
2684                        .mode                = 0644,
2685                        .proc_handler        = &proc_dointvec,
2686                },
2687                {
2688                        .ctl_name        = NET_NEIGH_GC_THRESH3,
2689                        .procname        = "gc_thresh3",
2690                        .maxlen                = sizeof(int),
2691                        .mode                = 0644,
2692                        .proc_handler        = &proc_dointvec,
2693                },
2694                {},
2695        },
2696};
2697
2698int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
2699                          int p_id, int pdev_id, char *p_name,
2700                          proc_handler *handler, ctl_handler *strategy)
2701{
2702        struct neigh_sysctl_table *t;
2703        const char *dev_name_source = NULL;
2704
2705#define NEIGH_CTL_PATH_ROOT        0
2706#define NEIGH_CTL_PATH_PROTO        1
2707#define NEIGH_CTL_PATH_NEIGH        2
2708#define NEIGH_CTL_PATH_DEV        3
2709
2710        struct ctl_path neigh_path[] = {
2711                { .procname = "net",         .ctl_name = CTL_NET, },
2712                { .procname = "proto",         .ctl_name = 0, },
2713                { .procname = "neigh",         .ctl_name = 0, },
2714                { .procname = "default", .ctl_name = NET_PROTO_CONF_DEFAULT, },
2715                { },
2716        };
2717
2718        t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL);
2719        if (!t)
2720                goto err;
2721
2722        t->neigh_vars[0].data  = &p->mcast_probes;
2723        t->neigh_vars[1].data  = &p->ucast_probes;
2724        t->neigh_vars[2].data  = &p->app_probes;
2725        t->neigh_vars[3].data  = &p->retrans_time;
2726        t->neigh_vars[4].data  = &p->base_reachable_time;
2727        t->neigh_vars[5].data  = &p->delay_probe_time;
2728        t->neigh_vars[6].data  = &p->gc_staletime;
2729        t->neigh_vars[7].data  = &p->queue_len;
2730        t->neigh_vars[8].data  = &p->proxy_qlen;
2731        t->neigh_vars[9].data  = &p->anycast_delay;
2732        t->neigh_vars[10].data = &p->proxy_delay;
2733        t->neigh_vars[11].data = &p->locktime;
2734        t->neigh_vars[12].data  = &p->retrans_time;
2735        t->neigh_vars[13].data  = &p->base_reachable_time;
2736
2737        if (dev) {
2738                dev_name_source = dev->name;
2739                neigh_path[NEIGH_CTL_PATH_DEV].ctl_name = dev->ifindex;
2740                /* Terminate the table early */
2741                memset(&t->neigh_vars[14], 0, sizeof(t->neigh_vars[14]));
2742        } else {
2743                dev_name_source = neigh_path[NEIGH_CTL_PATH_DEV].procname;
2744                t->neigh_vars[14].data = (int *)(p + 1);
2745                t->neigh_vars[15].data = (int *)(p + 1) + 1;
2746                t->neigh_vars[16].data = (int *)(p + 1) + 2;
2747                t->neigh_vars[17].data = (int *)(p + 1) + 3;
2748        }
2749
2750
2751        if (handler || strategy) {
2752                /* RetransTime */
2753                t->neigh_vars[3].proc_handler = handler;
2754                t->neigh_vars[3].strategy = strategy;
2755                t->neigh_vars[3].extra1 = dev;
2756                if (!strategy)
2757                        t->neigh_vars[3].ctl_name = CTL_UNNUMBERED;
2758                /* ReachableTime */
2759                t->neigh_vars[4].proc_handler = handler;
2760                t->neigh_vars[4].strategy = strategy;
2761                t->neigh_vars[4].extra1 = dev;
2762                if (!strategy)
2763                        t->neigh_vars[4].ctl_name = CTL_UNNUMBERED;
2764                /* RetransTime (in milliseconds)*/
2765                t->neigh_vars[12].proc_handler = handler;
2766                t->neigh_vars[12].strategy = strategy;
2767                t->neigh_vars[12].extra1 = dev;
2768                if (!strategy)
2769                        t->neigh_vars[12].ctl_name = CTL_UNNUMBERED;
2770                /* ReachableTime (in milliseconds) */
2771                t->neigh_vars[13].proc_handler = handler;
2772                t->neigh_vars[13].strategy = strategy;
2773                t->neigh_vars[13].extra1 = dev;
2774                if (!strategy)
2775                        t->neigh_vars[13].ctl_name = CTL_UNNUMBERED;
2776        }
2777
2778        t->dev_name = kstrdup(dev_name_source, GFP_KERNEL);
2779        if (!t->dev_name)
2780                goto free;
2781
2782        neigh_path[NEIGH_CTL_PATH_DEV].procname = t->dev_name;
2783        neigh_path[NEIGH_CTL_PATH_NEIGH].ctl_name = pdev_id;
2784        neigh_path[NEIGH_CTL_PATH_PROTO].procname = p_name;
2785        neigh_path[NEIGH_CTL_PATH_PROTO].ctl_name = p_id;
2786
2787        t->sysctl_header =
2788                register_net_sysctl_table(neigh_parms_net(p), neigh_path, t->neigh_vars);
2789        if (!t->sysctl_header)
2790                goto free_procname;
2791
2792        p->sysctl_table = t;
2793        return 0;
2794
2795free_procname:
2796        kfree(t->dev_name);
2797free:
2798        kfree(t);
2799err:
2800        return -ENOBUFS;
2801}
2802EXPORT_SYMBOL(neigh_sysctl_register);
2803
2804void neigh_sysctl_unregister(struct neigh_parms *p)
2805{
2806        if (p->sysctl_table) {
2807                struct neigh_sysctl_table *t = p->sysctl_table;
2808                p->sysctl_table = NULL;
2809                unregister_sysctl_table(t->sysctl_header);
2810                kfree(t->dev_name);
2811                kfree(t);
2812        }
2813}
2814EXPORT_SYMBOL(neigh_sysctl_unregister);
2815
2816#endif        /* CONFIG_SYSCTL */
2817
2818static int __init neigh_init(void)
2819{
2820        rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL);
2821        rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL);
2822        rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info);
2823
2824        rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info);
2825        rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL);
2826
2827        return 0;
2828}
2829
2830subsys_initcall(neigh_init);
2831