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