data_len字段:存在分散报文,data_len表示分片的部分大小 如下所示,没有开启分片的报文len = x,data_len = 0: 如下所示在Linux内核中,使用skb_is_nonlinear函数判断是否存在分片,即通过判断data_len的大小是否为0: 在没有开启分片的报文中,数据包长度在struct sk_buff中为len字段的大小,即data到tail的长度,nf...
sk_buff->truesize这是缓冲区的总长度,包括sk_buff结构和数据部分。如果申请一个len字节的缓冲区,alloc_skb函数会把它初始化成len+sizeof(sk_buff)。当skb->len变化时,这个变量也会变化。 sk_buff->headsk_buff->datask_buff->tailsk_buff->end它们表示缓冲区和数据部分的边界。在每一层申请缓冲区时,它...
将data指针上移,并增加skb的len值。这个操作在存储空间的头部增加了一段可以存储网络报文的空间,但是增加不能使data的值小于 head的值,skb的len值大于truesize的值。 *3 unsigned char * skb_pull(struct sk_buffskb, unsigned int len) 从缓冲区的数据区删除len字节,把腾出的内存归还给头部空间。将data指针下...
skb- >data_len; } 在没有开启分片的报文中,数据包长度在struct sk_buff中为len字段的大小,即data到tail的长度,nf_frags为0,frag_list为NULL。 普通聚合分散I/O的报文: 采用聚合分散I/O的报文, frag_list为 NULL,nf_frags不等于0 ,说明这不是一个普通的分片,而是聚合分散I/O的报文。
**sk_buff->len ** 表示当前协议数据包的长度 。它包括主缓冲区中的数据长度(data指针指向它)和分片中的数据长度。 sk_buff->data_len 和len不同,data_len只计算分片中数据的长度 sk_buff->mac_len 这是mac头的长度 sk_buff->users 这是一个引用计数,用于计算有多少实体引用了这个sk_buff缓冲区。它的...
sk_buff->data_len和len不同,data_len只计算分片中数据的长度 sk_buff->mac_len这是mac头的长度 sk_buff->users这是一个引用计数,用于计算有多少实体引用了这个sk_buff缓冲区。它的主要用途是防止释放sk_buff后,还有其他实体引用这个sk_buff。 因此,每个引用这个缓冲区的实体都必须在适当的时候增加或减小这个...
http://blog.csdn.net/kakadiablo/article/details/7948414 struct sk_buff *skb; skb->len 是data长度,包含所带分片长度 skb->data_len 是paged data长度, 即分片数据的长度,也就是skb_shared_info中的长度 skb_headlen skb->len - skb->data_len 是当前片(unpaged data)长度...
sk_buff->data_len 和len不同,data_len只计算分片中数据的长度 sk_buff->mac_len 这是mac头的长度 sk_buff->users 这是一个引用计数,用于计算有多少实体引用了这个sk_buff缓冲区。它的主要用途是防止释放sk_buff后,还有其他实体引用这个sk_buff。 因此,每个引用这个缓冲区的实体都必须在适当的时候增加或减小...
unsigned int len,//len缓冲区中数据部分的长度。 data_len,//data_len只计算分片中数据的长度 mac_len,//mac头的长度 csum;//校验和 __u32 priority; __u8 local_df:1, cloned:1,//表示该结构是另一个sk_buff克隆的 ip_summed:2, nohdr:1, ...
unsignedchar*head , *data ; ... /* 协议头表示 */ sk_buff_data_t transport_header ;/* 传输层协议头 */ sk_buff_data_t network_header ;/* 网络层协议头 */ sk_buff_data_t mac_header ;/* 链路层协议头 */ sk_buff_data_t tail ;/* 指向驻留在线性数据区的最后一字节数据*/ ...