skbuff frags和frag_list之间的区别

sk_buff有两个地方可以存储下一个碎片数据:

skb_shinfo(head)->frag_list skb_shinfo(head)->frags[] 

请有人解释这两种处理碎片的方法之间的区别。

谢谢,最好的问候!

两者都用于不同的情况。

断支[]

当你的设备支持分散 – 聚集I / O,并且你想要它做数据的合并等。你可以从第二个片段开始填充frags []结构,直到第n个片段。 第一个片段总是由数据指针指定的。 其余的碎片填充在frags []结构中。 如果你不使用分散收集,这个变量是空的。

frag_list

这是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片段的

内核3.17

skb_shinfo(头) – >断支[]

如果您的网卡支持SG I / O __ip_append_data会将用户空间数据复制到skb_shinfo(head) – > frags,否则这个函数会创建一个用户空间数据填充的skbs列表,并且所有的skbs将在sk-> sk_write_queue中排队。

skb_shinfo(头) – > frag_list

这个成员被IP碎片使用。 检查ip_push_pending_frames()->ip_finish_skb()用sk-> sk_write_queue中的skbs填充frag_list,然后检查ip_fragment()以处理frag_list。