Lines Matching refs:n

55 static void __neigh_notify(struct neighbour *n, int type, int flags);
131 struct neighbour *n; in neigh_forced_gc() local
135 while ((n = rcu_dereference_protected(*np, in neigh_forced_gc()
141 write_lock(&n->lock); in neigh_forced_gc()
142 if (atomic_read(&n->refcnt) == 1 && in neigh_forced_gc()
143 !(n->nud_state & NUD_PERMANENT)) { in neigh_forced_gc()
145 rcu_dereference_protected(n->next, in neigh_forced_gc()
147 n->dead = 1; in neigh_forced_gc()
149 write_unlock(&n->lock); in neigh_forced_gc()
150 neigh_cleanup_and_release(n); in neigh_forced_gc()
153 write_unlock(&n->lock); in neigh_forced_gc()
154 np = &n->next; in neigh_forced_gc()
165 static void neigh_add_timer(struct neighbour *n, unsigned long when) in neigh_add_timer() argument
167 neigh_hold(n); in neigh_add_timer()
168 if (unlikely(mod_timer(&n->timer, when))) { in neigh_add_timer()
170 n->nud_state); in neigh_add_timer()
175 static int neigh_del_timer(struct neighbour *n) in neigh_del_timer() argument
177 if ((n->nud_state & NUD_IN_TIMER) && in neigh_del_timer()
178 del_timer(&n->timer)) { in neigh_del_timer()
179 neigh_release(n); in neigh_del_timer()
204 struct neighbour *n; in neigh_flush_dev() local
207 while ((n = rcu_dereference_protected(*np, in neigh_flush_dev()
209 if (dev && n->dev != dev) { in neigh_flush_dev()
210 np = &n->next; in neigh_flush_dev()
214 rcu_dereference_protected(n->next, in neigh_flush_dev()
216 write_lock(&n->lock); in neigh_flush_dev()
217 neigh_del_timer(n); in neigh_flush_dev()
218 n->dead = 1; in neigh_flush_dev()
220 if (atomic_read(&n->refcnt) != 1) { in neigh_flush_dev()
230 __skb_queue_purge(&n->arp_queue); in neigh_flush_dev()
231 n->arp_queue_len_bytes = 0; in neigh_flush_dev()
232 n->output = neigh_blackhole; in neigh_flush_dev()
233 if (n->nud_state & NUD_VALID) in neigh_flush_dev()
234 n->nud_state = NUD_NOARP; in neigh_flush_dev()
236 n->nud_state = NUD_NONE; in neigh_flush_dev()
237 neigh_dbg(2, "neigh %p is stray\n", n); in neigh_flush_dev()
239 write_unlock(&n->lock); in neigh_flush_dev()
240 neigh_cleanup_and_release(n); in neigh_flush_dev()
268 struct neighbour *n = NULL; in neigh_alloc() local
285 n = kzalloc(tbl->entry_size + dev->neigh_priv_len, GFP_ATOMIC); in neigh_alloc()
286 if (!n) in neigh_alloc()
289 __skb_queue_head_init(&n->arp_queue); in neigh_alloc()
290 rwlock_init(&n->lock); in neigh_alloc()
291 seqlock_init(&n->ha_lock); in neigh_alloc()
292 n->updated = n->used = now; in neigh_alloc()
293 n->nud_state = NUD_NONE; in neigh_alloc()
294 n->output = neigh_blackhole; in neigh_alloc()
295 seqlock_init(&n->hh.hh_lock); in neigh_alloc()
296 n->parms = neigh_parms_clone(&tbl->parms); in neigh_alloc()
297 setup_timer(&n->timer, neigh_timer_handler, (unsigned long)n); in neigh_alloc()
300 n->tbl = tbl; in neigh_alloc()
301 atomic_set(&n->refcnt, 1); in neigh_alloc()
302 n->dead = 1; in neigh_alloc()
304 return n; in neigh_alloc()
374 struct neighbour *n, *next; in neigh_hash_grow() local
376 for (n = rcu_dereference_protected(old_nht->hash_buckets[i], in neigh_hash_grow()
378 n != NULL; in neigh_hash_grow()
379 n = next) { in neigh_hash_grow()
380 hash = tbl->hash(n->primary_key, n->dev, in neigh_hash_grow()
384 next = rcu_dereference_protected(n->next, in neigh_hash_grow()
387 rcu_assign_pointer(n->next, in neigh_hash_grow()
391 rcu_assign_pointer(new_nht->hash_buckets[hash], n); in neigh_hash_grow()
403 struct neighbour *n; in neigh_lookup() local
408 n = __neigh_lookup_noref(tbl, pkey, dev); in neigh_lookup()
409 if (n) { in neigh_lookup()
410 if (!atomic_inc_not_zero(&n->refcnt)) in neigh_lookup()
411 n = NULL; in neigh_lookup()
416 return n; in neigh_lookup()
423 struct neighbour *n; in neigh_lookup_nodev() local
434 for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]); in neigh_lookup_nodev()
435 n != NULL; in neigh_lookup_nodev()
436 n = rcu_dereference_bh(n->next)) { in neigh_lookup_nodev()
437 if (!memcmp(n->primary_key, pkey, key_len) && in neigh_lookup_nodev()
438 net_eq(dev_net(n->dev), net)) { in neigh_lookup_nodev()
439 if (!atomic_inc_not_zero(&n->refcnt)) in neigh_lookup_nodev()
440 n = NULL; in neigh_lookup_nodev()
447 return n; in neigh_lookup_nodev()
457 struct neighbour *n1, *rc, *n = neigh_alloc(tbl, dev); in __neigh_create() local
460 if (!n) { in __neigh_create()
465 memcpy(n->primary_key, pkey, key_len); in __neigh_create()
466 n->dev = dev; in __neigh_create()
470 if (tbl->constructor && (error = tbl->constructor(n)) < 0) { in __neigh_create()
476 error = dev->netdev_ops->ndo_neigh_construct(n); in __neigh_create()
484 if (n->parms->neigh_setup && in __neigh_create()
485 (error = n->parms->neigh_setup(n)) < 0) { in __neigh_create()
490 n->confirmed = jiffies - (NEIGH_VAR(n->parms, BASE_REACHABLE_TIME) << 1); in __neigh_create()
501 if (n->parms->dead) { in __neigh_create()
519 n->dead = 0; in __neigh_create()
521 neigh_hold(n); in __neigh_create()
522 rcu_assign_pointer(n->next, in __neigh_create()
525 rcu_assign_pointer(nht->hash_buckets[hash_val], n); in __neigh_create()
527 neigh_dbg(2, "neigh %p is created\n", n); in __neigh_create()
528 rc = n; in __neigh_create()
534 neigh_release(n); in __neigh_create()
549 static struct pneigh_entry *__pneigh_lookup_1(struct pneigh_entry *n, in __pneigh_lookup_1() argument
555 while (n) { in __pneigh_lookup_1()
556 if (!memcmp(n->key, pkey, key_len) && in __pneigh_lookup_1()
557 net_eq(pneigh_net(n), net) && in __pneigh_lookup_1()
558 (n->dev == dev || !n->dev)) in __pneigh_lookup_1()
559 return n; in __pneigh_lookup_1()
560 n = n->next; in __pneigh_lookup_1()
580 struct pneigh_entry *n; in pneigh_lookup() local
585 n = __pneigh_lookup_1(tbl->phash_buckets[hash_val], in pneigh_lookup()
589 if (n || !creat) in pneigh_lookup()
594 n = kmalloc(sizeof(*n) + key_len, GFP_KERNEL); in pneigh_lookup()
595 if (!n) in pneigh_lookup()
598 write_pnet(&n->net, net); in pneigh_lookup()
599 memcpy(n->key, pkey, key_len); in pneigh_lookup()
600 n->dev = dev; in pneigh_lookup()
604 if (tbl->pconstructor && tbl->pconstructor(n)) { in pneigh_lookup()
607 kfree(n); in pneigh_lookup()
608 n = NULL; in pneigh_lookup()
613 n->next = tbl->phash_buckets[hash_val]; in pneigh_lookup()
614 tbl->phash_buckets[hash_val] = n; in pneigh_lookup()
617 return n; in pneigh_lookup()
625 struct pneigh_entry *n, **np; in pneigh_delete() local
630 for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL; in pneigh_delete()
631 np = &n->next) { in pneigh_delete()
632 if (!memcmp(n->key, pkey, key_len) && n->dev == dev && in pneigh_delete()
633 net_eq(pneigh_net(n), net)) { in pneigh_delete()
634 *np = n->next; in pneigh_delete()
637 tbl->pdestructor(n); in pneigh_delete()
638 if (n->dev) in pneigh_delete()
639 dev_put(n->dev); in pneigh_delete()
640 kfree(n); in pneigh_delete()
650 struct pneigh_entry *n, **np; in pneigh_ifdown() local
655 while ((n = *np) != NULL) { in pneigh_ifdown()
656 if (!dev || n->dev == dev) { in pneigh_ifdown()
657 *np = n->next; in pneigh_ifdown()
659 tbl->pdestructor(n); in pneigh_ifdown()
660 if (n->dev) in pneigh_ifdown()
661 dev_put(n->dev); in pneigh_ifdown()
662 kfree(n); in pneigh_ifdown()
665 np = &n->next; in pneigh_ifdown()
743 struct neighbour *n; in neigh_periodic_work() local
772 while ((n = rcu_dereference_protected(*np, in neigh_periodic_work()
776 write_lock(&n->lock); in neigh_periodic_work()
778 state = n->nud_state; in neigh_periodic_work()
780 write_unlock(&n->lock); in neigh_periodic_work()
784 if (time_before(n->used, n->confirmed)) in neigh_periodic_work()
785 n->used = n->confirmed; in neigh_periodic_work()
787 if (atomic_read(&n->refcnt) == 1 && in neigh_periodic_work()
789 time_after(jiffies, n->used + NEIGH_VAR(n->parms, GC_STALETIME)))) { in neigh_periodic_work()
790 *np = n->next; in neigh_periodic_work()
791 n->dead = 1; in neigh_periodic_work()
792 write_unlock(&n->lock); in neigh_periodic_work()
793 neigh_cleanup_and_release(n); in neigh_periodic_work()
796 write_unlock(&n->lock); in neigh_periodic_work()
799 np = &n->next; in neigh_periodic_work()
821 static __inline__ int neigh_max_probes(struct neighbour *n) in neigh_max_probes() argument
823 struct neigh_parms *p = n->parms; in neigh_max_probes()
825 (n->nud_state & NUD_PROBE ? NEIGH_VAR(p, MCAST_REPROBES) : in neigh_max_probes()
1272 static void neigh_hh_init(struct neighbour *n) in neigh_hh_init() argument
1274 struct net_device *dev = n->dev; in neigh_hh_init()
1275 __be16 prot = n->tbl->protocol; in neigh_hh_init()
1276 struct hh_cache *hh = &n->hh; in neigh_hh_init()
1278 write_lock_bh(&n->lock); in neigh_hh_init()
1284 dev->header_ops->cache(n, hh, prot); in neigh_hh_init()
1286 write_unlock_bh(&n->lock); in neigh_hh_init()
1360 struct sk_buff *skb, *n; in neigh_proxy_process() local
1364 skb_queue_walk_safe(&tbl->proxy_queue, skb, n) { in neigh_proxy_process()
2266 struct neighbour *n; in neigh_dump_table() local
2292 for (n = rcu_dereference_bh(nht->hash_buckets[h]), idx = 0; in neigh_dump_table()
2293 n != NULL; in neigh_dump_table()
2294 n = rcu_dereference_bh(n->next)) { in neigh_dump_table()
2295 if (!net_eq(dev_net(n->dev), net)) in neigh_dump_table()
2297 if (neigh_ifindex_filtered(n->dev, filter_idx)) in neigh_dump_table()
2299 if (neigh_master_filtered(n->dev, filter_master_idx)) in neigh_dump_table()
2303 if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid, in neigh_dump_table()
2325 struct pneigh_entry *n; in pneigh_dump_table() local
2335 for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) { in pneigh_dump_table()
2336 if (pneigh_net(n) != net) in pneigh_dump_table()
2340 if (pneigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid, in pneigh_dump_table()
2412 struct neighbour *n; in neigh_for_each() local
2414 for (n = rcu_dereference_bh(nht->hash_buckets[chain]); in neigh_for_each()
2415 n != NULL; in neigh_for_each()
2416 n = rcu_dereference_bh(n->next)) in neigh_for_each()
2417 cb(n, cookie); in neigh_for_each()
2434 struct neighbour *n; in __neigh_for_each_release() local
2438 while ((n = rcu_dereference_protected(*np, in __neigh_for_each_release()
2442 write_lock(&n->lock); in __neigh_for_each_release()
2443 release = cb(n); in __neigh_for_each_release()
2446 rcu_dereference_protected(n->next, in __neigh_for_each_release()
2448 n->dead = 1; in __neigh_for_each_release()
2450 np = &n->next; in __neigh_for_each_release()
2451 write_unlock(&n->lock); in __neigh_for_each_release()
2453 neigh_cleanup_and_release(n); in __neigh_for_each_release()
2500 struct neighbour *n = NULL; in neigh_get_first() local
2505 n = rcu_dereference_bh(nht->hash_buckets[bucket]); in neigh_get_first()
2507 while (n) { in neigh_get_first()
2508 if (!net_eq(dev_net(n->dev), net)) in neigh_get_first()
2514 v = state->neigh_sub_iter(state, n, &fakep); in neigh_get_first()
2520 if (n->nud_state & ~NUD_NOARP) in neigh_get_first()
2523 n = rcu_dereference_bh(n->next); in neigh_get_first()
2526 if (n) in neigh_get_first()
2531 return n; in neigh_get_first()
2535 struct neighbour *n, in neigh_get_next()
2543 void *v = state->neigh_sub_iter(state, n, pos); in neigh_get_next()
2545 return n; in neigh_get_next()
2547 n = rcu_dereference_bh(n->next); in neigh_get_next()
2550 while (n) { in neigh_get_next()
2551 if (!net_eq(dev_net(n->dev), net)) in neigh_get_next()
2554 void *v = state->neigh_sub_iter(state, n, pos); in neigh_get_next()
2556 return n; in neigh_get_next()
2562 if (n->nud_state & ~NUD_NOARP) in neigh_get_next()
2565 n = rcu_dereference_bh(n->next); in neigh_get_next()
2568 if (n) in neigh_get_next()
2574 n = rcu_dereference_bh(nht->hash_buckets[state->bucket]); in neigh_get_next()
2577 if (n && pos) in neigh_get_next()
2579 return n; in neigh_get_next()
2584 struct neighbour *n = neigh_get_first(seq); in neigh_get_idx() local
2586 if (n) { in neigh_get_idx()
2589 n = neigh_get_next(seq, n, pos); in neigh_get_idx()
2590 if (!n) in neigh_get_idx()
2594 return *pos ? NULL : n; in neigh_get_idx()
2834 static void __neigh_notify(struct neighbour *n, int type, int flags) in __neigh_notify() argument
2836 struct net *net = dev_net(n->dev); in __neigh_notify()
2844 err = neigh_fill_info(skb, n, 0, 0, type, flags); in __neigh_notify()
2858 void neigh_app_ns(struct neighbour *n) in neigh_app_ns() argument
2860 __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST); in neigh_app_ns()