私はLinuxがどのデバイスを介して受信および送信パケットを処理するかを理解しようとしています。
vethペア(例:veth1やveth2)を例にとると、パケットがveth1を介して送信されると、veth2で受信されます。 vethには独自のカーネルモジュールがあるので、veth1を介して送信するためにカーネルはxmit()を呼び出します。機能パケットを veth2 に転送します。
dev_forward_skb()
コードと通貨を見るnetif_rx_internal()
機能、パケットを保持するために使用されるメモリの観点から、veth2デバイスが実行する唯一の役割は、さらなるenqueue_to_backlog()
処理のためにパケットをキューに入れる必要があるCPUを知らせることです。関数process_backlog()
は引き続きネットワークスタックにパケットを送信します。
私の質問は:デバイスveth2に実際にパケット(受信または送信用)を保持する独自のキューがありますか、それともデバイスが使用するCPUを通知するのですか?私は見た構造 netdev_rx_queue
しかし、これまではマップとフローテーブルのメンバーを使用するコードだけが見つかりました。
この問題は、ループバック、tun/tap、eth などの他のデバイスにも拡張されます。