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。