因此需要释放frags,frag_list中被拷贝过的数据//计算从frags数组中拷贝的数据量eat =delta;for(i =0; i < skb_shinfo(skb)->nr_frags; i++) {//寻找到满足eat这么多数据量的最后一个pageif(skb_shinfo(skb)->frags[i].size >=eat)//在frags数组中的数据量可以满足delta时,则只...
//分配新的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...
skb的内存空间划分为线性区(head-end)和非线性区(frags和frag_list),非线性区是通过skb_shinfo管理的。 理解skb_shinfo至关重要,它位于skb尾部,其中frags用于Scatter Gather(SG)功能,这是一种在TX时通过硬件加速数据发送的方式。SG通过软件生成分散的数据块,硬件进行DMA读取和合并,例如IXGBE驱动通过dma_map_single...
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...
·void skb_clone_fraglist(struct sk_buff *skb) ·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) ...
· 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...
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...
我对bpf_skb_pull_data把非线性区的数据如何pull到线性区非常感兴趣,因为非线性区有两种类型,但是文档中没有说明: 1. 偏移如何对应到两种非线性区frags和frag_list 2. frags和frag_list在pull时的顺序问题 3. 如何扩展线性区的数据 bpf_skb_pull_data的作用在注释中写到非常清楚: ...
skb的核心数据结构中,skb_shinfo(skb共享信息)隐藏在skb的end之后,包含frag_list和frags数组,用于处理TCP分段、UDP分包等操作。skb的内存空间划分为线性区(head-end)和非线性区(frags和frag_list),非线性区是通过skb_shinfo管理的。理解skb_shinfo至关重要,它位于skb尾部,其中frags用于Scatter ...