FreeBSDのetherswitch framework

#自己紹介 @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](https://qiita-image-store.s3.amazonaws.com/0/104066/24ebcdb3-4430-d02a-8453-43fcb359fdb9.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](https://qiita-image-store.s3.amazonaws.com/0/104066/290498ce-6388-ac51-75b8-ec0bdb85d91b.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拡張作ってみました

https://github.com/yamori813/mruby-etherswitch

build_config.rbに入れてビルドすると以下のように使えます

```ruby
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での発表](https://www.bsdcan.org/2012/schedule/events/330.en.html)
[StefanBethkeさんの資料](https://wiki.freebsd.org/StefanBethke/EtherSwitch)

自分もQiitaなどにいくつか書いてます