skb_pull(skb, len); ``` 其中,skb是指向sk_buff结构体的指针,它指向要读取数据的套接字缓冲区;len是要读取的数据长度。 接下来,我们来看一下skb_pull函数的实现原理。skb_pull函数的主要作用是将套接字缓冲区中的数据复制到指定的缓冲区中,并更新套接字缓冲区的读指针。具体实现步骤如下: 1. 首先,判断...
skb操作中的预留和对齐操作主要由skb_put、skb_push、skb_pull、skb_reserve完成;这几个函数的区别通过下面图(图片来自:深入理解linux网络技术内幕)可以清晰的区分;另外,需要注意的是skb_reserve只能操作空skb,即在分配了空间,尚未填充数据时调用; 以下为四个函数的源码分析; 1/**2* skb_put - add data to a...
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){returnunlikely(len > skb-...
skb_pull(): skb->data指针往回拉(增大); skb_reserve(): skb->data和skb->tail同时往下拉(增大);2. 三个拷贝 skb_clone(): 函数仅仅是克隆个sk_buff结构体,其他数据都是共享; pskb_copy(): 函数克隆复制了sk_buff和其数据区(包括分片结构体/非线性区),其他数据共享; skb_copy(): 函数则是完全的...
- skb_pull(): 缩小数据区空间。headroom空间增大,tailroom空间不变,skb->data指针下移,skb->tail指针不变。 - skb_reserve(): 数据区空间大小不变,headroom空间增大,tailroom空间降低,skb->data和skb->tail同时下移。 对于带有frag page的分片skb,不能使用上述函数,必须使用以下函数: ...
如果skb 是非线性的并且len 由线性和非线性部分组成,则pull入非线性数据,使得 skb 中的 len 字节可读可写,如果为 len 传递了一个零值,则拉取整个 skb 长度。 此helper 仅用于通过 direct packet access 进行读取和写入。 对于direct packet access,如果偏移量无效,或者如果请求的数据在 skb 的非线性部分中,则...
数据预留和对齐主要由skb_reserve()、skb_put()、skb_push()以及skb_pull()这几个函数来完成。 1.skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐。它并没有把数据移出或移入数据缓存区,而只是简单地更新了数据缓存区的两个指针-分别指...
5. skb提供了多种操作函数,如skb_push、skb_pull、skb_put、skb_reserve等,用于在数据包的不同部分插入或提取数据。 6. skb结构体在网络栈的各个层次中被传递,从网络接口层到传输层,再到应用层。 7. skb结构体中包含了多个指针,如next指针,用于将多个skb结构体链接成链表,这在处理分片数据包时非常有用。
·int pskb_may_pull(struct sk_buff *skb, unsigned int len) 在调用 skb_pull() 去掉外层协议头之前,通常先调用此函数判断一下是否有足够的数据用于“pull”。 如果线性 buffer足够 pull,则返回1; 如果需要 pull 的数据超过 skb->len,则返回0; ...