2017-10-17 233 views
3

我知道每個NIC都有RAM中的RX/TX環用於操作系統接收/發送數據包。環中的一個項目(包描述符)包括數據包的物理地址,數據包的長度等。我想知道這個描述符指向了sk_buff嗎?並且如果數據包是一個GSO數據包會發生什麼?這是真的,環中的一個描述符=一個數據包=一個sk_buff?RX/TX環和sk_buff之間的關係是什麼?

+1

*「每個NIC的RX/TX環都在RAM中」* - 不正確。 NIC可以有深層的FIFO來保存幀。請參閱https://stackoverflow.com/questions/23574203/regarding-napi-implementation-in-linux-kernel/23598916#23598916 – sawdust

回答

1

我不知道,這是否描述符指向一個sk_buff的?

不完全是。 sk_buff是軟件構造,大致包含元信息的數據結構描述網絡數據的某些塊與data本身。因此,網卡描述並不需要指向sk_buff - 它可能只指向數據緩衝區(DMA /物理地址使用)。

如果該數據包是GSO包,會發生什麼?

這是一個非常模棱兩可的問題,因爲這些卸載可能在軟件中實現(例如通過網絡堆棧)並可能以硬件完成。

在前一種情況下,沒有任何關於NIC SW描述符的討論 - 上層應用程序提供了一個連續的數據塊,並且網絡堆棧從它產生較小的數據包,以便sk_buff -s移交給網絡驅動程序已經描述了小包。

在後一種情況(HW卸載)網絡驅動程序與數據的大塊供給(由移交單sk_buff -s或sk_buff鏈它的裝置),並且繼而帖網絡驅動程序適當的描述符到NIC - 它可能是一個指向大塊數據的描述符,或者少數描述符指向相同連續數據緩衝區的較小部分 - 因爲卸載魔法將發生在硬件中,所以這並不重要 - 總體而言數據塊將被分割並且數據包頭將被相應地前置,從而產生很多較小的網絡數據包以便被連接。

這是真的,環中的一個描述符=一個數據包=一個sk_buff?

嚴格來說,。這取決於。您的網絡驅動程序可能會被要求傳輸一個sk_buff描述一個數據緩衝區。但是,在某些情況下,您的驅動程序可能會決定發佈多個指向同一塊數據但具有不同偏移量的描述符 - 即提交將部分完成,並且NIC環中將有多個描述符與單個sk_buff相關。另外,一個分組不總是一樣一個sk_buff - 的分組可以被呈現爲每個與單獨sk_buff所述的形成sk_buff一小撮(請找到nextprevfieldssk_buff)。

0

sk_buff與物理網絡接口(至少不是直接的)無關。 sk_buff列出存儲由套接字訪問軟件和內核協議處理程序(處理這些列表以添加/移除標題和/或改變數據,例如當採用加密時)所看到的數據。

低級驅動程序的職責是將sk_buff列表內容轉換爲物理網絡適配器將理解的內容。特別是網絡硬件可能真的很笨(就像在串行線路上進行網絡連接一樣),在這種情況下,驅動程序將基本讀取sk_buff列表逐字節並通過線路發送。

更先進的適配器通常能夠做到分散/聚集DMA - 鑑於RAM的地址的列表,他們將能夠訪問每個地址,無論是從那裏得到報文數據或將接收到的數據傳回。然而,這種機制的確切細節非常適用於特定的適配器,並且在很多情況下,單個供應商的產品之間甚至不一致。

0

Linux內核使用sk_buff數據結構來描述每個 數據包。當數據包到達NIC時,它調用DMA引擎 將數據包通過存儲在 中的空sk_buff存儲到內核內存中,稱爲rx_ring。如果 環形緩衝區已滿,則丟棄傳入數據包。當數據包在較高層處理時,數據包數據保留在同一內核內存中,避免任何額外的內存拷貝。

http://www.ece.virginia.edu/cheetah/documents/papers/TCPlinux.pdf

這最後一句,似乎表明進入的數據包數據保存在內核內存在的sk_buff結構沒有冗餘。所以我會說你的問題的答案是肯定的,那個描述符會指向一個sk_buff。是的,每個數據包放在rx_ring中它自己的sk_buff中。

相關問題