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

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

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

新旧状态不同时,首先删除定时器,如果新状态需要定时器,则重新设置定时器,最后设置表项neigh为新状态new。

if (new != old) {     
 neigh_del_timer(neigh);     
 if (new & NUD_IN_TIMER)     
  neigh_add_timer(neigh, (jiffies +     
   ((new & NUD_REACHABLE) ?     
   neigh->parms->reachable_time :     
    0)));     
 neigh->nud_state = new;     
}

如果邻居表项中的地址发生了更新,有了新的地址值lladdr,那么更新表项地址neigh->ha,并更新与此表项相关 的所有缓存表项neigh_update_hhs。

if (lladdr != neigh->ha) {     
 memcpy(&neigh->ha, lladdr, dev->addr_len);     
 neigh_update_hhs(neigh);     
 if (!(new & NUD_CONNECTED))     
  neigh->confirmed = jiffies -     
   (neigh->parms->base_reachable_time << 1);     
 notify = 1;     
}

如果表项状态从非有效(!NUD_VALID)迁移到有效(NUD_VALID),且此表项上的arp_queue上有项,表明之前有报文因为 地址无法解析在暂存在了arp_queue上。此时表项地址解析完成,变为有效状态,从arp_queue中取出所有待发送的报文skb,发 送出去n1->output(skb),并清空表项的arp_queue。

if (!(old & NUD_VALID)) {     
 struct sk_buff *skb;     
while (neigh->nud_state & NUD_VALID &&     
     (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {     
  struct neighbour *n1 = neigh;     
  write_unlock_bh(&neigh->lock);     
  /* On shaper/eql skb->dst->neighbour != neigh :( */ 
  if (skb_dst(skb) && skb_dst(skb)->neighbour)     
   n1 = skb_dst(skb)->neighbour;     
  n1->output(skb);     
  write_lock_bh(&neigh->lock);     
 }     
 skb_queue_purge(&neigh->arp_queue);     
}

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

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

热点阅读