- skb_pull(): 缩小数据区空间。headroom空间增大,tailroom空间不变,skb->data指针下移,skb->tail指针不变。 - skb_reserve(): 数据区空间大小不变,headroom空间增大,tailroom空间降低,skb->data和skb->tail同时下移。 对于带有frag page的分片skb,不能使用上述函数,必须使用以下函数: ...
headroom扩充nhead大小,tailroom扩充ntail大小。5. 几种len 线性数据长度: skb->head - skb->end。 实际线性数据长度:skb->data - skb->tail,不包含线性数据中的头空间和尾空间。 skb->data_len: skb中的分片数据(非线性数据)的长度。 skb->len: skb中的数据块的总长度,数据块包括实际线性数据和非线性...
目前为 止,从最后的图示上可以看到,在skb数据包缓冲区中,还有两块区域没有使用,一个headroom,一个是tailroom,这些是干什么用的呢?作为 一个练习的例子,由于存在某种对齐原则,在封装完成后,我需要在数据包的最后追加一些填充,或者说我需要在最前面加一个前导码,或者最常见的,我要在数据 包的最后加一个纠错码,此...
· void skb_reserve(struct sk_buff *skb, unsigned int len) · int skb_tailroom(const struct sk_buff *skb) · int skb_headroom(const struct sk_buff *skb) · int skb_pagelen(const struct sk_buff *skb) · int skb_headlen(const struct sk_buff *skb) · int skb_is_nonlinear(const st...
为了给协议头预留空间,可以使用skb_reserve(skb, head_len)方法,该方法会根据参数将data 指针后移,扩展headroom. 可以通过skb_put(skb, data_len) 方法移动tail 指针,扩展用户数据空间。该方法同时会增加skb->len. 这些空间都是从tailroom “挤”出来的,因此需要保证tailroom 有足够的空间。另外要注意skb_put()...
·int skb_tailroom(const struct sk_buff *skb) ·int skb_headroom(const struct sk_buff *skb) ·int skb_pagelen(const struct sk_buff *skb) ·int skb_headlen(const struct sk_buff *skb) ·int skb_is_nonlinear(const struct sk_buff *skb) ...
int skb_headroom(const struct sk_buff * skb) skb为要检查的缓冲区 返回&sk_buff首部空闲空间的字节数 skb_tailroom 缓冲区尾部的空闲字节数 int skb_tailroom(const struct sk_buff * skb) skb为要检查的缓冲区 返回&sk_buff尾部空闲空间的字节数 skb_reserve 调整头部的空间 void skb_reserve(struct sk...
linux协议栈skb操作函数
这个时候就需要headroom或者tailroom了,以在数据包最后追加数据为例,请看下图: 实际上,skb_put的操作就是,在数据包的末尾追加数据。至于说headroom如何使用,我就不多说了,其实还是skb_push,headroom有什么用呢?前导码,X over Y封装,不一而足。 实际的例子 ...
nskb=skb_copy_expand(skb,skb_headroom(skb),skb_tailroom(skb)+16,GFP_ATOMIC); if(!nskb) { printk("low memory.../n"); dev_kfree_skb(skb); return-1; } else { kfree_skb(skb);// 注意,如果此时是钩子函数钩出来的,则skb不能在这里释放,否则会造成死机。 skb...