操作后skb_buff的指针如下所示: skb_reserve作用就是预留空间,而且是尽最大的空间预留,但它并没有把数据放到该空间,只是简单更新指针,预留空间! 因为很多头都会有可选项,那么不知道头部可选项是多大,所以只能按照最大的分配,同时也要明白一点,预留的空间headroom不一定使用完,可能还有剩余。当我们要增加协议头信息的...
增加headroom区域的协议头:skb_push函数用于移动data指针,增加头部协议,与skb_reserve()类似,也并没有真正向数据缓存区中添加数据,而只是移动数据缓存区的头指针data。数据由其他函数复制到数据缓存区中。函数如下: void *skb_push(struct sk_buff *skb, unsigned int len) { skb->data -= len; skb->len +=...
* Increase the headroom of an empty &sk_buff by reducing the tail * room. This is only allowed for an empty buffer. 给协议预留head的存储空间,只能对空的skb使用; */ static inline void skb_reserve(struct sk_buff *skb, int len) { skb->data += len; skb->tail += len; } 如下图所...
操作后skb_buff的指针如下所示: skb_reserve作用就是预留空间,而且是尽最大的空间预留,但它并没有把数据放到该空间,只是简单更新指针,预留空间! 因为很多头都会有可选项,那么不知道头部可选项是多大,所以只能按照最大的分配,同时也要明白一点,预留的空间headroom不一定使用完,可能还有剩余。当我们要增加协议头信息的...
首先来说下三个空间。方便以下介绍函数时理解。第一个是:headroom,就是skb->head和skb->data之间的空间。第二个是:data。就是skb->data和skb->tail之间的空间。第三个是:tailroom,就是skb->tail和skb->end之间的空间。例如以下图: 接下来说下四个操作sk_buff结构中指针的函数:(a)skb_put(), (b)skb_...
sk_buff的操作要想形成一个最终的数据包,即以太帧(不考虑其它的链路层)。要进行以下的操作: 1.分配一个skb结构体 可以看出基本的模式,即“定位/设置”两步骤操作,有点区别的是应用层操作,这是因为应用层的操作一般都是在socket接口之上完成的。但是既然本文讲述的是skb的通用操作,就不再区分这个了。
sk_buff_data_tend; unsignedchar*head, *data; unsignedinttruesize; atomic_tusers; }; 2、sk_buff操作函数 head -->|---| | headroom |headroom = skb->head - skb->data data -->|---| | data |data = skb->data - skb->tail tail -->|---| | ...
首先来说下三个空间。方便以下介绍函数时理解。第一个是:headroom,就是skb->head和skb->data之间的空间。第二个是:data。就是skb->data和skb->tail之间的空间。第三个是:tailroom,就是skb->tail和skb->end之间的空间。例如以下图: 接下来说下四个操作sk_buff结构中指针的函数:(a)skb_put(), (b)skb_...
skb_reserve()函数为skb_buff缓存结构预留足够的空间来存放各层网络协议的头信息。该函数在在skb缓存申请成功后,加载报文数据前执行。在执行skb_reserve()函数前,skb->head,skb->data和skb->tail指针的位置的一样的,都位于skb内存空间的开始位置。这部份空间叫做headroom。有效数据后的空间叫tailroom。skb_reserve的...
增加headroom区域的协议头:skb_push函数用于移动data指针,增加头部协议,与skb_reserve类似,也并没有真正向数据缓存区中添加数据,而只是移动数据缓存区的头指针data。数据由其他函数复制到数据缓存区中。函数如下: void*skb_push(struct sk_buff *skb,unsignedintlen) ...