不配置napi的時候,網路裝置不使用自己的napi_struct結構,
所有網路裝置驅動都使用同乙個napi_struct,即cpu私有變數__get_cpu_var(softnet_data).backlog
每當收到資料報時,網路裝置驅動會把__get_cpu_var(softnet_data).backlog掛到__get_cpu_var(softnet_data).poll_list上面。
所以軟中斷裡net_rx_action遍歷cpu私有變數__get_cpu_var(softnet_data).poll_list時,
上面掛的napi_struct只有乙個
二、核心啟動時的準備工作
也是在net_dev_init中,初始化了cpu私有變數的napi_struct,即所有網路裝置驅動使用的napi_struct
__initnet_dev_init()
open_softirq(net_tx_softirq,
net_tx_action, null); //在軟中斷上掛網路接收handler
open_softirq(net_rx_softirq, net_rx_action, null); //在軟中斷上掛網路傳送handler
}三、中斷裡接受乙太網包
tsec的接收中斷處理函式
gfar_receive
#else
gfar_clean_rx_ring(dev, priv->rx_ring_size);
#endif
}gfar_clean_rx_ring
-->gfar_process_frame
-->
初始化了skb->dev,這樣在軟中斷裡才能判斷這個資料報來自**
-->receive(skb)// 呼叫netif_rx(skb)
#ifdef config_gfar_napi
#define receive(x) netif_receive_skb(x)
#else
#define receive(x) netif_rx(x)
#endif
netif_rx(skb)
軟中斷net_rx_action中呼叫poll鉤子函式
雖說軟中斷裡也遍歷cpu私有變數的poll_list,事實上poll_list現在只掛乙個napi_struct結構
即cpu私有變數的backlog成員(它在net_dev_init中初始化),所以現在呼叫的poll鉤子函式就是process_backlog了
static intprocess_backlog(
struct napi_struct *napi, int quota)
local_irq_enable();
dev = skb->dev;
netif_receive_skb(skb); //進入協議協議棧
dev_put(dev);
} while (++work < quota && jiffies == start_time);
return work;
}
網路資料報收發流程 二 不配置NAPI的情況
現在講講核心不配置成napi時的情況 一 no napi 資料結構 不配置napi的時候,網路裝置不使用自己的napi struct結構,所有網路裝置驅動都使用同乙個napi struct,即cpu私有變數 get cpu var softnet data backlog 每當收到資料報時,網路裝置...
網路資料報收發流程 2 不配置NAPI的情況
標籤 資料報網路 原文出處 不配置napi的時候,網路裝置不使用自己的napi struct結構,所有網路裝置驅動都使用同乙個napi struct,即cpu私有變數 get cpu var softnet data backlog 每當收到資料報時,網路裝置驅動會把 get cpu var sof...
網路資料報收發流程 三 e1000網絡卡和DMA
from 一 硬體布局 每個網絡卡 mac 都有自己的專用dma engine,如上圖的 tsec 和 e1000 網絡卡intel82546。上圖中的紅色線就是乙太網資料流,dma與ddr打交道需要其他模組的協助,如tsec,pci controller 乙太網資料在tsecddr pci con...