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语言编写:...
- skb is cloned and queued e.g. at socket receive queue.dataref becomes 2.- On CPU 1, skb_copy_datagram_iovec is called on clone 1, is reads nr_frags and seesvalue > 1.- On CPU 2, __skb_linearize is now called on clone 2, it modified theskb so nr_frags is now 0, and ...
-extern int __skb_linearize(struct sk_buff *skb, gfp_t gfp); -static inline int skb_linearize(struct sk_buff *skb, gfp_t gfp) +static inline int skb_linearize(struct sk_buff *skb) +{ + return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0; +} + +/** + * skb_line...
skb->data, skb_headlen(skb)); if (err) goto nest_cancel;if (skb_shinfo(skb)->nr_frags > ROCKER_TX_FRAGS_MAX) goto nest_cancel;if (skb_shinfo(skb)->nr_frags > ROCKER_TX_FRAGS_MAX) { err = skb_linearize(skb); if (err) goto unmap_frags;...