netif_start_queue/netif_wake_queue/netif_stop_queue
在網(wǎng)卡驅(qū)動(dòng)中,內(nèi)核為發(fā)送數(shù)據(jù)包的流量控制提供了幾個(gè)主要的函數(shù),用來(lái)在驅(qū)動(dòng)程序和內(nèi)核之間傳遞流控信息。
主要有4個(gè):
1】netif_start_queue ?啟動(dòng)接口傳輸隊(duì)列
2】netif_wake_queue ?通知網(wǎng)絡(luò)系統(tǒng)可以再次開(kāi)始傳輸數(shù)據(jù)包;并啟動(dòng)接口傳輸隊(duì)列。
3】netif_stop_queue ? 標(biāo)記設(shè)備不能傳輸其他數(shù)據(jù)包。
4】netif_queue_stopped
5】netif_tx_disable ? ?和第三個(gè)功能接口類似,但它還確保在返回時(shí),在其他cpu上沒(méi)有運(yùn)行hard_start_xmit函數(shù)。可以用第二個(gè)接口再次開(kāi)始傳輸隊(duì)列。
NETIF_STOP_QUEUE:
【作用】在驅(qū)動(dòng)程序中調(diào)用這個(gè)函數(shù)來(lái)告訴內(nèi)核的網(wǎng)絡(luò)子系統(tǒng),當(dāng)前網(wǎng)卡設(shè)備內(nèi)存不夠,不能繼續(xù)傳輸數(shù)據(jù)包,內(nèi)核要停止數(shù)據(jù)包的發(fā)送。
【實(shí)現(xiàn)】將設(shè)備發(fā)送隊(duì)列_tx[0]的狀態(tài)state的_QUEUE_STATE_XOFF置1。
NETIF_START_QUEUE:
【作用】驅(qū)動(dòng)程序調(diào)用這個(gè)函數(shù)來(lái)告訴內(nèi)核網(wǎng)絡(luò)子系統(tǒng),現(xiàn)在可以開(kāi)始數(shù)據(jù)包的發(fā)送。
【實(shí)現(xiàn)】將設(shè)備發(fā)送隊(duì)列的_tx[0]的state的_QUEUE_STATE_XOFF復(fù)位0。
NETIF_WAKE_QUEUE:
【作用】除了實(shí)現(xiàn)netif_start_queue的作用外,還會(huì)將設(shè)備的發(fā)送隊(duì)列加入到CPU的發(fā)送隊(duì)列,并且出發(fā)中斷處理的下半部來(lái)出發(fā)數(shù)據(jù)包發(fā)送。
【實(shí)現(xiàn)】除了檢查tx[0]的state的_QUEUE_STATE_XOFF位外,還檢查設(shè)備發(fā)送隊(duì)列qdisk成員的_QDISK_STATE_SCHED,如果是1說(shuō)明當(dāng)前設(shè)備的發(fā)送隊(duì)列尚未加入到CPU的發(fā)送隊(duì)列尾部,同時(shí)調(diào)用raise_softirq_irqoff(NET_TX_SOFTIRQ)來(lái)觸發(fā)softirq。
NETIF_QUEUE_STOPPED:
【作用】檢查net_device的發(fā)送隊(duì)列是否stopped
【實(shí)現(xiàn)】檢查設(shè)備發(fā)送隊(duì)列_tx[0]的狀態(tài)state的_QUEUE_STATE_XOFF是否置1,置1的話返回1,置0返回0。
=======用法=========
netif_start_queue一般在open函數(shù)中調(diào)用,開(kāi)啟數(shù)據(jù)包的傳輸。
netif_stop_queue一般用于驅(qū)動(dòng)程序通知網(wǎng)絡(luò)子系統(tǒng)暫停數(shù)據(jù)包傳輸,從來(lái)進(jìn)行實(shí)現(xiàn)流量控制。
netif_wake_queue在timeout后或者網(wǎng)卡硬件出錯(cuò)后調(diào)用,來(lái)重啟數(shù)據(jù)包的發(fā)送,并且將在設(shè)備隊(duì)列關(guān)閉期間進(jìn)入的到隊(duì)列的數(shù)據(jù)包發(fā)送。
?
?
================================================================================
netif_rx :?
原型: void netif_rx(struct sk_buff *skb)
調(diào)用(包括中斷期間)這個(gè)函數(shù)可以通知內(nèi)核已經(jīng)收到一個(gè)數(shù)據(jù)包,并封裝入一個(gè)套接字緩沖區(qū)。
netif_rx_schedule:
原型: void netif_rx_schedule(dev);
調(diào)用該函數(shù)通知內(nèi)核數(shù)據(jù)包已經(jīng)存在,并且在接口上啟動(dòng)輪詢機(jī)制,它只在NAPI驅(qū)動(dòng)程序中使用。
netif_receive_skb 和?netif_rx_complete
原型:int netif_receive_skb(struct sk_buff *skb);
??void netif_rx_complete(dev);
這兩函數(shù)只在NAPI驅(qū)動(dòng)程序中使用;NAPI中的netif_receive_skb函數(shù)與netif_rx等價(jià);它將數(shù)據(jù)包發(fā)送給內(nèi)核。當(dāng)NAPI驅(qū)動(dòng)程序耗盡了為接收數(shù)據(jù)包準(zhǔn)備的內(nèi)存時(shí),則它將重新啟動(dòng)中斷,然后調(diào)用netif_rx_complete終止輪詢函數(shù)。?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zxc2man/p/4105652.html
總結(jié)
以上是生活随笔為你收集整理的netif_start_queue/netif_wake_queue/netif_stop_queue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android项目笔记【项目管理统计图a
- 下一篇: ECSHOP如何增加红包序列号字符