Boost.Asio エクステンションを使用してブリッジ (レイヤー 2 スイッチ) を作成しました。タイプ要件を満たす追加のソケット、エンドポイント、およびプロトコルを簡単に作成できます。そして、私の拡張機能はAF_PACKET
、SOCK_RAW
およびで Linux パケット ソケットを使用しますhtons(ETH_P_ALL)
(パケット ソケットの詳細については、を参照man 7 packet
してください)。
私のブリッジがどのように機能するかを説明する例を次に示します。
[PC1] <----> IF1[PC2]IF2 <----> [PC3]
ブリッジは、ネットワーク インターフェイス (例: eth0) IF1 と IF2 を接続し、PC1 が PC2 で実行されているブリッジを介して PC3 と通信できるようにします。インターフェイスを接続する方法は、受信したパケットを IF1 から IF2 に送信することです (逆も同様です)。
私のブリッジは、有線接続では期待どおりに動作しますが、無線接続では動作しません。そこで、この問題の原因を突き止めようとしたところ、ARP 要求がまったく成功しなかったことがわかりました。
この問題を引き起こす実際の環境は次のとおりです。
[PC1] <--wired--> eth0[PC2]wlan0 <--wireless(802.11g)--> [router1]
上記の環境下で、例えば今、PC1 は ping(ICMP) パケットを router1 に送信しようとします。PC3に送信するには、PC1はrouter1のMACアドレスを知っている必要があるため、PC1はARP要求を送信FF:FF:FF:FF:FF:FF
し、PC2で実行されているブリッジはeth0から受信してwlan0に送信しますが、router1はarp応答をPC1に送信しません.
注: SOCK_RAW パケットは、パケット データを変更せずにデバイス ドライバーとの間でやり取りされます。(パケットのマニュアルページから引用)
PC1 が router1 と通信できるようにするにはどうすればよいですか?
ありがとうございました。
編集:
これが私の Boost.Asio 拡張機能です。
github: pfpacket/libarex
そして、これは上記を使用した私のブリッジです。
libarex/example/layer2_switch/interface_bridge.cpp