邻居子系统 之 邻居项查找neigh_lookup、___neigh_lookup_noref
概述 邻居项查找是通过neigh_lookup相关函数来进行的; ___neigh_lookup_noref,该函数根据输出设备和主键值(IPv4为下一跳ip地址)在邻居项hash表中查找,找到则返回该项; neigh_lookup,该函数调用了___neigh_lookup_noref函数,并且在找到邻居项之后,进行引用计数的递增,然后返回该项; 源码分析 1 struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey, 2 struct net_device *dev) 3 { 4 struct neighbour *n; 5 6 NEIGH_CACHE_STAT_INC(tbl, lookups); 7 8 rcu_read_lock_bh(); 9 10 /* 非引用查找邻居项 */ 11 n = __neigh_lookup_noref(tbl, pkey, dev); 12 13 /* 增加引用计数 */ 14 if (n) { 15 if (!atomic_inc_not_zero(&n->refcnt)) 16 n = NULL; 17 NEIGH_CACHE_STAT_INC(tbl, hits); 18 } 19 20 rcu_read_unlock_bh(); 21 22 /