Solaris をスイッチングハブにしよう/其の2目次†ご注意†ここで紹介しているプログラムは、カーネルモジュールです。そのため、プログラム上に問題があった場合にはシステムが panic し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。 変更点の概要†其の1で今後の課題としていた以下の機能を追加しました。
プログラムの変更点†brdg モジュールの構造体名の変更†
処理フローの変更†あて先イーサネットアドレスを確認するようになったため、brdg モジュールのパケットの処理の決定フローは以下のようになりました。 brdgamd コマンドは /etc/brdg.mid ファイルにネットワークインターフェース名と、max_id の対応を保持するように変更し、mux_id を意識せずにネットワークインターフェース名の指定で削除が行えるようにしました。本当は brdg モジュール内に情報を保持したかったのですが、brdgadm コマンド側からの brdg モジュール内の情報の取得が難しかったため、安直にファイルに書いておくことにしました^^; ソースファイルとダウンロード†ソースファイル: bridge.tar.gz
ソースコードはこちらのページから参照していたくこともできます インストール†コンパイル&インストール†コンパイル、インストール方法に特に変更はありません。コンパイルには gcc を使います。make をそのまま実行した場合 64 bit モジュールである brdg と 32 bit モジュールである brdg32、brdgadm コマンドをを生成します。 # make /usr/local/bin/gcc -g -D_KERNEL -c brdg.c -o brdg32.o /usr/ucb/ld -dn -r brdg32.o -o brdg32 /usr/local/bin/gcc -g -D_KERNEL -c brdg.c -m64 /usr/ucb/ld -dn -r brdg.o -o brdg /usr/local/bin/gcc -g -lnsl -lsocket brdgadm.c -o brdgadm brdg モジュールのインストールおよびカーネルへのロードは make install で行います。 # make install /bin/cp brdg /kernel/strmod/sparcv9/brdg /usr/sbin/modload brdg 32 bit カーネルで起動されていて、32 bit モジュールをインストールする場合には make install32 を実行します。 # make install32 /bin/cp brdg32 /kernel/strmod/brdg /usr/sbin/modload brdg アンインストール†モジュールのアンインストールは make uninstall もしくは make uninstall32 で行えます。 # make uninstall /bin/rm /kernel/strmod/sparcv9/brdg /usr/sbin/modunload -i `/usr/sbin/modinfo | awk '/brdg/{ print }'` 同時に brdg モジュールのアンロードも行われますが、brdg モジュールを利用中の STREAM が存在していると、アンロードは失敗します。brdgadm コマンドを使って brdg モジュールを使っている STREAM をすべて削除するか、もしくはシステムを再起動してください。 # make uninstall /bin/rm /kernel/strmod/sparcv9/brdg /usr/sbin/modunload -i `/usr/sbin/modinfo | awk '/brdg/{ print }'` can't unload the module: Device busy make: *** [uninstall] Error 16 使い方†インストールが終わってもモジュールのロードが終わっただけで、brdg モジュールはまだ利用可能状態にありません。brdgadm コマンドをつかって、スイッチのポートとして追加したいネットワークインターフェースを指定してください。 Usage: brdgadm [ -a interface | -d interface] Options: -a interface : Add interface as switch port -d interface : Delete interface from port lis インターフェースの追加†インターフェースの追加には brdgadm の -a オプションを使います。 例) # ./brdgadm -a hme0 hme0 successfully added. (muxid=8) # ./brdgadm -a le0 le0 successfully added. (muxid=9) 上記の例では、hme0 と le0 をスイッチのポートとして追加しています。-a オプションが正常に終了すると、スイッチのポートとして追加されたネットワークインターフェースと max_id が /etc/brdg.mid ファイルに書き込まれます。ファイルの内容は、引数無しで brdgadm コマンドを実行すると見ることができます。が、ファイルを cat すればいいだけの話なので、あまり意味はないです。 # ./brdgadm List of the interface currentry regsitered as port hme0 le0 # cat /etc/brdg.mid hme0:8 le0:9 インターフェースの削除†インターフェースの削除を行うには brdgadm の -d オプションを使います。 例) # ./brdgadm -d hme0 muxid 8 is being deleted...Done # ./brdgadm -d le0 muxid 9 is being deleted...Done 其の1の時のように、max_id を指定する必要はありません。追加の時と同様にネットワークインターフェース名をしていして削除します。 注意†brdgadm コマンドで指定するネットワークインターフェースは ifconfig にて設定されていないインターフェースを想定しています。上記の例では ifconfig -a を実行すると、以下のようになり、hme0、le0 ともに 使われていないことが分かります。 # ifconfig -a lo0: flags=1000849 mtu 8232 index 1 inet 127.0.0.1 netmask ff000000 # ifconfig で plumb されている(UP/DOWNかかわらず)ネットワークインターフェースを brdgadm で追加した場合、予想外の自体が発生する恐れがあります。(予想外といっているのは、本当にどう挙動するか分からないとうだけです・・想像できる不具合があるってわけでは無いです・・どうということはないかもしれません) 今後の課題†
|