FreeBSD
vlan
realtek
etherswitch

FreeBSDのEthernet Switchのフレームワークのetherswitchはいくつかのチップをサポートしていますが、その中のRealtekのRTL8366の使い方を簡単に説明します。

RTL8366はtag vlanが使えSRというモデルが最初に出てその後継でRBが出たようです。これらは微妙に仕様が違っていますが、etherswitch上では同じように使えます。

最近RT3052に接続されたRTL8366RBも使えるようにしてレビュー出したので、これをターゲットにしてみます。

このモジュールでは内蔵スイッチと外付けのRTL8366RBがあるのでデバイス名を指定してetherswitchcfgを実行する必要があります。

RT3052_Ether.png

まずドライバーのデフォルトの状態を示します。

# 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無しが良い気がします。