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