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