sk_buff
linux 内核中的数据结构被组织成一个双向链表,但是这个链表的最后一个成员和第一个成员指向一个sk_buff_head 结构
。但是,next
和 prev
成员被声明为指向 sk_buff
而不是 sk_buff_head
的指针。这怎么可能?
struct sk_buff {
struct sk_buff * next;
struct sk_buff * prev;
struct sk_buff_head * list;
struct sock * sk;
struct timeval stamp;
struct net_device * dev;
struct net_device * real_dev;
union private;
#endif#ifdef CONFIG_NET_SCHED__u32 tc_index;
#endif
unsigned int truesize;
atomic_t users;
};
struct sk_buff_head {
/* These two members must be first. */
struct sk_buff * next;
struct sk_buff * prev;
__ U32 qlen;
spinlock_t lock;
};
双向链表中的每个 sk_buff 结构必须能够快速找到整个链表的头部。这就是 sk_buff_head 结构的目的,它被插入到列表的开头。所以,sk_buff_head 是一个特殊的 sk_buff。指向里面的另一个 sk_buff_head 没有任何意义。我认为你会指向整个不同的双向链表的头部,如果下一个和上一个成员在 sk_buff_head...
请参阅下图以了解此概念。
我是一名优秀的程序员,十分优秀!