c - sk_buff 如何指向 sk_buff_head

标签 c networking linux-kernel

sk_buff linux 内核中的数据结构被组织成一个双向链表,但是这个链表的最后一个成员和第一个成员指向一个sk_buff_head 结构。但是,nextprev 成员被声明为指向 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...
请参阅下图以了解此概念。

sk_buff_head image

关于c - sk_buff 如何指向 sk_buff_head,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24274755/

相关文章:

java - Netstat 用于单个连接?

python - 使用 python 和 scapy 发送数据包到本地地址不起作用

linux - 在 Linux 内核中找不到方法 __kernel_vsyscall

linux - 在 Linux 中物理连续与几乎不连续

调用 pthread_create 错误 - 预期主表达式在 'void' 之前

c++ - 为什么在 C 和 C++ 代码中插入 URL 有效?

iphone - 单个请求到多个异步响应

linux - 内核和正常进程

c - 字符串被缩短两个字符

c - 关于 c 中 'not a statment' 的优化?