3

我想在多个队列中加入一个 skb buff。所以我想到了使用克隆选项。现在我的问题是,如果我在克隆的skb 上执行 kfree_skb,它会释放原始 skb,还是只删除一个引用?

谢谢!

4

2 回答 2

3

kfree_skb()将对克隆的 skbuff 做正确的事情,即释放 skbuff 结构本身而不是数据,如果它仍然被其他 skbuff 引用。

这是在 上完成的skb_release_data(),它检查 skbuff 是否不是克隆,或者这是对skb->data(以迂回方式完成以支持无头 skbuff 的最后引用,它保存对skb->data(的高 16 位skb->dataref)的有效负载部分的引用,此外通常对整个skb->data) 的引用。

于 2013-11-12T20:08:13.007 回答
2

当克隆一个 skb 时,会为克隆的 sk_buff 分配一个新内存,并且克隆的所有struct sk_buff成员都是克隆私有的。然而,数据即数据包在原始 SKB 和它的克隆之间共享。因此sk_buff仅将结构复制到新内存中。如果释放原始 skb,则如果 dataref 计数为零,则数据将丢失。这里的数据是你的数据包。

如果您不想在释放任何 skb 时丢失数据,请使用skb_copy代替skb_clone:skb_copy将 sk_buff 和数据包复制到新的内存区域。

编辑:编辑以前的回复并进行一些更正。

于 2013-11-12T17:13:40.573 回答