1. 程式人生 > >《深入理解Linux網路技術內幕》閱讀筆記(十)

《深入理解Linux網路技術內幕》閱讀筆記(十)

中斷處理函式會:
1.把幀拷貝到sk_buff資料結構。
2.對一些sk_buff引數做初始化,以便在稍後由上面的網路層使用。
3.更新其他一些該裝置私用的引數。
4.為NET_RX_SOFTIRQ軟IRQ排程以準備執行,藉此通知核心新幀的事。
Netpoll:是一個通用的架構,可通過輪詢網路適配卡(NIC)而傳送及接收幀,把中斷事件的需求刪除掉。任何核心功能都可使用Netpoll,以受益於其功能。例如可以通過UDP把核心資訊傳送到遠端主機。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
backlog_dev:並不是一個實際上存在的網路裝置,netif_rx_schedule()只是利用了其中的poll函式而已。在net_dev_init()中已經將其poll()初始化成process_backlog函式,故轉入process_backlog()函式,再呼叫netif_receive_skb()根據包的型別送入上一層的協議棧。
netif_rx主要任務:
1.對sk_buff資料結構的一些欄位做初始化(如接收幀的時間)。
2.把已接收的幀儲存到CPU的私有輸入佇列,然後觸發相關聯的softirq(NET_RX_SOFTIRQ)以通知核心。
3.更新有關擁塞等級的統計資料。
這裡寫圖片描述


這裡寫圖片描述
這裡寫圖片描述
擁塞等級的良好就是已接收的幀數目和正在等待處理的幀的數目。當裝置驅動程式使用NAPI時,就是由驅動程式實現任何擁塞控制機制。這是因為入口幀會被放在NIC的記憶體內,或者放在驅動程式所管控的接收環內,因此核心無法追蹤流量擁塞情況。相反,當裝置驅動程式沒使用NAPI時,幀會被新增到各個cpu佇列,而核心就會追蹤佇列的擁塞等級。
在佇列中當前幀的數目並不一定代表真實的擁塞等級。平均佇列長度是佇列狀態的較好的導向。記錄平均值可以使系統避免錯誤地把突發的流量歸為擁塞。
平均佇列長度以及擁塞等級計算:avg_log和cng_level的值總是會在get_sample_stats中更新。而get_sample_stats可以用兩種不同方式啟用:
1.每次接收一個新幀時。
2.通過週期性的定時器(必須定義OFFLINE_SAMPLE符號)。
幀可以在兩個地方等待net_rx_action予以處理:
1.一個共享的CPU專用佇列。非NAPI裝置的中斷處理例程,把幀放在本地cpu的softnet_data->input_pkt_queue。
2.裝置記憶體。NAPI驅動程式所用的poll方法會直接從裝置,或裝置驅動程式的接收環中,取出幀。
這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述這裡寫圖片描述
這裡寫圖片描述
netif_receive_skb的三個主要任務是:
1.把幀的副本傳給每個協議分流器。
2.把幀的副本傳給skb->protocol所關聯的L3協議處理函式。
3.負責此層必須處理的一些功能,例如橋接。
如果沒有協議處理例程和skb->protocol關聯,並且netif_receive_skb中的處理功能,如橋接,都沒有消化改幀,該幀就會被丟棄,因為核心不知道該如何處理。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
L3協議處理函式對封包的處理:
1.傳給接收工作站中正在執行的接收者。(應用程式)
2.丟棄
3.轉發