预留协议头空间:在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...
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...
这个计数器只保护sk_buff结构本身,而缓冲区的数据部分由类似的计数器 (dataref)来保护.有时可以用atomic_inc和atomic_dec函数来直接增加或减小users,但是,通常还是使用函数 skb_get和kfree_skb来操作这个变量。 sk_buff->truesize 这是缓冲区的总长度,包括sk_buff结构和数据部分。如果申请一个len字节的缓冲区,al...
1.分配一个struct sk_buff结构体(socket buffer套接字缓存区): static inline struct sk_buff *alloc_skb( unsigned int size, gfp_t priority) size : 为将要分配的缓存区的大小; priority : 取值为GFP_ATOMIC, GFP_KERNEL等; staticinlinestructsk_buff*alloc_skb(unsignedintsize,gft_t priority){return_...
structsk_buff_headprequeue//tcp段 缓冲到此队列 知道进程主动读取才真正的处理; structtask_struct*task; structmsghdr*msg; intmemory;// prequeue 当前消耗的内存 intlen;// 用户缓存中 当前可以使用的缓存大小 } ucopy; u32 snd_wl1;/* Sequence for window update记录跟新发送窗口的那个ack 段号 用来判...
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 { 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小得多。
structsk_buff_headprequeue//tcp段 缓冲到此队列 知道进程主动读取才真正的处理; structtask_struct*task; structmsghdr*msg; intmemory;// prequeue 当前消耗的内存 intlen;// 用户缓存中 当前可以使用的缓存大小 } ucopy; u32 snd_wl1;/* Sequence for window update记录跟新发送窗口的那个ack 段号 用来判...
`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; ...
struct sk_buff *head; struct sk_buff *tail; } backlog; rwlock_t callback_lock;/*用于结构末尾的回调函数互斥*/ /* 错误队列,很少使用 */ struct sk_buff_head error_queue; struct proto *prot;/*网络地址簇内部协议处理*/ #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) ...