2014-05-22 58 views
1

我有一個內核模塊,它從netfilter鉤子讀取數據包並使用sk_buff訪問數據。我發現當數據包速度很慢時,sk_buff->len表現正常,但當數據包到達較高速率(1Gbps等)時,對於少數數據包開始增加(始終爲8的倍數),然後sk_buff->lenLinux內核模塊:套接字緩衝區(sk_buff-> len)非確定性行爲

我正在重播的數據也有碎片包。是否將分片數據包附加在sk_buff中導致sk_buff->len增加?如果是的話,sk_buff是如何知道堆棧以及在什麼時候?

有人可以解釋爲什麼會發生,以及如何解決這個問題。任何對某些文檔的引用也會有所幫助。

回答

0

此行爲的原因是GRO(通用接收卸載)。這與接收端的優化一樣,就像TSO或GSO一樣。它將具有相同tcp和ip標頭的數據包附加到一個大型skb緩衝區中,以便更輕鬆地進行內核處理。