skb 操作函数skb_linearize skb_linearize:分配新的skb->data,将旧的skb->data、skb_shinfo(skb)->frags、skb_shinfo(skb)->frag_list中的内容拷贝到新skb->data的连续内存空间中,释放frags或frag_list //其中frags用于支持分散聚集IO,frags_list用于支持数据分片1.1int__skb_linearize(structsk_buff *skb,in...
skb_linearize函数实现 `skb_linearize`是一个在Linux内核网络子系统中使用的函数,用于将一个socket buffer (skb)转换为一个线性(连续)的内存区域。这通常用于网络包处理,因为很多网络协议(如IP和TCP/UDP)需要在数据包上进行指针操作。 以下是`skb_linearize`的简单实现,使用C语言编写:...
- On CPU 2, __skb_linearize is now called on clone 2, it modified theskb so nr_frags is now 0, and does put_page for all frags > 1.- On CPU 1, skb_copy_datagram_iovec will now use the previously readnr_frags > 1 and access a fragment page that was already freed.What did...
1.1 int __skb_linearize(struct sk_buff *skb, int gfp_mask) { unsigned int size; u8 *data; long offset; struct skb_shared_info *ninfo; int headerlen = skb->data - skb->head; int expand = (skb->tail + skb->data_len) - skb->end; //如果此skb被共享 if (skb_shared(skb)) ...
· int skb_linearize(struct sk_buff *skb, gfp_t gfp) ·struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) ‘clone’ 一个新的 SKB。新的 SKB 和原有的 SKB 结构基本一样,区别在于: 1)、它们共享同一个 Data Buffer ...
对于带有frag page的分片skb来说,data指针往下移动,可能会导致线性区越界,因此需要判断是否线性区有足够的空间用来pull操作,如果空间不够,那么需要执行linearize,重构线性区,把一部分frags中的数据移动到线性区中来操作。 pskb_may_pull(): 主要在使用skb_pull之前来检查线性区buffer有没有足够的数据用于 pull。
- if (skb_linearize(skb, GFP_ATOMIC) < 0) + if (skb_linearize(skb)) goto exit; if (!is_aoe_netif(ifp)) goto exit; diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c --- a/drivers/net/mv643xx_eth.c ...
"skb系列函数"提供了一些常用的数据处理函数,如"skb_clone"函数用于复制一个skb,"skb_linearize"函数将非线性的skb转换为线性的skb。这些函数提供了很大的灵活性,以适应网络协议栈中不同的数据处理需求。 结论: 在本文中,我们详细介绍了"skb系列函数"在Linux内核网络协议栈中的功能和用法。通过使用skb数据结构和...
- pskb_pull(): 对于带有frag page的分片skb来说,data指针往下移动,可能会导致线性区越界,因此需要判断是否线性区有足够的空间用来pull操作,如果空间不够,需要执行linearize,重构线性区,把一部分frags中的数据移动到线性区中来操作。 - pskb_may_pull(): 主要在使用skb_pull之前来检查线性区buffer有没有足够的...