pos-len);//为了方便理解,把该函数实现代码注释进来//skb为要被拆分的sk_buff结构,offset为剩下新的skb数据长度,to为skb1结构中tail指针,len为要拷贝的数据长度//static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb,//const int offset, void *to,//const unsigned int len)...
int i, copy; int start = skb_headlen(skb); if (offset > (int)skb->len - len) goto fault; /* Copy header. */ /*拷贝在本页中的部分*/ if ((copy = start - offset) > 0) { if (copy > len) copy = len; skb_copy_from_linear_data_offset(skb, offset, to, copy); if ((l...
int i, copy; int start = skb_headlen(skb); if (offset > (int)skb->len - len) goto fault; /* Copy header. */ /*拷贝在本页中的部分*/ if ((copy = start - offset) > 0) { if (copy > len) copy = len; skb_copy_from_linear_data_offset(skb, offset, to, copy); if ((l...
// skb为要被拆分的sk_buff结构,offset为剩下新的skb数据长度,to为skb1结构中tail指针,len为要拷贝的数据长度 // static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb, // const int offset, void *to, // const unsigned int len) // { // 从skb要剩下的数据位置开始...
skb_copy_from_linear_data_offset(head_skb,-tnl_hlen, nskb->data-tnl_hlen, doffset+tnl_hlen); Expand All@@ -2963,18 +2964,19 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) if(!sg) { nskb->ip_summed=CHECKSUM_NONE; ...
*/ void *skb_put(struct sk_buff *skb, unsigned int len) { void *tmp = skb_tail_pointer(skb); SKB_LINEAR_ASSERT(skb); skb->tail += len; skb->len += len; /* 返回原始的tail指针 */ return tmp; } skb_push skb push 在 skb->data 指针前面继续添加数据。例如在协议栈TX数据包时,...
18351836skb_copy_from_linear_data(skb, to, csstart);18371838csum= 0;1839if (csstart !=skb->len)1840csum=skb_copy_and_csum_bits(skb, csstart, to + csstart,1841skb->len- csstart, 0);18421843if (skb->ip_summed ==CHECKSUM_PARTIAL) {1844long csstuff = csstart +skb->csum_offset;...
也就是data_end - data其实是线性区的大小,而skb->len是线性区加非线性区的大小,前者其实是skb->data_len,但是BPF程序中无法从__sk_buff中直接拿到这个值。 non-linear and linear 这个问题[1][2][3]描述得非常清楚,我这里就不再阐述了。 但是我仍认为两个点还是必须要说, ...
skb->csum = csum_and_copy_from_user(user_pointer, data, user_data_len, 0, &err); if (err) goto user_fault; This is what a new SKB looks like right after the user data is added. skb_put() advances 'skb->tail' by the specified number of bytes, it also increments 'skb->len'...
也就是data_end - data其实是线性区的大小,而skb->len是线性区加非线性区的大小,前者其实是skb->data_len,但是BPF程序中无法从__sk_buff中直接拿到这个值。 non-linear and linear ...