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