skb操作中的预留和对齐操作主要由skb_put、skb_push、skb_pull、skb_reserve完成;这几个函数的区别通过下面图(图片来自:深入理解linux网络技术内幕)可以清晰的区分;另外,需要注意的是skb_reserve只能操作空skb,即在分配了空间,尚未填充数据时调用; 以下为四个函数的源码分析; 1/**2* skb_put - add data to a...
6)SKB传递到链路层,链路层为数据包添加链路层首部。 3.skb_put() skb_put()修改指向数据区末尾的指针tail,使之往下移len字节,即使数据区向下扩大len字节,并更新数据区长度len。调用skb_put()前后,SKB结构变化如图3-17所示。 图3-17 skb_put()示意 a) 调用前 b) 调用后 4.skb_pull() skb_pull()通过...
3.skb_put() skb_put()修改指向数据区末尾的指针tail,使之往下移len字节,即使数据区向下扩大len字节,并更新数据区长度len。调用skb_put()前后,SKB结构变化如图3-17所示。 图3-17 skb_put()示意 a) 调用前 b) 调用后 4.skb_pull() skb_pull()通过将data指针往下移动,在数据区首部忽略len字节长度的数据...
skb_push/skb_pull/skb_put/skb_reserve skb 几个关键指针 Note: 针对于Linux2.6,随之Linux迁移,可能会有所变化。 在申请一个skb的时候,其实申请了两块内存,一块用于存放sk_buff,另一块用于存放真正的包内的数据。 在sk_buff当中会有几个指针指向数据块内存。 skb->head: 申请的数据块的头 skb->end: 申...
linux skb_put(skb,len)和skb_push(skb,len)的区别 skb_put() 增长数据区的长度来为memcpy准备空间. 许多的网络操作需要加入一些桢头, 这可以使用skb_push来将数据区向后推, 为头留出空间. 请参见下图: --- | head | data | | --- skb_put --- | head | ...
skb_pull skb_push skb_put unsigned char *skb_pull(struct sk_buff *skb, int len) 该函数将 data 指针向数据区的末尾移动,减少了len 字段的长度。该函数可用于从接收到的数据头上移去数据或协议头。 unsigned char *skb_push(struct sk_buff *skb, int len)...