函数tcp_try_rmem_schedule在TCP的接收路径中调用,比如tcp_data_queue函数和tcp_data_queue_ofo函数,以及用于TCP套接口REPAIR模式的tcp_send_rcvq函数。如下为tcp_data_queue函数,如果接收队列sk_receive_queue为空,使用sk_forced_mem_schedule函数强制分配缓存额度,否则,使用tcp_try_rmem_schedule函数进行正常...
//在sk_alloc的时候初始化设置为1,然后在skb_set_owner_w加上SKB长度,当SKB发送出去后,在减去该SKB的长度,所以这个值当数据发送后其值始终是1,不会执行sock_wfree //这个为发送队列(包括克隆的)分配的实际空间,sk_forward_alloc是提前预分配的,实际上并没有分片空间,只是说先确定下来可以用这么多空间,就是...
sk_wmem_queued:发送队列所占空间,仅用于STREAM类型协议,替代sk_wmem_alloc。最大不能超过发送缓冲区大小。 接口: sk_wmem_schedule()发送队列内存申请。从协议内存限额中分配,分配的空间在sk_forward_alloc中。 sk_rmem_schedule()接收队列内存申请。从协议内存限额中分配,分配的空间在sk_forward_alloc中。 sk_st...
最终在函数__sk_add_backlog将数据包添加到backlog链表后,为链表的长度增加skb的truesize值。 static inline bool sk_rcvqueues_full(const struct sock *sk, unsigned int limit) { unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); return qsize > limit; } static inl...
volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */
atomic_t rmem_alloc;intlen;structsk_buff *head;structsk_buff *tail; } sk_backlog;///这个只针对接收数据,发送数据对应的是sk_rmem_alloc,//阅读函数__sk_mem_schedule可以了解proto的内存情况判断方法//表示接收队列中所有skb的总长度,在sock_queue_rcv_skb函数的skb_set_owner_r中增加#definesk_rmem...
rmem_alloc和rcvbuf,wmem_alloc 和sndbuf用于不同的目的。当我们收到一个数据包后,需要统计这个socket总共消耗的内存,这是通过skb_set_owner_r()来做的。 static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk) { skb->sk = sk; skb->destructor = sock_rfree; atomic_add(skb-...
sk_buff详解
For more information, see ddi_msix_alloc_limit.Network Driver Parametersigb Parameters (SXCE and Open Solaris 2009.06 Releases)The igb network driver parameters are provided in SXCE, build 111 or Open Solaris 2009.06 release. For more information, see ....
volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */