预留协议头空间:在sk_stream_alloc_skb调用__alloc_skb函数进行内存分配后,下一步就会预留协议头空间,使得head、tail、data指针分离: skb_reserve如下, 操作后skb_buff的指针如下所示: skb_reserve作用就是预留空间,而且是尽最大的空间预留,但它并没有把数据放到该空间,只是简单更新指针,预留空间! 因为很多头都会...
skb->tail = skb->data; } 最终四大指针初始化为以下图所示: 此时head、data、tail三个指针指向一起,end指向数据缓冲区的尾部。 预留协议头空间:在sk_stream_alloc_skb调用__alloc_skb函数进行内存分配后,下一步就会预留协议头空间,使得head、tail、data指针分离: struct sk_buff *sk_stream_alloc_skb(struct...
在TCP重要的skb缓存分配函数sk_stream_alloc_skb中,如果TCP协议总的内存处于承压状态,首先回收部分预分配缓存,因为马上要为skb分配内存,不应进行全部回收。在分配skb之后有两种情况,如果指定了强制分配force_schedule参数,即强制增加分配额度而不进行内存超限判断;否则,使用sk_wmem_schedule进行额度分配。只有在分配额度成...
而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是paged-data buff(也就是skb_shared_info)。 ok.我们先来看sk_buff_head的结构。它也就是所有sk_buff的头。 struct sk_buff_head { /* These two members must be first. */ ...
sk_stream_moderate_sndbuf()修改发送缓冲区(在申请内存失败的情况下),修改后的sndbuf小于目前发送队列所占空间,大于SOCK_MIN_SNDBUF。 sk_stream_wait_memory()在申请内存失败的情况下等待发送缓冲区释放空间。 当发送缓冲区填满(或申请不到skb,page,或达到协议内存限额上限)时,若在阻塞条件下,系统会等待内存空闲,...
int sk_forward_alloc; //skb_entail中的sk_mem_charge里面会对新分配的SKB空间做一次减法,表示预分配缓存空间少了 在真正分配空间之前需要比较这个值,看内存空间释放使用达到限度 //在应用层send_msg的时候,会在函数__sk_mem_schedule中开辟空间,为sk_forward_alloc增加amt * SK_MEM_QUANTUM;如果发送的数据长度...
这里遵循内核的习惯叫法:struct sk_buff<=>skb, struct sock<=>sk,struct skb_share_info<=>shinfo 1.sk_buff的组织形式 首先来看一张图: (图1) 从图中可以清除的看到sk_buff是以一个链表存在的,每一个sock都维护了一个发送队列,接收队列。相比来说这些队列对stream类型的协议更重要,因为对于stream,发送队...
skb = virtio_vsock_alloc_skb(len, GFP_KERNEL); if (!skb) return NULL;len = iov_length(vq->iov, out); iov_iter_init(&iov_iter, ITER_SOURCE, vq->iov, out, len);nbytes = copy_from_iter(&pkt->hdr, sizeof(pkt->hdr), &iov_iter); ...
struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp, bool force_schedule) { struct sk_buff *skb; ... skb = alloc_skb_fclone(size + sk->sk_prot->max_header, gfp); ... skb_reserve(skb, sk->sk_prot->max_header); ... } skb_reserve如下, static inline...
= 0 */ struct skb_ext *extensions; #endif }; 2.3、套接字缓冲区管理数据 套接字缓冲区的基本思想是,通过操作指针来增删协议首部。 head 和 end 指向数据在内存中的起始和结束位置。 data 和 tail 指向协议数据区域的起始和结束位置。 mac_header 指向 MAC 协议首部的起始。 network_header 和 ...