我想在多个队列中加入一个 skb buff。所以我想到了使用克隆选项。现在我的问题是,如果我在克隆的skb 上执行 kfree_skb,它会释放原始 skb,还是只删除一个引用?
谢谢!
我想在多个队列中加入一个 skb buff。所以我想到了使用克隆选项。现在我的问题是,如果我在克隆的skb 上执行 kfree_skb,它会释放原始 skb,还是只删除一个引用?
谢谢!
kfree_skb()
将对克隆的 skbuff 做正确的事情,即释放 skbuff 结构本身而不是数据,如果它仍然被其他 skbuff 引用。
这是在 上完成的skb_release_data()
,它检查 skbuff 是否不是克隆,或者这是对skb->data
(以迂回方式完成以支持无头 skbuff 的最后引用,它保存对skb->data
(的高 16 位skb->dataref
)的有效负载部分的引用,此外通常对整个skb->data
) 的引用。
当克隆一个 skb 时,会为克隆的 sk_buff 分配一个新内存,并且克隆的所有struct sk_buff
成员都是克隆私有的。然而,数据即数据包在原始 SKB 和它的克隆之间共享。因此sk_buff
仅将结构复制到新内存中。如果释放原始 skb,则如果 dataref 计数为零,则数据将丢失。这里的数据是你的数据包。
如果您不想在释放任何 skb 时丢失数据,请使用skb_copy
代替skb_clone
:skb_copy
将 sk_buff 和数据包复制到新的内存区域。
编辑:编辑以前的回复并进行一些更正。