skb的内存空间划分为线性区(head-end)和非线性区(frags和frag_list),非线性区是通过skb_shinfo管理的。 理解skb_shinfo至关重要,它位于skb尾部,其中frags用于Scatter Gather(SG)功能,这是一种在TX时通过硬件加速数据发送的方式。SG通过软件生成分散的数据块,硬件进行DMA读取和合并,例如IXGBE驱动通过dma_map_single...
//分配新的skb->data,将旧的skb->data、skb_shinfo(skb)->frags、skb_shinfo(skb)->frag_list中的内容拷贝到新skb->data的连续内存空间中,释放frags或frag_list //其中frags用于支持分散聚集IO,frags_list用于支持数据分片 1.1 int __skb_linearize(struct sk_buff *skb, int gfp_mask) { unsigned int ...
下面这幅图是《深入理解Linux网络技术内幕》里面的图,一个skb用于存储一个报文,如果一个报文特别大的话,线性存储区放不下就需要多个skb来存储,这就是下面frag_list的作用,保存连续的skb,但是如果内核支持分散聚集技术的话,并且报文长度刚好又不大于mt...
(3) struct skb_shared_info --作为header data的补充,用于存储ip分片,其中sk_buff *frag_list是一系列子skbuff链表,而frag[]是由一组单独的page组成的数据缓冲区 skb buff结构图如下: struct skb_buff 表示接收或发送数据包的包头信息,其成员变量在从一层向另一层传递时会发生修改。例如L3向L2传递前,会添加...
*/7unsignedshortgso_segs;8unsignedshortgso_type;9structsk_buff *frag_list;/*一种类型的分配数据*/10structskb_shared_hwtstamps hwtstamps;11u32 tskey;12__be32 ip6_frag_id;1314/*15* Warning : all fields before dataref are cleared in __alloc_skb()16*/17atomic_t dataref;/*用于引用...
· void skb_drop_fraglist(struct sk_buff *skb) · void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) · pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, gfp_t gfp_mask) · int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, in...
skb的核心数据结构中,skb_shinfo(skb共享信息)隐藏在skb的end之后,包含frag_list和frags数组,用于处理TCP分段、UDP分包等操作。skb的内存空间划分为线性区(head-end)和非线性区(frags和frag_list),非线性区是通过skb_shinfo管理的。理解skb_shinfo至关重要,它位于skb尾部,其中frags用于Scatter ...
先移动frags,再移动frag_list 3. 更新skb中的元数据 开始的问题清楚了两个。而且从源码来看bpf_skb_pull_data的第二个参数填__sk_buff->len这样的用法其实是最正确的,因为pskb_may_pull中在执行实际expend时会使用第二个参数减去线性区大小。 也就是这样用: SEC("tc") int test_a(struct __sk_buff *...
1.偏移如何对应到两种非线性区frags和frag_list2.frags和frag_list在pull时的顺序问题3.如何扩展线性区的数据 bpf_skb_pull_data的作用在注释中写到非常清楚: •Idea is the following: should the needed direct read/write test fail during runtime, we can pull in more data and redo again, since impl...
1.偏移如何对应到两种非线性区frags和frag_list2.frags和frag_list在pull时的顺序问题3.如何扩展线性区的数据 bpf_skb_pull_data的作用在注释中写到非常清楚: •Idea is the following: should the needed direct read/write test fail during runtime, we can pull in more data and redo again, since impl...