2

我有幾個問題與SKB有關。當我們嘗試使用alloc_skb()分配skb時,將分配與skb相關的所有標題,例如l4標題,l3標題,l2標題等,我已經看到sizeof(struct sk_buff)爲這必須與所有標題 - 我是否正確?skb和Scatter聚集功能

skb的內容將與所有標題相連(考慮一個沒有任何片段的襯墊skb)。正確?

分散聚集(SG) - 一種硬件功能,用於從不同存儲器位置獲取數據以複製(DMA)到設備內存。

如果skb將是內膽,並且如果它在MTU尺寸範圍內,SG將不會被使用。 ?

如果skb不是內襯,並且尺寸超過MTU尺寸,則將使用SG。

當我們將skb命中爲非線性情況時,在skb中有多個片段。請確認?

感謝, 庫馬爾

+0

sock_alloc_send_pskb()似乎每頁使用一個片段。 – ninjalj 2010-11-19 21:59:43

回答

2

我試圖理解你的問題。

當你使用alloc_skb時,你指定了你想要在skb結構本身中容納的數據的大小。 這通常用於網絡標頭

skb內部的分散收集列表通常用於您的數據包的有效載荷的數據

這意味着如果你有一堆數據在內存中,你可以創建skb,爲頭部留出空間,並在skb本身寫入頭文件 - 使用SG條目指向你的數據,免去了拷貝吧。

「MTU」的概念與SG是否使用無關。

如果你將「skb_put」數據放到你的skb中 - 它將和數據包一起傳輸。如果您向SG添加元素,它們將被傳輸到。

+0

除非主skbuff緩衝區已經填充頁面,至少對於TCP和UDP的發送操作,否則數據通常不會進入S/G IO碎片,請參閱tcp_sendmsg()/ udp_sendmsg()。 – ninjalj 2010-11-24 00:54:08