Lines Matching refs:tbl
57 static int pneigh_ifdown_and_unlock(struct neigh_table *tbl,
123 atomic_dec(&n->tbl->gc_entries); in neigh_mark_dead()
133 write_lock_bh(&n->tbl->lock); in neigh_update_gc_list()
147 atomic_dec(&n->tbl->gc_entries); in neigh_update_gc_list()
150 list_add_tail(&n->gc_list, &n->tbl->gc_list); in neigh_update_gc_list()
151 atomic_inc(&n->tbl->gc_entries); in neigh_update_gc_list()
155 write_unlock_bh(&n->tbl->lock); in neigh_update_gc_list()
162 write_lock_bh(&n->tbl->lock); in neigh_update_managed_list()
173 list_add_tail(&n->managed_list, &n->tbl->managed_list); in neigh_update_managed_list()
176 write_unlock_bh(&n->tbl->lock); in neigh_update_managed_list()
209 struct neigh_table *tbl) in neigh_del() argument
218 lockdep_is_held(&tbl->lock)); in neigh_del()
229 bool neigh_remove_one(struct neighbour *ndel, struct neigh_table *tbl) in neigh_remove_one() argument
237 nht = rcu_dereference_protected(tbl->nht, in neigh_remove_one()
238 lockdep_is_held(&tbl->lock)); in neigh_remove_one()
239 hash_val = tbl->hash(pkey, ndel->dev, nht->hash_rnd); in neigh_remove_one()
244 lockdep_is_held(&tbl->lock)))) { in neigh_remove_one()
246 return neigh_del(n, np, tbl); in neigh_remove_one()
252 static int neigh_forced_gc(struct neigh_table *tbl) in neigh_forced_gc() argument
254 int max_clean = atomic_read(&tbl->gc_entries) - tbl->gc_thresh2; in neigh_forced_gc()
259 NEIGH_CACHE_STAT_INC(tbl, forced_gc_runs); in neigh_forced_gc()
261 write_lock_bh(&tbl->lock); in neigh_forced_gc()
263 list_for_each_entry_safe(n, tmp, &tbl->gc_list, gc_list) { in neigh_forced_gc()
270 (tbl->is_multicast && in neigh_forced_gc()
271 tbl->is_multicast(n->primary_key)) || in neigh_forced_gc()
276 if (remove && neigh_remove_one(n, tbl)) in neigh_forced_gc()
283 tbl->last_flush = jiffies; in neigh_forced_gc()
285 write_unlock_bh(&tbl->lock); in neigh_forced_gc()
362 static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev, in neigh_flush_dev() argument
368 nht = rcu_dereference_protected(tbl->nht, in neigh_flush_dev()
369 lockdep_is_held(&tbl->lock)); in neigh_flush_dev()
376 lockdep_is_held(&tbl->lock))) != NULL) { in neigh_flush_dev()
387 lockdep_is_held(&tbl->lock))); in neigh_flush_dev()
416 void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev) in neigh_changeaddr() argument
418 write_lock_bh(&tbl->lock); in neigh_changeaddr()
419 neigh_flush_dev(tbl, dev, false); in neigh_changeaddr()
420 write_unlock_bh(&tbl->lock); in neigh_changeaddr()
424 static int __neigh_ifdown(struct neigh_table *tbl, struct net_device *dev, in __neigh_ifdown() argument
427 write_lock_bh(&tbl->lock); in __neigh_ifdown()
428 neigh_flush_dev(tbl, dev, skip_perm); in __neigh_ifdown()
429 pneigh_ifdown_and_unlock(tbl, dev); in __neigh_ifdown()
430 pneigh_queue_purge(&tbl->proxy_queue, dev ? dev_net(dev) : NULL, in __neigh_ifdown()
431 tbl->family); in __neigh_ifdown()
432 if (skb_queue_empty_lockless(&tbl->proxy_queue)) in __neigh_ifdown()
433 del_timer_sync(&tbl->proxy_timer); in __neigh_ifdown()
437 int neigh_carrier_down(struct neigh_table *tbl, struct net_device *dev) in neigh_carrier_down() argument
439 __neigh_ifdown(tbl, dev, true); in neigh_carrier_down()
444 int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev) in neigh_ifdown() argument
446 __neigh_ifdown(tbl, dev, false); in neigh_ifdown()
451 static struct neighbour *neigh_alloc(struct neigh_table *tbl, in neigh_alloc() argument
462 entries = atomic_inc_return(&tbl->gc_entries) - 1; in neigh_alloc()
463 if (entries >= tbl->gc_thresh3 || in neigh_alloc()
464 (entries >= tbl->gc_thresh2 && in neigh_alloc()
465 time_after(now, tbl->last_flush + 5 * HZ))) { in neigh_alloc()
466 if (!neigh_forced_gc(tbl) && in neigh_alloc()
467 entries >= tbl->gc_thresh3) { in neigh_alloc()
469 tbl->id); in neigh_alloc()
470 NEIGH_CACHE_STAT_INC(tbl, table_fulls); in neigh_alloc()
476 n = kzalloc(tbl->entry_size + dev->neigh_priv_len, GFP_ATOMIC); in neigh_alloc()
488 n->parms = neigh_parms_clone(&tbl->parms); in neigh_alloc()
491 NEIGH_CACHE_STAT_INC(tbl, allocs); in neigh_alloc()
492 n->tbl = tbl; in neigh_alloc()
498 atomic_inc(&tbl->entries); in neigh_alloc()
504 atomic_dec(&tbl->gc_entries); in neigh_alloc()
559 static struct neigh_hash_table *neigh_hash_grow(struct neigh_table *tbl, in neigh_hash_grow() argument
565 NEIGH_CACHE_STAT_INC(tbl, hash_grows); in neigh_hash_grow()
567 old_nht = rcu_dereference_protected(tbl->nht, in neigh_hash_grow()
568 lockdep_is_held(&tbl->lock)); in neigh_hash_grow()
577 lockdep_is_held(&tbl->lock)); in neigh_hash_grow()
580 hash = tbl->hash(n->primary_key, n->dev, in neigh_hash_grow()
585 lockdep_is_held(&tbl->lock)); in neigh_hash_grow()
590 lockdep_is_held(&tbl->lock))); in neigh_hash_grow()
595 rcu_assign_pointer(tbl->nht, new_nht); in neigh_hash_grow()
600 struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey, in neigh_lookup() argument
605 NEIGH_CACHE_STAT_INC(tbl, lookups); in neigh_lookup()
608 n = __neigh_lookup_noref(tbl, pkey, dev); in neigh_lookup()
612 NEIGH_CACHE_STAT_INC(tbl, hits); in neigh_lookup()
620 struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net, in neigh_lookup_nodev() argument
624 unsigned int key_len = tbl->key_len; in neigh_lookup_nodev()
628 NEIGH_CACHE_STAT_INC(tbl, lookups); in neigh_lookup_nodev()
631 nht = rcu_dereference_bh(tbl->nht); in neigh_lookup_nodev()
632 hash_val = tbl->hash(pkey, NULL, nht->hash_rnd) >> (32 - nht->hash_shift); in neigh_lookup_nodev()
641 NEIGH_CACHE_STAT_INC(tbl, hits); in neigh_lookup_nodev()
652 ___neigh_create(struct neigh_table *tbl, const void *pkey, in ___neigh_create() argument
656 u32 hash_val, key_len = tbl->key_len; in ___neigh_create()
661 n = neigh_alloc(tbl, dev, flags, exempt_from_gc); in ___neigh_create()
662 trace_neigh_create(tbl, dev, pkey, n, exempt_from_gc); in ___neigh_create()
673 if (tbl->constructor && (error = tbl->constructor(n)) < 0) { in ___neigh_create()
695 write_lock_bh(&tbl->lock); in ___neigh_create()
696 nht = rcu_dereference_protected(tbl->nht, in ___neigh_create()
697 lockdep_is_held(&tbl->lock)); in ___neigh_create()
699 if (atomic_read(&tbl->entries) > (1 << nht->hash_shift)) in ___neigh_create()
700 nht = neigh_hash_grow(tbl, nht->hash_shift + 1); in ___neigh_create()
702 hash_val = tbl->hash(n->primary_key, dev, nht->hash_rnd) >> (32 - nht->hash_shift); in ___neigh_create()
710 lockdep_is_held(&tbl->lock)); in ___neigh_create()
713 lockdep_is_held(&tbl->lock))) { in ___neigh_create()
724 list_add_tail(&n->gc_list, &n->tbl->gc_list); in ___neigh_create()
726 list_add_tail(&n->managed_list, &n->tbl->managed_list); in ___neigh_create()
731 lockdep_is_held(&tbl->lock))); in ___neigh_create()
733 write_unlock_bh(&tbl->lock); in ___neigh_create()
739 write_unlock_bh(&tbl->lock); in ___neigh_create()
742 atomic_dec(&tbl->gc_entries); in ___neigh_create()
747 struct neighbour *__neigh_create(struct neigh_table *tbl, const void *pkey, in __neigh_create() argument
750 return ___neigh_create(tbl, pkey, dev, 0, false, want_ref); in __neigh_create()
780 struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl, in __pneigh_lookup() argument
783 unsigned int key_len = tbl->key_len; in __pneigh_lookup()
786 return __pneigh_lookup_1(tbl->phash_buckets[hash_val], in __pneigh_lookup()
791 struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl, in pneigh_lookup() argument
796 unsigned int key_len = tbl->key_len; in pneigh_lookup()
799 read_lock_bh(&tbl->lock); in pneigh_lookup()
800 n = __pneigh_lookup_1(tbl->phash_buckets[hash_val], in pneigh_lookup()
802 read_unlock_bh(&tbl->lock); in pneigh_lookup()
818 if (tbl->pconstructor && tbl->pconstructor(n)) { in pneigh_lookup()
825 write_lock_bh(&tbl->lock); in pneigh_lookup()
826 n->next = tbl->phash_buckets[hash_val]; in pneigh_lookup()
827 tbl->phash_buckets[hash_val] = n; in pneigh_lookup()
828 write_unlock_bh(&tbl->lock); in pneigh_lookup()
835 int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey, in pneigh_delete() argument
839 unsigned int key_len = tbl->key_len; in pneigh_delete()
842 write_lock_bh(&tbl->lock); in pneigh_delete()
843 for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL; in pneigh_delete()
848 write_unlock_bh(&tbl->lock); in pneigh_delete()
849 if (tbl->pdestructor) in pneigh_delete()
850 tbl->pdestructor(n); in pneigh_delete()
856 write_unlock_bh(&tbl->lock); in pneigh_delete()
860 static int pneigh_ifdown_and_unlock(struct neigh_table *tbl, in pneigh_ifdown_and_unlock() argument
867 np = &tbl->phash_buckets[h]; in pneigh_ifdown_and_unlock()
878 write_unlock_bh(&tbl->lock); in pneigh_ifdown_and_unlock()
882 if (tbl->pdestructor) in pneigh_ifdown_and_unlock()
883 tbl->pdestructor(n); in pneigh_ifdown_and_unlock()
906 NEIGH_CACHE_STAT_INC(neigh->tbl, destroys); in neigh_destroy()
930 atomic_dec(&neigh->tbl->entries); in neigh_destroy()
961 struct neigh_table *tbl = container_of(work, struct neigh_table, gc_work.work); in neigh_periodic_work() local
967 NEIGH_CACHE_STAT_INC(tbl, periodic_gc_runs); in neigh_periodic_work()
969 write_lock_bh(&tbl->lock); in neigh_periodic_work()
970 nht = rcu_dereference_protected(tbl->nht, in neigh_periodic_work()
971 lockdep_is_held(&tbl->lock)); in neigh_periodic_work()
977 if (time_after(jiffies, tbl->last_rand + 300 * HZ)) { in neigh_periodic_work()
979 tbl->last_rand = jiffies; in neigh_periodic_work()
980 list_for_each_entry(p, &tbl->parms_list, list) in neigh_periodic_work()
985 if (atomic_read(&tbl->entries) < tbl->gc_thresh1) in neigh_periodic_work()
992 lockdep_is_held(&tbl->lock))) != NULL) { in neigh_periodic_work()
1025 write_unlock_bh(&tbl->lock); in neigh_periodic_work()
1027 write_lock_bh(&tbl->lock); in neigh_periodic_work()
1028 nht = rcu_dereference_protected(tbl->nht, in neigh_periodic_work()
1029 lockdep_is_held(&tbl->lock)); in neigh_periodic_work()
1036 queue_delayed_work(system_power_efficient_wq, &tbl->gc_work, in neigh_periodic_work()
1037 NEIGH_VAR(&tbl->parms, BASE_REACHABLE_TIME) >> 1); in neigh_periodic_work()
1038 write_unlock_bh(&tbl->lock); in neigh_periodic_work()
1055 NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed); in neigh_invalidate()
1240 NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards); in __neigh_event_send()
1518 struct neighbour *neigh_event_ns(struct neigh_table *tbl, in neigh_event_ns() argument
1522 struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev, in neigh_event_ns()
1535 __be16 prot = n->tbl->protocol; in neigh_hh_init()
1617 struct neigh_table *tbl = container_of(work, struct neigh_table, in neigh_managed_work() local
1621 write_lock_bh(&tbl->lock); in neigh_managed_work()
1622 list_for_each_entry(neigh, &tbl->managed_list, managed_list) in neigh_managed_work()
1624 queue_delayed_work(system_power_efficient_wq, &tbl->managed_work, in neigh_managed_work()
1625 NEIGH_VAR(&tbl->parms, INTERVAL_PROBE_TIME_MS)); in neigh_managed_work()
1626 write_unlock_bh(&tbl->lock); in neigh_managed_work()
1631 struct neigh_table *tbl = from_timer(tbl, t, proxy_timer); in neigh_proxy_process() local
1636 spin_lock(&tbl->proxy_queue.lock); in neigh_proxy_process()
1638 skb_queue_walk_safe(&tbl->proxy_queue, skb, n) { in neigh_proxy_process()
1644 neigh_parms_qlen_dec(dev, tbl->family); in neigh_proxy_process()
1645 __skb_unlink(skb, &tbl->proxy_queue); in neigh_proxy_process()
1647 if (tbl->proxy_redo && netif_running(dev)) { in neigh_proxy_process()
1649 tbl->proxy_redo(skb); in neigh_proxy_process()
1659 del_timer(&tbl->proxy_timer); in neigh_proxy_process()
1661 mod_timer(&tbl->proxy_timer, jiffies + sched_next); in neigh_proxy_process()
1662 spin_unlock(&tbl->proxy_queue.lock); in neigh_proxy_process()
1665 void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p, in pneigh_enqueue() argument
1679 spin_lock(&tbl->proxy_queue.lock); in pneigh_enqueue()
1680 if (del_timer(&tbl->proxy_timer)) { in pneigh_enqueue()
1681 if (time_before(tbl->proxy_timer.expires, sched_next)) in pneigh_enqueue()
1682 sched_next = tbl->proxy_timer.expires; in pneigh_enqueue()
1686 __skb_queue_tail(&tbl->proxy_queue, skb); in pneigh_enqueue()
1688 mod_timer(&tbl->proxy_timer, sched_next); in pneigh_enqueue()
1689 spin_unlock(&tbl->proxy_queue.lock); in pneigh_enqueue()
1693 static inline struct neigh_parms *lookup_neigh_parms(struct neigh_table *tbl, in lookup_neigh_parms() argument
1698 list_for_each_entry(p, &tbl->parms_list, list) { in lookup_neigh_parms()
1708 struct neigh_table *tbl) in neigh_parms_alloc() argument
1714 p = kmemdup(&tbl->parms, sizeof(*p), GFP_KERNEL); in neigh_parms_alloc()
1716 p->tbl = tbl; in neigh_parms_alloc()
1732 write_lock_bh(&tbl->lock); in neigh_parms_alloc()
1733 list_add(&p->list, &tbl->parms.list); in neigh_parms_alloc()
1734 write_unlock_bh(&tbl->lock); in neigh_parms_alloc()
1750 void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms) in neigh_parms_release() argument
1752 if (!parms || parms == &tbl->parms) in neigh_parms_release()
1754 write_lock_bh(&tbl->lock); in neigh_parms_release()
1757 write_unlock_bh(&tbl->lock); in neigh_parms_release()
1772 void neigh_table_init(int index, struct neigh_table *tbl) in neigh_table_init() argument
1777 INIT_LIST_HEAD(&tbl->parms_list); in neigh_table_init()
1778 INIT_LIST_HEAD(&tbl->gc_list); in neigh_table_init()
1779 INIT_LIST_HEAD(&tbl->managed_list); in neigh_table_init()
1781 list_add(&tbl->parms.list, &tbl->parms_list); in neigh_table_init()
1782 write_pnet(&tbl->parms.net, &init_net); in neigh_table_init()
1783 refcount_set(&tbl->parms.refcnt, 1); in neigh_table_init()
1784 tbl->parms.reachable_time = in neigh_table_init()
1785 neigh_rand_reach_time(NEIGH_VAR(&tbl->parms, BASE_REACHABLE_TIME)); in neigh_table_init()
1786 tbl->parms.qlen = 0; in neigh_table_init()
1788 tbl->stats = alloc_percpu(struct neigh_statistics); in neigh_table_init()
1789 if (!tbl->stats) in neigh_table_init()
1793 if (!proc_create_seq_data(tbl->id, 0, init_net.proc_net_stat, in neigh_table_init()
1794 &neigh_stat_seq_ops, tbl)) in neigh_table_init()
1798 RCU_INIT_POINTER(tbl->nht, neigh_hash_alloc(3)); in neigh_table_init()
1801 tbl->phash_buckets = kzalloc(phsize, GFP_KERNEL); in neigh_table_init()
1803 if (!tbl->nht || !tbl->phash_buckets) in neigh_table_init()
1806 if (!tbl->entry_size) in neigh_table_init()
1807 tbl->entry_size = ALIGN(offsetof(struct neighbour, primary_key) + in neigh_table_init()
1808 tbl->key_len, NEIGH_PRIV_ALIGN); in neigh_table_init()
1810 WARN_ON(tbl->entry_size % NEIGH_PRIV_ALIGN); in neigh_table_init()
1812 rwlock_init(&tbl->lock); in neigh_table_init()
1814 INIT_DEFERRABLE_WORK(&tbl->gc_work, neigh_periodic_work); in neigh_table_init()
1815 queue_delayed_work(system_power_efficient_wq, &tbl->gc_work, in neigh_table_init()
1816 tbl->parms.reachable_time); in neigh_table_init()
1817 INIT_DEFERRABLE_WORK(&tbl->managed_work, neigh_managed_work); in neigh_table_init()
1818 queue_delayed_work(system_power_efficient_wq, &tbl->managed_work, 0); in neigh_table_init()
1820 timer_setup(&tbl->proxy_timer, neigh_proxy_process, 0); in neigh_table_init()
1821 skb_queue_head_init_class(&tbl->proxy_queue, in neigh_table_init()
1824 tbl->last_flush = now; in neigh_table_init()
1825 tbl->last_rand = now + tbl->parms.reachable_time * 20; in neigh_table_init()
1827 neigh_tables[index] = tbl; in neigh_table_init()
1831 int neigh_table_clear(int index, struct neigh_table *tbl) in neigh_table_clear() argument
1835 cancel_delayed_work_sync(&tbl->managed_work); in neigh_table_clear()
1836 cancel_delayed_work_sync(&tbl->gc_work); in neigh_table_clear()
1837 del_timer_sync(&tbl->proxy_timer); in neigh_table_clear()
1838 pneigh_queue_purge(&tbl->proxy_queue, NULL, tbl->family); in neigh_table_clear()
1839 neigh_ifdown(tbl, NULL); in neigh_table_clear()
1840 if (atomic_read(&tbl->entries)) in neigh_table_clear()
1843 call_rcu(&rcu_dereference_protected(tbl->nht, 1)->rcu, in neigh_table_clear()
1845 tbl->nht = NULL; in neigh_table_clear()
1847 kfree(tbl->phash_buckets); in neigh_table_clear()
1848 tbl->phash_buckets = NULL; in neigh_table_clear()
1850 remove_proc_entry(tbl->id, init_net.proc_net_stat); in neigh_table_clear()
1852 free_percpu(tbl->stats); in neigh_table_clear()
1853 tbl->stats = NULL; in neigh_table_clear()
1861 struct neigh_table *tbl = NULL; in neigh_find_table() local
1865 tbl = neigh_tables[NEIGH_ARP_TABLE]; in neigh_find_table()
1868 tbl = neigh_tables[NEIGH_ND_TABLE]; in neigh_find_table()
1872 return tbl; in neigh_find_table()
1898 struct neigh_table *tbl; in neigh_delete() local
1922 tbl = neigh_find_table(ndm->ndm_family); in neigh_delete()
1923 if (tbl == NULL) in neigh_delete()
1926 if (nla_len(dst_attr) < (int)tbl->key_len) { in neigh_delete()
1932 err = pneigh_delete(tbl, net, nla_data(dst_attr), dev); in neigh_delete()
1939 neigh = neigh_lookup(tbl, nla_data(dst_attr), dev); in neigh_delete()
1948 write_lock_bh(&tbl->lock); in neigh_delete()
1950 neigh_remove_one(neigh, tbl); in neigh_delete()
1951 write_unlock_bh(&tbl->lock); in neigh_delete()
1965 struct neigh_table *tbl; in neigh_add() local
2008 tbl = neigh_find_table(ndm->ndm_family); in neigh_add()
2009 if (tbl == NULL) in neigh_add()
2012 if (nla_len(tb[NDA_DST]) < (int)tbl->key_len) { in neigh_add()
2031 pn = pneigh_lookup(tbl, net, dst, dev, 1); in neigh_add()
2046 if (tbl->allow_add && !tbl->allow_add(dev, extack)) { in neigh_add()
2051 neigh = neigh_lookup(tbl, dst, dev); in neigh_add()
2067 neigh = ___neigh_create(tbl, dst, dev, in neigh_add()
2159 static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, in neightbl_fill_info() argument
2171 read_lock_bh(&tbl->lock); in neightbl_fill_info()
2172 ndtmsg->ndtm_family = tbl->family; in neightbl_fill_info()
2176 if (nla_put_string(skb, NDTA_NAME, tbl->id) || in neightbl_fill_info()
2177 nla_put_msecs(skb, NDTA_GC_INTERVAL, tbl->gc_interval, NDTA_PAD) || in neightbl_fill_info()
2178 nla_put_u32(skb, NDTA_THRESH1, tbl->gc_thresh1) || in neightbl_fill_info()
2179 nla_put_u32(skb, NDTA_THRESH2, tbl->gc_thresh2) || in neightbl_fill_info()
2180 nla_put_u32(skb, NDTA_THRESH3, tbl->gc_thresh3)) in neightbl_fill_info()
2184 long flush_delta = now - tbl->last_flush; in neightbl_fill_info()
2185 long rand_delta = now - tbl->last_rand; in neightbl_fill_info()
2188 .ndtc_key_len = tbl->key_len, in neightbl_fill_info()
2189 .ndtc_entry_size = tbl->entry_size, in neightbl_fill_info()
2190 .ndtc_entries = atomic_read(&tbl->entries), in neightbl_fill_info()
2193 .ndtc_proxy_qlen = tbl->proxy_queue.qlen, in neightbl_fill_info()
2197 nht = rcu_dereference_bh(tbl->nht); in neightbl_fill_info()
2215 st = per_cpu_ptr(tbl->stats, cpu); in neightbl_fill_info()
2234 BUG_ON(tbl->parms.dev); in neightbl_fill_info()
2235 if (neightbl_fill_parms(skb, &tbl->parms) < 0) in neightbl_fill_info()
2238 read_unlock_bh(&tbl->lock); in neightbl_fill_info()
2243 read_unlock_bh(&tbl->lock); in neightbl_fill_info()
2249 struct neigh_table *tbl, in neightbl_fill_param_info() argument
2263 read_lock_bh(&tbl->lock); in neightbl_fill_param_info()
2264 ndtmsg->ndtm_family = tbl->family; in neightbl_fill_param_info()
2268 if (nla_put_string(skb, NDTA_NAME, tbl->id) < 0 || in neightbl_fill_param_info()
2272 read_unlock_bh(&tbl->lock); in neightbl_fill_param_info()
2276 read_unlock_bh(&tbl->lock); in neightbl_fill_param_info()
2312 struct neigh_table *tbl; in neightbl_set() local
2331 tbl = neigh_tables[tidx]; in neightbl_set()
2332 if (!tbl) in neightbl_set()
2334 if (ndtmsg->ndtm_family && tbl->family != ndtmsg->ndtm_family) in neightbl_set()
2336 if (nla_strcmp(tb[NDTA_NAME], tbl->id) == 0) { in neightbl_set()
2349 write_lock_bh(&tbl->lock); in neightbl_set()
2365 p = lookup_neigh_parms(tbl, net, ifindex); in neightbl_set()
2455 tbl->gc_thresh1 = nla_get_u32(tb[NDTA_THRESH1]); in neightbl_set()
2458 tbl->gc_thresh2 = nla_get_u32(tb[NDTA_THRESH2]); in neightbl_set()
2461 tbl->gc_thresh3 = nla_get_u32(tb[NDTA_THRESH3]); in neightbl_set()
2464 tbl->gc_interval = nla_get_msecs(tb[NDTA_GC_INTERVAL]); in neightbl_set()
2469 write_unlock_bh(&tbl->lock); in neightbl_set()
2505 struct neigh_table *tbl; in neightbl_dump_info() local
2519 tbl = neigh_tables[tidx]; in neightbl_dump_info()
2520 if (!tbl) in neightbl_dump_info()
2523 if (tidx < tbl_skip || (family && tbl->family != family)) in neightbl_dump_info()
2526 if (neightbl_fill_info(skb, tbl, NETLINK_CB(cb->skb).portid, in neightbl_dump_info()
2532 p = list_next_entry(&tbl->parms, list); in neightbl_dump_info()
2533 list_for_each_entry_from(p, &tbl->parms_list, list) { in neightbl_dump_info()
2540 if (neightbl_fill_param_info(skb, tbl, p, in neightbl_dump_info()
2583 if (nla_put(skb, NDA_DST, neigh->tbl->key_len, neigh->primary_key)) in neigh_fill_info()
2623 struct neigh_table *tbl) in pneigh_fill_info() argument
2637 ndm->ndm_family = tbl->family; in pneigh_fill_info()
2645 if (nla_put(skb, NDA_DST, tbl->key_len, pn->key)) in pneigh_fill_info()
2701 static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, in neigh_dump_table() argument
2716 nht = rcu_dereference_bh(tbl->nht); in neigh_dump_table()
2748 static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, in pneigh_dump_table() argument
2761 read_lock_bh(&tbl->lock); in pneigh_dump_table()
2766 for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) { in pneigh_dump_table()
2774 RTM_NEWNEIGH, flags, tbl) < 0) { in pneigh_dump_table()
2775 read_unlock_bh(&tbl->lock); in pneigh_dump_table()
2784 read_unlock_bh(&tbl->lock); in pneigh_dump_table()
2858 struct neigh_table *tbl; in neigh_dump_info() local
2879 tbl = neigh_tables[t]; in neigh_dump_info()
2881 if (!tbl) in neigh_dump_info()
2883 if (t < s_t || (family && tbl->family != family)) in neigh_dump_info()
2889 err = pneigh_dump_table(tbl, skb, cb, &filter); in neigh_dump_info()
2891 err = neigh_dump_table(tbl, skb, cb, &filter); in neigh_dump_info()
2901 struct neigh_table **tbl, in neigh_valid_get_req() argument
2933 *tbl = neigh_find_table(ndm->ndm_family); in neigh_valid_get_req()
2934 if (*tbl == NULL) { in neigh_valid_get_req()
2945 if (nla_len(tb[i]) != (int)(*tbl)->key_len) { in neigh_valid_get_req()
3001 u32 pid, u32 seq, struct neigh_table *tbl) in pneigh_get_reply() argument
3010 err = pneigh_fill_info(skb, neigh, pid, seq, RTM_NEWNEIGH, 0, tbl); in pneigh_get_reply()
3026 struct neigh_table *tbl = NULL; in neigh_get() local
3033 err = neigh_valid_get_req(nlh, &tbl, &dst, &dev_idx, &ndm_flags, in neigh_get()
3054 pn = pneigh_lookup(tbl, net, dst, dev, 0); in neigh_get()
3060 nlh->nlmsg_seq, tbl); in neigh_get()
3068 neigh = neigh_lookup(tbl, dst, dev); in neigh_get()
3082 void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie) in neigh_for_each() argument
3088 nht = rcu_dereference_bh(tbl->nht); in neigh_for_each()
3090 read_lock(&tbl->lock); /* avoid resizes */ in neigh_for_each()
3099 read_unlock(&tbl->lock); in neigh_for_each()
3105 void __neigh_for_each_release(struct neigh_table *tbl, in __neigh_for_each_release() argument
3111 nht = rcu_dereference_protected(tbl->nht, in __neigh_for_each_release()
3112 lockdep_is_held(&tbl->lock)); in __neigh_for_each_release()
3119 lockdep_is_held(&tbl->lock))) != NULL) { in __neigh_for_each_release()
3127 lockdep_is_held(&tbl->lock))); in __neigh_for_each_release()
3144 struct neigh_table *tbl; in neigh_xmit() local
3147 tbl = neigh_tables[index]; in neigh_xmit()
3148 if (!tbl) in neigh_xmit()
3156 neigh = __neigh_lookup_noref(tbl, addr, dev); in neigh_xmit()
3159 neigh = __neigh_create(tbl, addr, dev, false); in neigh_xmit()
3291 struct neigh_table *tbl = state->tbl; in pneigh_get_first() local
3297 pn = tbl->phash_buckets[bucket]; in pneigh_get_first()
3314 struct neigh_table *tbl = state->tbl; in pneigh_get_next() local
3323 pn = tbl->phash_buckets[state->bucket]; in pneigh_get_next()
3364 void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neig… in neigh_seq_start() argument
3365 __acquires(tbl->lock) in neigh_seq_start()
3370 state->tbl = tbl; in neigh_seq_start()
3375 state->nht = rcu_dereference_bh(tbl->nht); in neigh_seq_start()
3376 read_lock(&tbl->lock); in neigh_seq_start()
3410 __releases(tbl->lock) in neigh_seq_stop()
3414 struct neigh_table *tbl = state->tbl; in neigh_seq_stop() local
3416 read_unlock(&tbl->lock); in neigh_seq_stop()
3425 struct neigh_table *tbl = pde_data(file_inode(seq->file)); in neigh_stat_seq_start() local
3435 return per_cpu_ptr(tbl->stats, cpu); in neigh_stat_seq_start()
3442 struct neigh_table *tbl = pde_data(file_inode(seq->file)); in neigh_stat_seq_next() local
3449 return per_cpu_ptr(tbl->stats, cpu); in neigh_stat_seq_next()
3462 struct neigh_table *tbl = pde_data(file_inode(seq->file)); in neigh_stat_seq_show() local
3473 atomic_read(&tbl->entries), in neigh_stat_seq_show()
3808 struct neigh_table *tbl = p->tbl; in neigh_sysctl_register() local
3810 t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = &tbl->gc_interval; in neigh_sysctl_register()
3811 t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = &tbl->gc_thresh1; in neigh_sysctl_register()
3812 t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = &tbl->gc_thresh2; in neigh_sysctl_register()
3813 t->neigh_vars[NEIGH_VAR_GC_THRESH3].data = &tbl->gc_thresh3; in neigh_sysctl_register()