加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[十二]:UDP模块 - socket

发布时间:2016-04-19 00:43:42 所属栏目:Linux 来源:网络整理
导读:内核版本:2.6.34 这部分内容在于说明socket创建后如何被内核协议栈访问到,只关注两个问题:sock何时插入内核 表的,sock如何被内核访问的。对于核心的sock的

先看数目大于10的情况,hslot2是udptable中hash2 表取出的表项,键值是[inet_rcv_addr, snum],如果hslot2项的数目比hslot还多,那么查找hash2表是不划算的,返回直接查 找hash表。如果hslot2更少(这也是设计hash2的目的),使用udp_lib_lport_inuse2()查找是否有匹配项;如果没有找到,则使 用新的键值hash2_nulladdr,即[INADDR_ANY, snum]从hash2中取出表项,再使用udp_lib_lport_inuse2()查找是否有匹配项。 如果有,表明要插入的sk已经存在于内核表中,直接返回;如果没有,则执行sk的插入操作。scan_primary_hash代码段是在 hash表的hslot项中查找,只有当在hash2中查找更费时时才会执行。

if (hslot-

>count > 10) {     
 int exist;     
 unsigned int slot2 = udp_sk(sk)->udp_portaddr_hash ^ snum;     

 slot2          &= udptable->mask;     
 hash2_nulladdr &= udptable->mask;     

 hslot2 = udp_hashslot2(udptable, slot2);     
 if (hslot->count < hslot2->count)     
  goto scan_primary_hash;     

 exist = udp_lib_lport_inuse2(net, snum, hslot2, sk, saddr_comp);     
 if (!exist && (hash2_nulladdr != slot2)) {     
  hslot2 = udp_hashslot2(udptable, hash2_nulladdr);     
  exist = udp_lib_lport_inuse2(net, snum, hslot2,     
     sk, saddr_comp);     
 }     
 if (exist)     
  goto fail_unlock;     
 else 
  goto found;     
}     
scan_primary_hash:     
 if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk,     
  saddr_comp, 0))     
  goto fail_unlock;     
}

流程图:

Linux内核分析 - 网络[十二]:UDP模块 - socket

(编辑:佛山站长网)

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

热点阅读