return skb->data;} skb_pull: 将某个协议头从数据有效区移出 staticinlineunsignedchar*__skb_pull(structsk_buff *skb,unsignedintlen) { skb->len -= len;BUG_ON(skb->len < skb->data_len);returnskb->data += len; }staticinlineunsignedchar*skb_pull(structsk_buff *skb,unsignedintlen){return...
skb操作中的预留和对齐操作主要由skb_put、skb_push、skb_pull、skb_reserve完成;这几个函数的区别通过下面图(图片来自:深入理解linux网络技术内幕)可以清晰的区分;另外,需要注意的是skb_reserve只能操作空skb,即在分配了空间,尚未填充数据时调用; 以下为四个函数的源码分析; 1/**2* skb_put - add data to a...
skb_pull()通过将data指针往下移动,在数据区首部忽略len字节长度的数据,通常用于接收到数据包后在各层间由下往上传递时,上层忽略下层的首部。调用skb_pull()前后,SKB结构变化如图3-18所示。 图3-18 skb_pull()示意 a) 调用前 b) 调用后
> 1) My module needs to access to the entire frame, but when I receive a > packet in my handler, skb->data points on the beginning of the IP header > (not the ethernet). To solve this problem, I simply used skb_push(skb, > ETH_HLEN) and then skb_pull(skb, ETH_HLEN) to ma...
数据预留和对齐主要由skb_reserve()、skb_put()、skb_push()以及skb_pull()这几个函数来完成。 1.skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐。它并没有把数据移出或移入数据缓存区,而只是简单地更新了数据缓存区的两个指针-分别指...
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)...