linux - skbuff frags 和 frag_list 的区别

标签 linux linux-kernel linux-device-driver fragmentation

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

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

这两种处理碎片的方式有什么区别?

最佳答案

两者用于不同的情况。

碎片[]

当您的设备支持分散-聚集 I/O,并且您希望它进行数据组合等操作时,您可以从第二个片段开始填充 frags[] 结构,直到第 n 个片段。第一个片段总是由 datatail 指针指定。其余的片段填充在 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/

相关文章:

Python 和 UIO 设备 : Why does mmap. read() 工作而 os.read() 失败?

c++ - 是否有任何 API 或方法可以防止对动态分配的内存进行读访问(和写)?

mysql - 在 WINDOWS、Linux、macOS 上自动安装 MySQL

compiler-errors - 错误编译内核

linux - uevents如何在内核中被触发

c - 在 linux 内核中是否有任何标准来确定是通过内联还是通过宏来实现功能?

linux - 如何将 Linux 目录从不同的 PC 挂载到本地 Linux PC?

asp.net - Mono 的 XSP 网络服务器在 Linux 上找不到 MySql.Web.dll

ubuntu - 如何将 PC 连接到 ubuntu Beagle 板

linux - cdev_add() 在 117 上向 major 成功注册后,字符设备出现在哪里。