Network programming 检测/确保SKB分配和免费

Network programming 检测/确保SKB分配和免费,network-programming,linux-device-driver,network-driver,Network Programming,Linux Device Driver,Network Driver,通常,sk_buff由我在传输端开发的模块(网络驱动程序接口)通过“alloc_skb”分配给网络驱动程序。它基本上是免费的网络驱动程序发送后 有没有办法从我开发的模块中释放SKB,或者有没有办法确保网络驱动程序是否正确释放SKB buff?如果我没有记错,您可以使用SKB_get()来释放“发送端”上的缓冲区。这意味着,一旦网络驱动程序决定在连接缓冲区后释放缓冲区,它将调用一个适当的函数,该函数将减少参考计数器,但它仍将保持非零(因为您以前的+1),因此不会释放缓冲区。然后,您可以随时保存缓冲

通常,sk_buff由我在传输端开发的模块(网络驱动程序接口)通过“
alloc_skb
”分配给网络驱动程序。它基本上是免费的网络驱动程序发送后


有没有办法从我开发的模块中释放SKB,或者有没有办法确保网络驱动程序是否正确释放SKB buff?

如果我没有记错,您可以使用
SKB_get()
来释放“发送端”上的缓冲区。这意味着,一旦网络驱动程序决定在连接缓冲区后释放缓冲区,它将调用一个适当的函数,该函数将减少参考计数器,但它仍将保持非零(因为您以前的
+1
),因此不会释放缓冲区。然后,您可以随时保存缓冲区并释放它(因为您是最后一个用户)

但是,如果您有一个
sk_buff
-s链,恐怕您需要在每个段上执行
skb_get()


至于需要确保网络驱动程序本身正确释放缓冲区,例如,您可以在网络驱动程序中找到传输和插入调试打印输出时释放缓冲区的位置。然后重新编译,尝试以正常方式与驱动程序交互(即在将缓冲区交给驱动程序之前不执行
skb_get()
),并观察出现在
dmesg

中的调试打印输出,您说“发送端”是什么意思?因为后来你把它和“网络驱动程序”区分开来,最后你还使用了“我的发送端驱动程序”这个词。那么,请您澄清一下什么是“发送端”,以及您所说的是什么网络驱动程序(在内核中运行)。很可能您正在寻找的是
sk_buff
参考计数器。您可以增加
sk_buff
中的
users
字段,以指示释放缓冲区不安全。字段为。我已正确更新问题库。我将尝试在网络驱动程序中调试,因为我有sk-buff-s链