FreeBSDのEthernet Switchのフレームワークのetherswitchはいくつかのチップをサポートしていますが、その中のRealtekのRTL8366の使い方を簡単に説明します。
RTL8366はtag vlanが使えSRというモデルが最初に出てその後継でRBが出たようです。これらは微妙に仕様が違っていますが、etherswitch上では同じように使えます。
RTL8316という製品もRTL8366の前にあったようです。またRTL8325という製品もあるようです。
最近RT3052に接続されたRTL8366RBも使えるようにしてレビュー出したので、これをターゲットにしてみます。
このモジュールでは内蔵スイッチと外付けのRTL8366RBがあるのでデバイス名を指定してetherswitchcfgを実行する必要があります。
まずドライバーのデフォルトの状態を示します。
# etherswitchcfg -f /dev/etherswitch1 -v
etherswitch1: Realtek RTL8366RB with 6 ports and 16 VLAN groups
etherswitch1: VLAN capabilities=4<DOT1Q>
etherswitch1: VLAN mode: DOT1Q
port0:
pvid: 2
flags=0<>
media: Ethernet autoselect (none)
status: no carrier
port1:
pvid: 1
flags=0<>
media: Ethernet autoselect (none)
status: no carrier
port2:
pvid: 1
flags=0<>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
port3:
pvid: 1
flags=0<>
media: Ethernet autoselect (none)
status: no carrier
port4:
pvid: 1
flags=0<>
media: Ethernet autoselect (none)
status: no carrier
port5:
pvid: 1
flags=1<CPUPORT>
media: Ethernet 1000baseT <full-duplex,rxpause,txpause>
status: active
vlangroup0:
vlan: 1
members 1,2,3,4,5
vlangroup1:
vlan: 2
members 0,5t
etherswitchcfgコマンドの-vオプションでRBかSRかが確認できます。
この状態だとport0はvlan2になっていて、そのままでは使えません。それ以外のポートはCPUと通信ができます。
port0から入ってきたパケットはタグの2が入ってCPUポートに上がってきます。このため通常のifでは受け取れないパケットになっています。
製品のポート番号とRTL8366のボート番号が違う場合もあり注意が必要です。また一部のポートが出ていないケースもあります。
port0を使えるようにするにはvlanを設定します。
# ifconfig vlan2 create vlan 2 vlandev rt0
# ifconfig vlan2 inet 10.10.10.1 netmask 255.255.255.0
vlan2はもともとrt0に設定されていたIPアドレスとは別のネットワークになります。
port1をvlan2側に移してみます。
# etherswitchcfg -f /dev/etherswitch1 vlangroup0 members 2,3,4,5
vlangroup0:
vlan: 1
members 2,3,4,5
# etherswitchcfg -f /dev/etherswitch1 vlangroup1 members 0,1,5t
vlangroup1:
vlan: 2
members 0,1,5t
# etherswitchcfg -f /dev/etherswitch1 port1 pvid 2
port1:
pvid: 2
flags=0<>
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
やっていることはvlangroup0からport1を抜いてvlangroup1に追加して、port1のpvidを2にしてます。
これでport0,1とport2,3,4が別のネットワークになりました。
全てのポートでvlanを使わない場合は以下の設定をします。
etherswitchcfg -f /dev/etherswitch1 vlangroup1 members none
etherswitchcfg -f /dev/etherswitch1 port0 pvid 1
etherswitchcfg -f /dev/etherswitch1 vlangroup0 members 0,1,2,3,4,5
確認はpingとtcpdumpで行っています。
vlanの操作は自分がアクセスしているポートを間違えて別のネットワークに入れてしまったりするとアクセス不能になるので、注意が必要です。
vlanとは関係ありませんが、ケーブルが古くて長い場合など、ネゴシエーションがうまくいかない場合、以下のコマンドでポートを10に設定できます。
# etherswitchcfg port2 media 10baseT
port2:
pvid: 1
flags=0<>
media: Ethernet 10baseT/UTP
status: no carrier
ところでetherswitchcfgってコマンド名ちょっと長いですよね。。。あとデフォルトでport0使えないのは忘れてて結構ハマるときあるので、デフォルトは全てのポートでvlan無しが良い気がします。