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