Solaris をスイッチングハブにしよう/其の2

目次

ご注意

ここで紹介しているプログラムは、カーネルモジュールです。そのため、プログラム上に問題があった場合にはシステムが panic し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。

変更点の概要

其の1で今後の課題としていた以下の機能を追加しました。

  • あて先イーサネットアドレスを見てパケットを転送するポートを特定できるようにする。
  • brdgadm コマンドで mux_id を意識せずにネットワークインターフェースの削除ができるようにする。

プログラムの変更点

brdg モジュールの構造体名の変更

変更前 ----------> 変更後構造体概要
source_entry_s --> node_s発信元ノード情報
ノードが接続されているポートやイーサネットアドレスを保存

処理フローの変更

あて先イーサネットアドレスを確認するようになったため、brdg モジュールのパケットの処理の決定フローは以下のようになりました。

flow2.png

brdgamd コマンドは /etc/brdg.mid ファイルにネットワークインターフェース名と、max_id の対応を保持するように変更し、mux_id を意識せずにネットワークインターフェース名の指定で削除が行えるようにしました。本当は brdg モジュール内に情報を保持したかったのですが、brdgadm コマンド側からの brdg モジュール内の情報の取得が難しかったため、安直にファイルに書いておくことにしました^^;

ソースファイルとダウンロード

ソースファイル: bridge.tar.gz

tar ファイルに含まれるファイルの概要
Makefilebrdg モジュール、brdgadm コマンド用の makefile
brdg.cbrdg モジュールの本体。STREAMS モジュール。
あるネットワークインターフェースに到着したパケットを他のネットワークインターフェースへ転送する。
brdgadm.cbrdg モジュールのための設定用コマンド。
STREAM の作成、パーシストリンク、モジュールの PUSH を行う。

ソースコードはこちらのページから参照していたくこともできます

http://github.com/kaizawa/bridge

インストール

コンパイル&インストール

コンパイル、インストール方法に特に変更はありません。コンパイルには 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 で追加した場合、予想外の自体が発生する恐れがあります。(予想外といっているのは、本当にどう挙動するか分からないとうだけです・・想像できる不具合があるってわけでは無いです・・どうということはないかもしれません)

今後の課題

  1. あて先イーサネットアドレスが、ブロードキャストアドレスもしくはマルチキャストアドレスだった場合には、すぐに全ポートへパケットを配送できるようにする。(不要なノードリストの巡回をスキップする)
  2. .....

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-01-03 (月) 20:24:04