stmmac: split to core library and probe drivers
[linux-2.6-block.git] / net / core / neighbour.c
CommitLineData
1da177e4
LT
1/*
2 * Generic address resolution entity
3 *
4 * Authors:
5 * Pedro Roque <roque@di.fc.ul.pt>
6 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version
11 * 2 of the License, or (at your option) any later version.
12 *
13 * Fixes:
14 * Vitaly E. Lavrov releasing NULL neighbor in neigh_add.
15 * Harald Welte Add neighbour cache statistics like rtstat
16 */
17
e005d193
JP
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
5a0e3ad6 20#include <linux/slab.h>
1da177e4
LT
21#include <linux/types.h>
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/socket.h>
1da177e4
LT
25#include <linux/netdevice.h>
26#include <linux/proc_fs.h>
27#ifdef CONFIG_SYSCTL
28#include <linux/sysctl.h>
29#endif
30#include <linux/times.h>
457c4cbc 31#include <net/net_namespace.h>
1da177e4
LT
32#include <net/neighbour.h>
33#include <net/dst.h>
34#include <net/sock.h>
8d71740c 35#include <net/netevent.h>
a14a49d2 36#include <net/netlink.h>
1da177e4
LT
37#include <linux/rtnetlink.h>
38#include <linux/random.h>
543537bd 39#include <linux/string.h>
c3609d51 40#include <linux/log2.h>
1d4c8c29 41#include <linux/inetdevice.h>
bba24896 42#include <net/addrconf.h>
1da177e4 43
d5d427cd 44#define DEBUG
1da177e4 45#define NEIGH_DEBUG 1
d5d427cd
JP
46#define neigh_dbg(level, fmt, ...) \
47do { \
48 if (level <= NEIGH_DEBUG) \
49 pr_debug(fmt, ##__VA_ARGS__); \
50} while (0)
1da177e4
LT
51
52#define PNEIGH_HASHMASK 0xF
53
54static void neigh_timer_handler(unsigned long arg);
d961db35
TG
55static void __neigh_notify(struct neighbour *n, int type, int flags);
56static void neigh_update_notify(struct neighbour *neigh);
1da177e4 57static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
1da177e4
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
LT
768
769 /*
770 * periodically recompute ReachableTime from random function
771 */
772
e4c4e448 773 if (time_after(jiffies, tbl->last_rand + 300 * HZ)) {
1da177e4 774 struct neigh_parms *p;
e4c4e448 775 tbl->last_rand = jiffies;
75fbfd33 776 list_for_each_entry(p, &tbl->parms_list, list)
1da177e4 777 p->reachable_time =
1f9248e5 778 neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
1da177e4
LT
779 }
780
feff9ab2
DJ
781 if (atomic_read(&tbl->entries) < tbl->gc_thresh1)
782 goto out;
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);
5e2c21dc 948 goto out;
1da177e4
LT
949 }
950
951 if (neigh->nud_state & NUD_IN_TIMER) {
1da177e4
LT
952 if (time_before(next, jiffies + HZ/2))
953 next = jiffies + HZ/2;
6fb9974f
HX
954 if (!mod_timer(&neigh->timer, next))
955 neigh_hold(neigh);
1da177e4
LT
956 }
957 if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
cd28ca0a 958 neigh_probe(neigh);
9ff56607 959 } else {
69cc64d8 960out:
9ff56607
DM
961 write_unlock(&neigh->lock);
962 }
d961db35 963
8d71740c 964 if (notify)
d961db35 965 neigh_update_notify(neigh);
1da177e4 966
1da177e4
LT
967 neigh_release(neigh);
968}
969
970int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
971{
972 int rc;
cd28ca0a 973 bool immediate_probe = false;
1da177e4
LT
974
975 write_lock_bh(&neigh->lock);
976
977 rc = 0;
978 if (neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE))
979 goto out_unlock_bh;
980
1da177e4 981 if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) {
1f9248e5
JP
982 if (NEIGH_VAR(neigh->parms, MCAST_PROBES) +
983 NEIGH_VAR(neigh->parms, APP_PROBES)) {
cd28ca0a
ED
984 unsigned long next, now = jiffies;
985
1f9248e5
JP
986 atomic_set(&neigh->probes,
987 NEIGH_VAR(neigh->parms, UCAST_PROBES));
1da177e4 988 neigh->nud_state = NUD_INCOMPLETE;
cd28ca0a 989 neigh->updated = now;
1f9248e5
JP
990 next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME),
991 HZ/2);
cd28ca0a
ED
992 neigh_add_timer(neigh, next);
993 immediate_probe = true;
1da177e4
LT
994 } else {
995 neigh->nud_state = NUD_FAILED;
955aaa2f 996 neigh->updated = jiffies;
1da177e4
LT
997 write_unlock_bh(&neigh->lock);
998
f3fbbe0f 999 kfree_skb(skb);
1da177e4
LT
1000 return 1;
1001 }
1002 } else if (neigh->nud_state & NUD_STALE) {
d5d427cd 1003 neigh_dbg(2, "neigh %p is delayed\n", neigh);
1da177e4 1004 neigh->nud_state = NUD_DELAY;
955aaa2f 1005 neigh->updated = jiffies;
1f9248e5
JP
1006 neigh_add_timer(neigh, jiffies +
1007 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME));
1da177e4
LT
1008 }
1009
1010 if (neigh->nud_state == NUD_INCOMPLETE) {
1011 if (skb) {
8b5c171b 1012 while (neigh->arp_queue_len_bytes + skb->truesize >
1f9248e5 1013 NEIGH_VAR(neigh->parms, QUEUE_LEN_BYTES)) {
1da177e4 1014 struct sk_buff *buff;
8b5c171b 1015
f72051b0 1016 buff = __skb_dequeue(&neigh->arp_queue);
8b5c171b
ED
1017 if (!buff)
1018 break;
1019 neigh->arp_queue_len_bytes -= buff->truesize;
1da177e4 1020 kfree_skb(buff);
9a6d276e 1021 NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards);
1da177e4 1022 }
a4731138 1023 skb_dst_force(skb);
1da177e4 1024 __skb_queue_tail(&neigh->arp_queue, skb);
8b5c171b 1025 neigh->arp_queue_len_bytes += skb->truesize;
1da177e4
LT
1026 }
1027 rc = 1;
1028 }
1029out_unlock_bh:
cd28ca0a
ED
1030 if (immediate_probe)
1031 neigh_probe(neigh);
1032 else
1033 write_unlock(&neigh->lock);
1034 local_bh_enable();
1da177e4
LT
1035 return rc;
1036}
0a204500 1037EXPORT_SYMBOL(__neigh_event_send);
1da177e4 1038
f6b72b62 1039static void neigh_update_hhs(struct neighbour *neigh)
1da177e4
LT
1040{
1041 struct hh_cache *hh;
3b04ddde 1042 void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *)
91a72a70
DK
1043 = NULL;
1044
1045 if (neigh->dev->header_ops)
1046 update = neigh->dev->header_ops->cache_update;
1da177e4
LT
1047
1048 if (update) {
f6b72b62
DM
1049 hh = &neigh->hh;
1050 if (hh->hh_len) {
3644f0ce 1051 write_seqlock_bh(&hh->hh_lock);
1da177e4 1052 update(hh, neigh->dev, neigh->ha);
3644f0ce 1053 write_sequnlock_bh(&hh->hh_lock);
1da177e4
LT
1054 }
1055 }
1056}
1057
1058
1059
1060/* Generic update routine.
1061 -- lladdr is new lladdr or NULL, if it is not supplied.
1062 -- new is new state.
1063 -- flags
1064 NEIGH_UPDATE_F_OVERRIDE allows to override existing lladdr,
1065 if it is different.
1066 NEIGH_UPDATE_F_WEAK_OVERRIDE will suspect existing "connected"
4ec93edb 1067 lladdr instead of overriding it
1da177e4
LT
1068 if it is different.
1069 It also allows to retain current state
1070 if lladdr is unchanged.
1071 NEIGH_UPDATE_F_ADMIN means that the change is administrative.
1072
4ec93edb 1073 NEIGH_UPDATE_F_OVERRIDE_ISROUTER allows to override existing
1da177e4
LT
1074 NTF_ROUTER flag.
1075 NEIGH_UPDATE_F_ISROUTER indicates if the neighbour is known as
1076 a router.
1077
1078 Caller MUST hold reference count on the entry.
1079 */
1080
1081int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
1082 u32 flags)
1083{
1084 u8 old;
1085 int err;
1da177e4 1086 int notify = 0;
1da177e4
LT
1087 struct net_device *dev;
1088 int update_isrouter = 0;
1089
1090 write_lock_bh(&neigh->lock);
1091
1092 dev = neigh->dev;
1093 old = neigh->nud_state;
1094 err = -EPERM;
1095
4ec93edb 1096 if (!(flags & NEIGH_UPDATE_F_ADMIN) &&
1da177e4
LT
1097 (old & (NUD_NOARP | NUD_PERMANENT)))
1098 goto out;
1099
1100 if (!(new & NUD_VALID)) {
1101 neigh_del_timer(neigh);
1102 if (old & NUD_CONNECTED)
1103 neigh_suspect(neigh);
1104 neigh->nud_state = new;
1105 err = 0;
1da177e4 1106 notify = old & NUD_VALID;
5ef12d98
TT
1107 if ((old & (NUD_INCOMPLETE | NUD_PROBE)) &&
1108 (new & NUD_FAILED)) {
1109 neigh_invalidate(neigh);
1110 notify = 1;
1111 }
1da177e4
LT
1112 goto out;
1113 }
1114
1115 /* Compare new lladdr with cached one */
1116 if (!dev->addr_len) {
1117 /* First case: device needs no address. */
1118 lladdr = neigh->ha;
1119 } else if (lladdr) {
1120 /* The second case: if something is already cached
1121 and a new address is proposed:
1122 - compare new & old
1123 - if they are different, check override flag
1124 */
4ec93edb 1125 if ((old & NUD_VALID) &&
1da177e4
LT
1126 !memcmp(lladdr, neigh->ha, dev->addr_len))
1127 lladdr = neigh->ha;
1128 } else {
1129 /* No address is supplied; if we know something,
1130 use it, otherwise discard the request.
1131 */
1132 err = -EINVAL;
1133 if (!(old & NUD_VALID))
1134 goto out;
1135 lladdr = neigh->ha;
1136 }
1137
1138 if (new & NUD_CONNECTED)
1139 neigh->confirmed = jiffies;
1140 neigh->updated = jiffies;
1141
1142 /* If entry was valid and address is not changed,
1143 do not change entry state, if new one is STALE.
1144 */
1145 err = 0;
1146 update_isrouter = flags & NEIGH_UPDATE_F_OVERRIDE_ISROUTER;
1147 if (old & NUD_VALID) {
1148 if (lladdr != neigh->ha && !(flags & NEIGH_UPDATE_F_OVERRIDE)) {
1149 update_isrouter = 0;
1150 if ((flags & NEIGH_UPDATE_F_WEAK_OVERRIDE) &&
1151 (old & NUD_CONNECTED)) {
1152 lladdr = neigh->ha;
1153 new = NUD_STALE;
1154 } else
1155 goto out;
1156 } else {
1157 if (lladdr == neigh->ha && new == NUD_STALE &&
1158 ((flags & NEIGH_UPDATE_F_WEAK_OVERRIDE) ||
1159 (old & NUD_CONNECTED))
1160 )
1161 new = old;
1162 }
1163 }
1164
1165 if (new != old) {
1166 neigh_del_timer(neigh);
a43d8994 1167 if (new & NUD_IN_TIMER)
4ec93edb
YH
1168 neigh_add_timer(neigh, (jiffies +
1169 ((new & NUD_REACHABLE) ?
667347f1
DM
1170 neigh->parms->reachable_time :
1171 0)));
1da177e4 1172 neigh->nud_state = new;
53385d2d 1173 notify = 1;
1da177e4
LT
1174 }
1175
1176 if (lladdr != neigh->ha) {
0ed8ddf4 1177 write_seqlock(&neigh->ha_lock);
1da177e4 1178 memcpy(&neigh->ha, lladdr, dev->addr_len);
0ed8ddf4 1179 write_sequnlock(&neigh->ha_lock);
1da177e4
LT
1180 neigh_update_hhs(neigh);
1181 if (!(new & NUD_CONNECTED))
1182 neigh->confirmed = jiffies -
1f9248e5 1183 (NEIGH_VAR(neigh->parms, BASE_REACHABLE_TIME) << 1);
1da177e4 1184 notify = 1;
1da177e4
LT
1185 }
1186 if (new == old)
1187 goto out;
1188 if (new & NUD_CONNECTED)
1189 neigh_connect(neigh);
1190 else
1191 neigh_suspect(neigh);
1192 if (!(old & NUD_VALID)) {
1193 struct sk_buff *skb;
1194
1195 /* Again: avoid dead loop if something went wrong */
1196
1197 while (neigh->nud_state & NUD_VALID &&
1198 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
69cce1d1
DM
1199 struct dst_entry *dst = skb_dst(skb);
1200 struct neighbour *n2, *n1 = neigh;
1da177e4 1201 write_unlock_bh(&neigh->lock);
e049f288 1202
1203 rcu_read_lock();
13a43d94
DM
1204
1205 /* Why not just use 'neigh' as-is? The problem is that
1206 * things such as shaper, eql, and sch_teql can end up
1207 * using alternative, different, neigh objects to output
1208 * the packet in the output path. So what we need to do
1209 * here is re-lookup the top-level neigh in the path so
1210 * we can reinject the packet there.
1211 */
1212 n2 = NULL;
1213 if (dst) {
1214 n2 = dst_neigh_lookup_skb(dst, skb);
1215 if (n2)
1216 n1 = n2;
1217 }
8f40b161 1218 n1->output(n1, skb);
13a43d94
DM
1219 if (n2)
1220 neigh_release(n2);
e049f288 1221 rcu_read_unlock();
1222
1da177e4
LT
1223 write_lock_bh(&neigh->lock);
1224 }
c9ab4d85 1225 __skb_queue_purge(&neigh->arp_queue);
8b5c171b 1226 neigh->arp_queue_len_bytes = 0;
1da177e4
LT
1227 }
1228out:
1229 if (update_isrouter) {
1230 neigh->flags = (flags & NEIGH_UPDATE_F_ISROUTER) ?
1231 (neigh->flags | NTF_ROUTER) :
1232 (neigh->flags & ~NTF_ROUTER);
1233 }
1234 write_unlock_bh(&neigh->lock);
8d71740c
TT
1235
1236 if (notify)
d961db35
TG
1237 neigh_update_notify(neigh);
1238
1da177e4
LT
1239 return err;
1240}
0a204500 1241EXPORT_SYMBOL(neigh_update);
1da177e4 1242
7e980569
JB
1243/* Update the neigh to listen temporarily for probe responses, even if it is
1244 * in a NUD_FAILED state. The caller has to hold neigh->lock for writing.
1245 */
1246void __neigh_set_probe_once(struct neighbour *neigh)
1247{
1248 neigh->updated = jiffies;
1249 if (!(neigh->nud_state & NUD_FAILED))
1250 return;
2176d5d4
DJ
1251 neigh->nud_state = NUD_INCOMPLETE;
1252 atomic_set(&neigh->probes, neigh_max_probes(neigh));
7e980569
JB
1253 neigh_add_timer(neigh,
1254 jiffies + NEIGH_VAR(neigh->parms, RETRANS_TIME));
1255}
1256EXPORT_SYMBOL(__neigh_set_probe_once);
1257
1da177e4
LT
1258struct neighbour *neigh_event_ns(struct neigh_table *tbl,
1259 u8 *lladdr, void *saddr,
1260 struct net_device *dev)
1261{
1262 struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev,
1263 lladdr || !dev->addr_len);
1264 if (neigh)
4ec93edb 1265 neigh_update(neigh, lladdr, NUD_STALE,
1da177e4
LT
1266 NEIGH_UPDATE_F_OVERRIDE);
1267 return neigh;
1268}
0a204500 1269EXPORT_SYMBOL(neigh_event_ns);
1da177e4 1270
34d101dd 1271/* called with read_lock_bh(&n->lock); */
f6b72b62 1272static void neigh_hh_init(struct neighbour *n, struct dst_entry *dst)
1da177e4 1273{
1da177e4 1274 struct net_device *dev = dst->dev;
f6b72b62
DM
1275 __be16 prot = dst->ops->protocol;
1276 struct hh_cache *hh = &n->hh;
0ed8ddf4
ED
1277
1278 write_lock_bh(&n->lock);
34d101dd 1279
f6b72b62
DM
1280 /* Only one thread can come in here and initialize the
1281 * hh_cache entry.
1282 */
b23b5455
DM
1283 if (!hh->hh_len)
1284 dev->header_ops->cache(n, hh, prot);
34d101dd 1285
0ed8ddf4 1286 write_unlock_bh(&n->lock);
1da177e4
LT
1287}
1288
1289/* This function can be used in contexts, where only old dev_queue_xmit
767e97e1
ED
1290 * worked, f.e. if you want to override normal output path (eql, shaper),
1291 * but resolution is not made yet.
1da177e4
LT
1292 */
1293
8f40b161 1294int neigh_compat_output(struct neighbour *neigh, struct sk_buff *skb)
1da177e4
LT
1295{
1296 struct net_device *dev = skb->dev;
1297
bbe735e4 1298 __skb_pull(skb, skb_network_offset(skb));
1da177e4 1299
0c4e8581
SH
1300 if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
1301 skb->len) < 0 &&
2205369a 1302 dev_rebuild_header(skb))
1da177e4
LT
1303 return 0;
1304
1305 return dev_queue_xmit(skb);
1306}
0a204500 1307EXPORT_SYMBOL(neigh_compat_output);
1da177e4
LT
1308
1309/* Slow and careful. */
1310
8f40b161 1311int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
1da177e4 1312{
adf30907 1313 struct dst_entry *dst = skb_dst(skb);
1da177e4
LT
1314 int rc = 0;
1315
8f40b161 1316 if (!dst)
1da177e4
LT
1317 goto discard;
1318
1da177e4
LT
1319 if (!neigh_event_send(neigh, skb)) {
1320 int err;
1321 struct net_device *dev = neigh->dev;
0ed8ddf4 1322 unsigned int seq;
34d101dd 1323
f6b72b62
DM
1324 if (dev->header_ops->cache && !neigh->hh.hh_len)
1325 neigh_hh_init(neigh, dst);
34d101dd 1326
0ed8ddf4 1327 do {
e1f16503 1328 __skb_pull(skb, skb_network_offset(skb));
0ed8ddf4
ED
1329 seq = read_seqbegin(&neigh->ha_lock);
1330 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1331 neigh->ha, NULL, skb->len);
1332 } while (read_seqretry(&neigh->ha_lock, seq));
34d101dd 1333
1da177e4 1334 if (err >= 0)
542d4d68 1335 rc = dev_queue_xmit(skb);
1da177e4
LT
1336 else
1337 goto out_kfree_skb;
1338 }
1339out:
1340 return rc;
1341discard:
d5d427cd 1342 neigh_dbg(1, "%s: dst=%p neigh=%p\n", __func__, dst, neigh);
1da177e4
LT
1343out_kfree_skb:
1344 rc = -EINVAL;
1345 kfree_skb(skb);
1346 goto out;
1347}
0a204500 1348EXPORT_SYMBOL(neigh_resolve_output);
1da177e4
LT
1349
1350/* As fast as possible without hh cache */
1351
8f40b161 1352int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb)
1da177e4 1353{
1da177e4 1354 struct net_device *dev = neigh->dev;
0ed8ddf4 1355 unsigned int seq;
8f40b161 1356 int err;
1da177e4 1357
0ed8ddf4 1358 do {
e1f16503 1359 __skb_pull(skb, skb_network_offset(skb));
0ed8ddf4
ED
1360 seq = read_seqbegin(&neigh->ha_lock);
1361 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1362 neigh->ha, NULL, skb->len);
1363 } while (read_seqretry(&neigh->ha_lock, seq));
1364
1da177e4 1365 if (err >= 0)
542d4d68 1366 err = dev_queue_xmit(skb);
1da177e4
LT
1367 else {
1368 err = -EINVAL;
1369 kfree_skb(skb);
1370 }
1371 return err;
1372}
0a204500 1373EXPORT_SYMBOL(neigh_connected_output);
1da177e4 1374
8f40b161
DM
1375int neigh_direct_output(struct neighbour *neigh, struct sk_buff *skb)
1376{
1377 return dev_queue_xmit(skb);
1378}
1379EXPORT_SYMBOL(neigh_direct_output);
1380
1da177e4
LT
1381static void neigh_proxy_process(unsigned long arg)
1382{
1383 struct neigh_table *tbl = (struct neigh_table *)arg;
1384 long sched_next = 0;
1385 unsigned long now = jiffies;
f72051b0 1386 struct sk_buff *skb, *n;
1da177e4
LT
1387
1388 spin_lock(&tbl->proxy_queue.lock);
1389
f72051b0
DM
1390 skb_queue_walk_safe(&tbl->proxy_queue, skb, n) {
1391 long tdif = NEIGH_CB(skb)->sched_next - now;
1da177e4 1392
1da177e4 1393 if (tdif <= 0) {
f72051b0 1394 struct net_device *dev = skb->dev;
20e6074e 1395
f72051b0 1396 __skb_unlink(skb, &tbl->proxy_queue);
20e6074e
ED
1397 if (tbl->proxy_redo && netif_running(dev)) {
1398 rcu_read_lock();
f72051b0 1399 tbl->proxy_redo(skb);
20e6074e
ED
1400 rcu_read_unlock();
1401 } else {
f72051b0 1402 kfree_skb(skb);
20e6074e 1403 }
1da177e4
LT
1404
1405 dev_put(dev);
1406 } else if (!sched_next || tdif < sched_next)
1407 sched_next = tdif;
1408 }
1409 del_timer(&tbl->proxy_timer);
1410 if (sched_next)
1411 mod_timer(&tbl->proxy_timer, jiffies + sched_next);
1412 spin_unlock(&tbl->proxy_queue.lock);
1413}
1414
1415void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
1416 struct sk_buff *skb)
1417{
1418 unsigned long now = jiffies;
63862b5b
AH
1419
1420 unsigned long sched_next = now + (prandom_u32() %
1f9248e5 1421 NEIGH_VAR(p, PROXY_DELAY));
1da177e4 1422
1f9248e5 1423 if (tbl->proxy_queue.qlen > NEIGH_VAR(p, PROXY_QLEN)) {
1da177e4
LT
1424 kfree_skb(skb);
1425 return;
1426 }
a61bbcf2
PM
1427
1428 NEIGH_CB(skb)->sched_next = sched_next;
1429 NEIGH_CB(skb)->flags |= LOCALLY_ENQUEUED;
1da177e4
LT
1430
1431 spin_lock(&tbl->proxy_queue.lock);
1432 if (del_timer(&tbl->proxy_timer)) {
1433 if (time_before(tbl->proxy_timer.expires, sched_next))
1434 sched_next = tbl->proxy_timer.expires;
1435 }
adf30907 1436 skb_dst_drop(skb);
1da177e4
LT
1437 dev_hold(skb->dev);
1438 __skb_queue_tail(&tbl->proxy_queue, skb);
1439 mod_timer(&tbl->proxy_timer, sched_next);
1440 spin_unlock(&tbl->proxy_queue.lock);
1441}
0a204500 1442EXPORT_SYMBOL(pneigh_enqueue);
1da177e4 1443
97fd5bc7 1444static inline struct neigh_parms *lookup_neigh_parms(struct neigh_table *tbl,
426b5303
EB
1445 struct net *net, int ifindex)
1446{
1447 struct neigh_parms *p;
1448
75fbfd33 1449 list_for_each_entry(p, &tbl->parms_list, list) {
878628fb 1450 if ((p->dev && p->dev->ifindex == ifindex && net_eq(neigh_parms_net(p), net)) ||
170d6f99 1451 (!p->dev && !ifindex && net_eq(net, &init_net)))
426b5303
EB
1452 return p;
1453 }
1454
1455 return NULL;
1456}
1da177e4
LT
1457
1458struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
1459 struct neigh_table *tbl)
1460{
cf89d6b2 1461 struct neigh_parms *p;
00829823
SH
1462 struct net *net = dev_net(dev);
1463 const struct net_device_ops *ops = dev->netdev_ops;
426b5303 1464
cf89d6b2 1465 p = kmemdup(&tbl->parms, sizeof(*p), GFP_KERNEL);
1da177e4 1466 if (p) {
1da177e4
LT
1467 p->tbl = tbl;
1468 atomic_set(&p->refcnt, 1);
1da177e4 1469 p->reachable_time =
1f9248e5 1470 neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
63134803
VF
1471 dev_hold(dev);
1472 p->dev = dev;
1473 write_pnet(&p->net, hold_net(net));
1474 p->sysctl_table = NULL;
c7fb64db 1475
00829823 1476 if (ops->ndo_neigh_setup && ops->ndo_neigh_setup(dev, p)) {
63134803
VF
1477 release_net(net);
1478 dev_put(dev);
486b51d3
DL
1479 kfree(p);
1480 return NULL;
1da177e4 1481 }
486b51d3 1482
1da177e4 1483 write_lock_bh(&tbl->lock);
75fbfd33 1484 list_add(&p->list, &tbl->parms.list);
1da177e4 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{
1da177e4
LT
1503 if (!parms || parms == &tbl->parms)
1504 return;
1505 write_lock_bh(&tbl->lock);
75fbfd33
ND
1506 list_del(&parms->list);
1507 parms->dead = 1;
1da177e4 1508 write_unlock_bh(&tbl->lock);
75fbfd33
ND
1509 if (parms->dev)
1510 dev_put(parms->dev);
1511 call_rcu(&parms->rcu_head, neigh_rcu_free_parms);
1da177e4 1512}
0a204500 1513EXPORT_SYMBOL(neigh_parms_release);
1da177e4 1514
06f0511d 1515static void neigh_parms_destroy(struct neigh_parms *parms)
1da177e4 1516{
57da52c1 1517 release_net(neigh_parms_net(parms));
1da177e4
LT
1518 kfree(parms);
1519}
1520
c2ecba71
PE
1521static struct lock_class_key neigh_table_proxy_queue_class;
1522
dcd2ba92 1523static void neigh_table_init_no_netlink(struct neigh_table *tbl)
1da177e4
LT
1524{
1525 unsigned long now = jiffies;
1526 unsigned long phsize;
1527
75fbfd33
ND
1528 INIT_LIST_HEAD(&tbl->parms_list);
1529 list_add(&tbl->parms.list, &tbl->parms_list);
e42ea986 1530 write_pnet(&tbl->parms.net, &init_net);
1da177e4 1531 atomic_set(&tbl->parms.refcnt, 1);
1da177e4 1532 tbl->parms.reachable_time =
1f9248e5 1533 neigh_rand_reach_time(NEIGH_VAR(&tbl->parms, BASE_REACHABLE_TIME));
1da177e4 1534
1da177e4
LT
1535 tbl->stats = alloc_percpu(struct neigh_statistics);
1536 if (!tbl->stats)
1537 panic("cannot create neighbour cache statistics");
4ec93edb 1538
1da177e4 1539#ifdef CONFIG_PROC_FS
9b739ba5
AD
1540 if (!proc_create_data(tbl->id, 0, init_net.proc_net_stat,
1541 &neigh_stat_seq_fops, tbl))
1da177e4 1542 panic("cannot create neighbour proc dir entry");
1da177e4
LT
1543#endif
1544
cd089336 1545 RCU_INIT_POINTER(tbl->nht, neigh_hash_alloc(3));
1da177e4
LT
1546
1547 phsize = (PNEIGH_HASHMASK + 1) * sizeof(struct pneigh_entry *);
77d04bd9 1548 tbl->phash_buckets = kzalloc(phsize, GFP_KERNEL);
1da177e4 1549
d6bf7817 1550 if (!tbl->nht || !tbl->phash_buckets)
1da177e4
LT
1551 panic("cannot allocate neighbour cache hashes");
1552
08433eff
YH
1553 if (!tbl->entry_size)
1554 tbl->entry_size = ALIGN(offsetof(struct neighbour, primary_key) +
1555 tbl->key_len, NEIGH_PRIV_ALIGN);
1556 else
1557 WARN_ON(tbl->entry_size % NEIGH_PRIV_ALIGN);
1558
1da177e4 1559 rwlock_init(&tbl->lock);
203b42f7 1560 INIT_DEFERRABLE_WORK(&tbl->gc_work, neigh_periodic_work);
f618002b 1561 queue_delayed_work(system_power_efficient_wq, &tbl->gc_work,
1562 tbl->parms.reachable_time);
b24b8a24 1563 setup_timer(&tbl->proxy_timer, neigh_proxy_process, (unsigned long)tbl);
c2ecba71
PE
1564 skb_queue_head_init_class(&tbl->proxy_queue,
1565 &neigh_table_proxy_queue_class);
1da177e4
LT
1566
1567 tbl->last_flush = now;
1568 tbl->last_rand = now + tbl->parms.reachable_time * 20;
bd89efc5
SK
1569}
1570
1571void neigh_table_init(struct neigh_table *tbl)
1572{
1573 struct neigh_table *tmp;
1574
1575 neigh_table_init_no_netlink(tbl);
1da177e4 1576 write_lock(&neigh_tbl_lock);
bd89efc5
SK
1577 for (tmp = neigh_tables; tmp; tmp = tmp->next) {
1578 if (tmp->family == tbl->family)
1579 break;
1580 }
1da177e4
LT
1581 tbl->next = neigh_tables;
1582 neigh_tables = tbl;
1583 write_unlock(&neigh_tbl_lock);
bd89efc5
SK
1584
1585 if (unlikely(tmp)) {
e005d193
JP
1586 pr_err("Registering multiple tables for family %d\n",
1587 tbl->family);
bd89efc5
SK
1588 dump_stack();
1589 }
1da177e4 1590}
0a204500 1591EXPORT_SYMBOL(neigh_table_init);
1da177e4
LT
1592
1593int neigh_table_clear(struct neigh_table *tbl)
1594{
1595 struct neigh_table **tp;
1596
1597 /* It is not clean... Fix it to unload IPv6 module safely */
a5c30b34 1598 cancel_delayed_work_sync(&tbl->gc_work);
1da177e4
LT
1599 del_timer_sync(&tbl->proxy_timer);
1600 pneigh_queue_purge(&tbl->proxy_queue);
1601 neigh_ifdown(tbl, NULL);
1602 if (atomic_read(&tbl->entries))
e005d193 1603 pr_crit("neighbour leakage\n");
1da177e4
LT
1604 write_lock(&neigh_tbl_lock);
1605 for (tp = &neigh_tables; *tp; tp = &(*tp)->next) {
1606 if (*tp == tbl) {
1607 *tp = tbl->next;
1608 break;
1609 }
1610 }
1611 write_unlock(&neigh_tbl_lock);
1612
6193d2be
ED
1613 call_rcu(&rcu_dereference_protected(tbl->nht, 1)->rcu,
1614 neigh_hash_free_rcu);
d6bf7817 1615 tbl->nht = NULL;
1da177e4
LT
1616
1617 kfree(tbl->phash_buckets);
1618 tbl->phash_buckets = NULL;
1619
3f192b5c
AD
1620 remove_proc_entry(tbl->id, init_net.proc_net_stat);
1621
3fcde74b
KK
1622 free_percpu(tbl->stats);
1623 tbl->stats = NULL;
1624
1da177e4
LT
1625 return 0;
1626}
0a204500 1627EXPORT_SYMBOL(neigh_table_clear);
1da177e4 1628
661d2967 1629static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh)
1da177e4 1630{
3b1e0a65 1631 struct net *net = sock_net(skb->sk);
a14a49d2
TG
1632 struct ndmsg *ndm;
1633 struct nlattr *dst_attr;
1da177e4
LT
1634 struct neigh_table *tbl;
1635 struct net_device *dev = NULL;
a14a49d2 1636 int err = -EINVAL;
1da177e4 1637
110b2499 1638 ASSERT_RTNL();
a14a49d2 1639 if (nlmsg_len(nlh) < sizeof(*ndm))
1da177e4
LT
1640 goto out;
1641
a14a49d2
TG
1642 dst_attr = nlmsg_find_attr(nlh, sizeof(*ndm), NDA_DST);
1643 if (dst_attr == NULL)
1644 goto out;
1645
1646 ndm = nlmsg_data(nlh);
1647 if (ndm->ndm_ifindex) {
110b2499 1648 dev = __dev_get_by_index(net, ndm->ndm_ifindex);
a14a49d2
TG
1649 if (dev == NULL) {
1650 err = -ENODEV;
1651 goto out;
1652 }
1653 }
1654
1da177e4
LT
1655 read_lock(&neigh_tbl_lock);
1656 for (tbl = neigh_tables; tbl; tbl = tbl->next) {
a14a49d2 1657 struct neighbour *neigh;
1da177e4
LT
1658
1659 if (tbl->family != ndm->ndm_family)
1660 continue;
1661 read_unlock(&neigh_tbl_lock);
1662
a14a49d2 1663 if (nla_len(dst_attr) < tbl->key_len)
110b2499 1664 goto out;
1da177e4
LT
1665
1666 if (ndm->ndm_flags & NTF_PROXY) {
426b5303 1667 err = pneigh_delete(tbl, net, nla_data(dst_attr), dev);
110b2499 1668 goto out;
1da177e4
LT
1669 }
1670
a14a49d2 1671 if (dev == NULL)
110b2499 1672 goto out;
1da177e4 1673
a14a49d2
TG
1674 neigh = neigh_lookup(tbl, nla_data(dst_attr), dev);
1675 if (neigh == NULL) {
1676 err = -ENOENT;
110b2499 1677 goto out;
1da177e4 1678 }
a14a49d2
TG
1679
1680 err = neigh_update(neigh, NULL, NUD_FAILED,
1681 NEIGH_UPDATE_F_OVERRIDE |
1682 NEIGH_UPDATE_F_ADMIN);
1683 neigh_release(neigh);
110b2499 1684 goto out;
1da177e4
LT
1685 }
1686 read_unlock(&neigh_tbl_lock);
a14a49d2
TG
1687 err = -EAFNOSUPPORT;
1688
1da177e4
LT
1689out:
1690 return err;
1691}
1692
661d2967 1693static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh)
1da177e4 1694{
3b1e0a65 1695 struct net *net = sock_net(skb->sk);
5208debd
TG
1696 struct ndmsg *ndm;
1697 struct nlattr *tb[NDA_MAX+1];
1da177e4
LT
1698 struct neigh_table *tbl;
1699 struct net_device *dev = NULL;
5208debd 1700 int err;
1da177e4 1701
110b2499 1702 ASSERT_RTNL();
5208debd
TG
1703 err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL);
1704 if (err < 0)
1da177e4
LT
1705 goto out;
1706
5208debd
TG
1707 err = -EINVAL;
1708 if (tb[NDA_DST] == NULL)
1709 goto out;
1710
1711 ndm = nlmsg_data(nlh);
1712 if (ndm->ndm_ifindex) {
110b2499 1713 dev = __dev_get_by_index(net, ndm->ndm_ifindex);
5208debd
TG
1714 if (dev == NULL) {
1715 err = -ENODEV;
1716 goto out;
1717 }
1718
1719 if (tb[NDA_LLADDR] && nla_len(tb[NDA_LLADDR]) < dev->addr_len)
110b2499 1720 goto out;
5208debd
TG
1721 }
1722
1da177e4
LT
1723 read_lock(&neigh_tbl_lock);
1724 for (tbl = neigh_tables; tbl; tbl = tbl->next) {
5208debd
TG
1725 int flags = NEIGH_UPDATE_F_ADMIN | NEIGH_UPDATE_F_OVERRIDE;
1726 struct neighbour *neigh;
1727 void *dst, *lladdr;
1da177e4
LT
1728
1729 if (tbl->family != ndm->ndm_family)
1730 continue;
1731 read_unlock(&neigh_tbl_lock);
1732
5208debd 1733 if (nla_len(tb[NDA_DST]) < tbl->key_len)
110b2499 1734 goto out;
5208debd
TG
1735 dst = nla_data(tb[NDA_DST]);
1736 lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
1da177e4
LT
1737
1738 if (ndm->ndm_flags & NTF_PROXY) {
62dd9318
VN
1739 struct pneigh_entry *pn;
1740
1741 err = -ENOBUFS;
426b5303 1742 pn = pneigh_lookup(tbl, net, dst, dev, 1);
62dd9318
VN
1743 if (pn) {
1744 pn->flags = ndm->ndm_flags;
1745 err = 0;
1746 }
110b2499 1747 goto out;
1da177e4
LT
1748 }
1749
5208debd 1750 if (dev == NULL)
110b2499 1751 goto out;
5208debd
TG
1752
1753 neigh = neigh_lookup(tbl, dst, dev);
1754 if (neigh == NULL) {
1755 if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
1756 err = -ENOENT;
110b2499 1757 goto out;
5208debd 1758 }
4ec93edb 1759
5208debd
TG
1760 neigh = __neigh_lookup_errno(tbl, dst, dev);
1761 if (IS_ERR(neigh)) {
1762 err = PTR_ERR(neigh);
110b2499 1763 goto out;
1da177e4 1764 }
1da177e4 1765 } else {
5208debd
TG
1766 if (nlh->nlmsg_flags & NLM_F_EXCL) {
1767 err = -EEXIST;
1768 neigh_release(neigh);
110b2499 1769 goto out;
1da177e4 1770 }
1da177e4 1771
5208debd
TG
1772 if (!(nlh->nlmsg_flags & NLM_F_REPLACE))
1773 flags &= ~NEIGH_UPDATE_F_OVERRIDE;
1774 }
1da177e4 1775
0c5c2d30
EB
1776 if (ndm->ndm_flags & NTF_USE) {
1777 neigh_event_send(neigh, NULL);
1778 err = 0;
1779 } else
1780 err = neigh_update(neigh, lladdr, ndm->ndm_state, flags);
5208debd 1781 neigh_release(neigh);
110b2499 1782 goto out;
1da177e4
LT
1783 }
1784
1785 read_unlock(&neigh_tbl_lock);
5208debd 1786 err = -EAFNOSUPPORT;
1da177e4
LT
1787out:
1788 return err;
1789}
1790
c7fb64db
TG
1791static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
1792{
ca860fb3
TG
1793 struct nlattr *nest;
1794
1795 nest = nla_nest_start(skb, NDTA_PARMS);
1796 if (nest == NULL)
1797 return -ENOBUFS;
c7fb64db 1798
9a6308d7
DM
1799 if ((parms->dev &&
1800 nla_put_u32(skb, NDTPA_IFINDEX, parms->dev->ifindex)) ||
1801 nla_put_u32(skb, NDTPA_REFCNT, atomic_read(&parms->refcnt)) ||
1f9248e5
JP
1802 nla_put_u32(skb, NDTPA_QUEUE_LENBYTES,
1803 NEIGH_VAR(parms, QUEUE_LEN_BYTES)) ||
9a6308d7
DM
1804 /* approximative value for deprecated QUEUE_LEN (in packets) */
1805 nla_put_u32(skb, NDTPA_QUEUE_LEN,
1f9248e5
JP
1806 NEIGH_VAR(parms, QUEUE_LEN_BYTES) / SKB_TRUESIZE(ETH_FRAME_LEN)) ||
1807 nla_put_u32(skb, NDTPA_PROXY_QLEN, NEIGH_VAR(parms, PROXY_QLEN)) ||
1808 nla_put_u32(skb, NDTPA_APP_PROBES, NEIGH_VAR(parms, APP_PROBES)) ||
1809 nla_put_u32(skb, NDTPA_UCAST_PROBES,
1810 NEIGH_VAR(parms, UCAST_PROBES)) ||
1811 nla_put_u32(skb, NDTPA_MCAST_PROBES,
1812 NEIGH_VAR(parms, MCAST_PROBES)) ||
9a6308d7
DM
1813 nla_put_msecs(skb, NDTPA_REACHABLE_TIME, parms->reachable_time) ||
1814 nla_put_msecs(skb, NDTPA_BASE_REACHABLE_TIME,
1f9248e5
JP
1815 NEIGH_VAR(parms, BASE_REACHABLE_TIME)) ||
1816 nla_put_msecs(skb, NDTPA_GC_STALETIME,
1817 NEIGH_VAR(parms, GC_STALETIME)) ||
9a6308d7 1818 nla_put_msecs(skb, NDTPA_DELAY_PROBE_TIME,
1f9248e5
JP
1819 NEIGH_VAR(parms, DELAY_PROBE_TIME)) ||
1820 nla_put_msecs(skb, NDTPA_RETRANS_TIME,
1821 NEIGH_VAR(parms, RETRANS_TIME)) ||
1822 nla_put_msecs(skb, NDTPA_ANYCAST_DELAY,
1823 NEIGH_VAR(parms, ANYCAST_DELAY)) ||
1824 nla_put_msecs(skb, NDTPA_PROXY_DELAY,
1825 NEIGH_VAR(parms, PROXY_DELAY)) ||
1826 nla_put_msecs(skb, NDTPA_LOCKTIME,
1827 NEIGH_VAR(parms, LOCKTIME)))
9a6308d7 1828 goto nla_put_failure;
ca860fb3 1829 return nla_nest_end(skb, nest);
c7fb64db 1830
ca860fb3 1831nla_put_failure:
bc3ed28c
TG
1832 nla_nest_cancel(skb, nest);
1833 return -EMSGSIZE;
c7fb64db
TG
1834}
1835
ca860fb3
TG
1836static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl,
1837 u32 pid, u32 seq, int type, int flags)
c7fb64db
TG
1838{
1839 struct nlmsghdr *nlh;
1840 struct ndtmsg *ndtmsg;
1841
ca860fb3
TG
1842 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndtmsg), flags);
1843 if (nlh == NULL)
26932566 1844 return -EMSGSIZE;
c7fb64db 1845
ca860fb3 1846 ndtmsg = nlmsg_data(nlh);
c7fb64db
TG
1847
1848 read_lock_bh(&tbl->lock);
1849 ndtmsg->ndtm_family = tbl->family;
9ef1d4c7
PM
1850 ndtmsg->ndtm_pad1 = 0;
1851 ndtmsg->ndtm_pad2 = 0;
c7fb64db 1852
9a6308d7
DM
1853 if (nla_put_string(skb, NDTA_NAME, tbl->id) ||
1854 nla_put_msecs(skb, NDTA_GC_INTERVAL, tbl->gc_interval) ||
1855 nla_put_u32(skb, NDTA_THRESH1, tbl->gc_thresh1) ||
1856 nla_put_u32(skb, NDTA_THRESH2, tbl->gc_thresh2) ||
1857 nla_put_u32(skb, NDTA_THRESH3, tbl->gc_thresh3))
1858 goto nla_put_failure;
c7fb64db
TG
1859 {
1860 unsigned long now = jiffies;
1861 unsigned int flush_delta = now - tbl->last_flush;
1862 unsigned int rand_delta = now - tbl->last_rand;
d6bf7817 1863 struct neigh_hash_table *nht;
c7fb64db
TG
1864 struct ndt_config ndc = {
1865 .ndtc_key_len = tbl->key_len,
1866 .ndtc_entry_size = tbl->entry_size,
1867 .ndtc_entries = atomic_read(&tbl->entries),
1868 .ndtc_last_flush = jiffies_to_msecs(flush_delta),
1869 .ndtc_last_rand = jiffies_to_msecs(rand_delta),
c7fb64db
TG
1870 .ndtc_proxy_qlen = tbl->proxy_queue.qlen,
1871 };
1872
d6bf7817
ED
1873 rcu_read_lock_bh();
1874 nht = rcu_dereference_bh(tbl->nht);
2c2aba6c 1875 ndc.ndtc_hash_rnd = nht->hash_rnd[0];
cd089336 1876 ndc.ndtc_hash_mask = ((1 << nht->hash_shift) - 1);
d6bf7817
ED
1877 rcu_read_unlock_bh();
1878
9a6308d7
DM
1879 if (nla_put(skb, NDTA_CONFIG, sizeof(ndc), &ndc))
1880 goto nla_put_failure;
c7fb64db
TG
1881 }
1882
1883 {
1884 int cpu;
1885 struct ndt_stats ndst;
1886
1887 memset(&ndst, 0, sizeof(ndst));
1888
6f912042 1889 for_each_possible_cpu(cpu) {
c7fb64db
TG
1890 struct neigh_statistics *st;
1891
c7fb64db
TG
1892 st = per_cpu_ptr(tbl->stats, cpu);
1893 ndst.ndts_allocs += st->allocs;
1894 ndst.ndts_destroys += st->destroys;
1895 ndst.ndts_hash_grows += st->hash_grows;
1896 ndst.ndts_res_failed += st->res_failed;
1897 ndst.ndts_lookups += st->lookups;
1898 ndst.ndts_hits += st->hits;
1899 ndst.ndts_rcv_probes_mcast += st->rcv_probes_mcast;
1900 ndst.ndts_rcv_probes_ucast += st->rcv_probes_ucast;
1901 ndst.ndts_periodic_gc_runs += st->periodic_gc_runs;
1902 ndst.ndts_forced_gc_runs += st->forced_gc_runs;
1903 }
1904
9a6308d7
DM
1905 if (nla_put(skb, NDTA_STATS, sizeof(ndst), &ndst))
1906 goto nla_put_failure;
c7fb64db
TG
1907 }
1908
1909 BUG_ON(tbl->parms.dev);
1910 if (neightbl_fill_parms(skb, &tbl->parms) < 0)
ca860fb3 1911 goto nla_put_failure;
c7fb64db
TG
1912
1913 read_unlock_bh(&tbl->lock);
ca860fb3 1914 return nlmsg_end(skb, nlh);
c7fb64db 1915
ca860fb3 1916nla_put_failure:
c7fb64db 1917 read_unlock_bh(&tbl->lock);
26932566
PM
1918 nlmsg_cancel(skb, nlh);
1919 return -EMSGSIZE;
c7fb64db
TG
1920}
1921
ca860fb3
TG
1922static int neightbl_fill_param_info(struct sk_buff *skb,
1923 struct neigh_table *tbl,
c7fb64db 1924 struct neigh_parms *parms,
ca860fb3
TG
1925 u32 pid, u32 seq, int type,
1926 unsigned int flags)
c7fb64db
TG
1927{
1928 struct ndtmsg *ndtmsg;
1929 struct nlmsghdr *nlh;
1930
ca860fb3
TG
1931 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndtmsg), flags);
1932 if (nlh == NULL)
26932566 1933 return -EMSGSIZE;
c7fb64db 1934
ca860fb3 1935 ndtmsg = nlmsg_data(nlh);
c7fb64db
TG
1936
1937 read_lock_bh(&tbl->lock);
1938 ndtmsg->ndtm_family = tbl->family;
9ef1d4c7
PM
1939 ndtmsg->ndtm_pad1 = 0;
1940 ndtmsg->ndtm_pad2 = 0;
c7fb64db 1941
ca860fb3
TG
1942 if (nla_put_string(skb, NDTA_NAME, tbl->id) < 0 ||
1943 neightbl_fill_parms(skb, parms) < 0)
1944 goto errout;
c7fb64db
TG
1945
1946 read_unlock_bh(&tbl->lock);
ca860fb3
TG
1947 return nlmsg_end(skb, nlh);
1948errout:
c7fb64db 1949 read_unlock_bh(&tbl->lock);
26932566
PM
1950 nlmsg_cancel(skb, nlh);
1951 return -EMSGSIZE;
c7fb64db 1952}
4ec93edb 1953
ef7c79ed 1954static const struct nla_policy nl_neightbl_policy[NDTA_MAX+1] = {
6b3f8674
TG
1955 [NDTA_NAME] = { .type = NLA_STRING },
1956 [NDTA_THRESH1] = { .type = NLA_U32 },
1957 [NDTA_THRESH2] = { .type = NLA_U32 },
1958 [NDTA_THRESH3] = { .type = NLA_U32 },
1959 [NDTA_GC_INTERVAL] = { .type = NLA_U64 },
1960 [NDTA_PARMS] = { .type = NLA_NESTED },
1961};
1962
ef7c79ed 1963static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
6b3f8674
TG
1964 [NDTPA_IFINDEX] = { .type = NLA_U32 },
1965 [NDTPA_QUEUE_LEN] = { .type = NLA_U32 },
1966 [NDTPA_PROXY_QLEN] = { .type = NLA_U32 },
1967 [NDTPA_APP_PROBES] = { .type = NLA_U32 },
1968 [NDTPA_UCAST_PROBES] = { .type = NLA_U32 },
1969 [NDTPA_MCAST_PROBES] = { .type = NLA_U32 },
1970 [NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 },
1971 [NDTPA_GC_STALETIME] = { .type = NLA_U64 },
1972 [NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 },
1973 [NDTPA_RETRANS_TIME] = { .type = NLA_U64 },
1974 [NDTPA_ANYCAST_DELAY] = { .type = NLA_U64 },
1975 [NDTPA_PROXY_DELAY] = { .type = NLA_U64 },
1976 [NDTPA_LOCKTIME] = { .type = NLA_U64 },
1977};
1978
661d2967 1979static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh)
c7fb64db 1980{
3b1e0a65 1981 struct net *net = sock_net(skb->sk);
c7fb64db 1982 struct neigh_table *tbl;
6b3f8674
TG
1983 struct ndtmsg *ndtmsg;
1984 struct nlattr *tb[NDTA_MAX+1];
1985 int err;
c7fb64db 1986
6b3f8674
TG
1987 err = nlmsg_parse(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
1988 nl_neightbl_policy);
1989 if (err < 0)
1990 goto errout;
c7fb64db 1991
6b3f8674
TG
1992 if (tb[NDTA_NAME] == NULL) {
1993 err = -EINVAL;
1994 goto errout;
1995 }
1996
1997 ndtmsg = nlmsg_data(nlh);
c7fb64db
TG
1998 read_lock(&neigh_tbl_lock);
1999 for (tbl = neigh_tables; tbl; tbl = tbl->next) {
2000 if (ndtmsg->ndtm_family && tbl->family != ndtmsg->ndtm_family)
2001 continue;
2002
6b3f8674 2003 if (nla_strcmp(tb[NDTA_NAME], tbl->id) == 0)
c7fb64db
TG
2004 break;
2005 }
2006
2007 if (tbl == NULL) {
2008 err = -ENOENT;
6b3f8674 2009 goto errout_locked;
c7fb64db
TG
2010 }
2011
4ec93edb 2012 /*
c7fb64db
TG
2013 * We acquire tbl->lock to be nice to the periodic timers and
2014 * make sure they always see a consistent set of values.
2015 */
2016 write_lock_bh(&tbl->lock);
2017
6b3f8674
TG
2018 if (tb[NDTA_PARMS]) {
2019 struct nlattr *tbp[NDTPA_MAX+1];
c7fb64db 2020 struct neigh_parms *p;
6b3f8674 2021 int i, ifindex = 0;
c7fb64db 2022
6b3f8674
TG
2023 err = nla_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS],
2024 nl_ntbl_parm_policy);
2025 if (err < 0)
2026 goto errout_tbl_lock;
c7fb64db 2027
6b3f8674
TG
2028 if (tbp[NDTPA_IFINDEX])
2029 ifindex = nla_get_u32(tbp[NDTPA_IFINDEX]);
c7fb64db 2030
97fd5bc7 2031 p = lookup_neigh_parms(tbl, net, ifindex);
c7fb64db
TG
2032 if (p == NULL) {
2033 err = -ENOENT;
6b3f8674 2034 goto errout_tbl_lock;
c7fb64db 2035 }
c7fb64db 2036
6b3f8674
TG
2037 for (i = 1; i <= NDTPA_MAX; i++) {
2038 if (tbp[i] == NULL)
2039 continue;
c7fb64db 2040
6b3f8674
TG
2041 switch (i) {
2042 case NDTPA_QUEUE_LEN:
1f9248e5
JP
2043 NEIGH_VAR_SET(p, QUEUE_LEN_BYTES,
2044 nla_get_u32(tbp[i]) *
2045 SKB_TRUESIZE(ETH_FRAME_LEN));
8b5c171b
ED
2046 break;
2047 case NDTPA_QUEUE_LENBYTES:
1f9248e5
JP
2048 NEIGH_VAR_SET(p, QUEUE_LEN_BYTES,
2049 nla_get_u32(tbp[i]));
6b3f8674
TG
2050 break;
2051 case NDTPA_PROXY_QLEN:
1f9248e5
JP
2052 NEIGH_VAR_SET(p, PROXY_QLEN,
2053 nla_get_u32(tbp[i]));
6b3f8674
TG
2054 break;
2055 case NDTPA_APP_PROBES:
1f9248e5
JP
2056 NEIGH_VAR_SET(p, APP_PROBES,
2057 nla_get_u32(tbp[i]));
6b3f8674
TG
2058 break;
2059 case NDTPA_UCAST_PROBES:
1f9248e5
JP
2060 NEIGH_VAR_SET(p, UCAST_PROBES,
2061 nla_get_u32(tbp[i]));
6b3f8674
TG
2062 break;
2063 case NDTPA_MCAST_PROBES:
1f9248e5
JP
2064 NEIGH_VAR_SET(p, MCAST_PROBES,
2065 nla_get_u32(tbp[i]));
6b3f8674
TG
2066 break;
2067 case NDTPA_BASE_REACHABLE_TIME:
1f9248e5
JP
2068 NEIGH_VAR_SET(p, BASE_REACHABLE_TIME,
2069 nla_get_msecs(tbp[i]));
6b3f8674
TG
2070 break;
2071 case NDTPA_GC_STALETIME:
1f9248e5
JP
2072 NEIGH_VAR_SET(p, GC_STALETIME,
2073 nla_get_msecs(tbp[i]));
6b3f8674
TG
2074 break;
2075 case NDTPA_DELAY_PROBE_TIME:
1f9248e5
JP
2076 NEIGH_VAR_SET(p, DELAY_PROBE_TIME,
2077 nla_get_msecs(tbp[i]));
6b3f8674
TG
2078 break;
2079 case NDTPA_RETRANS_TIME:
1f9248e5
JP
2080 NEIGH_VAR_SET(p, RETRANS_TIME,
2081 nla_get_msecs(tbp[i]));
6b3f8674
TG
2082 break;
2083 case NDTPA_ANYCAST_DELAY:
3977458c
JP
2084 NEIGH_VAR_SET(p, ANYCAST_DELAY,
2085 nla_get_msecs(tbp[i]));
6b3f8674
TG
2086 break;
2087 case NDTPA_PROXY_DELAY:
3977458c
JP
2088 NEIGH_VAR_SET(p, PROXY_DELAY,
2089 nla_get_msecs(tbp[i]));
6b3f8674
TG
2090 break;
2091 case NDTPA_LOCKTIME:
3977458c
JP
2092 NEIGH_VAR_SET(p, LOCKTIME,
2093 nla_get_msecs(tbp[i]));
6b3f8674
TG
2094 break;
2095 }
2096 }
2097 }
c7fb64db 2098
dc25c676
G
2099 err = -ENOENT;
2100 if ((tb[NDTA_THRESH1] || tb[NDTA_THRESH2] ||
2101 tb[NDTA_THRESH3] || tb[NDTA_GC_INTERVAL]) &&
2102 !net_eq(net, &init_net))
2103 goto errout_tbl_lock;
2104
6b3f8674
TG
2105 if (tb[NDTA_THRESH1])
2106 tbl->gc_thresh1 = nla_get_u32(tb[NDTA_THRESH1]);
c7fb64db 2107
6b3f8674
TG
2108 if (tb[NDTA_THRESH2])
2109 tbl->gc_thresh2 = nla_get_u32(tb[NDTA_THRESH2]);
c7fb64db 2110
6b3f8674
TG
2111 if (tb[NDTA_THRESH3])
2112 tbl->gc_thresh3 = nla_get_u32(tb[NDTA_THRESH3]);
c7fb64db 2113
6b3f8674
TG
2114 if (tb[NDTA_GC_INTERVAL])
2115 tbl->gc_interval = nla_get_msecs(tb[NDTA_GC_INTERVAL]);
c7fb64db
TG
2116
2117 err = 0;
2118
6b3f8674 2119errout_tbl_lock:
c7fb64db 2120 write_unlock_bh(&tbl->lock);
6b3f8674 2121errout_locked:
c7fb64db 2122 read_unlock(&neigh_tbl_lock);
6b3f8674 2123errout:
c7fb64db
TG
2124 return err;
2125}
2126
c8822a4e 2127static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
c7fb64db 2128{
3b1e0a65 2129 struct net *net = sock_net(skb->sk);
ca860fb3
TG
2130 int family, tidx, nidx = 0;
2131 int tbl_skip = cb->args[0];
2132 int neigh_skip = cb->args[1];
c7fb64db
TG
2133 struct neigh_table *tbl;
2134
ca860fb3 2135 family = ((struct rtgenmsg *) nlmsg_data(cb->nlh))->rtgen_family;
c7fb64db
TG
2136
2137 read_lock(&neigh_tbl_lock);
ca860fb3 2138 for (tbl = neigh_tables, tidx = 0; tbl; tbl = tbl->next, tidx++) {
c7fb64db
TG
2139 struct neigh_parms *p;
2140
ca860fb3 2141 if (tidx < tbl_skip || (family && tbl->family != family))
c7fb64db
TG
2142 continue;
2143
15e47304 2144 if (neightbl_fill_info(skb, tbl, NETLINK_CB(cb->skb).portid,
ca860fb3
TG
2145 cb->nlh->nlmsg_seq, RTM_NEWNEIGHTBL,
2146 NLM_F_MULTI) <= 0)
c7fb64db
TG
2147 break;
2148
75fbfd33
ND
2149 nidx = 0;
2150 p = list_next_entry(&tbl->parms, list);
2151 list_for_each_entry_from(p, &tbl->parms_list, list) {
878628fb 2152 if (!net_eq(neigh_parms_net(p), net))
426b5303
EB
2153 continue;
2154
efc683fc
GK
2155 if (nidx < neigh_skip)
2156 goto next;
c7fb64db 2157
ca860fb3 2158 if (neightbl_fill_param_info(skb, tbl, p,
15e47304 2159 NETLINK_CB(cb->skb).portid,
ca860fb3
TG
2160 cb->nlh->nlmsg_seq,
2161 RTM_NEWNEIGHTBL,
2162 NLM_F_MULTI) <= 0)
c7fb64db 2163 goto out;
efc683fc
GK
2164 next:
2165 nidx++;
c7fb64db
TG
2166 }
2167
ca860fb3 2168 neigh_skip = 0;
c7fb64db
TG
2169 }
2170out:
2171 read_unlock(&neigh_tbl_lock);
ca860fb3
TG
2172 cb->args[0] = tidx;
2173 cb->args[1] = nidx;
c7fb64db
TG
2174
2175 return skb->len;
2176}
1da177e4 2177
8b8aec50
TG
2178static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh,
2179 u32 pid, u32 seq, int type, unsigned int flags)
1da177e4
LT
2180{
2181 unsigned long now = jiffies;
1da177e4 2182 struct nda_cacheinfo ci;
8b8aec50
TG
2183 struct nlmsghdr *nlh;
2184 struct ndmsg *ndm;
2185
2186 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
2187 if (nlh == NULL)
26932566 2188 return -EMSGSIZE;
1da177e4 2189
8b8aec50
TG
2190 ndm = nlmsg_data(nlh);
2191 ndm->ndm_family = neigh->ops->family;
9ef1d4c7
PM
2192 ndm->ndm_pad1 = 0;
2193 ndm->ndm_pad2 = 0;
8b8aec50
TG
2194 ndm->ndm_flags = neigh->flags;
2195 ndm->ndm_type = neigh->type;
2196 ndm->ndm_ifindex = neigh->dev->ifindex;
1da177e4 2197
9a6308d7
DM
2198 if (nla_put(skb, NDA_DST, neigh->tbl->key_len, neigh->primary_key))
2199 goto nla_put_failure;
8b8aec50
TG
2200
2201 read_lock_bh(&neigh->lock);
2202 ndm->ndm_state = neigh->nud_state;
0ed8ddf4
ED
2203 if (neigh->nud_state & NUD_VALID) {
2204 char haddr[MAX_ADDR_LEN];
2205
2206 neigh_ha_snapshot(haddr, neigh, neigh->dev);
2207 if (nla_put(skb, NDA_LLADDR, neigh->dev->addr_len, haddr) < 0) {
2208 read_unlock_bh(&neigh->lock);
2209 goto nla_put_failure;
2210 }
8b8aec50
TG
2211 }
2212
b9f5f52c
SH
2213 ci.ndm_used = jiffies_to_clock_t(now - neigh->used);
2214 ci.ndm_confirmed = jiffies_to_clock_t(now - neigh->confirmed);
2215 ci.ndm_updated = jiffies_to_clock_t(now - neigh->updated);
8b8aec50
TG
2216 ci.ndm_refcnt = atomic_read(&neigh->refcnt) - 1;
2217 read_unlock_bh(&neigh->lock);
2218
9a6308d7
DM
2219 if (nla_put_u32(skb, NDA_PROBES, atomic_read(&neigh->probes)) ||
2220 nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
2221 goto nla_put_failure;
8b8aec50
TG
2222
2223 return nlmsg_end(skb, nlh);
2224
2225nla_put_failure:
26932566
PM
2226 nlmsg_cancel(skb, nlh);
2227 return -EMSGSIZE;
1da177e4
LT
2228}
2229
84920c14
TZ
2230static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn,
2231 u32 pid, u32 seq, int type, unsigned int flags,
2232 struct neigh_table *tbl)
2233{
2234 struct nlmsghdr *nlh;
2235 struct ndmsg *ndm;
2236
2237 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
2238 if (nlh == NULL)
2239 return -EMSGSIZE;
2240
2241 ndm = nlmsg_data(nlh);
2242 ndm->ndm_family = tbl->family;
2243 ndm->ndm_pad1 = 0;
2244 ndm->ndm_pad2 = 0;
2245 ndm->ndm_flags = pn->flags | NTF_PROXY;
545469f7 2246 ndm->ndm_type = RTN_UNICAST;
84920c14
TZ
2247 ndm->ndm_ifindex = pn->dev->ifindex;
2248 ndm->ndm_state = NUD_NONE;
2249
9a6308d7
DM
2250 if (nla_put(skb, NDA_DST, tbl->key_len, pn->key))
2251 goto nla_put_failure;
84920c14
TZ
2252
2253 return nlmsg_end(skb, nlh);
2254
2255nla_put_failure:
2256 nlmsg_cancel(skb, nlh);
2257 return -EMSGSIZE;
2258}
2259
d961db35
TG
2260static void neigh_update_notify(struct neighbour *neigh)
2261{
2262 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
2263 __neigh_notify(neigh, RTM_NEWNEIGH, 0);
2264}
1da177e4
LT
2265
2266static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
2267 struct netlink_callback *cb)
2268{
767e97e1 2269 struct net *net = sock_net(skb->sk);
1da177e4
LT
2270 struct neighbour *n;
2271 int rc, h, s_h = cb->args[1];
2272 int idx, s_idx = idx = cb->args[2];
d6bf7817 2273 struct neigh_hash_table *nht;
1da177e4 2274
d6bf7817
ED
2275 rcu_read_lock_bh();
2276 nht = rcu_dereference_bh(tbl->nht);
2277
4bd6683b 2278 for (h = s_h; h < (1 << nht->hash_shift); h++) {
1da177e4
LT
2279 if (h > s_h)
2280 s_idx = 0;
767e97e1
ED
2281 for (n = rcu_dereference_bh(nht->hash_buckets[h]), idx = 0;
2282 n != NULL;
2283 n = rcu_dereference_bh(n->next)) {
09ad9bc7 2284 if (!net_eq(dev_net(n->dev), net))
426b5303 2285 continue;
efc683fc
GK
2286 if (idx < s_idx)
2287 goto next;
15e47304 2288 if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid,
1da177e4 2289 cb->nlh->nlmsg_seq,
b6544c0b
JHS
2290 RTM_NEWNEIGH,
2291 NLM_F_MULTI) <= 0) {
1da177e4
LT
2292 rc = -1;
2293 goto out;
2294 }
767e97e1 2295next:
efc683fc 2296 idx++;
1da177e4 2297 }
1da177e4
LT
2298 }
2299 rc = skb->len;
2300out:
d6bf7817 2301 rcu_read_unlock_bh();
1da177e4
LT
2302 cb->args[1] = h;
2303 cb->args[2] = idx;
2304 return rc;
2305}
2306
84920c14
TZ
2307static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
2308 struct netlink_callback *cb)
2309{
2310 struct pneigh_entry *n;
2311 struct net *net = sock_net(skb->sk);
2312 int rc, h, s_h = cb->args[3];
2313 int idx, s_idx = idx = cb->args[4];
2314
2315 read_lock_bh(&tbl->lock);
2316
4bd6683b 2317 for (h = s_h; h <= PNEIGH_HASHMASK; h++) {
84920c14
TZ
2318 if (h > s_h)
2319 s_idx = 0;
2320 for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) {
2321 if (dev_net(n->dev) != net)
2322 continue;
2323 if (idx < s_idx)
2324 goto next;
15e47304 2325 if (pneigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid,
84920c14
TZ
2326 cb->nlh->nlmsg_seq,
2327 RTM_NEWNEIGH,
2328 NLM_F_MULTI, tbl) <= 0) {
2329 read_unlock_bh(&tbl->lock);
2330 rc = -1;
2331 goto out;
2332 }
2333 next:
2334 idx++;
2335 }
2336 }
2337
2338 read_unlock_bh(&tbl->lock);
2339 rc = skb->len;
2340out:
2341 cb->args[3] = h;
2342 cb->args[4] = idx;
2343 return rc;
2344
2345}
2346
c8822a4e 2347static int neigh_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
1da177e4
LT
2348{
2349 struct neigh_table *tbl;
2350 int t, family, s_t;
84920c14 2351 int proxy = 0;
4bd6683b 2352 int err;
1da177e4
LT
2353
2354 read_lock(&neigh_tbl_lock);
8b8aec50 2355 family = ((struct rtgenmsg *) nlmsg_data(cb->nlh))->rtgen_family;
84920c14
TZ
2356
2357 /* check for full ndmsg structure presence, family member is
2358 * the same for both structures
2359 */
2360 if (nlmsg_len(cb->nlh) >= sizeof(struct ndmsg) &&
2361 ((struct ndmsg *) nlmsg_data(cb->nlh))->ndm_flags == NTF_PROXY)
2362 proxy = 1;
2363
1da177e4
LT
2364 s_t = cb->args[0];
2365
4bd6683b 2366 for (tbl = neigh_tables, t = 0; tbl;
84920c14 2367 tbl = tbl->next, t++) {
1da177e4
LT
2368 if (t < s_t || (family && tbl->family != family))
2369 continue;
2370 if (t > s_t)
2371 memset(&cb->args[1], 0, sizeof(cb->args) -
2372 sizeof(cb->args[0]));
84920c14
TZ
2373 if (proxy)
2374 err = pneigh_dump_table(tbl, skb, cb);
2375 else
2376 err = neigh_dump_table(tbl, skb, cb);
4bd6683b
ED
2377 if (err < 0)
2378 break;
1da177e4
LT
2379 }
2380 read_unlock(&neigh_tbl_lock);
2381
2382 cb->args[0] = t;
2383 return skb->len;
2384}
2385
2386void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie)
2387{
2388 int chain;
d6bf7817 2389 struct neigh_hash_table *nht;
1da177e4 2390
d6bf7817
ED
2391 rcu_read_lock_bh();
2392 nht = rcu_dereference_bh(tbl->nht);
2393
767e97e1 2394 read_lock(&tbl->lock); /* avoid resizes */
cd089336 2395 for (chain = 0; chain < (1 << nht->hash_shift); chain++) {
1da177e4
LT
2396 struct neighbour *n;
2397
767e97e1
ED
2398 for (n = rcu_dereference_bh(nht->hash_buckets[chain]);
2399 n != NULL;
2400 n = rcu_dereference_bh(n->next))
1da177e4
LT
2401 cb(n, cookie);
2402 }
d6bf7817
ED
2403 read_unlock(&tbl->lock);
2404 rcu_read_unlock_bh();
1da177e4
LT
2405}
2406EXPORT_SYMBOL(neigh_for_each);
2407
2408/* The tbl->lock must be held as a writer and BH disabled. */
2409void __neigh_for_each_release(struct neigh_table *tbl,
2410 int (*cb)(struct neighbour *))
2411{
2412 int chain;
d6bf7817 2413 struct neigh_hash_table *nht;
1da177e4 2414
d6bf7817
ED
2415 nht = rcu_dereference_protected(tbl->nht,
2416 lockdep_is_held(&tbl->lock));
cd089336 2417 for (chain = 0; chain < (1 << nht->hash_shift); chain++) {
767e97e1
ED
2418 struct neighbour *n;
2419 struct neighbour __rcu **np;
1da177e4 2420
d6bf7817 2421 np = &nht->hash_buckets[chain];
767e97e1
ED
2422 while ((n = rcu_dereference_protected(*np,
2423 lockdep_is_held(&tbl->lock))) != NULL) {
1da177e4
LT
2424 int release;
2425
2426 write_lock(&n->lock);
2427 release = cb(n);
2428 if (release) {
767e97e1
ED
2429 rcu_assign_pointer(*np,
2430 rcu_dereference_protected(n->next,
2431 lockdep_is_held(&tbl->lock)));
1da177e4
LT
2432 n->dead = 1;
2433 } else
2434 np = &n->next;
2435 write_unlock(&n->lock);
4f494554
TG
2436 if (release)
2437 neigh_cleanup_and_release(n);
1da177e4
LT
2438 }
2439 }
2440}
2441EXPORT_SYMBOL(__neigh_for_each_release);
2442
2443#ifdef CONFIG_PROC_FS
2444
2445static struct neighbour *neigh_get_first(struct seq_file *seq)
2446{
2447 struct neigh_seq_state *state = seq->private;
1218854a 2448 struct net *net = seq_file_net(seq);
d6bf7817 2449 struct neigh_hash_table *nht = state->nht;
1da177e4
LT
2450 struct neighbour *n = NULL;
2451 int bucket = state->bucket;
2452
2453 state->flags &= ~NEIGH_SEQ_IS_PNEIGH;
cd089336 2454 for (bucket = 0; bucket < (1 << nht->hash_shift); bucket++) {
767e97e1 2455 n = rcu_dereference_bh(nht->hash_buckets[bucket]);
1da177e4
LT
2456
2457 while (n) {
878628fb 2458 if (!net_eq(dev_net(n->dev), net))
426b5303 2459 goto next;
1da177e4
LT
2460 if (state->neigh_sub_iter) {
2461 loff_t fakep = 0;
2462 void *v;
2463
2464 v = state->neigh_sub_iter(state, n, &fakep);
2465 if (!v)
2466 goto next;
2467 }
2468 if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))
2469 break;
2470 if (n->nud_state & ~NUD_NOARP)
2471 break;
767e97e1
ED
2472next:
2473 n = rcu_dereference_bh(n->next);
1da177e4
LT
2474 }
2475
2476 if (n)
2477 break;
2478 }
2479 state->bucket = bucket;
2480
2481 return n;
2482}
2483
2484static struct neighbour *neigh_get_next(struct seq_file *seq,
2485 struct neighbour *n,
2486 loff_t *pos)
2487{
2488 struct neigh_seq_state *state = seq->private;
1218854a 2489 struct net *net = seq_file_net(seq);
d6bf7817 2490 struct neigh_hash_table *nht = state->nht;
1da177e4
LT
2491
2492 if (state->neigh_sub_iter) {
2493 void *v = state->neigh_sub_iter(state, n, pos);
2494 if (v)
2495 return n;
2496 }
767e97e1 2497 n = rcu_dereference_bh(n->next);
1da177e4
LT
2498
2499 while (1) {
2500 while (n) {
878628fb 2501 if (!net_eq(dev_net(n->dev), net))
426b5303 2502 goto next;
1da177e4
LT
2503 if (state->neigh_sub_iter) {
2504 void *v = state->neigh_sub_iter(state, n, pos);
2505 if (v)
2506 return n;
2507 goto next;
2508 }
2509 if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))
2510 break;
2511
2512 if (n->nud_state & ~NUD_NOARP)
2513 break;
767e97e1
ED
2514next:
2515 n = rcu_dereference_bh(n->next);
1da177e4
LT
2516 }
2517
2518 if (n)
2519 break;
2520
cd089336 2521 if (++state->bucket >= (1 << nht->hash_shift))
1da177e4
LT
2522 break;
2523
767e97e1 2524 n = rcu_dereference_bh(nht->hash_buckets[state->bucket]);
1da177e4
LT
2525 }
2526
2527 if (n && pos)
2528 --(*pos);
2529 return n;
2530}
2531
2532static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos)
2533{
2534 struct neighbour *n = neigh_get_first(seq);
2535
2536 if (n) {
745e2031 2537 --(*pos);
1da177e4
LT
2538 while (*pos) {
2539 n = neigh_get_next(seq, n, pos);
2540 if (!n)
2541 break;
2542 }
2543 }
2544 return *pos ? NULL : n;
2545}
2546
2547static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
2548{
2549 struct neigh_seq_state *state = seq->private;
1218854a 2550 struct net *net = seq_file_net(seq);
1da177e4
LT
2551 struct neigh_table *tbl = state->tbl;
2552 struct pneigh_entry *pn = NULL;
2553 int bucket = state->bucket;
2554
2555 state->flags |= NEIGH_SEQ_IS_PNEIGH;
2556 for (bucket = 0; bucket <= PNEIGH_HASHMASK; bucket++) {
2557 pn = tbl->phash_buckets[bucket];
878628fb 2558 while (pn && !net_eq(pneigh_net(pn), net))
426b5303 2559 pn = pn->next;
1da177e4
LT
2560 if (pn)
2561 break;
2562 }
2563 state->bucket = bucket;
2564
2565 return pn;
2566}
2567
2568static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
2569 struct pneigh_entry *pn,
2570 loff_t *pos)
2571{
2572 struct neigh_seq_state *state = seq->private;
1218854a 2573 struct net *net = seq_file_net(seq);
1da177e4
LT
2574 struct neigh_table *tbl = state->tbl;
2575
df07a94c
JBD
2576 do {
2577 pn = pn->next;
2578 } while (pn && !net_eq(pneigh_net(pn), net));
2579
1da177e4
LT
2580 while (!pn) {
2581 if (++state->bucket > PNEIGH_HASHMASK)
2582 break;
2583 pn = tbl->phash_buckets[state->bucket];
878628fb 2584 while (pn && !net_eq(pneigh_net(pn), net))
426b5303 2585 pn = pn->next;
1da177e4
LT
2586 if (pn)
2587 break;
2588 }
2589
2590 if (pn && pos)
2591 --(*pos);
2592
2593 return pn;
2594}
2595
2596static struct pneigh_entry *pneigh_get_idx(struct seq_file *seq, loff_t *pos)
2597{
2598 struct pneigh_entry *pn = pneigh_get_first(seq);
2599
2600 if (pn) {
745e2031 2601 --(*pos);
1da177e4
LT
2602 while (*pos) {
2603 pn = pneigh_get_next(seq, pn, pos);
2604 if (!pn)
2605 break;
2606 }
2607 }
2608 return *pos ? NULL : pn;
2609}
2610
2611static void *neigh_get_idx_any(struct seq_file *seq, loff_t *pos)
2612{
2613 struct neigh_seq_state *state = seq->private;
2614 void *rc;
745e2031 2615 loff_t idxpos = *pos;
1da177e4 2616
745e2031 2617 rc = neigh_get_idx(seq, &idxpos);
1da177e4 2618 if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY))
745e2031 2619 rc = pneigh_get_idx(seq, &idxpos);
1da177e4
LT
2620
2621 return rc;
2622}
2623
2624void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags)
d6bf7817 2625 __acquires(rcu_bh)
1da177e4
LT
2626{
2627 struct neigh_seq_state *state = seq->private;
1da177e4
LT
2628
2629 state->tbl = tbl;
2630 state->bucket = 0;
2631 state->flags = (neigh_seq_flags & ~NEIGH_SEQ_IS_PNEIGH);
2632
d6bf7817
ED
2633 rcu_read_lock_bh();
2634 state->nht = rcu_dereference_bh(tbl->nht);
767e97e1 2635
745e2031 2636 return *pos ? neigh_get_idx_any(seq, pos) : SEQ_START_TOKEN;
1da177e4
LT
2637}
2638EXPORT_SYMBOL(neigh_seq_start);
2639
2640void *neigh_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2641{
2642 struct neigh_seq_state *state;
2643 void *rc;
2644
2645 if (v == SEQ_START_TOKEN) {
bff69732 2646 rc = neigh_get_first(seq);
1da177e4
LT
2647 goto out;
2648 }
2649
2650 state = seq->private;
2651 if (!(state->flags & NEIGH_SEQ_IS_PNEIGH)) {
2652 rc = neigh_get_next(seq, v, NULL);
2653 if (rc)
2654 goto out;
2655 if (!(state->flags & NEIGH_SEQ_NEIGH_ONLY))
2656 rc = pneigh_get_first(seq);
2657 } else {
2658 BUG_ON(state->flags & NEIGH_SEQ_NEIGH_ONLY);
2659 rc = pneigh_get_next(seq, v, NULL);
2660 }
2661out:
2662 ++(*pos);
2663 return rc;
2664}
2665EXPORT_SYMBOL(neigh_seq_next);
2666
2667void neigh_seq_stop(struct seq_file *seq, void *v)
d6bf7817 2668 __releases(rcu_bh)
1da177e4 2669{
d6bf7817 2670 rcu_read_unlock_bh();
1da177e4
LT
2671}
2672EXPORT_SYMBOL(neigh_seq_stop);
2673
2674/* statistics via seq_file */
2675
2676static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos)
2677{
81c1ebfc 2678 struct neigh_table *tbl = seq->private;
1da177e4
LT
2679 int cpu;
2680
2681 if (*pos == 0)
2682 return SEQ_START_TOKEN;
4ec93edb 2683
0f23174a 2684 for (cpu = *pos-1; cpu < nr_cpu_ids; ++cpu) {
1da177e4
LT
2685 if (!cpu_possible(cpu))
2686 continue;
2687 *pos = cpu+1;
2688 return per_cpu_ptr(tbl->stats, cpu);
2689 }
2690 return NULL;
2691}
2692
2693static void *neigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2694{
81c1ebfc 2695 struct neigh_table *tbl = seq->private;
1da177e4
LT
2696 int cpu;
2697
0f23174a 2698 for (cpu = *pos; cpu < nr_cpu_ids; ++cpu) {
1da177e4
LT
2699 if (!cpu_possible(cpu))
2700 continue;
2701 *pos = cpu+1;
2702 return per_cpu_ptr(tbl->stats, cpu);
2703 }
2704 return NULL;
2705}
2706
2707static void neigh_stat_seq_stop(struct seq_file *seq, void *v)
2708{
2709
2710}
2711
2712static int neigh_stat_seq_show(struct seq_file *seq, void *v)
2713{
81c1ebfc 2714 struct neigh_table *tbl = seq->private;
1da177e4
LT
2715 struct neigh_statistics *st = v;
2716
2717 if (v == SEQ_START_TOKEN) {
9a6d276e 2718 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
2719 return 0;
2720 }
2721
2722 seq_printf(seq, "%08x %08lx %08lx %08lx %08lx %08lx %08lx "
9a6d276e 2723 "%08lx %08lx %08lx %08lx %08lx\n",
1da177e4
LT
2724 atomic_read(&tbl->entries),
2725
2726 st->allocs,
2727 st->destroys,
2728 st->hash_grows,
2729
2730 st->lookups,
2731 st->hits,
2732
2733 st->res_failed,
2734
2735 st->rcv_probes_mcast,
2736 st->rcv_probes_ucast,
2737
2738 st->periodic_gc_runs,
9a6d276e
NH
2739 st->forced_gc_runs,
2740 st->unres_discards
1da177e4
LT
2741 );
2742
2743 return 0;
2744}
2745
f690808e 2746static const struct seq_operations neigh_stat_seq_ops = {
1da177e4
LT
2747 .start = neigh_stat_seq_start,
2748 .next = neigh_stat_seq_next,
2749 .stop = neigh_stat_seq_stop,
2750 .show = neigh_stat_seq_show,
2751};
2752
2753static int neigh_stat_seq_open(struct inode *inode, struct file *file)
2754{
2755 int ret = seq_open(file, &neigh_stat_seq_ops);
2756
2757 if (!ret) {
2758 struct seq_file *sf = file->private_data;
d9dda78b 2759 sf->private = PDE_DATA(inode);
1da177e4
LT
2760 }
2761 return ret;
2762};
2763
9a32144e 2764static const struct file_operations neigh_stat_seq_fops = {
1da177e4
LT
2765 .owner = THIS_MODULE,
2766 .open = neigh_stat_seq_open,
2767 .read = seq_read,
2768 .llseek = seq_lseek,
2769 .release = seq_release,
2770};
2771
2772#endif /* CONFIG_PROC_FS */
2773
339bf98f
TG
2774static inline size_t neigh_nlmsg_size(void)
2775{
2776 return NLMSG_ALIGN(sizeof(struct ndmsg))
2777 + nla_total_size(MAX_ADDR_LEN) /* NDA_DST */
2778 + nla_total_size(MAX_ADDR_LEN) /* NDA_LLADDR */
2779 + nla_total_size(sizeof(struct nda_cacheinfo))
2780 + nla_total_size(4); /* NDA_PROBES */
2781}
2782
b8673311 2783static void __neigh_notify(struct neighbour *n, int type, int flags)
1da177e4 2784{
c346dca1 2785 struct net *net = dev_net(n->dev);
8b8aec50 2786 struct sk_buff *skb;
b8673311 2787 int err = -ENOBUFS;
1da177e4 2788
339bf98f 2789 skb = nlmsg_new(neigh_nlmsg_size(), GFP_ATOMIC);
8b8aec50 2790 if (skb == NULL)
b8673311 2791 goto errout;
1da177e4 2792
b8673311 2793 err = neigh_fill_info(skb, n, 0, 0, type, flags);
26932566
PM
2794 if (err < 0) {
2795 /* -EMSGSIZE implies BUG in neigh_nlmsg_size() */
2796 WARN_ON(err == -EMSGSIZE);
2797 kfree_skb(skb);
2798 goto errout;
2799 }
1ce85fe4
PNA
2800 rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
2801 return;
b8673311
TG
2802errout:
2803 if (err < 0)
426b5303 2804 rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
1da177e4
LT
2805}
2806
b8673311 2807void neigh_app_ns(struct neighbour *n)
1da177e4 2808{
b8673311
TG
2809 __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST);
2810}
0a204500 2811EXPORT_SYMBOL(neigh_app_ns);
1da177e4
LT
2812
2813#ifdef CONFIG_SYSCTL
b93196dc 2814static int zero;
555445cd 2815static int int_max = INT_MAX;
b93196dc 2816static int unres_qlen_max = INT_MAX / SKB_TRUESIZE(ETH_FRAME_LEN);
1da177e4 2817
fe2c6338
JP
2818static int proc_unres_qlen(struct ctl_table *ctl, int write,
2819 void __user *buffer, size_t *lenp, loff_t *ppos)
8b5c171b
ED
2820{
2821 int size, ret;
fe2c6338 2822 struct ctl_table tmp = *ctl;
8b5c171b 2823
ce46cc64
SW
2824 tmp.extra1 = &zero;
2825 tmp.extra2 = &unres_qlen_max;
8b5c171b 2826 tmp.data = &size;
ce46cc64
SW
2827
2828 size = *(int *)ctl->data / SKB_TRUESIZE(ETH_FRAME_LEN);
2829 ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
2830
8b5c171b
ED
2831 if (write && !ret)
2832 *(int *)ctl->data = size * SKB_TRUESIZE(ETH_FRAME_LEN);
2833 return ret;
2834}
2835
1d4c8c29
JP
2836static struct neigh_parms *neigh_get_dev_parms_rcu(struct net_device *dev,
2837 int family)
2838{
bba24896
JP
2839 switch (family) {
2840 case AF_INET:
1d4c8c29 2841 return __in_dev_arp_parms_get_rcu(dev);
bba24896
JP
2842 case AF_INET6:
2843 return __in6_dev_nd_parms_get_rcu(dev);
2844 }
1d4c8c29
JP
2845 return NULL;
2846}
2847
2848static void neigh_copy_dflt_parms(struct net *net, struct neigh_parms *p,
2849 int index)
2850{
2851 struct net_device *dev;
2852 int family = neigh_parms_family(p);
2853
2854 rcu_read_lock();
2855 for_each_netdev_rcu(net, dev) {
2856 struct neigh_parms *dst_p =
2857 neigh_get_dev_parms_rcu(dev, family);
2858
2859 if (dst_p && !test_bit(index, dst_p->data_state))
2860 dst_p->data[index] = p->data[index];
2861 }
2862 rcu_read_unlock();
2863}
2864
2865static void neigh_proc_update(struct ctl_table *ctl, int write)
2866{
2867 struct net_device *dev = ctl->extra1;
2868 struct neigh_parms *p = ctl->extra2;
77d47afb 2869 struct net *net = neigh_parms_net(p);
1d4c8c29
JP
2870 int index = (int *) ctl->data - p->data;
2871
2872 if (!write)
2873 return;
2874
2875 set_bit(index, p->data_state);
2876 if (!dev) /* NULL dev means this is default value */
2877 neigh_copy_dflt_parms(net, p, index);
2878}
2879
1f9248e5
JP
2880static int neigh_proc_dointvec_zero_intmax(struct ctl_table *ctl, int write,
2881 void __user *buffer,
2882 size_t *lenp, loff_t *ppos)
2883{
2884 struct ctl_table tmp = *ctl;
1d4c8c29 2885 int ret;
1f9248e5
JP
2886
2887 tmp.extra1 = &zero;
2888 tmp.extra2 = &int_max;
2889
1d4c8c29
JP
2890 ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
2891 neigh_proc_update(ctl, write);
2892 return ret;
1f9248e5
JP
2893}
2894
cb5b09c1
JP
2895int neigh_proc_dointvec(struct ctl_table *ctl, int write,
2896 void __user *buffer, size_t *lenp, loff_t *ppos)
2897{
1d4c8c29
JP
2898 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2899
2900 neigh_proc_update(ctl, write);
2901 return ret;
cb5b09c1
JP
2902}
2903EXPORT_SYMBOL(neigh_proc_dointvec);
2904
2905int neigh_proc_dointvec_jiffies(struct ctl_table *ctl, int write,
2906 void __user *buffer,
2907 size_t *lenp, loff_t *ppos)
2908{
1d4c8c29
JP
2909 int ret = proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos);
2910
2911 neigh_proc_update(ctl, write);
2912 return ret;
cb5b09c1
JP
2913}
2914EXPORT_SYMBOL(neigh_proc_dointvec_jiffies);
2915
2916static int neigh_proc_dointvec_userhz_jiffies(struct ctl_table *ctl, int write,
2917 void __user *buffer,
2918 size_t *lenp, loff_t *ppos)
2919{
1d4c8c29
JP
2920 int ret = proc_dointvec_userhz_jiffies(ctl, write, buffer, lenp, ppos);
2921
2922 neigh_proc_update(ctl, write);
2923 return ret;
cb5b09c1
JP
2924}
2925
2926int neigh_proc_dointvec_ms_jiffies(struct ctl_table *ctl, int write,
2927 void __user *buffer,
2928 size_t *lenp, loff_t *ppos)
2929{
1d4c8c29
JP
2930 int ret = proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos);
2931
2932 neigh_proc_update(ctl, write);
2933 return ret;
cb5b09c1
JP
2934}
2935EXPORT_SYMBOL(neigh_proc_dointvec_ms_jiffies);
2936
2937static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write,
2938 void __user *buffer,
2939 size_t *lenp, loff_t *ppos)
2940{
1d4c8c29
JP
2941 int ret = proc_unres_qlen(ctl, write, buffer, lenp, ppos);
2942
2943 neigh_proc_update(ctl, write);
2944 return ret;
cb5b09c1
JP
2945}
2946
1f9248e5
JP
2947#define NEIGH_PARMS_DATA_OFFSET(index) \
2948 (&((struct neigh_parms *) 0)->data[index])
2949
2950#define NEIGH_SYSCTL_ENTRY(attr, data_attr, name, mval, proc) \
2951 [NEIGH_VAR_ ## attr] = { \
2952 .procname = name, \
2953 .data = NEIGH_PARMS_DATA_OFFSET(NEIGH_VAR_ ## data_attr), \
2954 .maxlen = sizeof(int), \
2955 .mode = mval, \
2956 .proc_handler = proc, \
2957 }
2958
2959#define NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(attr, name) \
2960 NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_zero_intmax)
2961
2962#define NEIGH_SYSCTL_JIFFIES_ENTRY(attr, name) \
cb5b09c1 2963 NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_jiffies)
1f9248e5
JP
2964
2965#define NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(attr, name) \
cb5b09c1 2966 NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_userhz_jiffies)
1f9248e5
JP
2967
2968#define NEIGH_SYSCTL_MS_JIFFIES_ENTRY(attr, name) \
cb5b09c1 2969 NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_ms_jiffies)
1f9248e5
JP
2970
2971#define NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(attr, data_attr, name) \
cb5b09c1 2972 NEIGH_SYSCTL_ENTRY(attr, data_attr, name, 0644, neigh_proc_dointvec_ms_jiffies)
1f9248e5
JP
2973
2974#define NEIGH_SYSCTL_UNRES_QLEN_REUSED_ENTRY(attr, data_attr, name) \
cb5b09c1 2975 NEIGH_SYSCTL_ENTRY(attr, data_attr, name, 0644, neigh_proc_dointvec_unres_qlen)
54716e3b 2976
1da177e4
LT
2977static struct neigh_sysctl_table {
2978 struct ctl_table_header *sysctl_header;
8b5c171b 2979 struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1];
ab32ea5d 2980} neigh_sysctl_template __read_mostly = {
1da177e4 2981 .neigh_vars = {
1f9248e5
JP
2982 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_PROBES, "mcast_solicit"),
2983 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(UCAST_PROBES, "ucast_solicit"),
2984 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"),
2985 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"),
2986 NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"),
2987 NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"),
2988 NEIGH_SYSCTL_JIFFIES_ENTRY(GC_STALETIME, "gc_stale_time"),
2989 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(QUEUE_LEN_BYTES, "unres_qlen_bytes"),
2990 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(PROXY_QLEN, "proxy_qlen"),
2991 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(ANYCAST_DELAY, "anycast_delay"),
2992 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(PROXY_DELAY, "proxy_delay"),
2993 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(LOCKTIME, "locktime"),
2994 NEIGH_SYSCTL_UNRES_QLEN_REUSED_ENTRY(QUEUE_LEN, QUEUE_LEN_BYTES, "unres_qlen"),
2995 NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(RETRANS_TIME_MS, RETRANS_TIME, "retrans_time_ms"),
2996 NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(BASE_REACHABLE_TIME_MS, BASE_REACHABLE_TIME, "base_reachable_time_ms"),
8b5c171b 2997 [NEIGH_VAR_GC_INTERVAL] = {
1da177e4
LT
2998 .procname = "gc_interval",
2999 .maxlen = sizeof(int),
3000 .mode = 0644,
6d9f239a 3001 .proc_handler = proc_dointvec_jiffies,
1da177e4 3002 },
8b5c171b 3003 [NEIGH_VAR_GC_THRESH1] = {
1da177e4
LT
3004 .procname = "gc_thresh1",
3005 .maxlen = sizeof(int),
3006 .mode = 0644,
555445cd
FF
3007 .extra1 = &zero,
3008 .extra2 = &int_max,
3009 .proc_handler = proc_dointvec_minmax,
1da177e4 3010 },
8b5c171b 3011 [NEIGH_VAR_GC_THRESH2] = {
1da177e4
LT
3012 .procname = "gc_thresh2",
3013 .maxlen = sizeof(int),
3014 .mode = 0644,
555445cd
FF
3015 .extra1 = &zero,
3016 .extra2 = &int_max,
3017 .proc_handler = proc_dointvec_minmax,
1da177e4 3018 },
8b5c171b 3019 [NEIGH_VAR_GC_THRESH3] = {
1da177e4
LT
3020 .procname = "gc_thresh3",
3021 .maxlen = sizeof(int),
3022 .mode = 0644,
555445cd
FF
3023 .extra1 = &zero,
3024 .extra2 = &int_max,
3025 .proc_handler = proc_dointvec_minmax,
1da177e4 3026 },
c3bac5a7 3027 {},
1da177e4
LT
3028 },
3029};
3030
3031int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
73af614a 3032 proc_handler *handler)
1da177e4 3033{
1f9248e5 3034 int i;
3c607bbb 3035 struct neigh_sysctl_table *t;
1f9248e5 3036 const char *dev_name_source;
8f40a1f9 3037 char neigh_path[ sizeof("net//neigh/") + IFNAMSIZ + IFNAMSIZ ];
73af614a 3038 char *p_name;
1da177e4 3039
3c607bbb 3040 t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL);
1da177e4 3041 if (!t)
3c607bbb
PE
3042 goto err;
3043
b194c1f1 3044 for (i = 0; i < NEIGH_VAR_GC_INTERVAL; i++) {
1f9248e5 3045 t->neigh_vars[i].data += (long) p;
cb5b09c1 3046 t->neigh_vars[i].extra1 = dev;
1d4c8c29 3047 t->neigh_vars[i].extra2 = p;
cb5b09c1 3048 }
1da177e4
LT
3049
3050 if (dev) {
3051 dev_name_source = dev->name;
d12af679 3052 /* Terminate the table early */
8b5c171b
ED
3053 memset(&t->neigh_vars[NEIGH_VAR_GC_INTERVAL], 0,
3054 sizeof(t->neigh_vars[NEIGH_VAR_GC_INTERVAL]));
1da177e4 3055 } else {
9ecf07a1 3056 struct neigh_table *tbl = p->tbl;
8f40a1f9 3057 dev_name_source = "default";
9ecf07a1
MK
3058 t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = &tbl->gc_interval;
3059 t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = &tbl->gc_thresh1;
3060 t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = &tbl->gc_thresh2;
3061 t->neigh_vars[NEIGH_VAR_GC_THRESH3].data = &tbl->gc_thresh3;
1da177e4
LT
3062 }
3063
f8572d8f 3064 if (handler) {
1da177e4 3065 /* RetransTime */
8b5c171b 3066 t->neigh_vars[NEIGH_VAR_RETRANS_TIME].proc_handler = handler;
1da177e4 3067 /* ReachableTime */
8b5c171b 3068 t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME].proc_handler = handler;
1da177e4 3069 /* RetransTime (in milliseconds)*/
8b5c171b 3070 t->neigh_vars[NEIGH_VAR_RETRANS_TIME_MS].proc_handler = handler;
1da177e4 3071 /* ReachableTime (in milliseconds) */
8b5c171b 3072 t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = handler;
1da177e4
LT
3073 }
3074
464dc801
EB
3075 /* Don't export sysctls to unprivileged users */
3076 if (neigh_parms_net(p)->user_ns != &init_user_ns)
3077 t->neigh_vars[0].procname = NULL;
3078
73af614a
JP
3079 switch (neigh_parms_family(p)) {
3080 case AF_INET:
3081 p_name = "ipv4";
3082 break;
3083 case AF_INET6:
3084 p_name = "ipv6";
3085 break;
3086 default:
3087 BUG();
3088 }
3089
8f40a1f9
EB
3090 snprintf(neigh_path, sizeof(neigh_path), "net/%s/neigh/%s",
3091 p_name, dev_name_source);
4ab438fc 3092 t->sysctl_header =
8f40a1f9 3093 register_net_sysctl(neigh_parms_net(p), neigh_path, t->neigh_vars);
3c607bbb 3094 if (!t->sysctl_header)
8f40a1f9 3095 goto free;
3c607bbb 3096
1da177e4
LT
3097 p->sysctl_table = t;
3098 return 0;
3099
3c607bbb 3100free:
1da177e4 3101 kfree(t);
3c607bbb
PE
3102err:
3103 return -ENOBUFS;
1da177e4 3104}
0a204500 3105EXPORT_SYMBOL(neigh_sysctl_register);
1da177e4
LT
3106
3107void neigh_sysctl_unregister(struct neigh_parms *p)
3108{
3109 if (p->sysctl_table) {
3110 struct neigh_sysctl_table *t = p->sysctl_table;
3111 p->sysctl_table = NULL;
5dd3df10 3112 unregister_net_sysctl_table(t->sysctl_header);
1da177e4
LT
3113 kfree(t);
3114 }
3115}
0a204500 3116EXPORT_SYMBOL(neigh_sysctl_unregister);
1da177e4
LT
3117
3118#endif /* CONFIG_SYSCTL */
3119
c8822a4e
TG
3120static int __init neigh_init(void)
3121{
c7ac8679
GR
3122 rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, NULL);
3123 rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, NULL);
3124 rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info, NULL);
c8822a4e 3125
c7ac8679
GR
3126 rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info,
3127 NULL);
3128 rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, NULL);
c8822a4e
TG
3129
3130 return 0;
3131}
3132
3133subsys_initcall(neigh_init);
3134