要传输帧时,内核会提供dev_queue_xmit函数,此函数会从设备的出口队列中退出一个帧,然后将该帧传递给设备的hard_start_xmit方法,内核还提供了一个类似的但是能处理队列锁的函数__net_schdeule函数,可为设备调度以准备传输。__net_schdeule函数完成的两个主要的任务是:
1、把设备添加到output_queue输出设备列表的头部。
2、为NET_TX_SOFTIRQ软IRQ调度以准备运行。
注意调用dev_queue_xmit函数进行传输时,传输的帧存储在sk_buff中已经是完整的数据帧了,这是由各种协议处理函数处理之后的结果。软中断触发的net_tx_action函数区别于net_rx_action函数的需要将帧传给L2层的协议处理函数,net_tx_action主要的任务是:
1、当设备的传输功能通过netif_wake_queue开启时(例如:当设备有足够的内存时),等待被传送的帧实际上被传送出去。
2、在某种情况下,此函数要收回那些已成功传输的缓冲区的sk_buff结构。