2012-04-09 5 views
0

シナリオは次のとおりです。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_devicestruct net_bridge_port)を取得することは可能ですか。

いずれかの提案があります。よろしくお願いします。

答えて

0

struct net_bridgeには、メンバーポートのリストport_listがあります。リストにはstruct net_bridge_port要素が含まれ、さらにstruct net_dev要素が含まれています。まだパケットが上で来たのインターフェースが、については何も知らないメンバーのどのあなたを教えてくれないもちろん

struct net_bridge *br = netdev_priv(dev); 

を、:

あなたは自明橋のstruct net_deviceからstruct net_bridgeを得ることができますなぜあなたはこれをやろうとしているのですか、それが問題なのかどうかは言えません。

+0

こんにちは@クリストフプロボスト、あなたの意見を多くありがとう。パケットが送信される正確な出力インターフェイスを見つけることは可能ですか?私たちのネットワークデバイスはTCP接続のオフロードを行うことができるので、このデバイスを他の通常のnet_device(ワイヤレスインターフェース)と区別したい場合は –

+1

この場合、この作業を行う価値があるかどうか疑問です。私はあなたのデバイスが単にブリッジの一部(priv_flagsのIFF_DONT_BRIDGEを設定する)を拒否するか、単にその場合にTCP接続をオフロードしないでください。代わりにブリッジコードにパッチを当てて内部にアクセスできるようにして、__ br_fdb_getを自分で実行して宛先インターフェイスを見つけることができます。その道を辿ると、タイムアウトや競争条件のねじれた迷路がある。要するに、レイヤリングモデルをかなりひどく壊してしまい、結果が悪くなります。 –

+0

@Kristof Provostに感謝します。確立された接続検出を他の場所に移動できると思いますか?デバイスドライバの内部は良い選択ではありません。なぜなら、この確立された接続を追跡するのに多くの労力を要するからです。 –

関連する問題