skb->data 指针是不够的?为什么追踪网络报文时,仅解析 skb->data 指针是不够的?因为 skb->data ...
通常我们会直接使用 skb->data 或通过类似 skb_network_header(skb) 的函数来获取网络层头部的指针。
On input, the 'csum' field can be used to store a checksum calculated by the device. If the device indicates 'CHECKSUM_HW' in the SKB 'ip_summed' field, this means that 'csum' is the two's complement checksum of the entire packet data area starting at 'skb->data'. This is generic...
truesize就是skb所消耗的内存(skb本身+databuffer) rcvbuf接收数据包的总大小 sndbuf发送数据包的总大小 [*head, *data, *tail, *end] 这四个指正用来实现对databuffer的管理。head和end用于指向buffer, data和tail用来指向实际的数据。这四个指正将buffer划分为三个区 packet data:用来保存真正的数据 head room:...
data和tail分别是真正数据的起始位结束。 初始定位 函数:skb_reserve(m); m表示数据包最终封装(不包括前导码/纠错码等)的最大可能长度,函数原型如下: static inline void skb_reserve(struct sk_buff *skb, int len) { skb->data += len; skb->tail += len; } skb的逐层封装的关键在于写指针的定位,...
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)长度...
Now we may commit changes to skb data. */ pull_pages: eat = delta; k = 0; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { int size = skb_frag_size(&skb_shinfo(skb)->frags[i]); if (size <= eat) { // 释放对frag(skb->frags[i])的引用。 skb_frag_unref(skb...
4. `unsigned char *data`:指向SKB所封装的数据的起始地址的指针。该数据可以是网络层的IP数据报、传输层的TCP或UDP数据报等。 5. `unsigned int len`:表示封装在SKB中的有效数据的长度,即数据包的实际大小。 6. `unsigned int network_header`和`unsigned int transport_header`:分别指示SKB中网络头部和传输...
1.1、重要的长度len的解析 (1)、线性数据:head - end (2)、实际线性数据:data - tail,不包含线性数据中的头空间和尾空间。 skb->data_len: skb中的分片数据(非线性数据)的长度。 skb->len: skb中的数据块的总长度,数据块包括实际线性数据和非线性数据,非线性数据为data_len,所以skb->len= (data - tai...