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