skb_put函数是Linux内核中网络子系统中的一个重要函数。它用于将数据插入到套接字缓冲区(socket buffer)中。 在Linux内核中,套接字缓冲区(socket buffer)是用于存储网络数据的数据结构。它由一个数据头部和一个数据部分组成。数据头部中包含一些与数据有关的信息,如数据长度、数据类型等。数据部分则存储具体的网络数...
skb操作中的预留和对齐操作主要由skb_put、skb_push、skb_pull、skb_reserve完成;这几个函数的区别通过下面图(图片来自:深入理解linux网络技术内幕)可以清晰的区分;另外,需要注意的是skb_reserve只能操作空skb,即在分配了空间,尚未填充数据时调用; 以下为四个函数的源码分析; 1/**2* skb_put - add data to a...
skb_push/skb_pull/skb_put/skb_reserve skb 几个关键指针 Note: 针对于Linux2.6,随之Linux迁移,可能会有所变化。 在申请一个skb的时候,其实申请了两块内存,一块用于存放sk_buff,另一块用于存放真正的包内的数据。 在sk_buff当中会有几个指针指向数据块内存。 skb->head: 申请的数据块的头 skb->end: 申...
skb_push:写指针前移n,更新数据包长度,从它返回的位置可以写n个字节数据-即封装n字节的协议; skb_put:写指针移动到数据包尾部,返回尾部指针,可以从此位置写n字节数据,同时更新尾指针和数据包长度; 导读-最新发表 - 我爱内核网 - 构建全国最权威的内核技术交流分享论坛 网络分层模型——skb核心操作 - 论坛 - ...
SKB系列函数是对数据包结构体skb的操作函数,包括以下几种: - skb_put(): 向后扩大数据区空间。headroom空间不变,tailroom空间降低,skb->data指针不变,skb->tail指针下移。 - skb_push(): 向前扩大数据区空间。headroom空间降低,tailroom空间不变。skb->tail指针不变,skb->data指针上移。 - skb_pull(): 缩...
data和skb->tail指向同一地址,是没有数据的,用skb_put函数将skb->tail往后拉数据包长度个字节空间,通过返回的原skb->tail地址,把网络数据从网卡中拷贝到套接字缓存里,skb_put函数就是在skb->tail和skb->end之间加数据。接着将数据往上层发送,在每一层中用skb_pull函数或者移动skb->data指针的方式,将各个层...
skb_copy_from_linear_data_offset(skb, len, skb_put(skb1, pos - len), pos - len); // 为了方便理解,把该函数实现代码注释进来 // skb为要被拆分的sk_buff结构,offset为剩下新的skb数据长度,to为skb1结构中tail指针,len为要拷贝的数据长度 ...
其中,"skb_put"函数和"skb_pull"函数分别用于在skb后追加数据和从skb前拿出数据。这使得我们能够按需填充和读取数据,提高了数据处理的效率。 第四部分:skb的链表操作 除了用于传输单个数据包的skb,"skb系列函数"还提供了链表操作的函数,以处理多个数据包。其中,"skb_queue_head"函数和"skb_queue_tail"函数分别...
储存应用层数据skb_put() (4)、这时就开始调用函数 skb_push() 来使 data 指针向上移动,空出空间来添加各层协议信息,添加协议信息也是用skb_put()。直到最后到达二层,添加完帧头然后就开始发包了。 添加协议头 1.3、非线性数据区 1.2中所讲的都是线性数据区中的相关的配置,当线性数据区不够用的时候就会启用...