网卡驱动:数据包发送的流控机制-netif_start_queue/netif_wake_queue/netif_stop_queue

来源:互联网 发布:淘宝卖家可以删差评吗 编辑:程序博客网 时间:2024/06/06 01:53

在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息。

主要有三个:

1】netif_start_queue

2】netif_wake_queue

3】netif_stop_queue

4】netif_queue_stopped


NETIF_STOP_QUEUE:

【作用】在驱动程序中调用这个函数来告诉内核的网络子系统,当前网卡设备内存不够,不能继续传输数据包,内核要停止数据包的发送。

【实现】将设备发送队列_tx[0]的状态state的_QUEUE_STATE_XOFF置1。

NETIF_START_QUEUE:

【作用】驱动程序调用这个函数来告诉内核网络子系统,现在可以开始数据包的发送。

【实现】将设备发送队列的_tx[0]的state的_QUEUE_STATE_XOFF复位0。

NETIF_WAKE_QUEUE:

【作用】除了实现netif_start_queue的作用外,还会将设备的发送队列加入到CPU的发送队列,并且出发中断处理的下半部来出发数据包发送。

【实现】除了检查tx[0]的state的_QUEUE_STATE_XOFF位外,还检查设备发送队列qdisk成员的_QDISK_STATE_SCHED,如果是1说明当前设备的发送队列尚未加入到CPU的发送队列尾部,同时调用raise_softirq_irqoff(NET_TX_SOFTIRQ)来触发softirq。

NETIF_QUEUE_STOPPED:

【作用】检查net_device的发送队列是否stopped

【实现】检查设备发送队列_tx[0]的状态state的_QUEUE_STATE_XOFF是否置1,置1的话返回1,置0返回0。

=======用法=========

netif_start_queue一般在open函数中调用,开启数据包的传输。

netif_stop_queue一般用于驱动程序通知网络子系统暂停数据包传输,从来进行实现流量控制。

netif_wake_queue在timeout后或者网卡硬件出错后调用,来重启数据包的发送,并且将在设备队列关闭期间进入的到队列的数据包发送。