自己紹介 @yamori813
はじめに
ルータなどに内蔵されたSwitchチップをサポート
ZRouterで開発が始まりFreeBSD 10.0Relaseに入りました
OpenWRTのswconfigの様なものかも
Switchチップはそれぞれ仕様が違うので最大公約数な実装
最低限WAN/LANのVLAN設定ができる機能実装
細かい事したかったらレジスタ直接叩いてね
Switchチップのメーカー
100の頃
ASIX, Atheros, Broadcom, Davicom, IC Plus, Infineon, Marvell, Micrel, Ralink, Realtek
Gega
Atheros, Broadcom, Marvel, Realtek, Vitesse
etherswitchのサポート対象
Atheros, IC Plus, Marvel, Ralink, Realtekなど
共通コードとチップ対応のモジュールで構成
SwitchとCPU(SOC)の接続はMDIO,I2C,MEMORYIO
コントロール無しのukswitch
sys/dev/etherswitchとsbin/etherswitchcfgにソースあり〼
自分もいくつかサポートを増やすコードを書きました
FreeBSDではコードレビューにPhabricatorを使っています
サポートを増やすときに既存のコードをいじるか、新たにファイルを増やすか悩む
Bootの初期化に依存しないように
テストが厄介
VLAN設定
PORT/DOT1Q/QinQ VLAN
vlan(4)との合わせ技
etherswitchcfgコマンドで設定
ifconfig are0 up
etherswitchcfg config vlan_mode dot1q
etherswitchcfg port4 pvid 2
etherswitchcfg vlangroup1 vlan 1 members 0,1,2,3,5
etherswitchcfg vlangroup2 vlan 2 members 4,5
ifconfig vlan1 create vlan 1 vlandev are0
ifconfig vlan2 create vlan 2 vlandev are0
ifconfig vlan1 inet 10.10.10.5 netmask 255.255.255.0
ifconfig vlan2 inet 10.0.1.5 netmask 255.255.255.0
設定の確認
# etherswitchcfg -v
etherswitch0: Infineon ADM6996FC/M/MX MDIO switch driver with 6 ports and 16 VLA
N groups
etherswitch0: VLAN capabilities=6<PORT,DOT1Q>
etherswitch0: VLAN mode: DOT1Q
port0:
pvid: 1
flags=2<STRIPTAG>
media: Ethernet autoselect (none)
status: no carrier
port1:
pvid: 1
flags=2<STRIPTAG>
media: Ethernet autoselect (none)
status: no carrier
port2:
pvid: 1
flags=2<STRIPTAG>
media: Ethernet autoselect (none)
status: no carrier
port3:
pvid: 1
flags=2<STRIPTAG>
media: Ethernet autoselect (none)
status: no carrier
port4:
pvid: 2
flags=2<STRIPTAG>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
port5:
pvid: 1
flags=5<CPUPORT,ADDTAG>
media: Ethernet 100baseTX <full-duplex>
status: active
vlangroup0:
vlan: 1
members 0,1,2,3,4,5
vlangroup1:
vlan: 1
members 0,1,2,3,5
vlangroup2:
vlan: 2
members 4,5
mruby拡張
etherswitchのレジスタを読み書きするmruby拡張作ってみました
build_config.rbに入れてビルドすると以下のように使えます
t = EtherSwitch.new(0)
# ADM6996FC Port 3 Transmit Packet Count
p t.readreg(0xd9) * 0x10000 + t.readreg(0xd8)
# ADM6996FC Port 3 Receive Packet Counter
p t.readreg(0xb5) * 0x10000 + t.readreg(0xb4)
課題
FDT(FlattenedDeviceTree)対応
テスト&サポート対象の明確化
ドキュメント整備
デフォルト設定がデバイス毎に違うのを整える
データーシートが無いデバイスどうする
ホワイトボックススイッチってどうなの?
ブラウザベースのVLAN管理とか
OpenFlow / NetConf ?
いろいろ使ってない機能を試してみたい
参考資料
BSDCan2012での発表
StefanBethkeさんの資料
自分もQiitaなどにいくつか書いてます