Linux内核--网络栈实现分析(十一)--驱动程序层(下)

发表于:2013-1-07 10:21

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:闫明    来源:51Testing软件测试网采编

分享:

  其中的dev_tint()函数是将设备的所有缓存队列中的数据全部调用dev_queue_xmit()发送全部数据包。

/*
 * This routine is called when an device driver (i.e. an
 * interface) is ready to transmit a packet.
 */
//该函数功能:遍历设备的缓冲队列,对所有的数据包调用dev_queue_xmit()函数发送数据
void dev_tint(struct device *dev)
{
 int i;
 struct sk_buff *skb;
 unsigned long flags;
 
 save_flags(flags); 
 /*
  * Work the queues in priority order
  */
 
 for(i = 0;i < DEV_NUMBUFFS; i++)
 {
  /*
   * Pull packets from the queue
   */
  

  cli();
  while((skb=skb_dequeue(&dev->buffs[i]))!=NULL)
  {
   /*
    * Stop anyone freeing the buffer while we retransmit it
    */
   skb_device_lock(skb);
   restore_flags(flags);
   /*
    * Feed them to the output stage and if it fails
    * indicate they re-queue at the front.
    */
   dev_queue_xmit(skb,dev,-i - 1);//注意优先级的计算方式,在函数dev_queue_xmit()中优先级若<0则计算pri=-pri-1=-(-i-1)-1=i,
             //这样做的目的就是为了得到正确的where值,函数(dev_queue_xmit())中
   /*
    * If we can take no more then stop here.
    */
   if (dev->tbusy)
    return;
   cli();
  }
 }
 restore_flags(flags);
}

  驱动层严格的说不属于内核网络栈的内容,和硬件关系密切,何况这种网卡硬件设备可能已经不用了,这里就没有详细分析。

  本文转载自:http://blog.csdn.net/yming0221/article/details/7492423

相关链接:

Linux内核--网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构

Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)

Linux内核--网络栈实现分析(四)--网络层之IP协议(上)

Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)

Linux内核--网络栈实现分析(六)--应用层获取数据包(上)

Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

Linux内核--网络栈实现分析(八)--应用层发送数据(下)

Linux内核--网络栈实现分析(九)--传输层之UDP协议(下)

Linux内核--网络栈实现分析(十)--网络层之IP协议(下)

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号