LoginSignup
1
1

More than 5 years have passed since last update.

FreeBSDのetherswitch framework

Last updated at Posted at 2016-11-29
1 / 10

自己紹介 @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

SwitchLogo.png

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

npstudy-vlan.png


設定の確認

# 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などにいくつか書いてます

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1