複数のキューで skb バフをキューに入れたいです。そこで、クローンオプションを使用することを考えました。ここで私の質問は、クローン化されたskb で kfree_skb を実行した場合、元の skb を解放するか、それとも参照を 1 つ削除するかです。
ありがとう!
複数のキューで skb バフをキューに入れたいです。そこで、クローンオプションを使用することを考えました。ここで私の質問は、クローン化されたskb で kfree_skb を実行した場合、元の skb を解放するか、それとも参照を 1 つ削除するかです。
ありがとう!
skb のクローンが作成されると、クローン化された sk_buff に新しいメモリが割り当てられ、クローンのすべてのstruct sk_buff
メンバーがクローンに対してプライベートになります。ただし、データ、つまりパケットは、元の SKB とそのクローンの間で共有されます。したがって、sk_buff
構造のみが新しいメモリにコピーされます。元の skb を解放すると、dataref カウントがゼロの場合、データが失われます。ここでデータはあなたのパケットです。
skb の解放時にデータを失いたくない場合は、skb_copy
代わりにskb_clone
:skb_copy
を使用して、sk_buff とパケットの両方を新しいメモリ領域にコピーします。
編集: いくつかの修正を加えて以前の返信を編集します。