struct sk_buff数据空间预留和对齐

socket Buffer数据包存放缓冲区数据空间的预留和对其操作主要有以下函数,这些函数提供的操作是skb_buff数据结构的data和tai'l指针的方法。

函数原型        函数功能
skd_reserve(struct sk_buff *skb, int len)在skb的头和尾预留指定长度的空间
skb_put(struct sk_buff *skb, unsigned int len)在skb的尾部预留指定长度的空间
skb_push(struct sk_buff *skb, unsigned int len)在skb的头部预留指定长度的空间        
skb_pull(struct sk_buff *skb, unsigned int len)在skb的头部移走指定长度的数据
skb_trim(struct sk_buff *skb, unsigned int len)在skb的尾部移走指定长度的数据

1 skb_reserve

在存放数据包缓冲区的头部预留指定的空间,通常用于在数据包存储区插入网络协议头或强制数据边界对齐。该函数同时将skb->data  skb->tail指针向后移动:

skb->data += len

skb->tail += len

我们看一下一个以太网驱动的接受函数,在将数据存入刚分配的socket buffer之前,都要使用以下命令:

static void net rx(struct net_device *dev){
    skb = dev_alloc_skb(length + 2);
    ......
    skb_reserve(skb, 2);
}

以上是cs89x0以太网适配器,他的驱动程序知道其接受的是以太网协议的网络数据包,以太网的协议头长度是14个字节,所以驱动程序在数据包缓冲区头部预留2个字节,这样网络层的协议头在插入是可以按照16字节的边界对齐。

2 skb_put

skb_put函数是将skb->tail指针向后移动len的位置,在socket buffer存放数据包的缓冲区尾部为数据预留长度为len的空间。

 3 skb_push

skb_push将skb->data的指针向前移动len的位置,在socket buffer存放数据包的缓冲区的头部为将要写入的数据预留长度为len的空间。

 

 4 skb_pull

skb_pull将socket buffer存放数据包缓冲区的头部移走长度为len的数据,即skb->data指针想后移动skb->data+len。

 5 skb_trim

skb_trim从缓冲区尾部移走长度为len的数据,即skb->tail指针向前移动skb->tail-len。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值