我试图了解 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