加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[九]:邻居表

发布时间:2016-05-28 22:17:43 所属栏目:Linux 来源:网络整理
导读:内核版本:2.6.34 这部分的重点是三个核心的数据结构-邻居表、邻居缓存、代理邻居表,以及NUD状态转移图。 总的来说,要成功添加一条邻居表项,需要满足两个条

拷贝key(即IP地址) 到primary_key,而primary_key就是紧接neighbour的4个字节,看下struct neighbor的声明 - u8 primary_key[0];设置n- >dev指向接收到报文的网卡设备dev。

memcpy(n->primary_key, pkey, key_len);     
n->dev = dev;

哈希表是牺牲空间换时间,保证均匀度很重要,一旦某个表项的值过多,链表查找会降低性能。因 此当表项数目entries大于初始分配大小hash_mask+1时,执行neigh_hash_grow将哈希表空间倍增,这也是内核使用哈希表时常 用的方法,可变大小的哈希表。

if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1))     
 neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1);

通过pkey和dev计算哈希值,决定插入tbl- >hash_buckets的表项。

hash_val = tbl->hash(pkey, dev) & tbl->hash_mask;

搜索tbl- >hash_buckets[hash_val]项,如果创建的新ARP表项已存在,则退出;否则将其n插入该项的链表头。

for (n1 = 

tbl->hash_buckets[hash_val]; n1; n1 = n1->next) {     
 if (dev == n1->dev && !memcmp(n1->primary_key, pkey, key_len)) {     
  neigh_hold(n1);     
  rc = n1;     
  goto out_tbl_unlock;     
 }     
}     
n->next = tbl->hash_buckets[hash_val];     
tbl->hash_buckets[hash_val] = n;

附一张创建ARP表项并插入到hash_buckets的图:

Linux内核分析 - 网络[九]:邻居表

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读