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。