開始行:
#norelated
*Solaris をスイッチングハブにしよう/其の1
*目次 [#y842c882]
#contents
*ご注意 [#e93c2ad3]
ここで紹介しているプログラムは、カーネルモジュールです。...
*概要とプログラムのイメージ [#idf6225a]
こんどは、余った Ethernet ポートを利用して、Solaris マシ...
FreeBSD に bridge というモジュールがあって、まさに同じ事...
プログラムとしては、パケットの転送を行う STREAMS モジュー...
|CENTER:brdgadm| ユーザコマンド。&br;STREAM の作成、モジ...
|CENTER:brdg| STREAMS モジュール。&br;実際のパケットの転...
brdg モジュールはぶっちゃけパケットの転送をしているだけな...
&br;
#aname(fig1)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/device_open...
&br;''図1''&br;
-brdgadm コマンドが、IP のドライバである /dev/ip をオープ...
-これにより、hme ドライバ、ip ドライバを底辺とした2つの ...
#clear
&br;
#aname(fig2)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/push_brdg.p...
&br;''図''2&br;
-hme ドライバの STREAM に brdg モジュールを PUSH する。
#clear
&br;
#aname(fig3)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/i_plink.png...
&br;''図3''&br;
-I_PLINK ioctl() コマンドを使って、hme の STREAM を ip の...
#clear
&br;
#aname(fig4)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/close_devic...
&br;''図4''&br;
-/dev/ip と /dev/hme をオープンした FD をクローズし、brdg...
#clear
&br;
#aname(fig5)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/link_2strea...
&br;''図5''&br;
-同様に、/dev/le に対しても brdgadm コマンドを使って STRE...
-これで、hme から来たパケットが brdg モジュールを介して l...
#clear
&br;
[[図4>#fig4]]で、結局は hme driver を底辺とした STREAM ...
通常、プロセスが STREAMS デバイスをオープン してできた ST...
まずは、[[図1>#fig1]]でオープンしている /dev/ip ですが、...
#ref(http://www.whiteboard.ne.jp/~admin2/pict/upper_multi...
&br;''アッパーマルチプレクサー''&br;&br;
マルチプレクサーの上方に複数の STREAM が接続されている。...
#clear
#ref(http://www.whiteboard.ne.jp/~admin2/pict/lower_multi...
&br;''ロアーマルチプレクサー''&br;&br;
マルチプレクサーの下方に複数の STREAM が接続されている。...
#clear
&br;
ちなみに、上記の両方を兼ね備えたマルチプレクサーを M-to-N...
アッパーマルチプレクサーは、マルチプレクサーの開発者がそ...
|>|STREAMS ioctl() I_LINK コマンド|h
|概要| STREAM デバイスの制御|
|インクルードファイル | #include <unistd.h>&br;#include <...
|形式| int ioctl(int FD1, I_LINK, int FD2);|
|引数 |int FD1 : アッパーマルチプレクサーのファイル記...
|戻り値 |成功時: 実数値&br;エラー: -1|
これにより、2つの STREAM(マルチプレクサーの STREAM とデ...
ここで、先ほどでてきたパーシストリンクに戻りますが、上記...
次に、brdg モジュールですが、STREAMS モジュールとしての骨...
#ref(http://www.whiteboard.ne.jp/~admin2/pict/flow.png)
*ソースファイルとダウンロード [#lff718e3]
ソースファイル: [[bridge-0.1.tar.gz>http://github.com/dow...
|>|CENTER:tar ファイルに含まれるファイルの概要|h
|Makefile|brdg モジュール、brdgadm コマンド用の makefile|
|brdg.c| brdg モジュールの本体。STREAMS モジュール。&br;...
|brdgadm.c| brdg モジュールのための設定用コマンド。&br;S...
*プログラムの解説 [#d4f7fecf]
**brdgadm.c [#w15b58b4]
コードの大部分は、基本的には [[Solaris DLPI プログラミン...
add_interface() の中ではネットワークインターフェースのデ...
/*
* SAP(Service Access Point)を 0 にして bind 要求
*/
dlbindreq (if_fd, 0, 0, DL_CLDLS, 0, 0);
dlbindack (if_fd, buf);
/*
* PROMISCOUS モードへ。DL_PROMISC_SAP、DL_PROMISC_PH...
*/
dlpromisconreq(if_fd, DL_PROMISC_SAP);
dlokack(if_fd, buf);
dlpromisconreq(if_fd, DL_PROMISC_PHYS);
dlokack(if_fd, buf);
man hme によると、SAP 0 にバインドすることによって、Ether...
|===== docs.sun.com hme の man page より ================...
Packet Monitor では ''DL_PROMISC_PHY'' フラグをセットして...
/*
* ip の stream に interface の stream を LINK
* (PLINK = persist link)
*/
mux_id = ioctl(ip_fd, I_PLINK, if_fd);
if( mux_id < 0){
perror("I_PLINK ioctl failed");
exit(0);
}
printf("mux_id = %d\n", mux_id);
printf("Please write down mux_id.\nThis mux_id will b...
add_interface() のなかに、先ほどお話した I_PLINK(パーシ...
if ((ip_fd = open("/dev/ip", O_RDWR)) < 0)
syserr("/dev/ip");
if (ioctl(ip_fd, I_PUNLINK, mux_id) < 0) {
perror("I_PUNLINK ioctl failed");
exit(0);
}
I_PUNLINK ioctl で指定している mux_id は brdgadm コマンド...
**brdg.c [#lc0caef0]
brdg モジュールは brdgadm コマンドによって追加されたネッ...
typedef struct port_s
{
queue_t *qptr;
char *ifname;
}port_t;
port_t port_list[MAXPORT];
この port_s 構造体は MAXPORT を最大数とした配列になってい...
また、brdg モジュールは受信したパケットの発信元 Ethernet ...
typedef struct source_entry_s
{
struct ether_addr ether_source;
port_t *port;
int state;
} source_entry_t;
source_entry_t source_hash_table[MAXHASH];
ハッシュテーブルの最大値は MAXHASH で決まっており、現在は...
*インストール [#qc3057e8]
**コンパイル&インストール [#h43a083f]
コンパイルには gcc を使います。make をそのまま実行した場...
# 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 モジュールのインストールおよびカーネルへのロードは m...
# make install
/bin/cp brdg /kernel/strmod/sparcv9/brdg
/usr/sbin/modload brdg
32 bit カーネルで起動されていて、32 bit モジュールをイン...
# make install32
/bin/cp brdg32 /kernel/strmod/brdg
/usr/sbin/modload brdg
**アンインストール [#d9c81aeb]
モジュールのアンインストールは make uninstall もしくは ma...
# make uninstall
/bin/rm /kernel/strmod/sparcv9/brdg
/usr/sbin/modunload -i `/usr/sbin/modinfo | awk '/brdg/{...
同時に brdg モジュールのアンロードも行われますが、brdg モ...
# make uninstall
/bin/rm /kernel/strmod/sparcv9/brdg
/usr/sbin/modunload -i `/usr/sbin/modinfo | awk '/brdg/{...
can't unload the module: Device busy
make: *** [uninstall] Error 16
*使い方 [#g99e3c16]
インストールが終わってもモジュールのロードが終わっただけ...
Usage: brdgadm [-a <interface> | -d mux_id ]
**インターフェースの追加 [#k23e7c3e]
インターフェースの追加には brdgad の -a オプションを使い...
例)
# ./brdgadm -a hme0
devname = hme, ppa = 0 devpath = /dev/hme
mux_id = 11
Please write down mux_id.
This mux_id will be used for -d (=delete)
# ./brdgadm -a le0
devname = le, ppa = 0 devpath = /dev/le
mux_id = 12
Please write down mux_id.
This mux_id will be used for -d (=delete)
上記の例では、hme0 と le0 をハブのポートとして追加してい...
**インターフェースの削除 [#cebd63bb]
インターフェースの削除を行うには brdgadm の -d オプション...
例)
# ./brdgadm -d 11
mux_id 11 is being deleted...
Done
# ./brdgadm -d 12
mux_id 12 is being deleted...
Done
-d オプションの引数として先ほどの mux_id を指定しています...
***注意 [#b891d5bc]
brdgadm コマンドで指定するネットワークインターフェースは ...
# ifconfig -a
lo0: flags=1000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
#
ifconfig で plumb されている(UP/DOWNかかわらず)ネットワ...
*今後の課題 [#c6c00ede]
+あて先 Ethernet アドレスを見てパケットを転送するポートを...
+brdgadm コマンドで mux_id を意識せずにネットワークインタ...
終了行:
#norelated
*Solaris をスイッチングハブにしよう/其の1
*目次 [#y842c882]
#contents
*ご注意 [#e93c2ad3]
ここで紹介しているプログラムは、カーネルモジュールです。...
*概要とプログラムのイメージ [#idf6225a]
こんどは、余った Ethernet ポートを利用して、Solaris マシ...
FreeBSD に bridge というモジュールがあって、まさに同じ事...
プログラムとしては、パケットの転送を行う STREAMS モジュー...
|CENTER:brdgadm| ユーザコマンド。&br;STREAM の作成、モジ...
|CENTER:brdg| STREAMS モジュール。&br;実際のパケットの転...
brdg モジュールはぶっちゃけパケットの転送をしているだけな...
&br;
#aname(fig1)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/device_open...
&br;''図1''&br;
-brdgadm コマンドが、IP のドライバである /dev/ip をオープ...
-これにより、hme ドライバ、ip ドライバを底辺とした2つの ...
#clear
&br;
#aname(fig2)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/push_brdg.p...
&br;''図''2&br;
-hme ドライバの STREAM に brdg モジュールを PUSH する。
#clear
&br;
#aname(fig3)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/i_plink.png...
&br;''図3''&br;
-I_PLINK ioctl() コマンドを使って、hme の STREAM を ip の...
#clear
&br;
#aname(fig4)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/close_devic...
&br;''図4''&br;
-/dev/ip と /dev/hme をオープンした FD をクローズし、brdg...
#clear
&br;
#aname(fig5)
#ref(http://www.whiteboard.ne.jp/~admin2/pict/link_2strea...
&br;''図5''&br;
-同様に、/dev/le に対しても brdgadm コマンドを使って STRE...
-これで、hme から来たパケットが brdg モジュールを介して l...
#clear
&br;
[[図4>#fig4]]で、結局は hme driver を底辺とした STREAM ...
通常、プロセスが STREAMS デバイスをオープン してできた ST...
まずは、[[図1>#fig1]]でオープンしている /dev/ip ですが、...
#ref(http://www.whiteboard.ne.jp/~admin2/pict/upper_multi...
&br;''アッパーマルチプレクサー''&br;&br;
マルチプレクサーの上方に複数の STREAM が接続されている。...
#clear
#ref(http://www.whiteboard.ne.jp/~admin2/pict/lower_multi...
&br;''ロアーマルチプレクサー''&br;&br;
マルチプレクサーの下方に複数の STREAM が接続されている。...
#clear
&br;
ちなみに、上記の両方を兼ね備えたマルチプレクサーを M-to-N...
アッパーマルチプレクサーは、マルチプレクサーの開発者がそ...
|>|STREAMS ioctl() I_LINK コマンド|h
|概要| STREAM デバイスの制御|
|インクルードファイル | #include <unistd.h>&br;#include <...
|形式| int ioctl(int FD1, I_LINK, int FD2);|
|引数 |int FD1 : アッパーマルチプレクサーのファイル記...
|戻り値 |成功時: 実数値&br;エラー: -1|
これにより、2つの STREAM(マルチプレクサーの STREAM とデ...
ここで、先ほどでてきたパーシストリンクに戻りますが、上記...
次に、brdg モジュールですが、STREAMS モジュールとしての骨...
#ref(http://www.whiteboard.ne.jp/~admin2/pict/flow.png)
*ソースファイルとダウンロード [#lff718e3]
ソースファイル: [[bridge-0.1.tar.gz>http://github.com/dow...
|>|CENTER:tar ファイルに含まれるファイルの概要|h
|Makefile|brdg モジュール、brdgadm コマンド用の makefile|
|brdg.c| brdg モジュールの本体。STREAMS モジュール。&br;...
|brdgadm.c| brdg モジュールのための設定用コマンド。&br;S...
*プログラムの解説 [#d4f7fecf]
**brdgadm.c [#w15b58b4]
コードの大部分は、基本的には [[Solaris DLPI プログラミン...
add_interface() の中ではネットワークインターフェースのデ...
/*
* SAP(Service Access Point)を 0 にして bind 要求
*/
dlbindreq (if_fd, 0, 0, DL_CLDLS, 0, 0);
dlbindack (if_fd, buf);
/*
* PROMISCOUS モードへ。DL_PROMISC_SAP、DL_PROMISC_PH...
*/
dlpromisconreq(if_fd, DL_PROMISC_SAP);
dlokack(if_fd, buf);
dlpromisconreq(if_fd, DL_PROMISC_PHYS);
dlokack(if_fd, buf);
man hme によると、SAP 0 にバインドすることによって、Ether...
|===== docs.sun.com hme の man page より ================...
Packet Monitor では ''DL_PROMISC_PHY'' フラグをセットして...
/*
* ip の stream に interface の stream を LINK
* (PLINK = persist link)
*/
mux_id = ioctl(ip_fd, I_PLINK, if_fd);
if( mux_id < 0){
perror("I_PLINK ioctl failed");
exit(0);
}
printf("mux_id = %d\n", mux_id);
printf("Please write down mux_id.\nThis mux_id will b...
add_interface() のなかに、先ほどお話した I_PLINK(パーシ...
if ((ip_fd = open("/dev/ip", O_RDWR)) < 0)
syserr("/dev/ip");
if (ioctl(ip_fd, I_PUNLINK, mux_id) < 0) {
perror("I_PUNLINK ioctl failed");
exit(0);
}
I_PUNLINK ioctl で指定している mux_id は brdgadm コマンド...
**brdg.c [#lc0caef0]
brdg モジュールは brdgadm コマンドによって追加されたネッ...
typedef struct port_s
{
queue_t *qptr;
char *ifname;
}port_t;
port_t port_list[MAXPORT];
この port_s 構造体は MAXPORT を最大数とした配列になってい...
また、brdg モジュールは受信したパケットの発信元 Ethernet ...
typedef struct source_entry_s
{
struct ether_addr ether_source;
port_t *port;
int state;
} source_entry_t;
source_entry_t source_hash_table[MAXHASH];
ハッシュテーブルの最大値は MAXHASH で決まっており、現在は...
*インストール [#qc3057e8]
**コンパイル&インストール [#h43a083f]
コンパイルには gcc を使います。make をそのまま実行した場...
# 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 モジュールのインストールおよびカーネルへのロードは m...
# make install
/bin/cp brdg /kernel/strmod/sparcv9/brdg
/usr/sbin/modload brdg
32 bit カーネルで起動されていて、32 bit モジュールをイン...
# make install32
/bin/cp brdg32 /kernel/strmod/brdg
/usr/sbin/modload brdg
**アンインストール [#d9c81aeb]
モジュールのアンインストールは make uninstall もしくは ma...
# make uninstall
/bin/rm /kernel/strmod/sparcv9/brdg
/usr/sbin/modunload -i `/usr/sbin/modinfo | awk '/brdg/{...
同時に brdg モジュールのアンロードも行われますが、brdg モ...
# make uninstall
/bin/rm /kernel/strmod/sparcv9/brdg
/usr/sbin/modunload -i `/usr/sbin/modinfo | awk '/brdg/{...
can't unload the module: Device busy
make: *** [uninstall] Error 16
*使い方 [#g99e3c16]
インストールが終わってもモジュールのロードが終わっただけ...
Usage: brdgadm [-a <interface> | -d mux_id ]
**インターフェースの追加 [#k23e7c3e]
インターフェースの追加には brdgad の -a オプションを使い...
例)
# ./brdgadm -a hme0
devname = hme, ppa = 0 devpath = /dev/hme
mux_id = 11
Please write down mux_id.
This mux_id will be used for -d (=delete)
# ./brdgadm -a le0
devname = le, ppa = 0 devpath = /dev/le
mux_id = 12
Please write down mux_id.
This mux_id will be used for -d (=delete)
上記の例では、hme0 と le0 をハブのポートとして追加してい...
**インターフェースの削除 [#cebd63bb]
インターフェースの削除を行うには brdgadm の -d オプション...
例)
# ./brdgadm -d 11
mux_id 11 is being deleted...
Done
# ./brdgadm -d 12
mux_id 12 is being deleted...
Done
-d オプションの引数として先ほどの mux_id を指定しています...
***注意 [#b891d5bc]
brdgadm コマンドで指定するネットワークインターフェースは ...
# ifconfig -a
lo0: flags=1000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
#
ifconfig で plumb されている(UP/DOWNかかわらず)ネットワ...
*今後の課題 [#c6c00ede]
+あて先 Ethernet アドレスを見てパケットを転送するポートを...
+brdgadm コマンドで mux_id を意識せずにネットワークインタ...
ページ名: