skb_shared_info中页面数组的size大小有何巧妙?
/* To allow 64K frame to be packed as single skb without frag_list */
#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)
- struct skb_frag_struct {
- struct page *page;
- __u32 page_offset;
- __u32 size;
- };
复制代码
- /* This data is invariant across clones and lives at
- * the end of the header data, ie. at skb->end.
- */
- struct skb_shared_info {
- atomic_t dataref;
- unsigned short nr_frags;
- unsigned short gso_size;
- /* Warning: this field is not always filled in (UFO)! */
- unsigned short gso_segs;
- unsigned short gso_type;
- __be32 ip6_frag_id;
- struct sk_buff *frag_list;
- skb_frag_t frags[MAX_SKB_FRAGS];
- };
复制代码skb_frag_t数组大小为 MAX_SKB_FRAGS ,即在4k页面大小的情况下,数组的size为18,那么skb_shared_info 最多可存储18个页面大小?
一般tcp/udp包头中的大小用short表示,也即最大64k的大小即可,也就是说需要65536/PAGE_SIZE 个页面就可以完全搞定了,可是内核中为什么这么定义呢?
为什么要故意在后面加2个页面大小呢?linux内核这么做的目的在哪?或者说有什么巧妙之处?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论