skb_shared_info中页面数组的size大小有何巧妙?

发布于 2022-10-15 05:48:17 字数 1669 浏览 15 评论 0

/* To allow 64K frame to be packed as single skb without frag_list */
#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)

  1. struct skb_frag_struct {
  2.         struct page *page;
  3.         __u32 page_offset;
  4.         __u32 size;
  5. };

复制代码

  1. /* This data is invariant across clones and lives at
  2. * the end of the header data, ie. at skb->end.
  3. */
  4. struct skb_shared_info {
  5.         atomic_t        dataref;
  6.         unsigned short        nr_frags;
  7.         unsigned short        gso_size;
  8.         /* Warning: this field is not always filled in (UFO)! */
  9.         unsigned short        gso_segs;
  10.         unsigned short  gso_type;
  11.         __be32          ip6_frag_id;
  12.         struct sk_buff        *frag_list;
  13.         skb_frag_t        frags[MAX_SKB_FRAGS];
  14. };

复制代码skb_frag_t数组大小为 MAX_SKB_FRAGS ,即在4k页面大小的情况下,数组的size为18,那么skb_shared_info 最多可存储18个页面大小?
一般tcp/udp包头中的大小用short表示,也即最大64k的大小即可,也就是说需要65536/PAGE_SIZE 个页面就可以完全搞定了,可是内核中为什么这么定义呢?
为什么要故意在后面加2个页面大小呢?linux内核这么做的目的在哪?或者说有什么巧妙之处?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文