netif_start_queue/netif_wake_queue/netif_stop_queue

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

主要有4个:

1】netif_start_queue  启动接口传输队列

2】netif_wake_queue  通知网络系统可以再次开始传输数据包;并启动接口传输队列。

3】netif_stop_queue   标记设备不能传输其他数据包。

4】netif_queue_stopped

5】netif_tx_disable    和第三个功能接口类似,但它还确保在返回时,在其他cpu上没有运行hard_start_xmit函数。可以用第二个接口再次开始传输队列。

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后或者网卡硬件出错后调用,来重启数据包的发送,并且将在设备队列关闭期间进入的到队列的数据包发送。

================================================================================

netif_rx

原型: void netif_rx(struct sk_buff *skb)

调用(包括中断期间)这个函数可以通知内核已经收到一个数据包,并封装入一个套接字缓冲区。

netif_rx_schedule:

原型: void netif_rx_schedule(dev);

调用该函数通知内核数据包已经存在,并且在接口上启动轮询机制,它只在NAPI驱动程序中使用。

netif_receive_skb 和 netif_rx_complete

原型:int netif_receive_skb(struct sk_buff *skb);

     void netif_rx_complete(dev);

这两函数只在NAPI驱动程序中使用;NAPI中的netif_receive_skb函数与netif_rx等价;它将数据包发送给内核。当NAPI驱动程序耗尽了为接收数据包准备的内存时,则它将重新启动中断,然后调用netif_rx_complete终止轮询函数。 

原文地址:https://www.cnblogs.com/zxc2man/p/4105652.html