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