Linux 网络设备是否有自己的队列来保存传入和传出的数据包?

Linux 网络设备是否有自己的队列来保存传入和传出的数据包?

我试图了解 Linux 如何处理通过任何设备的入口和出口数据包。

以 veth 对(例如 veth1 和 veth2)为例,当数据包通过 veth1 发送时,它将在 veth2 处接收。现在 veth 有了自己的内核模块,为了通过 veth1 进行传输,内核将调用它的 xmit()功能它将把数据包转发到 veth2。

查看代码dev_forward_skb()和调用netif_rx_internal() 功能,就用于保存数据包的内存而言,我看到设备 veth2 发挥的唯一作用是告诉数据包应放置在哪个 CPU 的队列中(通过用于enqueue_to_backlog()进一步处理)。该process_backlog()功能继续将数据包发送到网络堆栈。

我的问题是:设备 veth2 是否拥有自己的任何实际保存数据包(用于入口或出口)的队列,或者设备只是告诉要使用哪个 CPU?我看到结构 netdev_rx_queue,但到目前为止我只找到使用其映射和流表成员的代码。

这个问题也延伸到其他设备,如环回、tun/tap 和 eth

相关内容