網路資料報收發流程 二 不配置NAPI的情況

2021-05-27 20:50:46 字數 1875 閱讀 9993

不配置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...