其中的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协议(下)