Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0-or-later
2 : /*
3 : * Generic address resolution entity
4 : *
5 : * Authors:
6 : * Pedro Roque <roque@di.fc.ul.pt>
7 : * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
8 : *
9 : * Fixes:
10 : * Vitaly E. Lavrov releasing NULL neighbor in neigh_add.
11 : * Harald Welte Add neighbour cache statistics like rtstat
12 : */
13 :
14 : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 :
16 : #include <linux/slab.h>
17 : #include <linux/kmemleak.h>
18 : #include <linux/types.h>
19 : #include <linux/kernel.h>
20 : #include <linux/module.h>
21 : #include <linux/socket.h>
22 : #include <linux/netdevice.h>
23 : #include <linux/proc_fs.h>
24 : #ifdef CONFIG_SYSCTL
25 : #include <linux/sysctl.h>
26 : #endif
27 : #include <linux/times.h>
28 : #include <net/net_namespace.h>
29 : #include <net/neighbour.h>
30 : #include <net/arp.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 : #include <linux/inetdevice.h>
40 : #include <net/addrconf.h>
41 :
42 : #include <trace/events/neigh.h>
43 :
44 : #define NEIGH_DEBUG 1
45 : #define neigh_dbg(level, fmt, ...) \
46 : do { \
47 : if (level <= NEIGH_DEBUG) \
48 : pr_debug(fmt, ##__VA_ARGS__); \
49 : } while (0)
50 :
51 : #define PNEIGH_HASHMASK 0xF
52 :
53 : static void neigh_timer_handler(struct timer_list *t);
54 : static void __neigh_notify(struct neighbour *n, int type, int flags,
55 : u32 pid);
56 : static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid);
57 : static int pneigh_ifdown_and_unlock(struct neigh_table *tbl,
58 : struct net_device *dev);
59 :
60 : #ifdef CONFIG_PROC_FS
61 : static const struct seq_operations neigh_stat_seq_ops;
62 : #endif
63 :
64 : /*
65 : Neighbour hash table buckets are protected with rwlock tbl->lock.
66 :
67 : - All the scans/updates to hash buckets MUST be made under this lock.
68 : - NOTHING clever should be made under this lock: no callbacks
69 : to protocol backends, no attempts to send something to network.
70 : It will result in deadlocks, if backend/driver wants to use neighbour
71 : cache.
72 : - If the entry requires some non-trivial actions, increase
73 : its reference count and release table lock.
74 :
75 : Neighbour entries are protected:
76 : - with reference count.
77 : - with rwlock neigh->lock
78 :
79 : Reference count prevents destruction.
80 :
81 : neigh->lock mainly serializes ll address data and its validity state.
82 : However, the same lock is used to protect another entry fields:
83 : - timer
84 : - resolution queue
85 :
86 : Again, nothing clever shall be made under neigh->lock,
87 : the most complicated procedure, which we allow is dev->hard_header.
88 : It is supposed, that dev->hard_header is simplistic and does
89 : not make callbacks to neighbour tables.
90 : */
91 :
92 0 : static int neigh_blackhole(struct neighbour *neigh, struct sk_buff *skb)
93 : {
94 0 : kfree_skb(skb);
95 0 : return -ENETDOWN;
96 : }
97 :
98 0 : static void neigh_cleanup_and_release(struct neighbour *neigh)
99 : {
100 0 : trace_neigh_cleanup_and_release(neigh, 0);
101 0 : __neigh_notify(neigh, RTM_DELNEIGH, 0, 0);
102 0 : call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
103 0 : neigh_release(neigh);
104 0 : }
105 :
106 : /*
107 : * It is random distribution in the interval (1/2)*base...(3/2)*base.
108 : * It corresponds to default IPv6 settings and is not overridable,
109 : * because it is really reasonable choice.
110 : */
111 :
112 3 : unsigned long neigh_rand_reach_time(unsigned long base)
113 : {
114 3 : return base ? (prandom_u32() % base) + (base >> 1) : 0;
115 : }
116 : EXPORT_SYMBOL(neigh_rand_reach_time);
117 :
118 0 : static void neigh_mark_dead(struct neighbour *n)
119 : {
120 0 : n->dead = 1;
121 0 : if (!list_empty(&n->gc_list)) {
122 0 : list_del_init(&n->gc_list);
123 0 : atomic_dec(&n->tbl->gc_entries);
124 : }
125 0 : }
126 :
127 0 : static void neigh_update_gc_list(struct neighbour *n)
128 : {
129 0 : bool on_gc_list, exempt_from_gc;
130 :
131 0 : write_lock_bh(&n->tbl->lock);
132 0 : write_lock(&n->lock);
133 :
134 : /* remove from the gc list if new state is permanent or if neighbor
135 : * is externally learned; otherwise entry should be on the gc list
136 : */
137 0 : exempt_from_gc = n->nud_state & NUD_PERMANENT ||
138 0 : n->flags & NTF_EXT_LEARNED;
139 0 : on_gc_list = !list_empty(&n->gc_list);
140 :
141 0 : if (exempt_from_gc && on_gc_list) {
142 0 : list_del_init(&n->gc_list);
143 0 : atomic_dec(&n->tbl->gc_entries);
144 0 : } else if (!exempt_from_gc && !on_gc_list) {
145 : /* add entries to the tail; cleaning removes from the front */
146 0 : list_add_tail(&n->gc_list, &n->tbl->gc_list);
147 0 : atomic_inc(&n->tbl->gc_entries);
148 : }
149 :
150 0 : write_unlock(&n->lock);
151 0 : write_unlock_bh(&n->tbl->lock);
152 0 : }
153 :
154 3 : static bool neigh_update_ext_learned(struct neighbour *neigh, u32 flags,
155 : int *notify)
156 : {
157 3 : bool rc = false;
158 3 : u8 ndm_flags;
159 :
160 3 : if (!(flags & NEIGH_UPDATE_F_ADMIN))
161 : return rc;
162 :
163 0 : ndm_flags = (flags & NEIGH_UPDATE_F_EXT_LEARNED) ? NTF_EXT_LEARNED : 0;
164 0 : if ((neigh->flags ^ ndm_flags) & NTF_EXT_LEARNED) {
165 0 : if (ndm_flags & NTF_EXT_LEARNED)
166 0 : neigh->flags |= NTF_EXT_LEARNED;
167 : else
168 0 : neigh->flags &= ~NTF_EXT_LEARNED;
169 0 : rc = true;
170 0 : *notify = 1;
171 : }
172 :
173 : return rc;
174 : }
175 :
176 0 : static bool neigh_del(struct neighbour *n, struct neighbour __rcu **np,
177 : struct neigh_table *tbl)
178 : {
179 0 : bool retval = false;
180 :
181 0 : write_lock(&n->lock);
182 0 : if (refcount_read(&n->refcnt) == 1) {
183 0 : struct neighbour *neigh;
184 :
185 0 : neigh = rcu_dereference_protected(n->next,
186 : lockdep_is_held(&tbl->lock));
187 0 : rcu_assign_pointer(*np, neigh);
188 0 : neigh_mark_dead(n);
189 0 : retval = true;
190 : }
191 0 : write_unlock(&n->lock);
192 0 : if (retval)
193 0 : neigh_cleanup_and_release(n);
194 0 : return retval;
195 : }
196 :
197 0 : bool neigh_remove_one(struct neighbour *ndel, struct neigh_table *tbl)
198 : {
199 0 : struct neigh_hash_table *nht;
200 0 : void *pkey = ndel->primary_key;
201 0 : u32 hash_val;
202 0 : struct neighbour *n;
203 0 : struct neighbour __rcu **np;
204 :
205 0 : nht = rcu_dereference_protected(tbl->nht,
206 : lockdep_is_held(&tbl->lock));
207 0 : hash_val = tbl->hash(pkey, ndel->dev, nht->hash_rnd);
208 0 : hash_val = hash_val >> (32 - nht->hash_shift);
209 :
210 0 : np = &nht->hash_buckets[hash_val];
211 0 : while ((n = rcu_dereference_protected(*np,
212 : lockdep_is_held(&tbl->lock)))) {
213 0 : if (n == ndel)
214 0 : return neigh_del(n, np, tbl);
215 0 : np = &n->next;
216 : }
217 : return false;
218 : }
219 :
220 0 : static int neigh_forced_gc(struct neigh_table *tbl)
221 : {
222 0 : int max_clean = atomic_read(&tbl->gc_entries) - tbl->gc_thresh2;
223 0 : unsigned long tref = jiffies - 5 * HZ;
224 0 : struct neighbour *n, *tmp;
225 0 : int shrunk = 0;
226 :
227 0 : NEIGH_CACHE_STAT_INC(tbl, forced_gc_runs);
228 :
229 0 : write_lock_bh(&tbl->lock);
230 :
231 0 : list_for_each_entry_safe(n, tmp, &tbl->gc_list, gc_list) {
232 0 : if (refcount_read(&n->refcnt) == 1) {
233 0 : bool remove = false;
234 :
235 0 : write_lock(&n->lock);
236 0 : if ((n->nud_state == NUD_FAILED) ||
237 0 : (tbl->is_multicast &&
238 0 : tbl->is_multicast(n->primary_key)) ||
239 0 : time_after(tref, n->updated))
240 : remove = true;
241 0 : write_unlock(&n->lock);
242 :
243 0 : if (remove && neigh_remove_one(n, tbl))
244 0 : shrunk++;
245 0 : if (shrunk >= max_clean)
246 : break;
247 : }
248 : }
249 :
250 0 : tbl->last_flush = jiffies;
251 :
252 0 : write_unlock_bh(&tbl->lock);
253 :
254 0 : return shrunk;
255 : }
256 :
257 7 : static void neigh_add_timer(struct neighbour *n, unsigned long when)
258 : {
259 7 : neigh_hold(n);
260 7 : if (unlikely(mod_timer(&n->timer, when))) {
261 0 : printk("NEIGH: BUG, double timer add, state is %x\n",
262 0 : n->nud_state);
263 0 : dump_stack();
264 : }
265 7 : }
266 :
267 7 : static int neigh_del_timer(struct neighbour *n)
268 : {
269 10 : if ((n->nud_state & NUD_IN_TIMER) &&
270 3 : del_timer(&n->timer)) {
271 3 : neigh_release(n);
272 3 : return 1;
273 : }
274 : return 0;
275 : }
276 :
277 0 : static void pneigh_queue_purge(struct sk_buff_head *list)
278 : {
279 0 : struct sk_buff *skb;
280 :
281 0 : while ((skb = skb_dequeue(list)) != NULL) {
282 0 : dev_put(skb->dev);
283 0 : kfree_skb(skb);
284 : }
285 0 : }
286 :
287 0 : static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev,
288 : bool skip_perm)
289 : {
290 0 : int i;
291 0 : struct neigh_hash_table *nht;
292 :
293 0 : nht = rcu_dereference_protected(tbl->nht,
294 : lockdep_is_held(&tbl->lock));
295 :
296 0 : for (i = 0; i < (1 << nht->hash_shift); i++) {
297 0 : struct neighbour *n;
298 0 : struct neighbour __rcu **np = &nht->hash_buckets[i];
299 :
300 0 : while ((n = rcu_dereference_protected(*np,
301 : lockdep_is_held(&tbl->lock))) != NULL) {
302 0 : if (dev && n->dev != dev) {
303 0 : np = &n->next;
304 0 : continue;
305 : }
306 0 : if (skip_perm && n->nud_state & NUD_PERMANENT) {
307 0 : np = &n->next;
308 0 : continue;
309 : }
310 0 : rcu_assign_pointer(*np,
311 : rcu_dereference_protected(n->next,
312 : lockdep_is_held(&tbl->lock)));
313 0 : write_lock(&n->lock);
314 0 : neigh_del_timer(n);
315 0 : neigh_mark_dead(n);
316 0 : if (refcount_read(&n->refcnt) != 1) {
317 : /* The most unpleasant situation.
318 : We must destroy neighbour entry,
319 : but someone still uses it.
320 :
321 : The destroy will be delayed until
322 : the last user releases us, but
323 : we must kill timers etc. and move
324 : it to safe state.
325 : */
326 0 : __skb_queue_purge(&n->arp_queue);
327 0 : n->arp_queue_len_bytes = 0;
328 0 : n->output = neigh_blackhole;
329 0 : if (n->nud_state & NUD_VALID)
330 0 : n->nud_state = NUD_NOARP;
331 : else
332 0 : n->nud_state = NUD_NONE;
333 0 : neigh_dbg(2, "neigh %p is stray\n", n);
334 : }
335 0 : write_unlock(&n->lock);
336 0 : neigh_cleanup_and_release(n);
337 : }
338 : }
339 0 : }
340 :
341 0 : void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
342 : {
343 0 : write_lock_bh(&tbl->lock);
344 0 : neigh_flush_dev(tbl, dev, false);
345 0 : write_unlock_bh(&tbl->lock);
346 0 : }
347 : EXPORT_SYMBOL(neigh_changeaddr);
348 :
349 0 : static int __neigh_ifdown(struct neigh_table *tbl, struct net_device *dev,
350 : bool skip_perm)
351 : {
352 0 : write_lock_bh(&tbl->lock);
353 0 : neigh_flush_dev(tbl, dev, skip_perm);
354 0 : pneigh_ifdown_and_unlock(tbl, dev);
355 :
356 0 : del_timer_sync(&tbl->proxy_timer);
357 0 : pneigh_queue_purge(&tbl->proxy_queue);
358 0 : return 0;
359 : }
360 :
361 0 : int neigh_carrier_down(struct neigh_table *tbl, struct net_device *dev)
362 : {
363 0 : __neigh_ifdown(tbl, dev, true);
364 0 : return 0;
365 : }
366 : EXPORT_SYMBOL(neigh_carrier_down);
367 :
368 0 : int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
369 : {
370 0 : __neigh_ifdown(tbl, dev, false);
371 0 : return 0;
372 : }
373 : EXPORT_SYMBOL(neigh_ifdown);
374 :
375 2 : static struct neighbour *neigh_alloc(struct neigh_table *tbl,
376 : struct net_device *dev,
377 : bool exempt_from_gc)
378 : {
379 2 : struct neighbour *n = NULL;
380 2 : unsigned long now = jiffies;
381 2 : int entries;
382 :
383 2 : if (exempt_from_gc)
384 0 : goto do_alloc;
385 :
386 2 : entries = atomic_inc_return(&tbl->gc_entries) - 1;
387 2 : if (entries >= tbl->gc_thresh3 ||
388 2 : (entries >= tbl->gc_thresh2 &&
389 0 : time_after(now, tbl->last_flush + 5 * HZ))) {
390 0 : if (!neigh_forced_gc(tbl) &&
391 0 : entries >= tbl->gc_thresh3) {
392 0 : net_info_ratelimited("%s: neighbor table overflow!\n",
393 : tbl->id);
394 0 : NEIGH_CACHE_STAT_INC(tbl, table_fulls);
395 0 : goto out_entries;
396 : }
397 : }
398 :
399 2 : do_alloc:
400 2 : n = kzalloc(tbl->entry_size + dev->neigh_priv_len, GFP_ATOMIC);
401 2 : if (!n)
402 0 : goto out_entries;
403 :
404 2 : __skb_queue_head_init(&n->arp_queue);
405 2 : rwlock_init(&n->lock);
406 2 : seqlock_init(&n->ha_lock);
407 2 : n->updated = n->used = now;
408 2 : n->nud_state = NUD_NONE;
409 2 : n->output = neigh_blackhole;
410 2 : seqlock_init(&n->hh.hh_lock);
411 2 : n->parms = neigh_parms_clone(&tbl->parms);
412 2 : timer_setup(&n->timer, neigh_timer_handler, 0);
413 :
414 2 : NEIGH_CACHE_STAT_INC(tbl, allocs);
415 2 : n->tbl = tbl;
416 2 : refcount_set(&n->refcnt, 1);
417 2 : n->dead = 1;
418 2 : INIT_LIST_HEAD(&n->gc_list);
419 :
420 2 : atomic_inc(&tbl->entries);
421 2 : out:
422 2 : return n;
423 :
424 0 : out_entries:
425 0 : if (!exempt_from_gc)
426 0 : atomic_dec(&tbl->gc_entries);
427 0 : goto out;
428 : }
429 :
430 4 : static void neigh_get_hash_rnd(u32 *x)
431 : {
432 8 : *x = get_random_u32() | 1;
433 : }
434 :
435 1 : static struct neigh_hash_table *neigh_hash_alloc(unsigned int shift)
436 : {
437 1 : size_t size = (1 << shift) * sizeof(struct neighbour *);
438 1 : struct neigh_hash_table *ret;
439 1 : struct neighbour __rcu **buckets;
440 1 : int i;
441 :
442 1 : ret = kmalloc(sizeof(*ret), GFP_ATOMIC);
443 1 : if (!ret)
444 : return NULL;
445 1 : if (size <= PAGE_SIZE) {
446 1 : buckets = kzalloc(size, GFP_ATOMIC);
447 : } else {
448 0 : buckets = (struct neighbour __rcu **)
449 0 : __get_free_pages(GFP_ATOMIC | __GFP_ZERO,
450 0 : get_order(size));
451 0 : kmemleak_alloc(buckets, size, 1, GFP_ATOMIC);
452 : }
453 1 : if (!buckets) {
454 0 : kfree(ret);
455 0 : return NULL;
456 : }
457 1 : ret->hash_buckets = buckets;
458 1 : ret->hash_shift = shift;
459 5 : for (i = 0; i < NEIGH_NUM_HASH_RND; i++)
460 4 : neigh_get_hash_rnd(&ret->hash_rnd[i]);
461 : return ret;
462 : }
463 :
464 0 : static void neigh_hash_free_rcu(struct rcu_head *head)
465 : {
466 0 : struct neigh_hash_table *nht = container_of(head,
467 : struct neigh_hash_table,
468 : rcu);
469 0 : size_t size = (1 << nht->hash_shift) * sizeof(struct neighbour *);
470 0 : struct neighbour __rcu **buckets = nht->hash_buckets;
471 :
472 0 : if (size <= PAGE_SIZE) {
473 0 : kfree(buckets);
474 : } else {
475 0 : kmemleak_free(buckets);
476 0 : free_pages((unsigned long)buckets, get_order(size));
477 : }
478 0 : kfree(nht);
479 0 : }
480 :
481 0 : static struct neigh_hash_table *neigh_hash_grow(struct neigh_table *tbl,
482 : unsigned long new_shift)
483 : {
484 0 : unsigned int i, hash;
485 0 : struct neigh_hash_table *new_nht, *old_nht;
486 :
487 0 : NEIGH_CACHE_STAT_INC(tbl, hash_grows);
488 :
489 0 : old_nht = rcu_dereference_protected(tbl->nht,
490 : lockdep_is_held(&tbl->lock));
491 0 : new_nht = neigh_hash_alloc(new_shift);
492 0 : if (!new_nht)
493 : return old_nht;
494 :
495 0 : for (i = 0; i < (1 << old_nht->hash_shift); i++) {
496 0 : struct neighbour *n, *next;
497 :
498 0 : for (n = rcu_dereference_protected(old_nht->hash_buckets[i],
499 : lockdep_is_held(&tbl->lock));
500 0 : n != NULL;
501 0 : n = next) {
502 0 : hash = tbl->hash(n->primary_key, n->dev,
503 0 : new_nht->hash_rnd);
504 :
505 0 : hash >>= (32 - new_nht->hash_shift);
506 0 : next = rcu_dereference_protected(n->next,
507 : lockdep_is_held(&tbl->lock));
508 :
509 0 : rcu_assign_pointer(n->next,
510 : rcu_dereference_protected(
511 : new_nht->hash_buckets[hash],
512 : lockdep_is_held(&tbl->lock)));
513 0 : rcu_assign_pointer(new_nht->hash_buckets[hash], n);
514 : }
515 : }
516 :
517 0 : rcu_assign_pointer(tbl->nht, new_nht);
518 0 : call_rcu(&old_nht->rcu, neigh_hash_free_rcu);
519 0 : return new_nht;
520 : }
521 :
522 3 : struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
523 : struct net_device *dev)
524 : {
525 3 : struct neighbour *n;
526 :
527 3 : NEIGH_CACHE_STAT_INC(tbl, lookups);
528 :
529 3 : rcu_read_lock_bh();
530 3 : n = __neigh_lookup_noref(tbl, pkey, dev);
531 3 : if (n) {
532 3 : if (!refcount_inc_not_zero(&n->refcnt))
533 0 : n = NULL;
534 3 : NEIGH_CACHE_STAT_INC(tbl, hits);
535 : }
536 :
537 3 : rcu_read_unlock_bh();
538 3 : return n;
539 : }
540 : EXPORT_SYMBOL(neigh_lookup);
541 :
542 0 : struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
543 : const void *pkey)
544 : {
545 0 : struct neighbour *n;
546 0 : unsigned int key_len = tbl->key_len;
547 0 : u32 hash_val;
548 0 : struct neigh_hash_table *nht;
549 :
550 0 : NEIGH_CACHE_STAT_INC(tbl, lookups);
551 :
552 0 : rcu_read_lock_bh();
553 0 : nht = rcu_dereference_bh(tbl->nht);
554 0 : hash_val = tbl->hash(pkey, NULL, nht->hash_rnd) >> (32 - nht->hash_shift);
555 :
556 0 : for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
557 0 : n != NULL;
558 0 : n = rcu_dereference_bh(n->next)) {
559 0 : if (!memcmp(n->primary_key, pkey, key_len) &&
560 0 : net_eq(dev_net(n->dev), net)) {
561 0 : if (!refcount_inc_not_zero(&n->refcnt))
562 0 : n = NULL;
563 0 : NEIGH_CACHE_STAT_INC(tbl, hits);
564 : break;
565 : }
566 : }
567 :
568 0 : rcu_read_unlock_bh();
569 0 : return n;
570 : }
571 : EXPORT_SYMBOL(neigh_lookup_nodev);
572 :
573 2 : static struct neighbour *___neigh_create(struct neigh_table *tbl,
574 : const void *pkey,
575 : struct net_device *dev,
576 : bool exempt_from_gc, bool want_ref)
577 : {
578 2 : struct neighbour *n1, *rc, *n = neigh_alloc(tbl, dev, exempt_from_gc);
579 2 : u32 hash_val;
580 2 : unsigned int key_len = tbl->key_len;
581 2 : int error;
582 2 : struct neigh_hash_table *nht;
583 :
584 2 : trace_neigh_create(tbl, dev, pkey, n, exempt_from_gc);
585 :
586 2 : if (!n) {
587 0 : rc = ERR_PTR(-ENOBUFS);
588 0 : goto out;
589 : }
590 :
591 2 : memcpy(n->primary_key, pkey, key_len);
592 2 : n->dev = dev;
593 2 : dev_hold(dev);
594 :
595 : /* Protocol specific setup. */
596 2 : if (tbl->constructor && (error = tbl->constructor(n)) < 0) {
597 0 : rc = ERR_PTR(error);
598 0 : goto out_neigh_release;
599 : }
600 :
601 2 : if (dev->netdev_ops->ndo_neigh_construct) {
602 0 : error = dev->netdev_ops->ndo_neigh_construct(dev, n);
603 0 : if (error < 0) {
604 0 : rc = ERR_PTR(error);
605 0 : goto out_neigh_release;
606 : }
607 : }
608 :
609 : /* Device specific setup. */
610 2 : if (n->parms->neigh_setup &&
611 0 : (error = n->parms->neigh_setup(n)) < 0) {
612 0 : rc = ERR_PTR(error);
613 0 : goto out_neigh_release;
614 : }
615 :
616 2 : n->confirmed = jiffies - (NEIGH_VAR(n->parms, BASE_REACHABLE_TIME) << 1);
617 :
618 2 : write_lock_bh(&tbl->lock);
619 2 : nht = rcu_dereference_protected(tbl->nht,
620 : lockdep_is_held(&tbl->lock));
621 :
622 2 : if (atomic_read(&tbl->entries) > (1 << nht->hash_shift))
623 0 : nht = neigh_hash_grow(tbl, nht->hash_shift + 1);
624 :
625 2 : hash_val = tbl->hash(n->primary_key, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
626 :
627 2 : if (n->parms->dead) {
628 0 : rc = ERR_PTR(-EINVAL);
629 0 : goto out_tbl_unlock;
630 : }
631 :
632 2 : for (n1 = rcu_dereference_protected(nht->hash_buckets[hash_val],
633 : lockdep_is_held(&tbl->lock));
634 2 : n1 != NULL;
635 0 : n1 = rcu_dereference_protected(n1->next,
636 : lockdep_is_held(&tbl->lock))) {
637 0 : if (dev == n1->dev && !memcmp(n1->primary_key, n->primary_key, key_len)) {
638 0 : if (want_ref)
639 0 : neigh_hold(n1);
640 0 : rc = n1;
641 0 : goto out_tbl_unlock;
642 : }
643 : }
644 :
645 2 : n->dead = 0;
646 2 : if (!exempt_from_gc)
647 2 : list_add_tail(&n->gc_list, &n->tbl->gc_list);
648 :
649 2 : if (want_ref)
650 0 : neigh_hold(n);
651 2 : rcu_assign_pointer(n->next,
652 : rcu_dereference_protected(nht->hash_buckets[hash_val],
653 : lockdep_is_held(&tbl->lock)));
654 2 : rcu_assign_pointer(nht->hash_buckets[hash_val], n);
655 2 : write_unlock_bh(&tbl->lock);
656 2 : neigh_dbg(2, "neigh %p is created\n", n);
657 2 : rc = n;
658 2 : out:
659 2 : return rc;
660 0 : out_tbl_unlock:
661 0 : write_unlock_bh(&tbl->lock);
662 0 : out_neigh_release:
663 0 : if (!exempt_from_gc)
664 0 : atomic_dec(&tbl->gc_entries);
665 0 : neigh_release(n);
666 0 : goto out;
667 : }
668 :
669 2 : struct neighbour *__neigh_create(struct neigh_table *tbl, const void *pkey,
670 : struct net_device *dev, bool want_ref)
671 : {
672 2 : return ___neigh_create(tbl, pkey, dev, false, want_ref);
673 : }
674 : EXPORT_SYMBOL(__neigh_create);
675 :
676 0 : static u32 pneigh_hash(const void *pkey, unsigned int key_len)
677 : {
678 0 : u32 hash_val = *(u32 *)(pkey + key_len - 4);
679 0 : hash_val ^= (hash_val >> 16);
680 0 : hash_val ^= hash_val >> 8;
681 0 : hash_val ^= hash_val >> 4;
682 0 : hash_val &= PNEIGH_HASHMASK;
683 0 : return hash_val;
684 : }
685 :
686 0 : static struct pneigh_entry *__pneigh_lookup_1(struct pneigh_entry *n,
687 : struct net *net,
688 : const void *pkey,
689 : unsigned int key_len,
690 : struct net_device *dev)
691 : {
692 0 : while (n) {
693 0 : if (!memcmp(n->key, pkey, key_len) &&
694 0 : net_eq(pneigh_net(n), net) &&
695 0 : (n->dev == dev || !n->dev))
696 0 : return n;
697 0 : n = n->next;
698 : }
699 : return NULL;
700 : }
701 :
702 0 : struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
703 : struct net *net, const void *pkey, struct net_device *dev)
704 : {
705 0 : unsigned int key_len = tbl->key_len;
706 0 : u32 hash_val = pneigh_hash(pkey, key_len);
707 :
708 0 : return __pneigh_lookup_1(tbl->phash_buckets[hash_val],
709 : net, pkey, key_len, dev);
710 : }
711 : EXPORT_SYMBOL_GPL(__pneigh_lookup);
712 :
713 0 : struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
714 : struct net *net, const void *pkey,
715 : struct net_device *dev, int creat)
716 : {
717 0 : struct pneigh_entry *n;
718 0 : unsigned int key_len = tbl->key_len;
719 0 : u32 hash_val = pneigh_hash(pkey, key_len);
720 :
721 0 : read_lock_bh(&tbl->lock);
722 0 : n = __pneigh_lookup_1(tbl->phash_buckets[hash_val],
723 : net, pkey, key_len, dev);
724 0 : read_unlock_bh(&tbl->lock);
725 :
726 0 : if (n || !creat)
727 0 : goto out;
728 :
729 0 : ASSERT_RTNL();
730 :
731 0 : n = kmalloc(sizeof(*n) + key_len, GFP_KERNEL);
732 0 : if (!n)
733 0 : goto out;
734 :
735 0 : n->protocol = 0;
736 0 : write_pnet(&n->net, net);
737 0 : memcpy(n->key, pkey, key_len);
738 0 : n->dev = dev;
739 0 : if (dev)
740 0 : dev_hold(dev);
741 :
742 0 : if (tbl->pconstructor && tbl->pconstructor(n)) {
743 0 : if (dev)
744 0 : dev_put(dev);
745 0 : kfree(n);
746 0 : n = NULL;
747 0 : goto out;
748 : }
749 :
750 0 : write_lock_bh(&tbl->lock);
751 0 : n->next = tbl->phash_buckets[hash_val];
752 0 : tbl->phash_buckets[hash_val] = n;
753 0 : write_unlock_bh(&tbl->lock);
754 0 : out:
755 0 : return n;
756 : }
757 : EXPORT_SYMBOL(pneigh_lookup);
758 :
759 :
760 0 : int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey,
761 : struct net_device *dev)
762 : {
763 0 : struct pneigh_entry *n, **np;
764 0 : unsigned int key_len = tbl->key_len;
765 0 : u32 hash_val = pneigh_hash(pkey, key_len);
766 :
767 0 : write_lock_bh(&tbl->lock);
768 0 : for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL;
769 0 : np = &n->next) {
770 0 : if (!memcmp(n->key, pkey, key_len) && n->dev == dev &&
771 0 : net_eq(pneigh_net(n), net)) {
772 0 : *np = n->next;
773 0 : write_unlock_bh(&tbl->lock);
774 0 : if (tbl->pdestructor)
775 0 : tbl->pdestructor(n);
776 0 : if (n->dev)
777 0 : dev_put(n->dev);
778 0 : kfree(n);
779 0 : return 0;
780 : }
781 : }
782 0 : write_unlock_bh(&tbl->lock);
783 0 : return -ENOENT;
784 : }
785 :
786 0 : static int pneigh_ifdown_and_unlock(struct neigh_table *tbl,
787 : struct net_device *dev)
788 : {
789 0 : struct pneigh_entry *n, **np, *freelist = NULL;
790 0 : u32 h;
791 :
792 0 : for (h = 0; h <= PNEIGH_HASHMASK; h++) {
793 0 : np = &tbl->phash_buckets[h];
794 0 : while ((n = *np) != NULL) {
795 0 : if (!dev || n->dev == dev) {
796 0 : *np = n->next;
797 0 : n->next = freelist;
798 0 : freelist = n;
799 0 : continue;
800 : }
801 0 : np = &n->next;
802 : }
803 : }
804 0 : write_unlock_bh(&tbl->lock);
805 0 : while ((n = freelist)) {
806 0 : freelist = n->next;
807 0 : n->next = NULL;
808 0 : if (tbl->pdestructor)
809 0 : tbl->pdestructor(n);
810 0 : if (n->dev)
811 0 : dev_put(n->dev);
812 0 : kfree(n);
813 : }
814 0 : return -ENOENT;
815 : }
816 :
817 : static void neigh_parms_destroy(struct neigh_parms *parms);
818 :
819 0 : static inline void neigh_parms_put(struct neigh_parms *parms)
820 : {
821 0 : if (refcount_dec_and_test(&parms->refcnt))
822 0 : neigh_parms_destroy(parms);
823 0 : }
824 :
825 : /*
826 : * neighbour must already be out of the table;
827 : *
828 : */
829 0 : void neigh_destroy(struct neighbour *neigh)
830 : {
831 0 : struct net_device *dev = neigh->dev;
832 :
833 0 : NEIGH_CACHE_STAT_INC(neigh->tbl, destroys);
834 :
835 0 : if (!neigh->dead) {
836 0 : pr_warn("Destroying alive neighbour %p\n", neigh);
837 0 : dump_stack();
838 0 : return;
839 : }
840 :
841 0 : if (neigh_del_timer(neigh))
842 0 : pr_warn("Impossible event\n");
843 :
844 0 : write_lock_bh(&neigh->lock);
845 0 : __skb_queue_purge(&neigh->arp_queue);
846 0 : write_unlock_bh(&neigh->lock);
847 0 : neigh->arp_queue_len_bytes = 0;
848 :
849 0 : if (dev->netdev_ops->ndo_neigh_destroy)
850 0 : dev->netdev_ops->ndo_neigh_destroy(dev, neigh);
851 :
852 0 : dev_put(dev);
853 0 : neigh_parms_put(neigh->parms);
854 :
855 0 : neigh_dbg(2, "neigh %p is destroyed\n", neigh);
856 :
857 0 : atomic_dec(&neigh->tbl->entries);
858 0 : kfree_rcu(neigh, rcu);
859 : }
860 : EXPORT_SYMBOL(neigh_destroy);
861 :
862 : /* Neighbour state is suspicious;
863 : disable fast path.
864 :
865 : Called with write_locked neigh.
866 : */
867 3 : static void neigh_suspect(struct neighbour *neigh)
868 : {
869 3 : neigh_dbg(2, "neigh %p is suspected\n", neigh);
870 :
871 3 : neigh->output = neigh->ops->output;
872 0 : }
873 :
874 : /* Neighbour state is OK;
875 : enable fast path.
876 :
877 : Called with write_locked neigh.
878 : */
879 3 : static void neigh_connect(struct neighbour *neigh)
880 : {
881 3 : neigh_dbg(2, "neigh %p is connected\n", neigh);
882 :
883 3 : neigh->output = neigh->ops->connected_output;
884 3 : }
885 :
886 3 : static void neigh_periodic_work(struct work_struct *work)
887 : {
888 3 : struct neigh_table *tbl = container_of(work, struct neigh_table, gc_work.work);
889 3 : struct neighbour *n;
890 3 : struct neighbour __rcu **np;
891 3 : unsigned int i;
892 3 : struct neigh_hash_table *nht;
893 :
894 3 : NEIGH_CACHE_STAT_INC(tbl, periodic_gc_runs);
895 :
896 3 : write_lock_bh(&tbl->lock);
897 3 : nht = rcu_dereference_protected(tbl->nht,
898 : lockdep_is_held(&tbl->lock));
899 :
900 : /*
901 : * periodically recompute ReachableTime from random function
902 : */
903 :
904 3 : if (time_after(jiffies, tbl->last_rand + 300 * HZ)) {
905 0 : struct neigh_parms *p;
906 0 : tbl->last_rand = jiffies;
907 0 : list_for_each_entry(p, &tbl->parms_list, list)
908 0 : p->reachable_time =
909 0 : neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
910 : }
911 :
912 3 : if (atomic_read(&tbl->entries) < tbl->gc_thresh1)
913 3 : goto out;
914 :
915 0 : for (i = 0 ; i < (1 << nht->hash_shift); i++) {
916 0 : np = &nht->hash_buckets[i];
917 :
918 0 : while ((n = rcu_dereference_protected(*np,
919 : lockdep_is_held(&tbl->lock))) != NULL) {
920 0 : unsigned int state;
921 :
922 0 : write_lock(&n->lock);
923 :
924 0 : state = n->nud_state;
925 0 : if ((state & (NUD_PERMANENT | NUD_IN_TIMER)) ||
926 0 : (n->flags & NTF_EXT_LEARNED)) {
927 0 : write_unlock(&n->lock);
928 0 : goto next_elt;
929 : }
930 :
931 0 : if (time_before(n->used, n->confirmed))
932 0 : n->used = n->confirmed;
933 :
934 0 : if (refcount_read(&n->refcnt) == 1 &&
935 : (state == NUD_FAILED ||
936 0 : time_after(jiffies, n->used + NEIGH_VAR(n->parms, GC_STALETIME)))) {
937 0 : *np = n->next;
938 0 : neigh_mark_dead(n);
939 0 : write_unlock(&n->lock);
940 0 : neigh_cleanup_and_release(n);
941 0 : continue;
942 : }
943 0 : write_unlock(&n->lock);
944 :
945 0 : next_elt:
946 0 : np = &n->next;
947 : }
948 : /*
949 : * It's fine to release lock here, even if hash table
950 : * grows while we are preempted.
951 : */
952 0 : write_unlock_bh(&tbl->lock);
953 0 : cond_resched();
954 0 : write_lock_bh(&tbl->lock);
955 0 : nht = rcu_dereference_protected(tbl->nht,
956 : lockdep_is_held(&tbl->lock));
957 : }
958 0 : out:
959 : /* Cycle through all hash buckets every BASE_REACHABLE_TIME/2 ticks.
960 : * ARP entry timeouts range from 1/2 BASE_REACHABLE_TIME to 3/2
961 : * BASE_REACHABLE_TIME.
962 : */
963 6 : queue_delayed_work(system_power_efficient_wq, &tbl->gc_work,
964 3 : NEIGH_VAR(&tbl->parms, BASE_REACHABLE_TIME) >> 1);
965 3 : write_unlock_bh(&tbl->lock);
966 3 : }
967 :
968 1 : static __inline__ int neigh_max_probes(struct neighbour *n)
969 : {
970 1 : struct neigh_parms *p = n->parms;
971 2 : return NEIGH_VAR(p, UCAST_PROBES) + NEIGH_VAR(p, APP_PROBES) +
972 1 : (n->nud_state & NUD_PROBE ? NEIGH_VAR(p, MCAST_REPROBES) :
973 : NEIGH_VAR(p, MCAST_PROBES));
974 : }
975 :
976 0 : static void neigh_invalidate(struct neighbour *neigh)
977 : __releases(neigh->lock)
978 : __acquires(neigh->lock)
979 : {
980 0 : struct sk_buff *skb;
981 :
982 0 : NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed);
983 0 : neigh_dbg(2, "neigh %p is failed\n", neigh);
984 0 : neigh->updated = jiffies;
985 :
986 : /* It is very thin place. report_unreachable is very complicated
987 : routine. Particularly, it can hit the same neighbour entry!
988 :
989 : So that, we try to be accurate and avoid dead loop. --ANK
990 : */
991 0 : while (neigh->nud_state == NUD_FAILED &&
992 0 : (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
993 0 : write_unlock(&neigh->lock);
994 0 : neigh->ops->error_report(neigh, skb);
995 0 : write_lock(&neigh->lock);
996 : }
997 0 : __skb_queue_purge(&neigh->arp_queue);
998 0 : neigh->arp_queue_len_bytes = 0;
999 0 : }
1000 :
1001 3 : static void neigh_probe(struct neighbour *neigh)
1002 : __releases(neigh->lock)
1003 : {
1004 3 : struct sk_buff *skb = skb_peek_tail(&neigh->arp_queue);
1005 : /* keep skb alive even if arp_queue overflows */
1006 2 : if (skb)
1007 2 : skb = skb_clone(skb, GFP_ATOMIC);
1008 3 : write_unlock(&neigh->lock);
1009 3 : if (neigh->ops->solicit)
1010 3 : neigh->ops->solicit(neigh, skb);
1011 3 : atomic_inc(&neigh->probes);
1012 3 : consume_skb(skb);
1013 3 : }
1014 :
1015 : /* Called when a timer expires for a neighbour entry. */
1016 :
1017 5 : static void neigh_timer_handler(struct timer_list *t)
1018 : {
1019 5 : unsigned long now, next;
1020 5 : struct neighbour *neigh = from_timer(neigh, t, timer);
1021 5 : unsigned int state;
1022 5 : int notify = 0;
1023 :
1024 5 : write_lock(&neigh->lock);
1025 :
1026 5 : state = neigh->nud_state;
1027 5 : now = jiffies;
1028 5 : next = now + HZ;
1029 :
1030 5 : if (!(state & NUD_IN_TIMER))
1031 0 : goto out;
1032 :
1033 5 : if (state & NUD_REACHABLE) {
1034 4 : if (time_before_eq(now,
1035 : neigh->confirmed + neigh->parms->reachable_time)) {
1036 : neigh_dbg(2, "neigh %p is still alive\n", neigh);
1037 : next = neigh->confirmed + neigh->parms->reachable_time;
1038 3 : } else if (time_before_eq(now,
1039 : neigh->used +
1040 : NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME))) {
1041 0 : neigh_dbg(2, "neigh %p is delayed\n", neigh);
1042 0 : neigh->nud_state = NUD_DELAY;
1043 0 : neigh->updated = jiffies;
1044 0 : neigh_suspect(neigh);
1045 0 : next = now + NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME);
1046 : } else {
1047 3 : neigh_dbg(2, "neigh %p is suspected\n", neigh);
1048 3 : neigh->nud_state = NUD_STALE;
1049 3 : neigh->updated = jiffies;
1050 3 : neigh_suspect(neigh);
1051 3 : notify = 1;
1052 : }
1053 1 : } else if (state & NUD_DELAY) {
1054 1 : if (time_before_eq(now,
1055 : neigh->confirmed +
1056 : NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME))) {
1057 0 : neigh_dbg(2, "neigh %p is now reachable\n", neigh);
1058 0 : neigh->nud_state = NUD_REACHABLE;
1059 0 : neigh->updated = jiffies;
1060 0 : neigh_connect(neigh);
1061 0 : notify = 1;
1062 0 : next = neigh->confirmed + neigh->parms->reachable_time;
1063 : } else {
1064 1 : neigh_dbg(2, "neigh %p is probed\n", neigh);
1065 1 : neigh->nud_state = NUD_PROBE;
1066 1 : neigh->updated = jiffies;
1067 1 : atomic_set(&neigh->probes, 0);
1068 1 : notify = 1;
1069 1 : next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME),
1070 : HZ/100);
1071 : }
1072 : } else {
1073 : /* NUD_PROBE|NUD_INCOMPLETE */
1074 0 : next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), HZ/100);
1075 : }
1076 :
1077 5 : if ((neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) &&
1078 1 : atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) {
1079 0 : neigh->nud_state = NUD_FAILED;
1080 0 : notify = 1;
1081 0 : neigh_invalidate(neigh);
1082 0 : goto out;
1083 : }
1084 :
1085 5 : if (neigh->nud_state & NUD_IN_TIMER) {
1086 2 : if (time_before(next, jiffies + HZ/100))
1087 0 : next = jiffies + HZ/100;
1088 2 : if (!mod_timer(&neigh->timer, next))
1089 2 : neigh_hold(neigh);
1090 : }
1091 5 : if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
1092 1 : neigh_probe(neigh);
1093 : } else {
1094 4 : out:
1095 4 : write_unlock(&neigh->lock);
1096 : }
1097 :
1098 5 : if (notify)
1099 4 : neigh_update_notify(neigh, 0);
1100 :
1101 5 : trace_neigh_timer_handler(neigh, 0);
1102 :
1103 5 : neigh_release(neigh);
1104 5 : }
1105 :
1106 4 : int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
1107 : {
1108 4 : int rc;
1109 4 : bool immediate_probe = false;
1110 :
1111 4 : write_lock_bh(&neigh->lock);
1112 :
1113 4 : rc = 0;
1114 4 : if (neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE))
1115 0 : goto out_unlock_bh;
1116 4 : if (neigh->dead)
1117 0 : goto out_dead;
1118 :
1119 4 : if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) {
1120 2 : if (NEIGH_VAR(neigh->parms, MCAST_PROBES) +
1121 2 : NEIGH_VAR(neigh->parms, APP_PROBES)) {
1122 2 : unsigned long next, now = jiffies;
1123 :
1124 2 : atomic_set(&neigh->probes,
1125 : NEIGH_VAR(neigh->parms, UCAST_PROBES));
1126 2 : neigh_del_timer(neigh);
1127 2 : neigh->nud_state = NUD_INCOMPLETE;
1128 2 : neigh->updated = now;
1129 2 : next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME),
1130 : HZ/100);
1131 2 : neigh_add_timer(neigh, next);
1132 2 : immediate_probe = true;
1133 : } else {
1134 0 : neigh->nud_state = NUD_FAILED;
1135 0 : neigh->updated = jiffies;
1136 0 : write_unlock_bh(&neigh->lock);
1137 :
1138 0 : kfree_skb(skb);
1139 0 : return 1;
1140 : }
1141 2 : } else if (neigh->nud_state & NUD_STALE) {
1142 2 : neigh_dbg(2, "neigh %p is delayed\n", neigh);
1143 2 : neigh_del_timer(neigh);
1144 2 : neigh->nud_state = NUD_DELAY;
1145 2 : neigh->updated = jiffies;
1146 2 : neigh_add_timer(neigh, jiffies +
1147 2 : NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME));
1148 : }
1149 :
1150 4 : if (neigh->nud_state == NUD_INCOMPLETE) {
1151 2 : if (skb) {
1152 2 : while (neigh->arp_queue_len_bytes + skb->truesize >
1153 2 : NEIGH_VAR(neigh->parms, QUEUE_LEN_BYTES)) {
1154 0 : struct sk_buff *buff;
1155 :
1156 0 : buff = __skb_dequeue(&neigh->arp_queue);
1157 0 : if (!buff)
1158 : break;
1159 0 : neigh->arp_queue_len_bytes -= buff->truesize;
1160 0 : kfree_skb(buff);
1161 2 : NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards);
1162 : }
1163 2 : skb_dst_force(skb);
1164 2 : __skb_queue_tail(&neigh->arp_queue, skb);
1165 2 : neigh->arp_queue_len_bytes += skb->truesize;
1166 : }
1167 : rc = 1;
1168 : }
1169 2 : out_unlock_bh:
1170 4 : if (immediate_probe)
1171 2 : neigh_probe(neigh);
1172 : else
1173 2 : write_unlock(&neigh->lock);
1174 4 : local_bh_enable();
1175 4 : trace_neigh_event_send_done(neigh, rc);
1176 4 : return rc;
1177 :
1178 0 : out_dead:
1179 0 : if (neigh->nud_state & NUD_STALE)
1180 0 : goto out_unlock_bh;
1181 0 : write_unlock_bh(&neigh->lock);
1182 0 : kfree_skb(skb);
1183 0 : trace_neigh_event_send_dead(neigh, 1);
1184 0 : return 1;
1185 : }
1186 : EXPORT_SYMBOL(__neigh_event_send);
1187 :
1188 2 : static void neigh_update_hhs(struct neighbour *neigh)
1189 : {
1190 2 : struct hh_cache *hh;
1191 2 : void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *)
1192 : = NULL;
1193 :
1194 2 : if (neigh->dev->header_ops)
1195 2 : update = neigh->dev->header_ops->cache_update;
1196 :
1197 2 : if (update) {
1198 2 : hh = &neigh->hh;
1199 2 : if (READ_ONCE(hh->hh_len)) {
1200 0 : write_seqlock_bh(&hh->hh_lock);
1201 0 : update(hh, neigh->dev, neigh->ha);
1202 0 : write_sequnlock_bh(&hh->hh_lock);
1203 : }
1204 : }
1205 2 : }
1206 :
1207 :
1208 :
1209 : /* Generic update routine.
1210 : -- lladdr is new lladdr or NULL, if it is not supplied.
1211 : -- new is new state.
1212 : -- flags
1213 : NEIGH_UPDATE_F_OVERRIDE allows to override existing lladdr,
1214 : if it is different.
1215 : NEIGH_UPDATE_F_WEAK_OVERRIDE will suspect existing "connected"
1216 : lladdr instead of overriding it
1217 : if it is different.
1218 : NEIGH_UPDATE_F_ADMIN means that the change is administrative.
1219 :
1220 : NEIGH_UPDATE_F_OVERRIDE_ISROUTER allows to override existing
1221 : NTF_ROUTER flag.
1222 : NEIGH_UPDATE_F_ISROUTER indicates if the neighbour is known as
1223 : a router.
1224 :
1225 : Caller MUST hold reference count on the entry.
1226 : */
1227 :
1228 3 : static int __neigh_update(struct neighbour *neigh, const u8 *lladdr,
1229 : u8 new, u32 flags, u32 nlmsg_pid,
1230 : struct netlink_ext_ack *extack)
1231 : {
1232 3 : bool ext_learn_change = false;
1233 3 : u8 old;
1234 3 : int err;
1235 3 : int notify = 0;
1236 3 : struct net_device *dev;
1237 3 : int update_isrouter = 0;
1238 :
1239 3 : trace_neigh_update(neigh, lladdr, new, flags, nlmsg_pid);
1240 :
1241 3 : write_lock_bh(&neigh->lock);
1242 :
1243 3 : dev = neigh->dev;
1244 3 : old = neigh->nud_state;
1245 3 : err = -EPERM;
1246 :
1247 3 : if (neigh->dead) {
1248 0 : NL_SET_ERR_MSG(extack, "Neighbor entry is now dead");
1249 0 : new = old;
1250 0 : goto out;
1251 : }
1252 3 : if (!(flags & NEIGH_UPDATE_F_ADMIN) &&
1253 : (old & (NUD_NOARP | NUD_PERMANENT)))
1254 0 : goto out;
1255 :
1256 3 : ext_learn_change = neigh_update_ext_learned(neigh, flags, ¬ify);
1257 :
1258 3 : if (!(new & NUD_VALID)) {
1259 0 : neigh_del_timer(neigh);
1260 0 : if (old & NUD_CONNECTED)
1261 0 : neigh_suspect(neigh);
1262 0 : neigh->nud_state = new;
1263 0 : err = 0;
1264 0 : notify = old & NUD_VALID;
1265 0 : if ((old & (NUD_INCOMPLETE | NUD_PROBE)) &&
1266 : (new & NUD_FAILED)) {
1267 0 : neigh_invalidate(neigh);
1268 0 : notify = 1;
1269 : }
1270 0 : goto out;
1271 : }
1272 :
1273 : /* Compare new lladdr with cached one */
1274 3 : if (!dev->addr_len) {
1275 : /* First case: device needs no address. */
1276 0 : lladdr = neigh->ha;
1277 3 : } else if (lladdr) {
1278 : /* The second case: if something is already cached
1279 : and a new address is proposed:
1280 : - compare new & old
1281 : - if they are different, check override flag
1282 : */
1283 3 : if ((old & NUD_VALID) &&
1284 1 : !memcmp(lladdr, neigh->ha, dev->addr_len))
1285 1 : lladdr = neigh->ha;
1286 : } else {
1287 : /* No address is supplied; if we know something,
1288 : use it, otherwise discard the request.
1289 : */
1290 0 : err = -EINVAL;
1291 0 : if (!(old & NUD_VALID)) {
1292 0 : NL_SET_ERR_MSG(extack, "No link layer address given");
1293 0 : goto out;
1294 : }
1295 0 : lladdr = neigh->ha;
1296 : }
1297 :
1298 : /* Update confirmed timestamp for neighbour entry after we
1299 : * received ARP packet even if it doesn't change IP to MAC binding.
1300 : */
1301 3 : if (new & NUD_CONNECTED)
1302 3 : neigh->confirmed = jiffies;
1303 :
1304 : /* If entry was valid and address is not changed,
1305 : do not change entry state, if new one is STALE.
1306 : */
1307 3 : err = 0;
1308 3 : update_isrouter = flags & NEIGH_UPDATE_F_OVERRIDE_ISROUTER;
1309 3 : if (old & NUD_VALID) {
1310 1 : if (lladdr != neigh->ha && !(flags & NEIGH_UPDATE_F_OVERRIDE)) {
1311 0 : update_isrouter = 0;
1312 0 : if ((flags & NEIGH_UPDATE_F_WEAK_OVERRIDE) &&
1313 : (old & NUD_CONNECTED)) {
1314 : lladdr = neigh->ha;
1315 : new = NUD_STALE;
1316 : } else
1317 0 : goto out;
1318 : } else {
1319 1 : if (lladdr == neigh->ha && new == NUD_STALE &&
1320 1 : !(flags & NEIGH_UPDATE_F_ADMIN))
1321 0 : new = old;
1322 : }
1323 : }
1324 :
1325 : /* Update timestamp only once we know we will make a change to the
1326 : * neighbour entry. Otherwise we risk to move the locktime window with
1327 : * noop updates and ignore relevant ARP updates.
1328 : */
1329 3 : if (new != old || lladdr != neigh->ha)
1330 3 : neigh->updated = jiffies;
1331 :
1332 3 : if (new != old) {
1333 3 : neigh_del_timer(neigh);
1334 3 : if (new & NUD_PROBE)
1335 0 : atomic_set(&neigh->probes, 0);
1336 3 : if (new & NUD_IN_TIMER)
1337 3 : neigh_add_timer(neigh, (jiffies +
1338 : ((new & NUD_REACHABLE) ?
1339 3 : neigh->parms->reachable_time :
1340 : 0)));
1341 3 : neigh->nud_state = new;
1342 3 : notify = 1;
1343 : }
1344 :
1345 3 : if (lladdr != neigh->ha) {
1346 2 : write_seqlock(&neigh->ha_lock);
1347 2 : memcpy(&neigh->ha, lladdr, dev->addr_len);
1348 2 : write_sequnlock(&neigh->ha_lock);
1349 2 : neigh_update_hhs(neigh);
1350 2 : if (!(new & NUD_CONNECTED))
1351 0 : neigh->confirmed = jiffies -
1352 0 : (NEIGH_VAR(neigh->parms, BASE_REACHABLE_TIME) << 1);
1353 2 : notify = 1;
1354 : }
1355 3 : if (new == old)
1356 0 : goto out;
1357 3 : if (new & NUD_CONNECTED)
1358 3 : neigh_connect(neigh);
1359 : else
1360 0 : neigh_suspect(neigh);
1361 3 : if (!(old & NUD_VALID)) {
1362 : struct sk_buff *skb;
1363 :
1364 : /* Again: avoid dead loop if something went wrong */
1365 :
1366 4 : while (neigh->nud_state & NUD_VALID &&
1367 4 : (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
1368 2 : struct dst_entry *dst = skb_dst(skb);
1369 2 : struct neighbour *n2, *n1 = neigh;
1370 2 : write_unlock_bh(&neigh->lock);
1371 :
1372 2 : rcu_read_lock();
1373 :
1374 : /* Why not just use 'neigh' as-is? The problem is that
1375 : * things such as shaper, eql, and sch_teql can end up
1376 : * using alternative, different, neigh objects to output
1377 : * the packet in the output path. So what we need to do
1378 : * here is re-lookup the top-level neigh in the path so
1379 : * we can reinject the packet there.
1380 : */
1381 2 : n2 = NULL;
1382 2 : if (dst) {
1383 2 : n2 = dst_neigh_lookup_skb(dst, skb);
1384 2 : if (n2)
1385 2 : n1 = n2;
1386 : }
1387 2 : n1->output(n1, skb);
1388 2 : if (n2)
1389 2 : neigh_release(n2);
1390 2 : rcu_read_unlock();
1391 :
1392 2 : write_lock_bh(&neigh->lock);
1393 : }
1394 2 : __skb_queue_purge(&neigh->arp_queue);
1395 2 : neigh->arp_queue_len_bytes = 0;
1396 : }
1397 1 : out:
1398 3 : if (update_isrouter)
1399 0 : neigh_update_is_router(neigh, flags, ¬ify);
1400 3 : write_unlock_bh(&neigh->lock);
1401 :
1402 3 : if (((new ^ old) & NUD_PERMANENT) || ext_learn_change)
1403 0 : neigh_update_gc_list(neigh);
1404 :
1405 3 : if (notify)
1406 3 : neigh_update_notify(neigh, nlmsg_pid);
1407 :
1408 3 : trace_neigh_update_done(neigh, err);
1409 :
1410 3 : return err;
1411 : }
1412 :
1413 3 : int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
1414 : u32 flags, u32 nlmsg_pid)
1415 : {
1416 3 : return __neigh_update(neigh, lladdr, new, flags, nlmsg_pid, NULL);
1417 : }
1418 : EXPORT_SYMBOL(neigh_update);
1419 :
1420 : /* Update the neigh to listen temporarily for probe responses, even if it is
1421 : * in a NUD_FAILED state. The caller has to hold neigh->lock for writing.
1422 : */
1423 0 : void __neigh_set_probe_once(struct neighbour *neigh)
1424 : {
1425 0 : if (neigh->dead)
1426 : return;
1427 0 : neigh->updated = jiffies;
1428 0 : if (!(neigh->nud_state & NUD_FAILED))
1429 : return;
1430 0 : neigh->nud_state = NUD_INCOMPLETE;
1431 0 : atomic_set(&neigh->probes, neigh_max_probes(neigh));
1432 0 : neigh_add_timer(neigh,
1433 0 : jiffies + max(NEIGH_VAR(neigh->parms, RETRANS_TIME),
1434 : HZ/100));
1435 : }
1436 : EXPORT_SYMBOL(__neigh_set_probe_once);
1437 :
1438 0 : struct neighbour *neigh_event_ns(struct neigh_table *tbl,
1439 : u8 *lladdr, void *saddr,
1440 : struct net_device *dev)
1441 : {
1442 0 : struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev,
1443 0 : lladdr || !dev->addr_len);
1444 0 : if (neigh)
1445 0 : neigh_update(neigh, lladdr, NUD_STALE,
1446 : NEIGH_UPDATE_F_OVERRIDE, 0);
1447 0 : return neigh;
1448 : }
1449 : EXPORT_SYMBOL(neigh_event_ns);
1450 :
1451 : /* called with read_lock_bh(&n->lock); */
1452 2 : static void neigh_hh_init(struct neighbour *n)
1453 : {
1454 2 : struct net_device *dev = n->dev;
1455 2 : __be16 prot = n->tbl->protocol;
1456 2 : struct hh_cache *hh = &n->hh;
1457 :
1458 2 : write_lock_bh(&n->lock);
1459 :
1460 : /* Only one thread can come in here and initialize the
1461 : * hh_cache entry.
1462 : */
1463 2 : if (!hh->hh_len)
1464 2 : dev->header_ops->cache(n, hh, prot);
1465 :
1466 2 : write_unlock_bh(&n->lock);
1467 2 : }
1468 :
1469 : /* Slow and careful. */
1470 :
1471 8 : int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
1472 : {
1473 8 : int rc = 0;
1474 :
1475 8 : if (!neigh_event_send(neigh, skb)) {
1476 6 : int err;
1477 6 : struct net_device *dev = neigh->dev;
1478 6 : unsigned int seq;
1479 :
1480 6 : if (dev->header_ops->cache && !READ_ONCE(neigh->hh.hh_len))
1481 2 : neigh_hh_init(neigh);
1482 :
1483 6 : do {
1484 6 : __skb_pull(skb, skb_network_offset(skb));
1485 6 : seq = read_seqbegin(&neigh->ha_lock);
1486 12 : err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1487 6 : neigh->ha, NULL, skb->len);
1488 6 : } while (read_seqretry(&neigh->ha_lock, seq));
1489 :
1490 6 : if (err >= 0)
1491 6 : rc = dev_queue_xmit(skb);
1492 : else
1493 0 : goto out_kfree_skb;
1494 : }
1495 2 : out:
1496 8 : return rc;
1497 0 : out_kfree_skb:
1498 0 : rc = -EINVAL;
1499 0 : kfree_skb(skb);
1500 0 : goto out;
1501 : }
1502 : EXPORT_SYMBOL(neigh_resolve_output);
1503 :
1504 : /* As fast as possible without hh cache */
1505 :
1506 0 : int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb)
1507 : {
1508 0 : struct net_device *dev = neigh->dev;
1509 0 : unsigned int seq;
1510 0 : int err;
1511 :
1512 0 : do {
1513 0 : __skb_pull(skb, skb_network_offset(skb));
1514 0 : seq = read_seqbegin(&neigh->ha_lock);
1515 0 : err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1516 0 : neigh->ha, NULL, skb->len);
1517 0 : } while (read_seqretry(&neigh->ha_lock, seq));
1518 :
1519 0 : if (err >= 0)
1520 0 : err = dev_queue_xmit(skb);
1521 : else {
1522 0 : err = -EINVAL;
1523 0 : kfree_skb(skb);
1524 : }
1525 0 : return err;
1526 : }
1527 : EXPORT_SYMBOL(neigh_connected_output);
1528 :
1529 0 : int neigh_direct_output(struct neighbour *neigh, struct sk_buff *skb)
1530 : {
1531 0 : return dev_queue_xmit(skb);
1532 : }
1533 : EXPORT_SYMBOL(neigh_direct_output);
1534 :
1535 0 : static void neigh_proxy_process(struct timer_list *t)
1536 : {
1537 0 : struct neigh_table *tbl = from_timer(tbl, t, proxy_timer);
1538 0 : long sched_next = 0;
1539 0 : unsigned long now = jiffies;
1540 0 : struct sk_buff *skb, *n;
1541 :
1542 0 : spin_lock(&tbl->proxy_queue.lock);
1543 :
1544 0 : skb_queue_walk_safe(&tbl->proxy_queue, skb, n) {
1545 0 : long tdif = NEIGH_CB(skb)->sched_next - now;
1546 :
1547 0 : if (tdif <= 0) {
1548 0 : struct net_device *dev = skb->dev;
1549 :
1550 0 : __skb_unlink(skb, &tbl->proxy_queue);
1551 0 : if (tbl->proxy_redo && netif_running(dev)) {
1552 0 : rcu_read_lock();
1553 0 : tbl->proxy_redo(skb);
1554 0 : rcu_read_unlock();
1555 : } else {
1556 0 : kfree_skb(skb);
1557 : }
1558 :
1559 0 : dev_put(dev);
1560 0 : } else if (!sched_next || tdif < sched_next)
1561 0 : sched_next = tdif;
1562 : }
1563 0 : del_timer(&tbl->proxy_timer);
1564 0 : if (sched_next)
1565 0 : mod_timer(&tbl->proxy_timer, jiffies + sched_next);
1566 0 : spin_unlock(&tbl->proxy_queue.lock);
1567 0 : }
1568 :
1569 0 : void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
1570 : struct sk_buff *skb)
1571 : {
1572 0 : unsigned long sched_next = jiffies +
1573 0 : prandom_u32_max(NEIGH_VAR(p, PROXY_DELAY));
1574 :
1575 0 : if (tbl->proxy_queue.qlen > NEIGH_VAR(p, PROXY_QLEN)) {
1576 0 : kfree_skb(skb);
1577 0 : return;
1578 : }
1579 :
1580 0 : NEIGH_CB(skb)->sched_next = sched_next;
1581 0 : NEIGH_CB(skb)->flags |= LOCALLY_ENQUEUED;
1582 :
1583 0 : spin_lock(&tbl->proxy_queue.lock);
1584 0 : if (del_timer(&tbl->proxy_timer)) {
1585 0 : if (time_before(tbl->proxy_timer.expires, sched_next))
1586 0 : sched_next = tbl->proxy_timer.expires;
1587 : }
1588 0 : skb_dst_drop(skb);
1589 0 : dev_hold(skb->dev);
1590 0 : __skb_queue_tail(&tbl->proxy_queue, skb);
1591 0 : mod_timer(&tbl->proxy_timer, sched_next);
1592 0 : spin_unlock(&tbl->proxy_queue.lock);
1593 : }
1594 : EXPORT_SYMBOL(pneigh_enqueue);
1595 :
1596 0 : static inline struct neigh_parms *lookup_neigh_parms(struct neigh_table *tbl,
1597 : struct net *net, int ifindex)
1598 : {
1599 0 : struct neigh_parms *p;
1600 :
1601 0 : list_for_each_entry(p, &tbl->parms_list, list) {
1602 0 : if ((p->dev && p->dev->ifindex == ifindex && net_eq(neigh_parms_net(p), net)) ||
1603 0 : (!p->dev && !ifindex && net_eq(net, &init_net)))
1604 0 : return p;
1605 : }
1606 :
1607 : return NULL;
1608 : }
1609 :
1610 2 : struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
1611 : struct neigh_table *tbl)
1612 : {
1613 2 : struct neigh_parms *p;
1614 2 : struct net *net = dev_net(dev);
1615 2 : const struct net_device_ops *ops = dev->netdev_ops;
1616 :
1617 2 : p = kmemdup(&tbl->parms, sizeof(*p), GFP_KERNEL);
1618 2 : if (p) {
1619 2 : p->tbl = tbl;
1620 2 : refcount_set(&p->refcnt, 1);
1621 4 : p->reachable_time =
1622 2 : neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
1623 2 : dev_hold(dev);
1624 2 : p->dev = dev;
1625 2 : write_pnet(&p->net, net);
1626 2 : p->sysctl_table = NULL;
1627 :
1628 2 : if (ops->ndo_neigh_setup && ops->ndo_neigh_setup(dev, p)) {
1629 0 : dev_put(dev);
1630 0 : kfree(p);
1631 0 : return NULL;
1632 : }
1633 :
1634 2 : write_lock_bh(&tbl->lock);
1635 2 : list_add(&p->list, &tbl->parms.list);
1636 2 : write_unlock_bh(&tbl->lock);
1637 :
1638 2 : neigh_parms_data_state_cleanall(p);
1639 : }
1640 : return p;
1641 : }
1642 : EXPORT_SYMBOL(neigh_parms_alloc);
1643 :
1644 0 : static void neigh_rcu_free_parms(struct rcu_head *head)
1645 : {
1646 0 : struct neigh_parms *parms =
1647 0 : container_of(head, struct neigh_parms, rcu_head);
1648 :
1649 0 : neigh_parms_put(parms);
1650 0 : }
1651 :
1652 0 : void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
1653 : {
1654 0 : if (!parms || parms == &tbl->parms)
1655 : return;
1656 0 : write_lock_bh(&tbl->lock);
1657 0 : list_del(&parms->list);
1658 0 : parms->dead = 1;
1659 0 : write_unlock_bh(&tbl->lock);
1660 0 : if (parms->dev)
1661 0 : dev_put(parms->dev);
1662 0 : call_rcu(&parms->rcu_head, neigh_rcu_free_parms);
1663 : }
1664 : EXPORT_SYMBOL(neigh_parms_release);
1665 :
1666 0 : static void neigh_parms_destroy(struct neigh_parms *parms)
1667 : {
1668 0 : kfree(parms);
1669 0 : }
1670 :
1671 : static struct lock_class_key neigh_table_proxy_queue_class;
1672 :
1673 : static struct neigh_table *neigh_tables[NEIGH_NR_TABLES] __read_mostly;
1674 :
1675 1 : void neigh_table_init(int index, struct neigh_table *tbl)
1676 : {
1677 1 : unsigned long now = jiffies;
1678 1 : unsigned long phsize;
1679 :
1680 1 : INIT_LIST_HEAD(&tbl->parms_list);
1681 1 : INIT_LIST_HEAD(&tbl->gc_list);
1682 1 : list_add(&tbl->parms.list, &tbl->parms_list);
1683 1 : write_pnet(&tbl->parms.net, &init_net);
1684 1 : refcount_set(&tbl->parms.refcnt, 1);
1685 2 : tbl->parms.reachable_time =
1686 1 : neigh_rand_reach_time(NEIGH_VAR(&tbl->parms, BASE_REACHABLE_TIME));
1687 :
1688 1 : tbl->stats = alloc_percpu(struct neigh_statistics);
1689 1 : if (!tbl->stats)
1690 0 : panic("cannot create neighbour cache statistics");
1691 :
1692 : #ifdef CONFIG_PROC_FS
1693 1 : if (!proc_create_seq_data(tbl->id, 0, init_net.proc_net_stat,
1694 : &neigh_stat_seq_ops, tbl))
1695 0 : panic("cannot create neighbour proc dir entry");
1696 : #endif
1697 :
1698 1 : RCU_INIT_POINTER(tbl->nht, neigh_hash_alloc(3));
1699 :
1700 1 : phsize = (PNEIGH_HASHMASK + 1) * sizeof(struct pneigh_entry *);
1701 1 : tbl->phash_buckets = kzalloc(phsize, GFP_KERNEL);
1702 :
1703 1 : if (!tbl->nht || !tbl->phash_buckets)
1704 0 : panic("cannot allocate neighbour cache hashes");
1705 :
1706 1 : if (!tbl->entry_size)
1707 1 : tbl->entry_size = ALIGN(offsetof(struct neighbour, primary_key) +
1708 : tbl->key_len, NEIGH_PRIV_ALIGN);
1709 : else
1710 0 : WARN_ON(tbl->entry_size % NEIGH_PRIV_ALIGN);
1711 :
1712 1 : rwlock_init(&tbl->lock);
1713 1 : INIT_DEFERRABLE_WORK(&tbl->gc_work, neigh_periodic_work);
1714 2 : queue_delayed_work(system_power_efficient_wq, &tbl->gc_work,
1715 1 : tbl->parms.reachable_time);
1716 1 : timer_setup(&tbl->proxy_timer, neigh_proxy_process, 0);
1717 1 : skb_queue_head_init_class(&tbl->proxy_queue,
1718 : &neigh_table_proxy_queue_class);
1719 :
1720 1 : tbl->last_flush = now;
1721 1 : tbl->last_rand = now + tbl->parms.reachable_time * 20;
1722 :
1723 1 : neigh_tables[index] = tbl;
1724 1 : }
1725 : EXPORT_SYMBOL(neigh_table_init);
1726 :
1727 0 : int neigh_table_clear(int index, struct neigh_table *tbl)
1728 : {
1729 0 : neigh_tables[index] = NULL;
1730 : /* It is not clean... Fix it to unload IPv6 module safely */
1731 0 : cancel_delayed_work_sync(&tbl->gc_work);
1732 0 : del_timer_sync(&tbl->proxy_timer);
1733 0 : pneigh_queue_purge(&tbl->proxy_queue);
1734 0 : neigh_ifdown(tbl, NULL);
1735 0 : if (atomic_read(&tbl->entries))
1736 0 : pr_crit("neighbour leakage\n");
1737 :
1738 0 : call_rcu(&rcu_dereference_protected(tbl->nht, 1)->rcu,
1739 : neigh_hash_free_rcu);
1740 0 : tbl->nht = NULL;
1741 :
1742 0 : kfree(tbl->phash_buckets);
1743 0 : tbl->phash_buckets = NULL;
1744 :
1745 0 : remove_proc_entry(tbl->id, init_net.proc_net_stat);
1746 :
1747 0 : free_percpu(tbl->stats);
1748 0 : tbl->stats = NULL;
1749 :
1750 0 : return 0;
1751 : }
1752 : EXPORT_SYMBOL(neigh_table_clear);
1753 :
1754 0 : static struct neigh_table *neigh_find_table(int family)
1755 : {
1756 0 : struct neigh_table *tbl = NULL;
1757 :
1758 0 : switch (family) {
1759 0 : case AF_INET:
1760 0 : tbl = neigh_tables[NEIGH_ARP_TABLE];
1761 0 : break;
1762 0 : case AF_INET6:
1763 0 : tbl = neigh_tables[NEIGH_ND_TABLE];
1764 0 : break;
1765 0 : case AF_DECnet:
1766 0 : tbl = neigh_tables[NEIGH_DN_TABLE];
1767 0 : break;
1768 : }
1769 :
1770 0 : return tbl;
1771 : }
1772 :
1773 : const struct nla_policy nda_policy[NDA_MAX+1] = {
1774 : [NDA_UNSPEC] = { .strict_start_type = NDA_NH_ID },
1775 : [NDA_DST] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
1776 : [NDA_LLADDR] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
1777 : [NDA_CACHEINFO] = { .len = sizeof(struct nda_cacheinfo) },
1778 : [NDA_PROBES] = { .type = NLA_U32 },
1779 : [NDA_VLAN] = { .type = NLA_U16 },
1780 : [NDA_PORT] = { .type = NLA_U16 },
1781 : [NDA_VNI] = { .type = NLA_U32 },
1782 : [NDA_IFINDEX] = { .type = NLA_U32 },
1783 : [NDA_MASTER] = { .type = NLA_U32 },
1784 : [NDA_PROTOCOL] = { .type = NLA_U8 },
1785 : [NDA_NH_ID] = { .type = NLA_U32 },
1786 : [NDA_FDB_EXT_ATTRS] = { .type = NLA_NESTED },
1787 : };
1788 :
1789 0 : static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh,
1790 : struct netlink_ext_ack *extack)
1791 : {
1792 0 : struct net *net = sock_net(skb->sk);
1793 0 : struct ndmsg *ndm;
1794 0 : struct nlattr *dst_attr;
1795 0 : struct neigh_table *tbl;
1796 0 : struct neighbour *neigh;
1797 0 : struct net_device *dev = NULL;
1798 0 : int err = -EINVAL;
1799 :
1800 0 : ASSERT_RTNL();
1801 0 : if (nlmsg_len(nlh) < sizeof(*ndm))
1802 0 : goto out;
1803 :
1804 0 : dst_attr = nlmsg_find_attr(nlh, sizeof(*ndm), NDA_DST);
1805 0 : if (!dst_attr) {
1806 0 : NL_SET_ERR_MSG(extack, "Network address not specified");
1807 0 : goto out;
1808 : }
1809 :
1810 0 : ndm = nlmsg_data(nlh);
1811 0 : if (ndm->ndm_ifindex) {
1812 0 : dev = __dev_get_by_index(net, ndm->ndm_ifindex);
1813 0 : if (dev == NULL) {
1814 0 : err = -ENODEV;
1815 0 : goto out;
1816 : }
1817 : }
1818 :
1819 0 : tbl = neigh_find_table(ndm->ndm_family);
1820 0 : if (tbl == NULL)
1821 : return -EAFNOSUPPORT;
1822 :
1823 0 : if (nla_len(dst_attr) < (int)tbl->key_len) {
1824 0 : NL_SET_ERR_MSG(extack, "Invalid network address");
1825 0 : goto out;
1826 : }
1827 :
1828 0 : if (ndm->ndm_flags & NTF_PROXY) {
1829 0 : err = pneigh_delete(tbl, net, nla_data(dst_attr), dev);
1830 0 : goto out;
1831 : }
1832 :
1833 0 : if (dev == NULL)
1834 0 : goto out;
1835 :
1836 0 : neigh = neigh_lookup(tbl, nla_data(dst_attr), dev);
1837 0 : if (neigh == NULL) {
1838 0 : err = -ENOENT;
1839 0 : goto out;
1840 : }
1841 :
1842 0 : err = __neigh_update(neigh, NULL, NUD_FAILED,
1843 : NEIGH_UPDATE_F_OVERRIDE | NEIGH_UPDATE_F_ADMIN,
1844 : NETLINK_CB(skb).portid, extack);
1845 0 : write_lock_bh(&tbl->lock);
1846 0 : neigh_release(neigh);
1847 0 : neigh_remove_one(neigh, tbl);
1848 0 : write_unlock_bh(&tbl->lock);
1849 :
1850 : out:
1851 : return err;
1852 : }
1853 :
1854 0 : static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
1855 : struct netlink_ext_ack *extack)
1856 : {
1857 0 : int flags = NEIGH_UPDATE_F_ADMIN | NEIGH_UPDATE_F_OVERRIDE |
1858 : NEIGH_UPDATE_F_OVERRIDE_ISROUTER;
1859 0 : struct net *net = sock_net(skb->sk);
1860 0 : struct ndmsg *ndm;
1861 0 : struct nlattr *tb[NDA_MAX+1];
1862 0 : struct neigh_table *tbl;
1863 0 : struct net_device *dev = NULL;
1864 0 : struct neighbour *neigh;
1865 0 : void *dst, *lladdr;
1866 0 : u8 protocol = 0;
1867 0 : int err;
1868 :
1869 0 : ASSERT_RTNL();
1870 0 : err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX,
1871 : nda_policy, extack);
1872 0 : if (err < 0)
1873 0 : goto out;
1874 :
1875 0 : err = -EINVAL;
1876 0 : if (!tb[NDA_DST]) {
1877 0 : NL_SET_ERR_MSG(extack, "Network address not specified");
1878 0 : goto out;
1879 : }
1880 :
1881 0 : ndm = nlmsg_data(nlh);
1882 0 : if (ndm->ndm_ifindex) {
1883 0 : dev = __dev_get_by_index(net, ndm->ndm_ifindex);
1884 0 : if (dev == NULL) {
1885 0 : err = -ENODEV;
1886 0 : goto out;
1887 : }
1888 :
1889 0 : if (tb[NDA_LLADDR] && nla_len(tb[NDA_LLADDR]) < dev->addr_len) {
1890 0 : NL_SET_ERR_MSG(extack, "Invalid link address");
1891 0 : goto out;
1892 : }
1893 : }
1894 :
1895 0 : tbl = neigh_find_table(ndm->ndm_family);
1896 0 : if (tbl == NULL)
1897 : return -EAFNOSUPPORT;
1898 :
1899 0 : if (nla_len(tb[NDA_DST]) < (int)tbl->key_len) {
1900 0 : NL_SET_ERR_MSG(extack, "Invalid network address");
1901 0 : goto out;
1902 : }
1903 :
1904 0 : dst = nla_data(tb[NDA_DST]);
1905 0 : lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
1906 :
1907 0 : if (tb[NDA_PROTOCOL])
1908 0 : protocol = nla_get_u8(tb[NDA_PROTOCOL]);
1909 :
1910 0 : if (ndm->ndm_flags & NTF_PROXY) {
1911 0 : struct pneigh_entry *pn;
1912 :
1913 0 : err = -ENOBUFS;
1914 0 : pn = pneigh_lookup(tbl, net, dst, dev, 1);
1915 0 : if (pn) {
1916 0 : pn->flags = ndm->ndm_flags;
1917 0 : if (protocol)
1918 0 : pn->protocol = protocol;
1919 : err = 0;
1920 : }
1921 0 : goto out;
1922 : }
1923 :
1924 0 : if (!dev) {
1925 0 : NL_SET_ERR_MSG(extack, "Device not specified");
1926 0 : goto out;
1927 : }
1928 :
1929 0 : if (tbl->allow_add && !tbl->allow_add(dev, extack)) {
1930 0 : err = -EINVAL;
1931 0 : goto out;
1932 : }
1933 :
1934 0 : neigh = neigh_lookup(tbl, dst, dev);
1935 0 : if (neigh == NULL) {
1936 0 : bool exempt_from_gc;
1937 :
1938 0 : if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
1939 0 : err = -ENOENT;
1940 0 : goto out;
1941 : }
1942 :
1943 0 : exempt_from_gc = ndm->ndm_state & NUD_PERMANENT ||
1944 0 : ndm->ndm_flags & NTF_EXT_LEARNED;
1945 0 : neigh = ___neigh_create(tbl, dst, dev, exempt_from_gc, true);
1946 0 : if (IS_ERR(neigh)) {
1947 0 : err = PTR_ERR(neigh);
1948 0 : goto out;
1949 : }
1950 : } else {
1951 0 : if (nlh->nlmsg_flags & NLM_F_EXCL) {
1952 0 : err = -EEXIST;
1953 0 : neigh_release(neigh);
1954 0 : goto out;
1955 : }
1956 :
1957 0 : if (!(nlh->nlmsg_flags & NLM_F_REPLACE))
1958 0 : flags &= ~(NEIGH_UPDATE_F_OVERRIDE |
1959 : NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1960 : }
1961 :
1962 0 : if (protocol)
1963 0 : neigh->protocol = protocol;
1964 :
1965 0 : if (ndm->ndm_flags & NTF_EXT_LEARNED)
1966 0 : flags |= NEIGH_UPDATE_F_EXT_LEARNED;
1967 :
1968 0 : if (ndm->ndm_flags & NTF_ROUTER)
1969 0 : flags |= NEIGH_UPDATE_F_ISROUTER;
1970 :
1971 0 : if (ndm->ndm_flags & NTF_USE) {
1972 0 : neigh_event_send(neigh, NULL);
1973 0 : err = 0;
1974 : } else
1975 0 : err = __neigh_update(neigh, lladdr, ndm->ndm_state, flags,
1976 : NETLINK_CB(skb).portid, extack);
1977 :
1978 0 : neigh_release(neigh);
1979 :
1980 : out:
1981 : return err;
1982 : }
1983 :
1984 0 : static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
1985 : {
1986 0 : struct nlattr *nest;
1987 :
1988 0 : nest = nla_nest_start_noflag(skb, NDTA_PARMS);
1989 0 : if (nest == NULL)
1990 : return -ENOBUFS;
1991 :
1992 0 : if ((parms->dev &&
1993 0 : nla_put_u32(skb, NDTPA_IFINDEX, parms->dev->ifindex)) ||
1994 0 : nla_put_u32(skb, NDTPA_REFCNT, refcount_read(&parms->refcnt)) ||
1995 0 : nla_put_u32(skb, NDTPA_QUEUE_LENBYTES,
1996 0 : NEIGH_VAR(parms, QUEUE_LEN_BYTES)) ||
1997 : /* approximative value for deprecated QUEUE_LEN (in packets) */
1998 0 : nla_put_u32(skb, NDTPA_QUEUE_LEN,
1999 0 : NEIGH_VAR(parms, QUEUE_LEN_BYTES) / SKB_TRUESIZE(ETH_FRAME_LEN)) ||
2000 0 : nla_put_u32(skb, NDTPA_PROXY_QLEN, NEIGH_VAR(parms, PROXY_QLEN)) ||
2001 0 : nla_put_u32(skb, NDTPA_APP_PROBES, NEIGH_VAR(parms, APP_PROBES)) ||
2002 0 : nla_put_u32(skb, NDTPA_UCAST_PROBES,
2003 0 : NEIGH_VAR(parms, UCAST_PROBES)) ||
2004 0 : nla_put_u32(skb, NDTPA_MCAST_PROBES,
2005 0 : NEIGH_VAR(parms, MCAST_PROBES)) ||
2006 0 : nla_put_u32(skb, NDTPA_MCAST_REPROBES,
2007 0 : NEIGH_VAR(parms, MCAST_REPROBES)) ||
2008 0 : nla_put_msecs(skb, NDTPA_REACHABLE_TIME, parms->reachable_time,
2009 0 : NDTPA_PAD) ||
2010 0 : nla_put_msecs(skb, NDTPA_BASE_REACHABLE_TIME,
2011 0 : NEIGH_VAR(parms, BASE_REACHABLE_TIME), NDTPA_PAD) ||
2012 0 : nla_put_msecs(skb, NDTPA_GC_STALETIME,
2013 0 : NEIGH_VAR(parms, GC_STALETIME), NDTPA_PAD) ||
2014 0 : nla_put_msecs(skb, NDTPA_DELAY_PROBE_TIME,
2015 0 : NEIGH_VAR(parms, DELAY_PROBE_TIME), NDTPA_PAD) ||
2016 0 : nla_put_msecs(skb, NDTPA_RETRANS_TIME,
2017 0 : NEIGH_VAR(parms, RETRANS_TIME), NDTPA_PAD) ||
2018 0 : nla_put_msecs(skb, NDTPA_ANYCAST_DELAY,
2019 0 : NEIGH_VAR(parms, ANYCAST_DELAY), NDTPA_PAD) ||
2020 0 : nla_put_msecs(skb, NDTPA_PROXY_DELAY,
2021 0 : NEIGH_VAR(parms, PROXY_DELAY), NDTPA_PAD) ||
2022 0 : nla_put_msecs(skb, NDTPA_LOCKTIME,
2023 0 : NEIGH_VAR(parms, LOCKTIME), NDTPA_PAD))
2024 0 : goto nla_put_failure;
2025 0 : return nla_nest_end(skb, nest);
2026 :
2027 0 : nla_put_failure:
2028 0 : nla_nest_cancel(skb, nest);
2029 0 : return -EMSGSIZE;
2030 : }
2031 :
2032 0 : static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl,
2033 : u32 pid, u32 seq, int type, int flags)
2034 : {
2035 0 : struct nlmsghdr *nlh;
2036 0 : struct ndtmsg *ndtmsg;
2037 :
2038 0 : nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndtmsg), flags);
2039 0 : if (nlh == NULL)
2040 : return -EMSGSIZE;
2041 :
2042 0 : ndtmsg = nlmsg_data(nlh);
2043 :
2044 0 : read_lock_bh(&tbl->lock);
2045 0 : ndtmsg->ndtm_family = tbl->family;
2046 0 : ndtmsg->ndtm_pad1 = 0;
2047 0 : ndtmsg->ndtm_pad2 = 0;
2048 :
2049 0 : if (nla_put_string(skb, NDTA_NAME, tbl->id) ||
2050 0 : nla_put_msecs(skb, NDTA_GC_INTERVAL, tbl->gc_interval, NDTA_PAD) ||
2051 0 : nla_put_u32(skb, NDTA_THRESH1, tbl->gc_thresh1) ||
2052 0 : nla_put_u32(skb, NDTA_THRESH2, tbl->gc_thresh2) ||
2053 0 : nla_put_u32(skb, NDTA_THRESH3, tbl->gc_thresh3))
2054 0 : goto nla_put_failure;
2055 : {
2056 0 : unsigned long now = jiffies;
2057 0 : long flush_delta = now - tbl->last_flush;
2058 0 : long rand_delta = now - tbl->last_rand;
2059 0 : struct neigh_hash_table *nht;
2060 0 : struct ndt_config ndc = {
2061 0 : .ndtc_key_len = tbl->key_len,
2062 0 : .ndtc_entry_size = tbl->entry_size,
2063 0 : .ndtc_entries = atomic_read(&tbl->entries),
2064 0 : .ndtc_last_flush = jiffies_to_msecs(flush_delta),
2065 0 : .ndtc_last_rand = jiffies_to_msecs(rand_delta),
2066 0 : .ndtc_proxy_qlen = tbl->proxy_queue.qlen,
2067 : };
2068 :
2069 0 : rcu_read_lock_bh();
2070 0 : nht = rcu_dereference_bh(tbl->nht);
2071 0 : ndc.ndtc_hash_rnd = nht->hash_rnd[0];
2072 0 : ndc.ndtc_hash_mask = ((1 << nht->hash_shift) - 1);
2073 0 : rcu_read_unlock_bh();
2074 :
2075 0 : if (nla_put(skb, NDTA_CONFIG, sizeof(ndc), &ndc))
2076 0 : goto nla_put_failure;
2077 : }
2078 :
2079 : {
2080 0 : int cpu;
2081 0 : struct ndt_stats ndst;
2082 :
2083 0 : memset(&ndst, 0, sizeof(ndst));
2084 :
2085 0 : for_each_possible_cpu(cpu) {
2086 0 : struct neigh_statistics *st;
2087 :
2088 0 : st = per_cpu_ptr(tbl->stats, cpu);
2089 0 : ndst.ndts_allocs += st->allocs;
2090 0 : ndst.ndts_destroys += st->destroys;
2091 0 : ndst.ndts_hash_grows += st->hash_grows;
2092 0 : ndst.ndts_res_failed += st->res_failed;
2093 0 : ndst.ndts_lookups += st->lookups;
2094 0 : ndst.ndts_hits += st->hits;
2095 0 : ndst.ndts_rcv_probes_mcast += st->rcv_probes_mcast;
2096 0 : ndst.ndts_rcv_probes_ucast += st->rcv_probes_ucast;
2097 0 : ndst.ndts_periodic_gc_runs += st->periodic_gc_runs;
2098 0 : ndst.ndts_forced_gc_runs += st->forced_gc_runs;
2099 0 : ndst.ndts_table_fulls += st->table_fulls;
2100 : }
2101 :
2102 0 : if (nla_put_64bit(skb, NDTA_STATS, sizeof(ndst), &ndst,
2103 : NDTA_PAD))
2104 0 : goto nla_put_failure;
2105 : }
2106 :
2107 0 : BUG_ON(tbl->parms.dev);
2108 0 : if (neightbl_fill_parms(skb, &tbl->parms) < 0)
2109 0 : goto nla_put_failure;
2110 :
2111 0 : read_unlock_bh(&tbl->lock);
2112 0 : nlmsg_end(skb, nlh);
2113 0 : return 0;
2114 :
2115 0 : nla_put_failure:
2116 0 : read_unlock_bh(&tbl->lock);
2117 0 : nlmsg_cancel(skb, nlh);
2118 0 : return -EMSGSIZE;
2119 : }
2120 :
2121 0 : static int neightbl_fill_param_info(struct sk_buff *skb,
2122 : struct neigh_table *tbl,
2123 : struct neigh_parms *parms,
2124 : u32 pid, u32 seq, int type,
2125 : unsigned int flags)
2126 : {
2127 0 : struct ndtmsg *ndtmsg;
2128 0 : struct nlmsghdr *nlh;
2129 :
2130 0 : nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndtmsg), flags);
2131 0 : if (nlh == NULL)
2132 : return -EMSGSIZE;
2133 :
2134 0 : ndtmsg = nlmsg_data(nlh);
2135 :
2136 0 : read_lock_bh(&tbl->lock);
2137 0 : ndtmsg->ndtm_family = tbl->family;
2138 0 : ndtmsg->ndtm_pad1 = 0;
2139 0 : ndtmsg->ndtm_pad2 = 0;
2140 :
2141 0 : if (nla_put_string(skb, NDTA_NAME, tbl->id) < 0 ||
2142 0 : neightbl_fill_parms(skb, parms) < 0)
2143 0 : goto errout;
2144 :
2145 0 : read_unlock_bh(&tbl->lock);
2146 0 : nlmsg_end(skb, nlh);
2147 0 : return 0;
2148 0 : errout:
2149 0 : read_unlock_bh(&tbl->lock);
2150 0 : nlmsg_cancel(skb, nlh);
2151 0 : return -EMSGSIZE;
2152 : }
2153 :
2154 : static const struct nla_policy nl_neightbl_policy[NDTA_MAX+1] = {
2155 : [NDTA_NAME] = { .type = NLA_STRING },
2156 : [NDTA_THRESH1] = { .type = NLA_U32 },
2157 : [NDTA_THRESH2] = { .type = NLA_U32 },
2158 : [NDTA_THRESH3] = { .type = NLA_U32 },
2159 : [NDTA_GC_INTERVAL] = { .type = NLA_U64 },
2160 : [NDTA_PARMS] = { .type = NLA_NESTED },
2161 : };
2162 :
2163 : static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
2164 : [NDTPA_IFINDEX] = { .type = NLA_U32 },
2165 : [NDTPA_QUEUE_LEN] = { .type = NLA_U32 },
2166 : [NDTPA_PROXY_QLEN] = { .type = NLA_U32 },
2167 : [NDTPA_APP_PROBES] = { .type = NLA_U32 },
2168 : [NDTPA_UCAST_PROBES] = { .type = NLA_U32 },
2169 : [NDTPA_MCAST_PROBES] = { .type = NLA_U32 },
2170 : [NDTPA_MCAST_REPROBES] = { .type = NLA_U32 },
2171 : [NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 },
2172 : [NDTPA_GC_STALETIME] = { .type = NLA_U64 },
2173 : [NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 },
2174 : [NDTPA_RETRANS_TIME] = { .type = NLA_U64 },
2175 : [NDTPA_ANYCAST_DELAY] = { .type = NLA_U64 },
2176 : [NDTPA_PROXY_DELAY] = { .type = NLA_U64 },
2177 : [NDTPA_LOCKTIME] = { .type = NLA_U64 },
2178 : };
2179 :
2180 0 : static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh,
2181 : struct netlink_ext_ack *extack)
2182 : {
2183 0 : struct net *net = sock_net(skb->sk);
2184 0 : struct neigh_table *tbl;
2185 0 : struct ndtmsg *ndtmsg;
2186 0 : struct nlattr *tb[NDTA_MAX+1];
2187 0 : bool found = false;
2188 0 : int err, tidx;
2189 :
2190 0 : err = nlmsg_parse_deprecated(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
2191 : nl_neightbl_policy, extack);
2192 0 : if (err < 0)
2193 0 : goto errout;
2194 :
2195 0 : if (tb[NDTA_NAME] == NULL) {
2196 0 : err = -EINVAL;
2197 0 : goto errout;
2198 : }
2199 :
2200 0 : ndtmsg = nlmsg_data(nlh);
2201 :
2202 0 : for (tidx = 0; tidx < NEIGH_NR_TABLES; tidx++) {
2203 0 : tbl = neigh_tables[tidx];
2204 0 : if (!tbl)
2205 0 : continue;
2206 0 : if (ndtmsg->ndtm_family && tbl->family != ndtmsg->ndtm_family)
2207 0 : continue;
2208 0 : if (nla_strcmp(tb[NDTA_NAME], tbl->id) == 0) {
2209 : found = true;
2210 : break;
2211 : }
2212 : }
2213 :
2214 0 : if (!found)
2215 : return -ENOENT;
2216 :
2217 : /*
2218 : * We acquire tbl->lock to be nice to the periodic timers and
2219 : * make sure they always see a consistent set of values.
2220 : */
2221 0 : write_lock_bh(&tbl->lock);
2222 :
2223 0 : if (tb[NDTA_PARMS]) {
2224 0 : struct nlattr *tbp[NDTPA_MAX+1];
2225 0 : struct neigh_parms *p;
2226 0 : int i, ifindex = 0;
2227 :
2228 0 : err = nla_parse_nested_deprecated(tbp, NDTPA_MAX,
2229 : tb[NDTA_PARMS],
2230 : nl_ntbl_parm_policy, extack);
2231 0 : if (err < 0)
2232 0 : goto errout_tbl_lock;
2233 :
2234 0 : if (tbp[NDTPA_IFINDEX])
2235 0 : ifindex = nla_get_u32(tbp[NDTPA_IFINDEX]);
2236 :
2237 0 : p = lookup_neigh_parms(tbl, net, ifindex);
2238 0 : if (p == NULL) {
2239 0 : err = -ENOENT;
2240 0 : goto errout_tbl_lock;
2241 : }
2242 :
2243 0 : for (i = 1; i <= NDTPA_MAX; i++) {
2244 0 : if (tbp[i] == NULL)
2245 0 : continue;
2246 :
2247 0 : switch (i) {
2248 0 : case NDTPA_QUEUE_LEN:
2249 0 : NEIGH_VAR_SET(p, QUEUE_LEN_BYTES,
2250 : nla_get_u32(tbp[i]) *
2251 : SKB_TRUESIZE(ETH_FRAME_LEN));
2252 : break;
2253 0 : case NDTPA_QUEUE_LENBYTES:
2254 0 : NEIGH_VAR_SET(p, QUEUE_LEN_BYTES,
2255 : nla_get_u32(tbp[i]));
2256 : break;
2257 0 : case NDTPA_PROXY_QLEN:
2258 0 : NEIGH_VAR_SET(p, PROXY_QLEN,
2259 : nla_get_u32(tbp[i]));
2260 : break;
2261 0 : case NDTPA_APP_PROBES:
2262 0 : NEIGH_VAR_SET(p, APP_PROBES,
2263 : nla_get_u32(tbp[i]));
2264 : break;
2265 0 : case NDTPA_UCAST_PROBES:
2266 0 : NEIGH_VAR_SET(p, UCAST_PROBES,
2267 : nla_get_u32(tbp[i]));
2268 : break;
2269 0 : case NDTPA_MCAST_PROBES:
2270 0 : NEIGH_VAR_SET(p, MCAST_PROBES,
2271 : nla_get_u32(tbp[i]));
2272 : break;
2273 0 : case NDTPA_MCAST_REPROBES:
2274 0 : NEIGH_VAR_SET(p, MCAST_REPROBES,
2275 : nla_get_u32(tbp[i]));
2276 : break;
2277 0 : case NDTPA_BASE_REACHABLE_TIME:
2278 0 : NEIGH_VAR_SET(p, BASE_REACHABLE_TIME,
2279 : nla_get_msecs(tbp[i]));
2280 : /* update reachable_time as well, otherwise, the change will
2281 : * only be effective after the next time neigh_periodic_work
2282 : * decides to recompute it (can be multiple minutes)
2283 : */
2284 0 : p->reachable_time =
2285 0 : neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
2286 0 : break;
2287 0 : case NDTPA_GC_STALETIME:
2288 0 : NEIGH_VAR_SET(p, GC_STALETIME,
2289 : nla_get_msecs(tbp[i]));
2290 : break;
2291 0 : case NDTPA_DELAY_PROBE_TIME:
2292 0 : NEIGH_VAR_SET(p, DELAY_PROBE_TIME,
2293 : nla_get_msecs(tbp[i]));
2294 0 : call_netevent_notifiers(NETEVENT_DELAY_PROBE_TIME_UPDATE, p);
2295 0 : break;
2296 0 : case NDTPA_RETRANS_TIME:
2297 0 : NEIGH_VAR_SET(p, RETRANS_TIME,
2298 : nla_get_msecs(tbp[i]));
2299 : break;
2300 0 : case NDTPA_ANYCAST_DELAY:
2301 0 : NEIGH_VAR_SET(p, ANYCAST_DELAY,
2302 : nla_get_msecs(tbp[i]));
2303 : break;
2304 0 : case NDTPA_PROXY_DELAY:
2305 0 : NEIGH_VAR_SET(p, PROXY_DELAY,
2306 : nla_get_msecs(tbp[i]));
2307 : break;
2308 0 : case NDTPA_LOCKTIME:
2309 0 : NEIGH_VAR_SET(p, LOCKTIME,
2310 : nla_get_msecs(tbp[i]));
2311 : break;
2312 : }
2313 0 : }
2314 : }
2315 :
2316 0 : err = -ENOENT;
2317 0 : if ((tb[NDTA_THRESH1] || tb[NDTA_THRESH2] ||
2318 : tb[NDTA_THRESH3] || tb[NDTA_GC_INTERVAL]) &&
2319 0 : !net_eq(net, &init_net))
2320 : goto errout_tbl_lock;
2321 :
2322 0 : if (tb[NDTA_THRESH1])
2323 0 : tbl->gc_thresh1 = nla_get_u32(tb[NDTA_THRESH1]);
2324 :
2325 0 : if (tb[NDTA_THRESH2])
2326 0 : tbl->gc_thresh2 = nla_get_u32(tb[NDTA_THRESH2]);
2327 :
2328 0 : if (tb[NDTA_THRESH3])
2329 0 : tbl->gc_thresh3 = nla_get_u32(tb[NDTA_THRESH3]);
2330 :
2331 0 : if (tb[NDTA_GC_INTERVAL])
2332 0 : tbl->gc_interval = nla_get_msecs(tb[NDTA_GC_INTERVAL]);
2333 :
2334 : err = 0;
2335 :
2336 0 : errout_tbl_lock:
2337 0 : write_unlock_bh(&tbl->lock);
2338 : errout:
2339 : return err;
2340 : }
2341 :
2342 0 : static int neightbl_valid_dump_info(const struct nlmsghdr *nlh,
2343 : struct netlink_ext_ack *extack)
2344 : {
2345 0 : struct ndtmsg *ndtm;
2346 :
2347 0 : if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ndtm))) {
2348 0 : NL_SET_ERR_MSG(extack, "Invalid header for neighbor table dump request");
2349 0 : return -EINVAL;
2350 : }
2351 :
2352 0 : ndtm = nlmsg_data(nlh);
2353 0 : if (ndtm->ndtm_pad1 || ndtm->ndtm_pad2) {
2354 0 : NL_SET_ERR_MSG(extack, "Invalid values in header for neighbor table dump request");
2355 0 : return -EINVAL;
2356 : }
2357 :
2358 0 : if (nlmsg_attrlen(nlh, sizeof(*ndtm))) {
2359 0 : NL_SET_ERR_MSG(extack, "Invalid data after header in neighbor table dump request");
2360 0 : return -EINVAL;
2361 : }
2362 :
2363 : return 0;
2364 : }
2365 :
2366 0 : static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
2367 : {
2368 0 : const struct nlmsghdr *nlh = cb->nlh;
2369 0 : struct net *net = sock_net(skb->sk);
2370 0 : int family, tidx, nidx = 0;
2371 0 : int tbl_skip = cb->args[0];
2372 0 : int neigh_skip = cb->args[1];
2373 0 : struct neigh_table *tbl;
2374 :
2375 0 : if (cb->strict_check) {
2376 0 : int err = neightbl_valid_dump_info(nlh, cb->extack);
2377 :
2378 0 : if (err < 0)
2379 : return err;
2380 : }
2381 :
2382 0 : family = ((struct rtgenmsg *)nlmsg_data(nlh))->rtgen_family;
2383 :
2384 0 : for (tidx = 0; tidx < NEIGH_NR_TABLES; tidx++) {
2385 0 : struct neigh_parms *p;
2386 :
2387 0 : tbl = neigh_tables[tidx];
2388 0 : if (!tbl)
2389 0 : continue;
2390 :
2391 0 : if (tidx < tbl_skip || (family && tbl->family != family))
2392 0 : continue;
2393 :
2394 0 : if (neightbl_fill_info(skb, tbl, NETLINK_CB(cb->skb).portid,
2395 : nlh->nlmsg_seq, RTM_NEWNEIGHTBL,
2396 : NLM_F_MULTI) < 0)
2397 : break;
2398 :
2399 0 : nidx = 0;
2400 0 : p = list_next_entry(&tbl->parms, list);
2401 0 : list_for_each_entry_from(p, &tbl->parms_list, list) {
2402 0 : if (!net_eq(neigh_parms_net(p), net))
2403 : continue;
2404 :
2405 0 : if (nidx < neigh_skip)
2406 0 : goto next;
2407 :
2408 0 : if (neightbl_fill_param_info(skb, tbl, p,
2409 0 : NETLINK_CB(cb->skb).portid,
2410 : nlh->nlmsg_seq,
2411 : RTM_NEWNEIGHTBL,
2412 : NLM_F_MULTI) < 0)
2413 0 : goto out;
2414 0 : next:
2415 0 : nidx++;
2416 : }
2417 :
2418 : neigh_skip = 0;
2419 : }
2420 0 : out:
2421 0 : cb->args[0] = tidx;
2422 0 : cb->args[1] = nidx;
2423 :
2424 0 : return skb->len;
2425 : }
2426 :
2427 7 : static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh,
2428 : u32 pid, u32 seq, int type, unsigned int flags)
2429 : {
2430 7 : unsigned long now = jiffies;
2431 7 : struct nda_cacheinfo ci;
2432 7 : struct nlmsghdr *nlh;
2433 7 : struct ndmsg *ndm;
2434 :
2435 7 : nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
2436 7 : if (nlh == NULL)
2437 : return -EMSGSIZE;
2438 :
2439 7 : ndm = nlmsg_data(nlh);
2440 7 : ndm->ndm_family = neigh->ops->family;
2441 7 : ndm->ndm_pad1 = 0;
2442 7 : ndm->ndm_pad2 = 0;
2443 7 : ndm->ndm_flags = neigh->flags;
2444 7 : ndm->ndm_type = neigh->type;
2445 7 : ndm->ndm_ifindex = neigh->dev->ifindex;
2446 :
2447 7 : if (nla_put(skb, NDA_DST, neigh->tbl->key_len, neigh->primary_key))
2448 0 : goto nla_put_failure;
2449 :
2450 7 : read_lock_bh(&neigh->lock);
2451 7 : ndm->ndm_state = neigh->nud_state;
2452 7 : if (neigh->nud_state & NUD_VALID) {
2453 7 : char haddr[MAX_ADDR_LEN];
2454 :
2455 7 : neigh_ha_snapshot(haddr, neigh, neigh->dev);
2456 7 : if (nla_put(skb, NDA_LLADDR, neigh->dev->addr_len, haddr) < 0) {
2457 0 : read_unlock_bh(&neigh->lock);
2458 0 : goto nla_put_failure;
2459 : }
2460 : }
2461 :
2462 7 : ci.ndm_used = jiffies_to_clock_t(now - neigh->used);
2463 7 : ci.ndm_confirmed = jiffies_to_clock_t(now - neigh->confirmed);
2464 7 : ci.ndm_updated = jiffies_to_clock_t(now - neigh->updated);
2465 7 : ci.ndm_refcnt = refcount_read(&neigh->refcnt) - 1;
2466 7 : read_unlock_bh(&neigh->lock);
2467 :
2468 14 : if (nla_put_u32(skb, NDA_PROBES, atomic_read(&neigh->probes)) ||
2469 7 : nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
2470 0 : goto nla_put_failure;
2471 :
2472 7 : if (neigh->protocol && nla_put_u8(skb, NDA_PROTOCOL, neigh->protocol))
2473 0 : goto nla_put_failure;
2474 :
2475 7 : nlmsg_end(skb, nlh);
2476 7 : return 0;
2477 :
2478 0 : nla_put_failure:
2479 0 : nlmsg_cancel(skb, nlh);
2480 0 : return -EMSGSIZE;
2481 : }
2482 :
2483 0 : static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn,
2484 : u32 pid, u32 seq, int type, unsigned int flags,
2485 : struct neigh_table *tbl)
2486 : {
2487 0 : struct nlmsghdr *nlh;
2488 0 : struct ndmsg *ndm;
2489 :
2490 0 : nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
2491 0 : if (nlh == NULL)
2492 : return -EMSGSIZE;
2493 :
2494 0 : ndm = nlmsg_data(nlh);
2495 0 : ndm->ndm_family = tbl->family;
2496 0 : ndm->ndm_pad1 = 0;
2497 0 : ndm->ndm_pad2 = 0;
2498 0 : ndm->ndm_flags = pn->flags | NTF_PROXY;
2499 0 : ndm->ndm_type = RTN_UNICAST;
2500 0 : ndm->ndm_ifindex = pn->dev ? pn->dev->ifindex : 0;
2501 0 : ndm->ndm_state = NUD_NONE;
2502 :
2503 0 : if (nla_put(skb, NDA_DST, tbl->key_len, pn->key))
2504 0 : goto nla_put_failure;
2505 :
2506 0 : if (pn->protocol && nla_put_u8(skb, NDA_PROTOCOL, pn->protocol))
2507 0 : goto nla_put_failure;
2508 :
2509 0 : nlmsg_end(skb, nlh);
2510 0 : return 0;
2511 :
2512 0 : nla_put_failure:
2513 0 : nlmsg_cancel(skb, nlh);
2514 0 : return -EMSGSIZE;
2515 : }
2516 :
2517 7 : static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid)
2518 : {
2519 7 : call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
2520 7 : __neigh_notify(neigh, RTM_NEWNEIGH, 0, nlmsg_pid);
2521 7 : }
2522 :
2523 0 : static bool neigh_master_filtered(struct net_device *dev, int master_idx)
2524 : {
2525 0 : struct net_device *master;
2526 :
2527 0 : if (!master_idx)
2528 : return false;
2529 :
2530 0 : master = dev ? netdev_master_upper_dev_get(dev) : NULL;
2531 0 : if (!master || master->ifindex != master_idx)
2532 0 : return true;
2533 :
2534 : return false;
2535 : }
2536 :
2537 0 : static bool neigh_ifindex_filtered(struct net_device *dev, int filter_idx)
2538 : {
2539 0 : if (filter_idx && (!dev || dev->ifindex != filter_idx))
2540 : return true;
2541 :
2542 : return false;
2543 : }
2544 :
2545 : struct neigh_dump_filter {
2546 : int master_idx;
2547 : int dev_idx;
2548 : };
2549 :
2550 0 : static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
2551 : struct netlink_callback *cb,
2552 : struct neigh_dump_filter *filter)
2553 : {
2554 0 : struct net *net = sock_net(skb->sk);
2555 0 : struct neighbour *n;
2556 0 : int rc, h, s_h = cb->args[1];
2557 0 : int idx, s_idx = idx = cb->args[2];
2558 0 : struct neigh_hash_table *nht;
2559 0 : unsigned int flags = NLM_F_MULTI;
2560 :
2561 0 : if (filter->dev_idx || filter->master_idx)
2562 0 : flags |= NLM_F_DUMP_FILTERED;
2563 :
2564 0 : rcu_read_lock_bh();
2565 0 : nht = rcu_dereference_bh(tbl->nht);
2566 :
2567 0 : for (h = s_h; h < (1 << nht->hash_shift); h++) {
2568 0 : if (h > s_h)
2569 0 : s_idx = 0;
2570 0 : for (n = rcu_dereference_bh(nht->hash_buckets[h]), idx = 0;
2571 0 : n != NULL;
2572 0 : n = rcu_dereference_bh(n->next)) {
2573 0 : if (idx < s_idx || !net_eq(dev_net(n->dev), net))
2574 0 : goto next;
2575 0 : if (neigh_ifindex_filtered(n->dev, filter->dev_idx) ||
2576 0 : neigh_master_filtered(n->dev, filter->master_idx))
2577 0 : goto next;
2578 0 : if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid,
2579 0 : cb->nlh->nlmsg_seq,
2580 : RTM_NEWNEIGH,
2581 : flags) < 0) {
2582 0 : rc = -1;
2583 0 : goto out;
2584 : }
2585 0 : next:
2586 0 : idx++;
2587 : }
2588 : }
2589 0 : rc = skb->len;
2590 0 : out:
2591 0 : rcu_read_unlock_bh();
2592 0 : cb->args[1] = h;
2593 0 : cb->args[2] = idx;
2594 0 : return rc;
2595 : }
2596 :
2597 0 : static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
2598 : struct netlink_callback *cb,
2599 : struct neigh_dump_filter *filter)
2600 : {
2601 0 : struct pneigh_entry *n;
2602 0 : struct net *net = sock_net(skb->sk);
2603 0 : int rc, h, s_h = cb->args[3];
2604 0 : int idx, s_idx = idx = cb->args[4];
2605 0 : unsigned int flags = NLM_F_MULTI;
2606 :
2607 0 : if (filter->dev_idx || filter->master_idx)
2608 0 : flags |= NLM_F_DUMP_FILTERED;
2609 :
2610 0 : read_lock_bh(&tbl->lock);
2611 :
2612 0 : for (h = s_h; h <= PNEIGH_HASHMASK; h++) {
2613 0 : if (h > s_h)
2614 0 : s_idx = 0;
2615 0 : for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) {
2616 0 : if (idx < s_idx || pneigh_net(n) != net)
2617 0 : goto next;
2618 0 : if (neigh_ifindex_filtered(n->dev, filter->dev_idx) ||
2619 0 : neigh_master_filtered(n->dev, filter->master_idx))
2620 0 : goto next;
2621 0 : if (pneigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid,
2622 0 : cb->nlh->nlmsg_seq,
2623 : RTM_NEWNEIGH, flags, tbl) < 0) {
2624 0 : read_unlock_bh(&tbl->lock);
2625 0 : rc = -1;
2626 0 : goto out;
2627 : }
2628 0 : next:
2629 0 : idx++;
2630 : }
2631 : }
2632 :
2633 0 : read_unlock_bh(&tbl->lock);
2634 0 : rc = skb->len;
2635 0 : out:
2636 0 : cb->args[3] = h;
2637 0 : cb->args[4] = idx;
2638 0 : return rc;
2639 :
2640 : }
2641 :
2642 0 : static int neigh_valid_dump_req(const struct nlmsghdr *nlh,
2643 : bool strict_check,
2644 : struct neigh_dump_filter *filter,
2645 : struct netlink_ext_ack *extack)
2646 : {
2647 0 : struct nlattr *tb[NDA_MAX + 1];
2648 0 : int err, i;
2649 :
2650 0 : if (strict_check) {
2651 0 : struct ndmsg *ndm;
2652 :
2653 0 : if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ndm))) {
2654 0 : NL_SET_ERR_MSG(extack, "Invalid header for neighbor dump request");
2655 0 : return -EINVAL;
2656 : }
2657 :
2658 0 : ndm = nlmsg_data(nlh);
2659 0 : if (ndm->ndm_pad1 || ndm->ndm_pad2 || ndm->ndm_ifindex ||
2660 0 : ndm->ndm_state || ndm->ndm_type) {
2661 0 : NL_SET_ERR_MSG(extack, "Invalid values in header for neighbor dump request");
2662 0 : return -EINVAL;
2663 : }
2664 :
2665 0 : if (ndm->ndm_flags & ~NTF_PROXY) {
2666 0 : NL_SET_ERR_MSG(extack, "Invalid flags in header for neighbor dump request");
2667 0 : return -EINVAL;
2668 : }
2669 :
2670 0 : err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg),
2671 : tb, NDA_MAX, nda_policy,
2672 : extack);
2673 : } else {
2674 0 : err = nlmsg_parse_deprecated(nlh, sizeof(struct ndmsg), tb,
2675 : NDA_MAX, nda_policy, extack);
2676 : }
2677 0 : if (err < 0)
2678 : return err;
2679 :
2680 0 : for (i = 0; i <= NDA_MAX; ++i) {
2681 0 : if (!tb[i])
2682 0 : continue;
2683 :
2684 : /* all new attributes should require strict_check */
2685 0 : switch (i) {
2686 0 : case NDA_IFINDEX:
2687 0 : filter->dev_idx = nla_get_u32(tb[i]);
2688 0 : break;
2689 0 : case NDA_MASTER:
2690 0 : filter->master_idx = nla_get_u32(tb[i]);
2691 0 : break;
2692 0 : default:
2693 0 : if (strict_check) {
2694 0 : NL_SET_ERR_MSG(extack, "Unsupported attribute in neighbor dump request");
2695 0 : return -EINVAL;
2696 : }
2697 : }
2698 : }
2699 :
2700 : return 0;
2701 : }
2702 :
2703 0 : static int neigh_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
2704 : {
2705 0 : const struct nlmsghdr *nlh = cb->nlh;
2706 0 : struct neigh_dump_filter filter = {};
2707 0 : struct neigh_table *tbl;
2708 0 : int t, family, s_t;
2709 0 : int proxy = 0;
2710 0 : int err;
2711 :
2712 0 : family = ((struct rtgenmsg *)nlmsg_data(nlh))->rtgen_family;
2713 :
2714 : /* check for full ndmsg structure presence, family member is
2715 : * the same for both structures
2716 : */
2717 0 : if (nlmsg_len(nlh) >= sizeof(struct ndmsg) &&
2718 0 : ((struct ndmsg *)nlmsg_data(nlh))->ndm_flags == NTF_PROXY)
2719 0 : proxy = 1;
2720 :
2721 0 : err = neigh_valid_dump_req(nlh, cb->strict_check, &filter, cb->extack);
2722 0 : if (err < 0 && cb->strict_check)
2723 : return err;
2724 :
2725 0 : s_t = cb->args[0];
2726 :
2727 0 : for (t = 0; t < NEIGH_NR_TABLES; t++) {
2728 0 : tbl = neigh_tables[t];
2729 :
2730 0 : if (!tbl)
2731 0 : continue;
2732 0 : if (t < s_t || (family && tbl->family != family))
2733 0 : continue;
2734 0 : if (t > s_t)
2735 0 : memset(&cb->args[1], 0, sizeof(cb->args) -
2736 : sizeof(cb->args[0]));
2737 0 : if (proxy)
2738 0 : err = pneigh_dump_table(tbl, skb, cb, &filter);
2739 : else
2740 0 : err = neigh_dump_table(tbl, skb, cb, &filter);
2741 0 : if (err < 0)
2742 : break;
2743 : }
2744 :
2745 0 : cb->args[0] = t;
2746 0 : return skb->len;
2747 : }
2748 :
2749 0 : static int neigh_valid_get_req(const struct nlmsghdr *nlh,
2750 : struct neigh_table **tbl,
2751 : void **dst, int *dev_idx, u8 *ndm_flags,
2752 : struct netlink_ext_ack *extack)
2753 : {
2754 0 : struct nlattr *tb[NDA_MAX + 1];
2755 0 : struct ndmsg *ndm;
2756 0 : int err, i;
2757 :
2758 0 : if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ndm))) {
2759 0 : NL_SET_ERR_MSG(extack, "Invalid header for neighbor get request");
2760 0 : return -EINVAL;
2761 : }
2762 :
2763 0 : ndm = nlmsg_data(nlh);
2764 0 : if (ndm->ndm_pad1 || ndm->ndm_pad2 || ndm->ndm_state ||
2765 : ndm->ndm_type) {
2766 0 : NL_SET_ERR_MSG(extack, "Invalid values in header for neighbor get request");
2767 0 : return -EINVAL;
2768 : }
2769 :
2770 0 : if (ndm->ndm_flags & ~NTF_PROXY) {
2771 0 : NL_SET_ERR_MSG(extack, "Invalid flags in header for neighbor get request");
2772 0 : return -EINVAL;
2773 : }
2774 :
2775 0 : err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
2776 : NDA_MAX, nda_policy, extack);
2777 0 : if (err < 0)
2778 : return err;
2779 :
2780 0 : *ndm_flags = ndm->ndm_flags;
2781 0 : *dev_idx = ndm->ndm_ifindex;
2782 0 : *tbl = neigh_find_table(ndm->ndm_family);
2783 0 : if (*tbl == NULL) {
2784 0 : NL_SET_ERR_MSG(extack, "Unsupported family in header for neighbor get request");
2785 0 : return -EAFNOSUPPORT;
2786 : }
2787 :
2788 0 : for (i = 0; i <= NDA_MAX; ++i) {
2789 0 : if (!tb[i])
2790 0 : continue;
2791 :
2792 0 : switch (i) {
2793 0 : case NDA_DST:
2794 0 : if (nla_len(tb[i]) != (int)(*tbl)->key_len) {
2795 0 : NL_SET_ERR_MSG(extack, "Invalid network address in neighbor get request");
2796 0 : return -EINVAL;
2797 : }
2798 0 : *dst = nla_data(tb[i]);
2799 0 : break;
2800 0 : default:
2801 0 : NL_SET_ERR_MSG(extack, "Unsupported attribute in neighbor get request");
2802 : return -EINVAL;
2803 : }
2804 : }
2805 :
2806 : return 0;
2807 : }
2808 :
2809 7 : static inline size_t neigh_nlmsg_size(void)
2810 : {
2811 7 : return NLMSG_ALIGN(sizeof(struct ndmsg))
2812 7 : + nla_total_size(MAX_ADDR_LEN) /* NDA_DST */
2813 7 : + nla_total_size(MAX_ADDR_LEN) /* NDA_LLADDR */
2814 7 : + nla_total_size(sizeof(struct nda_cacheinfo))
2815 7 : + nla_total_size(4) /* NDA_PROBES */
2816 7 : + nla_total_size(1); /* NDA_PROTOCOL */
2817 : }
2818 :
2819 0 : static int neigh_get_reply(struct net *net, struct neighbour *neigh,
2820 : u32 pid, u32 seq)
2821 : {
2822 0 : struct sk_buff *skb;
2823 0 : int err = 0;
2824 :
2825 0 : skb = nlmsg_new(neigh_nlmsg_size(), GFP_KERNEL);
2826 0 : if (!skb)
2827 : return -ENOBUFS;
2828 :
2829 0 : err = neigh_fill_info(skb, neigh, pid, seq, RTM_NEWNEIGH, 0);
2830 0 : if (err) {
2831 0 : kfree_skb(skb);
2832 0 : goto errout;
2833 : }
2834 :
2835 0 : err = rtnl_unicast(skb, net, pid);
2836 : errout:
2837 : return err;
2838 : }
2839 :
2840 0 : static inline size_t pneigh_nlmsg_size(void)
2841 : {
2842 0 : return NLMSG_ALIGN(sizeof(struct ndmsg))
2843 0 : + nla_total_size(MAX_ADDR_LEN) /* NDA_DST */
2844 0 : + nla_total_size(1); /* NDA_PROTOCOL */
2845 : }
2846 :
2847 0 : static int pneigh_get_reply(struct net *net, struct pneigh_entry *neigh,
2848 : u32 pid, u32 seq, struct neigh_table *tbl)
2849 : {
2850 0 : struct sk_buff *skb;
2851 0 : int err = 0;
2852 :
2853 0 : skb = nlmsg_new(pneigh_nlmsg_size(), GFP_KERNEL);
2854 0 : if (!skb)
2855 : return -ENOBUFS;
2856 :
2857 0 : err = pneigh_fill_info(skb, neigh, pid, seq, RTM_NEWNEIGH, 0, tbl);
2858 0 : if (err) {
2859 0 : kfree_skb(skb);
2860 0 : goto errout;
2861 : }
2862 :
2863 0 : err = rtnl_unicast(skb, net, pid);
2864 : errout:
2865 : return err;
2866 : }
2867 :
2868 0 : static int neigh_get(struct sk_buff *in_skb, struct nlmsghdr *nlh,
2869 : struct netlink_ext_ack *extack)
2870 : {
2871 0 : struct net *net = sock_net(in_skb->sk);
2872 0 : struct net_device *dev = NULL;
2873 0 : struct neigh_table *tbl = NULL;
2874 0 : struct neighbour *neigh;
2875 0 : void *dst = NULL;
2876 0 : u8 ndm_flags = 0;
2877 0 : int dev_idx = 0;
2878 0 : int err;
2879 :
2880 0 : err = neigh_valid_get_req(nlh, &tbl, &dst, &dev_idx, &ndm_flags,
2881 : extack);
2882 0 : if (err < 0)
2883 : return err;
2884 :
2885 0 : if (dev_idx) {
2886 0 : dev = __dev_get_by_index(net, dev_idx);
2887 0 : if (!dev) {
2888 0 : NL_SET_ERR_MSG(extack, "Unknown device ifindex");
2889 0 : return -ENODEV;
2890 : }
2891 : }
2892 :
2893 0 : if (!dst) {
2894 0 : NL_SET_ERR_MSG(extack, "Network address not specified");
2895 0 : return -EINVAL;
2896 : }
2897 :
2898 0 : if (ndm_flags & NTF_PROXY) {
2899 0 : struct pneigh_entry *pn;
2900 :
2901 0 : pn = pneigh_lookup(tbl, net, dst, dev, 0);
2902 0 : if (!pn) {
2903 0 : NL_SET_ERR_MSG(extack, "Proxy neighbour entry not found");
2904 0 : return -ENOENT;
2905 : }
2906 0 : return pneigh_get_reply(net, pn, NETLINK_CB(in_skb).portid,
2907 : nlh->nlmsg_seq, tbl);
2908 : }
2909 :
2910 0 : if (!dev) {
2911 0 : NL_SET_ERR_MSG(extack, "No device specified");
2912 0 : return -EINVAL;
2913 : }
2914 :
2915 0 : neigh = neigh_lookup(tbl, dst, dev);
2916 0 : if (!neigh) {
2917 0 : NL_SET_ERR_MSG(extack, "Neighbour entry not found");
2918 0 : return -ENOENT;
2919 : }
2920 :
2921 0 : err = neigh_get_reply(net, neigh, NETLINK_CB(in_skb).portid,
2922 : nlh->nlmsg_seq);
2923 :
2924 0 : neigh_release(neigh);
2925 :
2926 0 : return err;
2927 : }
2928 :
2929 0 : void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie)
2930 : {
2931 0 : int chain;
2932 0 : struct neigh_hash_table *nht;
2933 :
2934 0 : rcu_read_lock_bh();
2935 0 : nht = rcu_dereference_bh(tbl->nht);
2936 :
2937 0 : read_lock(&tbl->lock); /* avoid resizes */
2938 0 : for (chain = 0; chain < (1 << nht->hash_shift); chain++) {
2939 0 : struct neighbour *n;
2940 :
2941 0 : for (n = rcu_dereference_bh(nht->hash_buckets[chain]);
2942 0 : n != NULL;
2943 0 : n = rcu_dereference_bh(n->next))
2944 0 : cb(n, cookie);
2945 : }
2946 0 : read_unlock(&tbl->lock);
2947 0 : rcu_read_unlock_bh();
2948 0 : }
2949 : EXPORT_SYMBOL(neigh_for_each);
2950 :
2951 : /* The tbl->lock must be held as a writer and BH disabled. */
2952 0 : void __neigh_for_each_release(struct neigh_table *tbl,
2953 : int (*cb)(struct neighbour *))
2954 : {
2955 0 : int chain;
2956 0 : struct neigh_hash_table *nht;
2957 :
2958 0 : nht = rcu_dereference_protected(tbl->nht,
2959 : lockdep_is_held(&tbl->lock));
2960 0 : for (chain = 0; chain < (1 << nht->hash_shift); chain++) {
2961 0 : struct neighbour *n;
2962 0 : struct neighbour __rcu **np;
2963 :
2964 0 : np = &nht->hash_buckets[chain];
2965 0 : while ((n = rcu_dereference_protected(*np,
2966 : lockdep_is_held(&tbl->lock))) != NULL) {
2967 0 : int release;
2968 :
2969 0 : write_lock(&n->lock);
2970 0 : release = cb(n);
2971 0 : if (release) {
2972 0 : rcu_assign_pointer(*np,
2973 : rcu_dereference_protected(n->next,
2974 : lockdep_is_held(&tbl->lock)));
2975 0 : neigh_mark_dead(n);
2976 : } else
2977 0 : np = &n->next;
2978 0 : write_unlock(&n->lock);
2979 0 : if (release)
2980 0 : neigh_cleanup_and_release(n);
2981 : }
2982 : }
2983 0 : }
2984 : EXPORT_SYMBOL(__neigh_for_each_release);
2985 :
2986 0 : int neigh_xmit(int index, struct net_device *dev,
2987 : const void *addr, struct sk_buff *skb)
2988 : {
2989 0 : int err = -EAFNOSUPPORT;
2990 0 : if (likely(index < NEIGH_NR_TABLES)) {
2991 0 : struct neigh_table *tbl;
2992 0 : struct neighbour *neigh;
2993 :
2994 0 : tbl = neigh_tables[index];
2995 0 : if (!tbl)
2996 0 : goto out;
2997 0 : rcu_read_lock_bh();
2998 0 : if (index == NEIGH_ARP_TABLE) {
2999 0 : u32 key = *((u32 *)addr);
3000 :
3001 0 : neigh = __ipv4_neigh_lookup_noref(dev, key);
3002 : } else {
3003 0 : neigh = __neigh_lookup_noref(tbl, addr, dev);
3004 : }
3005 0 : if (!neigh)
3006 0 : neigh = __neigh_create(tbl, addr, dev, false);
3007 0 : err = PTR_ERR(neigh);
3008 0 : if (IS_ERR(neigh)) {
3009 0 : rcu_read_unlock_bh();
3010 0 : goto out_kfree_skb;
3011 : }
3012 0 : err = neigh->output(neigh, skb);
3013 0 : rcu_read_unlock_bh();
3014 : }
3015 0 : else if (index == NEIGH_LINK_TABLE) {
3016 0 : err = dev_hard_header(skb, dev, ntohs(skb->protocol),
3017 : addr, NULL, skb->len);
3018 0 : if (err < 0)
3019 0 : goto out_kfree_skb;
3020 0 : err = dev_queue_xmit(skb);
3021 : }
3022 0 : out:
3023 0 : return err;
3024 0 : out_kfree_skb:
3025 0 : kfree_skb(skb);
3026 0 : goto out;
3027 : }
3028 : EXPORT_SYMBOL(neigh_xmit);
3029 :
3030 : #ifdef CONFIG_PROC_FS
3031 :
3032 0 : static struct neighbour *neigh_get_first(struct seq_file *seq)
3033 : {
3034 0 : struct neigh_seq_state *state = seq->private;
3035 0 : struct net *net = seq_file_net(seq);
3036 0 : struct neigh_hash_table *nht = state->nht;
3037 0 : struct neighbour *n = NULL;
3038 0 : int bucket;
3039 :
3040 0 : state->flags &= ~NEIGH_SEQ_IS_PNEIGH;
3041 0 : for (bucket = 0; bucket < (1 << nht->hash_shift); bucket++) {
3042 0 : n = rcu_dereference_bh(nht->hash_buckets[bucket]);
3043 :
3044 0 : while (n) {
3045 0 : if (!net_eq(dev_net(n->dev), net))
3046 : goto next;
3047 0 : if (state->neigh_sub_iter) {
3048 0 : loff_t fakep = 0;
3049 0 : void *v;
3050 :
3051 0 : v = state->neigh_sub_iter(state, n, &fakep);
3052 0 : if (!v)
3053 0 : goto next;
3054 : }
3055 0 : if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))
3056 : break;
3057 0 : if (n->nud_state & ~NUD_NOARP)
3058 : break;
3059 0 : next:
3060 0 : n = rcu_dereference_bh(n->next);
3061 : }
3062 :
3063 0 : if (n)
3064 : break;
3065 : }
3066 0 : state->bucket = bucket;
3067 :
3068 0 : return n;
3069 : }
3070 :
3071 0 : static struct neighbour *neigh_get_next(struct seq_file *seq,
3072 : struct neighbour *n,
3073 : loff_t *pos)
3074 : {
3075 0 : struct neigh_seq_state *state = seq->private;
3076 0 : struct net *net = seq_file_net(seq);
3077 0 : struct neigh_hash_table *nht = state->nht;
3078 :
3079 0 : if (state->neigh_sub_iter) {
3080 0 : void *v = state->neigh_sub_iter(state, n, pos);
3081 0 : if (v)
3082 : return n;
3083 : }
3084 0 : n = rcu_dereference_bh(n->next);
3085 :
3086 : while (1) {
3087 0 : while (n) {
3088 0 : if (!net_eq(dev_net(n->dev), net))
3089 : goto next;
3090 0 : if (state->neigh_sub_iter) {
3091 0 : void *v = state->neigh_sub_iter(state, n, pos);
3092 0 : if (v)
3093 0 : return n;
3094 0 : goto next;
3095 : }
3096 0 : if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))
3097 : break;
3098 :
3099 0 : if (n->nud_state & ~NUD_NOARP)
3100 : break;
3101 0 : next:
3102 0 : n = rcu_dereference_bh(n->next);
3103 : }
3104 :
3105 0 : if (n)
3106 : break;
3107 :
3108 0 : if (++state->bucket >= (1 << nht->hash_shift))
3109 : break;
3110 :
3111 0 : n = rcu_dereference_bh(nht->hash_buckets[state->bucket]);
3112 : }
3113 :
3114 0 : if (n && pos)
3115 0 : --(*pos);
3116 : return n;
3117 : }
3118 :
3119 0 : static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos)
3120 : {
3121 0 : struct neighbour *n = neigh_get_first(seq);
3122 :
3123 0 : if (n) {
3124 0 : --(*pos);
3125 0 : while (*pos) {
3126 0 : n = neigh_get_next(seq, n, pos);
3127 0 : if (!n)
3128 : break;
3129 : }
3130 : }
3131 0 : return *pos ? NULL : n;
3132 : }
3133 :
3134 0 : static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
3135 : {
3136 0 : struct neigh_seq_state *state = seq->private;
3137 0 : struct net *net = seq_file_net(seq);
3138 0 : struct neigh_table *tbl = state->tbl;
3139 0 : struct pneigh_entry *pn = NULL;
3140 0 : int bucket = state->bucket;
3141 :
3142 0 : state->flags |= NEIGH_SEQ_IS_PNEIGH;
3143 0 : for (bucket = 0; bucket <= PNEIGH_HASHMASK; bucket++) {
3144 0 : pn = tbl->phash_buckets[bucket];
3145 0 : while (pn && !net_eq(pneigh_net(pn), net))
3146 : pn = pn->next;
3147 0 : if (pn)
3148 : break;
3149 : }
3150 0 : state->bucket = bucket;
3151 :
3152 0 : return pn;
3153 : }
3154 :
3155 0 : static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
3156 : struct pneigh_entry *pn,
3157 : loff_t *pos)
3158 : {
3159 0 : struct neigh_seq_state *state = seq->private;
3160 0 : struct net *net = seq_file_net(seq);
3161 0 : struct neigh_table *tbl = state->tbl;
3162 :
3163 0 : do {
3164 0 : pn = pn->next;
3165 0 : } while (pn && !net_eq(pneigh_net(pn), net));
3166 :
3167 0 : while (!pn) {
3168 0 : if (++state->bucket > PNEIGH_HASHMASK)
3169 : break;
3170 0 : pn = tbl->phash_buckets[state->bucket];
3171 0 : while (pn && !net_eq(pneigh_net(pn), net))
3172 : pn = pn->next;
3173 0 : if (pn)
3174 : break;
3175 : }
3176 :
3177 0 : if (pn && pos)
3178 0 : --(*pos);
3179 :
3180 0 : return pn;
3181 : }
3182 :
3183 0 : static struct pneigh_entry *pneigh_get_idx(struct seq_file *seq, loff_t *pos)
3184 : {
3185 0 : struct pneigh_entry *pn = pneigh_get_first(seq);
3186 :
3187 0 : if (pn) {
3188 0 : --(*pos);
3189 0 : while (*pos) {
3190 0 : pn = pneigh_get_next(seq, pn, pos);
3191 0 : if (!pn)
3192 : break;
3193 : }
3194 : }
3195 0 : return *pos ? NULL : pn;
3196 : }
3197 :
3198 0 : static void *neigh_get_idx_any(struct seq_file *seq, loff_t *pos)
3199 : {
3200 0 : struct neigh_seq_state *state = seq->private;
3201 0 : void *rc;
3202 0 : loff_t idxpos = *pos;
3203 :
3204 0 : rc = neigh_get_idx(seq, &idxpos);
3205 0 : if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY))
3206 0 : rc = pneigh_get_idx(seq, &idxpos);
3207 :
3208 0 : return rc;
3209 : }
3210 :
3211 0 : void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags)
3212 : __acquires(tbl->lock)
3213 : __acquires(rcu_bh)
3214 : {
3215 0 : struct neigh_seq_state *state = seq->private;
3216 :
3217 0 : state->tbl = tbl;
3218 0 : state->bucket = 0;
3219 0 : state->flags = (neigh_seq_flags & ~NEIGH_SEQ_IS_PNEIGH);
3220 :
3221 0 : rcu_read_lock_bh();
3222 0 : state->nht = rcu_dereference_bh(tbl->nht);
3223 0 : read_lock(&tbl->lock);
3224 :
3225 0 : return *pos ? neigh_get_idx_any(seq, pos) : SEQ_START_TOKEN;
3226 : }
3227 : EXPORT_SYMBOL(neigh_seq_start);
3228 :
3229 0 : void *neigh_seq_next(struct seq_file *seq, void *v, loff_t *pos)
3230 : {
3231 0 : struct neigh_seq_state *state;
3232 0 : void *rc;
3233 :
3234 0 : if (v == SEQ_START_TOKEN) {
3235 0 : rc = neigh_get_first(seq);
3236 0 : goto out;
3237 : }
3238 :
3239 0 : state = seq->private;
3240 0 : if (!(state->flags & NEIGH_SEQ_IS_PNEIGH)) {
3241 0 : rc = neigh_get_next(seq, v, NULL);
3242 0 : if (rc)
3243 0 : goto out;
3244 0 : if (!(state->flags & NEIGH_SEQ_NEIGH_ONLY))
3245 0 : rc = pneigh_get_first(seq);
3246 : } else {
3247 0 : BUG_ON(state->flags & NEIGH_SEQ_NEIGH_ONLY);
3248 0 : rc = pneigh_get_next(seq, v, NULL);
3249 : }
3250 0 : out:
3251 0 : ++(*pos);
3252 0 : return rc;
3253 : }
3254 : EXPORT_SYMBOL(neigh_seq_next);
3255 :
3256 0 : void neigh_seq_stop(struct seq_file *seq, void *v)
3257 : __releases(tbl->lock)
3258 : __releases(rcu_bh)
3259 : {
3260 0 : struct neigh_seq_state *state = seq->private;
3261 0 : struct neigh_table *tbl = state->tbl;
3262 :
3263 0 : read_unlock(&tbl->lock);
3264 0 : rcu_read_unlock_bh();
3265 0 : }
3266 : EXPORT_SYMBOL(neigh_seq_stop);
3267 :
3268 : /* statistics via seq_file */
3269 :
3270 0 : static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos)
3271 : {
3272 0 : struct neigh_table *tbl = PDE_DATA(file_inode(seq->file));
3273 0 : int cpu;
3274 :
3275 0 : if (*pos == 0)
3276 : return SEQ_START_TOKEN;
3277 :
3278 0 : for (cpu = *pos-1; cpu < nr_cpu_ids; ++cpu) {
3279 0 : if (!cpu_possible(cpu))
3280 0 : continue;
3281 0 : *pos = cpu+1;
3282 0 : return per_cpu_ptr(tbl->stats, cpu);
3283 : }
3284 : return NULL;
3285 : }
3286 :
3287 0 : static void *neigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos)
3288 : {
3289 0 : struct neigh_table *tbl = PDE_DATA(file_inode(seq->file));
3290 0 : int cpu;
3291 :
3292 0 : for (cpu = *pos; cpu < nr_cpu_ids; ++cpu) {
3293 0 : if (!cpu_possible(cpu))
3294 0 : continue;
3295 0 : *pos = cpu+1;
3296 0 : return per_cpu_ptr(tbl->stats, cpu);
3297 : }
3298 0 : (*pos)++;
3299 0 : return NULL;
3300 : }
3301 :
3302 0 : static void neigh_stat_seq_stop(struct seq_file *seq, void *v)
3303 : {
3304 :
3305 0 : }
3306 :
3307 0 : static int neigh_stat_seq_show(struct seq_file *seq, void *v)
3308 : {
3309 0 : struct neigh_table *tbl = PDE_DATA(file_inode(seq->file));
3310 0 : struct neigh_statistics *st = v;
3311 :
3312 0 : if (v == SEQ_START_TOKEN) {
3313 0 : 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 table_fulls\n");
3314 0 : return 0;
3315 : }
3316 :
3317 0 : seq_printf(seq, "%08x %08lx %08lx %08lx %08lx %08lx %08lx "
3318 : "%08lx %08lx %08lx %08lx %08lx %08lx\n",
3319 0 : atomic_read(&tbl->entries),
3320 :
3321 : st->allocs,
3322 : st->destroys,
3323 : st->hash_grows,
3324 :
3325 : st->lookups,
3326 : st->hits,
3327 :
3328 : st->res_failed,
3329 :
3330 : st->rcv_probes_mcast,
3331 : st->rcv_probes_ucast,
3332 :
3333 : st->periodic_gc_runs,
3334 : st->forced_gc_runs,
3335 : st->unres_discards,
3336 : st->table_fulls
3337 : );
3338 :
3339 0 : return 0;
3340 : }
3341 :
3342 : static const struct seq_operations neigh_stat_seq_ops = {
3343 : .start = neigh_stat_seq_start,
3344 : .next = neigh_stat_seq_next,
3345 : .stop = neigh_stat_seq_stop,
3346 : .show = neigh_stat_seq_show,
3347 : };
3348 : #endif /* CONFIG_PROC_FS */
3349 :
3350 7 : static void __neigh_notify(struct neighbour *n, int type, int flags,
3351 : u32 pid)
3352 : {
3353 7 : struct net *net = dev_net(n->dev);
3354 7 : struct sk_buff *skb;
3355 7 : int err = -ENOBUFS;
3356 :
3357 7 : skb = nlmsg_new(neigh_nlmsg_size(), GFP_ATOMIC);
3358 7 : if (skb == NULL)
3359 0 : goto errout;
3360 :
3361 7 : err = neigh_fill_info(skb, n, pid, 0, type, flags);
3362 7 : if (err < 0) {
3363 : /* -EMSGSIZE implies BUG in neigh_nlmsg_size() */
3364 0 : WARN_ON(err == -EMSGSIZE);
3365 0 : kfree_skb(skb);
3366 0 : goto errout;
3367 : }
3368 7 : rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
3369 7 : return;
3370 0 : errout:
3371 0 : if (err < 0)
3372 0 : rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
3373 : }
3374 :
3375 0 : void neigh_app_ns(struct neighbour *n)
3376 : {
3377 0 : __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST, 0);
3378 0 : }
3379 : EXPORT_SYMBOL(neigh_app_ns);
3380 :
3381 : #ifdef CONFIG_SYSCTL
3382 : static int unres_qlen_max = INT_MAX / SKB_TRUESIZE(ETH_FRAME_LEN);
3383 :
3384 0 : static int proc_unres_qlen(struct ctl_table *ctl, int write,
3385 : void *buffer, size_t *lenp, loff_t *ppos)
3386 : {
3387 0 : int size, ret;
3388 0 : struct ctl_table tmp = *ctl;
3389 :
3390 0 : tmp.extra1 = SYSCTL_ZERO;
3391 0 : tmp.extra2 = &unres_qlen_max;
3392 0 : tmp.data = &size;
3393 :
3394 0 : size = *(int *)ctl->data / SKB_TRUESIZE(ETH_FRAME_LEN);
3395 0 : ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
3396 :
3397 0 : if (write && !ret)
3398 0 : *(int *)ctl->data = size * SKB_TRUESIZE(ETH_FRAME_LEN);
3399 0 : return ret;
3400 : }
3401 :
3402 0 : static struct neigh_parms *neigh_get_dev_parms_rcu(struct net_device *dev,
3403 : int family)
3404 : {
3405 0 : switch (family) {
3406 : case AF_INET:
3407 0 : return __in_dev_arp_parms_get_rcu(dev);
3408 : case AF_INET6:
3409 0 : return __in6_dev_nd_parms_get_rcu(dev);
3410 : }
3411 : return NULL;
3412 : }
3413 :
3414 0 : static void neigh_copy_dflt_parms(struct net *net, struct neigh_parms *p,
3415 : int index)
3416 : {
3417 0 : struct net_device *dev;
3418 0 : int family = neigh_parms_family(p);
3419 :
3420 0 : rcu_read_lock();
3421 0 : for_each_netdev_rcu(net, dev) {
3422 0 : struct neigh_parms *dst_p =
3423 0 : neigh_get_dev_parms_rcu(dev, family);
3424 :
3425 0 : if (dst_p && !test_bit(index, dst_p->data_state))
3426 0 : dst_p->data[index] = p->data[index];
3427 : }
3428 0 : rcu_read_unlock();
3429 0 : }
3430 :
3431 0 : static void neigh_proc_update(struct ctl_table *ctl, int write)
3432 : {
3433 0 : struct net_device *dev = ctl->extra1;
3434 0 : struct neigh_parms *p = ctl->extra2;
3435 0 : struct net *net = neigh_parms_net(p);
3436 0 : int index = (int *) ctl->data - p->data;
3437 :
3438 0 : if (!write)
3439 : return;
3440 :
3441 0 : set_bit(index, p->data_state);
3442 0 : if (index == NEIGH_VAR_DELAY_PROBE_TIME)
3443 0 : call_netevent_notifiers(NETEVENT_DELAY_PROBE_TIME_UPDATE, p);
3444 0 : if (!dev) /* NULL dev means this is default value */
3445 0 : neigh_copy_dflt_parms(net, p, index);
3446 : }
3447 :
3448 0 : static int neigh_proc_dointvec_zero_intmax(struct ctl_table *ctl, int write,
3449 : void *buffer, size_t *lenp,
3450 : loff_t *ppos)
3451 : {
3452 0 : struct ctl_table tmp = *ctl;
3453 0 : int ret;
3454 :
3455 0 : tmp.extra1 = SYSCTL_ZERO;
3456 0 : tmp.extra2 = SYSCTL_INT_MAX;
3457 :
3458 0 : ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
3459 0 : neigh_proc_update(ctl, write);
3460 0 : return ret;
3461 : }
3462 :
3463 0 : int neigh_proc_dointvec(struct ctl_table *ctl, int write, void *buffer,
3464 : size_t *lenp, loff_t *ppos)
3465 : {
3466 0 : int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
3467 :
3468 0 : neigh_proc_update(ctl, write);
3469 0 : return ret;
3470 : }
3471 : EXPORT_SYMBOL(neigh_proc_dointvec);
3472 :
3473 0 : int neigh_proc_dointvec_jiffies(struct ctl_table *ctl, int write, void *buffer,
3474 : size_t *lenp, loff_t *ppos)
3475 : {
3476 0 : int ret = proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos);
3477 :
3478 0 : neigh_proc_update(ctl, write);
3479 0 : return ret;
3480 : }
3481 : EXPORT_SYMBOL(neigh_proc_dointvec_jiffies);
3482 :
3483 0 : static int neigh_proc_dointvec_userhz_jiffies(struct ctl_table *ctl, int write,
3484 : void *buffer, size_t *lenp,
3485 : loff_t *ppos)
3486 : {
3487 0 : int ret = proc_dointvec_userhz_jiffies(ctl, write, buffer, lenp, ppos);
3488 :
3489 0 : neigh_proc_update(ctl, write);
3490 0 : return ret;
3491 : }
3492 :
3493 0 : int neigh_proc_dointvec_ms_jiffies(struct ctl_table *ctl, int write,
3494 : void *buffer, size_t *lenp, loff_t *ppos)
3495 : {
3496 0 : int ret = proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos);
3497 :
3498 0 : neigh_proc_update(ctl, write);
3499 0 : return ret;
3500 : }
3501 : EXPORT_SYMBOL(neigh_proc_dointvec_ms_jiffies);
3502 :
3503 0 : static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write,
3504 : void *buffer, size_t *lenp,
3505 : loff_t *ppos)
3506 : {
3507 0 : int ret = proc_unres_qlen(ctl, write, buffer, lenp, ppos);
3508 :
3509 0 : neigh_proc_update(ctl, write);
3510 0 : return ret;
3511 : }
3512 :
3513 0 : static int neigh_proc_base_reachable_time(struct ctl_table *ctl, int write,
3514 : void *buffer, size_t *lenp,
3515 : loff_t *ppos)
3516 : {
3517 0 : struct neigh_parms *p = ctl->extra2;
3518 0 : int ret;
3519 :
3520 0 : if (strcmp(ctl->procname, "base_reachable_time") == 0)
3521 0 : ret = neigh_proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos);
3522 0 : else if (strcmp(ctl->procname, "base_reachable_time_ms") == 0)
3523 0 : ret = neigh_proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos);
3524 : else
3525 : ret = -1;
3526 :
3527 0 : if (write && ret == 0) {
3528 : /* update reachable_time as well, otherwise, the change will
3529 : * only be effective after the next time neigh_periodic_work
3530 : * decides to recompute it
3531 : */
3532 0 : p->reachable_time =
3533 0 : neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
3534 : }
3535 0 : return ret;
3536 : }
3537 :
3538 : #define NEIGH_PARMS_DATA_OFFSET(index) \
3539 : (&((struct neigh_parms *) 0)->data[index])
3540 :
3541 : #define NEIGH_SYSCTL_ENTRY(attr, data_attr, name, mval, proc) \
3542 : [NEIGH_VAR_ ## attr] = { \
3543 : .procname = name, \
3544 : .data = NEIGH_PARMS_DATA_OFFSET(NEIGH_VAR_ ## data_attr), \
3545 : .maxlen = sizeof(int), \
3546 : .mode = mval, \
3547 : .proc_handler = proc, \
3548 : }
3549 :
3550 : #define NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(attr, name) \
3551 : NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_zero_intmax)
3552 :
3553 : #define NEIGH_SYSCTL_JIFFIES_ENTRY(attr, name) \
3554 : NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_jiffies)
3555 :
3556 : #define NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(attr, name) \
3557 : NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_userhz_jiffies)
3558 :
3559 : #define NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(attr, data_attr, name) \
3560 : NEIGH_SYSCTL_ENTRY(attr, data_attr, name, 0644, neigh_proc_dointvec_ms_jiffies)
3561 :
3562 : #define NEIGH_SYSCTL_UNRES_QLEN_REUSED_ENTRY(attr, data_attr, name) \
3563 : NEIGH_SYSCTL_ENTRY(attr, data_attr, name, 0644, neigh_proc_dointvec_unres_qlen)
3564 :
3565 : static struct neigh_sysctl_table {
3566 : struct ctl_table_header *sysctl_header;
3567 : struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1];
3568 : } neigh_sysctl_template __read_mostly = {
3569 : .neigh_vars = {
3570 : NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_PROBES, "mcast_solicit"),
3571 : NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(UCAST_PROBES, "ucast_solicit"),
3572 : NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"),
3573 : NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_REPROBES, "mcast_resolicit"),
3574 : NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"),
3575 : NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"),
3576 : NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"),
3577 : NEIGH_SYSCTL_JIFFIES_ENTRY(GC_STALETIME, "gc_stale_time"),
3578 : NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(QUEUE_LEN_BYTES, "unres_qlen_bytes"),
3579 : NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(PROXY_QLEN, "proxy_qlen"),
3580 : NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(ANYCAST_DELAY, "anycast_delay"),
3581 : NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(PROXY_DELAY, "proxy_delay"),
3582 : NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(LOCKTIME, "locktime"),
3583 : NEIGH_SYSCTL_UNRES_QLEN_REUSED_ENTRY(QUEUE_LEN, QUEUE_LEN_BYTES, "unres_qlen"),
3584 : NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(RETRANS_TIME_MS, RETRANS_TIME, "retrans_time_ms"),
3585 : NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(BASE_REACHABLE_TIME_MS, BASE_REACHABLE_TIME, "base_reachable_time_ms"),
3586 : [NEIGH_VAR_GC_INTERVAL] = {
3587 : .procname = "gc_interval",
3588 : .maxlen = sizeof(int),
3589 : .mode = 0644,
3590 : .proc_handler = proc_dointvec_jiffies,
3591 : },
3592 : [NEIGH_VAR_GC_THRESH1] = {
3593 : .procname = "gc_thresh1",
3594 : .maxlen = sizeof(int),
3595 : .mode = 0644,
3596 : .extra1 = SYSCTL_ZERO,
3597 : .extra2 = SYSCTL_INT_MAX,
3598 : .proc_handler = proc_dointvec_minmax,
3599 : },
3600 : [NEIGH_VAR_GC_THRESH2] = {
3601 : .procname = "gc_thresh2",
3602 : .maxlen = sizeof(int),
3603 : .mode = 0644,
3604 : .extra1 = SYSCTL_ZERO,
3605 : .extra2 = SYSCTL_INT_MAX,
3606 : .proc_handler = proc_dointvec_minmax,
3607 : },
3608 : [NEIGH_VAR_GC_THRESH3] = {
3609 : .procname = "gc_thresh3",
3610 : .maxlen = sizeof(int),
3611 : .mode = 0644,
3612 : .extra1 = SYSCTL_ZERO,
3613 : .extra2 = SYSCTL_INT_MAX,
3614 : .proc_handler = proc_dointvec_minmax,
3615 : },
3616 : {},
3617 : },
3618 : };
3619 :
3620 3 : int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
3621 : proc_handler *handler)
3622 : {
3623 3 : int i;
3624 3 : struct neigh_sysctl_table *t;
3625 3 : const char *dev_name_source;
3626 3 : char neigh_path[ sizeof("net//neigh/") + IFNAMSIZ + IFNAMSIZ ];
3627 3 : char *p_name;
3628 :
3629 3 : t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL);
3630 3 : if (!t)
3631 0 : goto err;
3632 :
3633 51 : for (i = 0; i < NEIGH_VAR_GC_INTERVAL; i++) {
3634 48 : t->neigh_vars[i].data += (long) p;
3635 48 : t->neigh_vars[i].extra1 = dev;
3636 48 : t->neigh_vars[i].extra2 = p;
3637 : }
3638 :
3639 3 : if (dev) {
3640 2 : dev_name_source = dev->name;
3641 : /* Terminate the table early */
3642 2 : memset(&t->neigh_vars[NEIGH_VAR_GC_INTERVAL], 0,
3643 : sizeof(t->neigh_vars[NEIGH_VAR_GC_INTERVAL]));
3644 : } else {
3645 1 : struct neigh_table *tbl = p->tbl;
3646 1 : dev_name_source = "default";
3647 1 : t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = &tbl->gc_interval;
3648 1 : t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = &tbl->gc_thresh1;
3649 1 : t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = &tbl->gc_thresh2;
3650 1 : t->neigh_vars[NEIGH_VAR_GC_THRESH3].data = &tbl->gc_thresh3;
3651 : }
3652 :
3653 3 : if (handler) {
3654 : /* RetransTime */
3655 0 : t->neigh_vars[NEIGH_VAR_RETRANS_TIME].proc_handler = handler;
3656 : /* ReachableTime */
3657 0 : t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME].proc_handler = handler;
3658 : /* RetransTime (in milliseconds)*/
3659 0 : t->neigh_vars[NEIGH_VAR_RETRANS_TIME_MS].proc_handler = handler;
3660 : /* ReachableTime (in milliseconds) */
3661 0 : t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = handler;
3662 : } else {
3663 : /* Those handlers will update p->reachable_time after
3664 : * base_reachable_time(_ms) is set to ensure the new timer starts being
3665 : * applied after the next neighbour update instead of waiting for
3666 : * neigh_periodic_work to update its value (can be multiple minutes)
3667 : * So any handler that replaces them should do this as well
3668 : */
3669 : /* ReachableTime */
3670 3 : t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME].proc_handler =
3671 : neigh_proc_base_reachable_time;
3672 : /* ReachableTime (in milliseconds) */
3673 3 : t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler =
3674 : neigh_proc_base_reachable_time;
3675 : }
3676 :
3677 : /* Don't export sysctls to unprivileged users */
3678 3 : if (neigh_parms_net(p)->user_ns != &init_user_ns)
3679 0 : t->neigh_vars[0].procname = NULL;
3680 :
3681 3 : switch (neigh_parms_family(p)) {
3682 : case AF_INET:
3683 : p_name = "ipv4";
3684 : break;
3685 0 : case AF_INET6:
3686 0 : p_name = "ipv6";
3687 0 : break;
3688 0 : default:
3689 0 : BUG();
3690 : }
3691 :
3692 3 : snprintf(neigh_path, sizeof(neigh_path), "net/%s/neigh/%s",
3693 : p_name, dev_name_source);
3694 6 : t->sysctl_header =
3695 3 : register_net_sysctl(neigh_parms_net(p), neigh_path, t->neigh_vars);
3696 3 : if (!t->sysctl_header)
3697 0 : goto free;
3698 :
3699 3 : p->sysctl_table = t;
3700 3 : return 0;
3701 :
3702 0 : free:
3703 0 : kfree(t);
3704 : err:
3705 : return -ENOBUFS;
3706 : }
3707 : EXPORT_SYMBOL(neigh_sysctl_register);
3708 :
3709 0 : void neigh_sysctl_unregister(struct neigh_parms *p)
3710 : {
3711 0 : if (p->sysctl_table) {
3712 0 : struct neigh_sysctl_table *t = p->sysctl_table;
3713 0 : p->sysctl_table = NULL;
3714 0 : unregister_net_sysctl_table(t->sysctl_header);
3715 0 : kfree(t);
3716 : }
3717 0 : }
3718 : EXPORT_SYMBOL(neigh_sysctl_unregister);
3719 :
3720 : #endif /* CONFIG_SYSCTL */
3721 :
3722 1 : static int __init neigh_init(void)
3723 : {
3724 1 : rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, 0);
3725 1 : rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, 0);
3726 1 : rtnl_register(PF_UNSPEC, RTM_GETNEIGH, neigh_get, neigh_dump_info, 0);
3727 :
3728 1 : rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info,
3729 : 0);
3730 1 : rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, 0);
3731 :
3732 1 : return 0;
3733 : }
3734 :
3735 : subsys_initcall(neigh_init);
|