mtu = mtu - hlen;/* Size of data space */IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE;/* When frag_list is given, use it. First, check its validity: * some transformers could create wrong frag_list or break existing * one, it is not prohibited. In this case fall back to copying....
//分配新的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 ...
结构体sk_buff是Linux内核网络子系统的一个基本结构体,关于它的长度有很多定义和操作,非常容易弄混,这里给出一个简单的说明。 下面这幅图是《深入理解Linux网络技术内幕》里面的图,一个skb用于存储一个报文,如果一个报文特别大的话,线性存储区放不下就需要多个skb来存储,这就是下面frag_list的作用,保存连续的skb,...
因此需要释放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时,则只...
(2)sk_buff->data_len: data_len只计算分片中数据的长度,即skb_shared_info中有效数据总长度(包括frag_list,frags[]中的扩展数据),一般为0 (3)sk_buff->truesize:这是缓冲区的总长度,包括sk_buff结构和数据部分。如果申请一个len字节的缓冲区,alloc_skb函数会把它初始化成len+sizeof(sk_buff)。当skb-...
*/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;/*用于引用...
skb_frag_list_init(skb);/* BUILD HEADER */*prevhdr = NEXTHDR_FRAGMENT; tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC);if(!tmp_hdr) { IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_FRAGFAILS);return-ENOMEM; ...
先移动frags,再移动frag_list 3. 更新skb中的元数据 开始的问题清楚了两个。而且从源码来看bpf_skb_pull_data的第二个参数填__sk_buff->len这样的用法其实是最正确的,因为pskb_may_pull中在执行实际expend时会使用第二个参数减去线性区大小。 也就是这样用: SEC("tc") int test_a(struct __sk_buff *...
(./include/linux/netpoll.h:89 net/core/dev.c:6640) [ 62.905276] kthread (kernel/kthread.c:379) [ 62.913435] ret_from_fork (arch/x86/entry/entry_64.S:314) [ 62.917119] </TASK> In the critical scenario, rx-gro-list GRO-ed packets are fed, via a bridge, both to the local ...
· 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...