通常,sk_buff由我在发送端通过“alloc_skb
”开发并发给网络驱动程序的模块(网络驱动程序接口)分配。它在发送后基本上由网络驱动程序免费提供。
有没有办法从我开发的模块中免费获取SKB,或者有没有办法确保网络驱动程序是否正常释放skb buff?
如果我没记错的话,你可以在“发送方”使用skb_get()
到缓冲区的increment reference counter。这意味着一旦网络驱动程序决定在将其放入线路后释放缓冲区,它将调用一个正确的函数,该函数将递减参考计数器,但它仍将保持非零(因为您之前的+ 1
),所以它不会被释放。然后,您可以随时保留缓冲区并释放它(因为您是最后一个用户)。
但是,如果你有一系列sk_buff
-s,我担心你需要在每个段上执行skb_get()
。
至于您需要确保网络驱动程序本身正确释放缓冲区,例如,您可以在网络驱动程序中找到在传输时释放缓冲区并插入调试打印输出的位置。然后重新编译,尝试以正常方式与驱动程序交互(即,在将缓冲区交给驱动程序之前不执行skb_get()
)并观察dmesg
中出现的调试打印输出。