シナリオは次のとおりです。TCP接続が確立されたら(tcp_set_state()
の機能で確認できます)、sk->sk_dst_cache->dev
経由でこの接続の出口net_device
を調べることができます。このnet_device
では、net_device
とシステム上のnet_device
とを区別できます。レイヤ4のブリッジの下に実際のnet_deviceを取得します
sk->sk_dst_cache->dev
が常にブリッジを指しているので、この方法は、出力デバイスがブリッジのサブインターフェイスである場合には失敗します。現時点でレイヤ4になっている場合は、ブリッジの下にある実際のnet_device
(struct net_bridge_port
)を取得することは可能ですか。
いずれかの提案があります。よろしくお願いします。
こんにちは@クリストフプロボスト、あなたの意見を多くありがとう。パケットが送信される正確な出力インターフェイスを見つけることは可能ですか?私たちのネットワークデバイスはTCP接続のオフロードを行うことができるので、このデバイスを他の通常のnet_device(ワイヤレスインターフェース)と区別したい場合は –
この場合、この作業を行う価値があるかどうか疑問です。私はあなたのデバイスが単にブリッジの一部(priv_flagsのIFF_DONT_BRIDGEを設定する)を拒否するか、単にその場合にTCP接続をオフロードしないでください。代わりにブリッジコードにパッチを当てて内部にアクセスできるようにして、__ br_fdb_getを自分で実行して宛先インターフェイスを見つけることができます。その道を辿ると、タイムアウトや競争条件のねじれた迷路がある。要するに、レイヤリングモデルをかなりひどく壊してしまい、結果が悪くなります。 –
@Kristof Provostに感謝します。確立された接続検出を他の場所に移動できると思いますか?デバイスドライバの内部は良い選択ではありません。なぜなら、この確立された接続を追跡するのに多くの労力を要するからです。 –