sk_buff 有两个地方可以存储下一个碎片数据:
skb_shinfo(head)->frag_list
skb_shinfo(head)->frags[]
这两种处理碎片的方式有什么区别?
最佳答案
两者用于不同的情况。
碎片[]
当您的设备支持分散-聚集 I/O,并且您希望它进行数据组合等操作时,您可以从第二个片段开始填充 frags[]
结构,直到第 n 个片段。第一个片段总是由 data
和 tail
指针指定。其余的片段填充在 frags[]
结构中。如果不使用 scatter gather,则此变量为空。
片段列表
这是 IP 片段的列表。这将在 ip_push_pending_frames
期间被填充。
说你的 sk_buffs
是这样安排的,
sk_buff0->next = sk_buff1
sk_buff1->next = sk_buff2
...
sk_buffn-1->next = sk_buffn
ip_push_pending_frames
被调用后
sk_buff0->frag_list = sk_buff1
sk_buff1->next = sk_buff2
...
sk_buffn-1->next = sk_buffn
简单的说
frags[]
用于分散-聚集 I/O 缓冲区frag_list
用于 IP 片段
关于linux - skbuff frags 和 frag_list 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039744/