sk_buff有两个地方可以存储下一个碎片数据:
skb_shinfo(head)->frag_list
skb_shinfo(head)->frags[]
请解释一下这两种处理碎片的方式之间的区别。
谢谢并致以最良好的问候!
发布于 2012-05-09 17:44:38
两者都用于不同的情况。
frags[]
当您的设备支持分散聚集I/O,并且您希望它进行数据合并等操作时。您可以填充从第二个片段到第n个片段的frags[]
结构。第一个片段始终由data
和tail
指针指定。其余的片段被填充到frags[]
结构中。如果不使用scatter gather,则此变量为空。
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 buffersfrag_list
用于ip fragments发布于 2015-05-30 22:47:23
skb_shinfo(head)->frags[]
如果NIC支持SG I/O,__ip_append_data会将用户空间数据拷贝到skb_shinfo(头)->frags。NIC驱动程序(例如ixgbe_add_rx_frag)也可以使用这些frags[]来传输接收到的网络流量;请注意,frags[]中的每个内容都是完整数据包的一部分。一个完整的数据包由所有frags[] + (skb->data ~ skb->tail)组成。
skb_shinfo(head)->frag_list
此成员不直接由IP碎片使用。在__ip_make_skb()中,frag_list用于收集sk->sk_write_queue中的所有frag_list;一些NIC驱动程序也使用此skbs将数据包传送到上层网络堆栈。frag_list中的每个内容/skb也不是complete数据包;tcp_v4_send_ack -> ip_send_unicast_reply -> ip_push_pending_frames -> ip_finish_skb ->__ip_make_skb;
https://stackoverflow.com/questions/10039744
复制相似问题