struct sk_buff_head { struct sk_buff -*next; struct sk_buff -*prev; __u32 qlen; spinlock_t lock; }; qlen代表链表元素的个数 lock用于防止对链表的并发访问 sk_buff和sk_buff_head的前两个元素是一样的:next和prev指针。这使得它们可以放到同一个链表中,尽管 sk_buff_head要比sk_buff小得多。
预留协议头空间:在sk_stream_alloc_skb调用__alloc_skb函数进行内存分配后,下一步就会预留协议头空间,使得head、tail、data指针分离: 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...
structsk_buff_head{structsk_buff*next;structsk_buff*prev;__u32 qlen;spinlock_t lock;}structsk_buff{structsk_buff*next;structsk_buff*prev;structsock*sock;//struct sock是socket在网络层的表示,其中存放了网络层的信息unsignedintlen;//下面有介绍unsignedintdata_len;//下面有介绍__u16 mac_len;//...
skb->truesize: skb的总长度,包括sk_buff结构和数据部分,skb=sk_buff控制信息 + 线性数据(包括头空间和尾空间) + skb_shared_info控制信息 + 非线性数据, 所以:skb->truesize = sizeof(struct sk_buff) + (head - end) + sizeof(struct skb_shared_info) + data_len。 1.2、sk_buff数据区 sk_buff...
structsk_buff_headprequeue//tcp段 缓冲到此队列 知道进程主动读取才真正的处理; structtask_struct*task; structmsghdr*msg; intmemory;// prequeue 当前消耗的内存 intlen;// 用户缓存中 当前可以使用的缓存大小 } ucopy; u32 snd_wl1;/* Sequence for window update记录跟新发送窗口的那个ack 段号 用来判...
struct sk_buff_head { struct sk_buff-*next; struct sk_buff-*prev; __u32 qlen; spinlock_t lock; }; qlen代表链表元素的个数 lock用于防止对链表的并发访问 sk_buff和sk_buff_head的前两个元素是一样的:next和prev指针。这使得它们可以放到同一个链表中,尽管sk_buff_head要比sk_buff小得多。另外...
而struct sk_buff_head的定义如下: structsk_buff_head{ /* These two members must be first. */ structsk_buff*next; structsk_buff*prev; __u32 qlen; spinlock_t lock; }; 可以看出socket的接收和发送缓存是使用一个双链表将sk_buff组织起来的。
struct sk_buff_head { struct sk_buff -*next; struct sk_buff -*prev; __u32 qlen; spinlock_t lock; }; qlen代表链表元素的个数 lock用于防止对链表的并发访问 sk_buff和sk_buff_head的前两个元素是一样的:next和prev指针。这使得它们可以放到同一个链表中,尽管sk_buff_head要比sk_buff小得多。
struct sock 有三个 skb 队列(sk_buffer queue),分别是 rx , tx 和 err。 它的主要结构成员: struct sk_buff { /* These two members must be first. */ # packet 可以存在于 list 或者 queue 中,这两个成员用于链表处理 struct sk_buff *next; struct sk_buff *prev; struct sk_buff_head *list...
`struct sk_buff`的定义如下: ```c struct sk_buff { // 数据包数据指针 unsigned char *data; // 数据包数据长度 unsigned int len; // 协议头部指针 struct sk_buff_head *head; // 发送接口 struct net_device *dev; // 源MAC地址 unsigned char *mac_header; ...