FreeBSDでのEther Switch

お約束ですが、このページのいかなる記載においても著者は一切の責任をおいません。

2011年くらいからルーターなどに入っているEthernet Switchチップのサポートを 作っていたようです。当初は一緒にやっていたようなのですが、二つに分かれてしまい StefanBethkeが作られていていたものがheadに入り、ZRouterのOleksandrRybalko のものは外されてしまいました。当初サポート範囲が違っていて混乱していたのですが ほぼほぼheadの方に移行してあります。

一般的なEtherNetのハードはMACとPHYにより構成されますが、ルータなどで使われる SOCではMACをSOCに内蔵してPHYの代わりにSWITCHを接続しています。

AtherosのMIPS SOCの場合最初の頃のAR5312には二つMACがありWANとLANを別々に設定 できた。この後のSOCのAR5315はMACが一つになりWAN,LANを区別するためにVLANが 必須になった。ところがAR7系以降またMACが二つになり、VLANの必要がなくなっている。

AR531xのポートをしたのはこのSOCにはいろいろなスイッチが付いたモジュールが あったからだったりもします。

世の中的はGigaな時代になっているのですが、私はジャンク専門なので100なターゲット が多く偏った資料になっています。

Qiitrでもいろいろ書いています。etherswitchを試してみる

2017/2までにいろいろいじったものをレビュー出してheadに入れてもらいました。

Realtekrtl8366sr,rb
rtl830xsb,sc
rtl8366rbの方はおそらくTP-Link TL-WR1043NDの最初のモデル がターゲットと思われます。日本ではバッファローのWZR-HP-G301NHが同じ構成の ようです。rtl8366rbより一世代古いrtl8366srというチップもあり仕様が違っていて、 headのコードでは動作しないようです。データーシートはネットでダウンロードできる ものもるがRBのものがなかったりSRのものも完全なものは手に入りません。 おそらくRTL8366,RTL8366SR,RTL8366RB,RTL8367RBいうよな感じでリリースされてきた ようです。 srでも使えるようにしたコードレビュー出してheadに入れてもらいました。 100の方のRTL830xはRTL8305SB,SC,RTL8306SDとリリースされたようですが、SBの プロトタイプは作ってみたのですが、SCが手元にないので放置してあります。 MII/I2C 1000/100
IC PlusIP175C コードがあります。Ether関係のチップメーカーなので単体チップです。 データシートはネットで入手できます。 MII 1000/100
Qualcomm
(Atheros)
ar8x16 AR5系の頃は他のメーカのスイッチを使うようにしていたのだが、 AR7系は自社製品に移行した模様。AR8316は1000の外付けの チップですがSOCのAR7240には100のスイッチが内蔵されています。 データシートはネットでは手に入りません。 headにいろいろコードが入っています。 MII 1000/100
Broadcombcm5325 単体チップとMIPS SOCでは100のSwitchが内蔵になったものがあります。 データシートはネットではSOCを含め手に入りません。 ロシアのコミッターのMchaelがいじっていますが、headには入ってません。 MII 1000/100
MediaTek
(Ralink)
rt305x Mediatekを再実装した、ユーゴスラビアの方のコードがheadに入っています。 RT3050はportベースのuntaged/tagedでしたが、これ以降はvlan tableベースに なっています。データシートはネットで入手できます。 MEMIO 100
Infineon
(Admtek)
adm5120
amd6996f
adm6996fc/m
Infineonはドイツの会社で2004年にADMtekを買収してEthernetプロダクトを 製品ラインにしました。しかし現在のホームページを見るとEthernet関係の プロダクトは止めてしまったようです。 amd6996f,fcは単体チップです。fとfcは全くレジスタの構成が違います。 対応のコードを作ってレビューしてheadに入れてもらいました。 データシートはネットで入手できます。 MII 100
Marvell88E6060 FON2201などで広く使われていたチップ。コードはありません。 88E6060は.1Qではなく、独自仕様のポート識別をおこなっているので、ちょっと 厄介です。 対応のコードを作ってレビューしてheadに入れてもらいました。独自仕様のtagに ついては対応していません。vlan(4)が使えないのでこれに似たコードが必要に なります。netgraphで作っても良いかもしれません。 ちょうどこのページを書いている時にheadのetherswitchに88E6352,88E6172,88E6176 のコードが追加されていました。88E6060データシートはネットで入手できまが、 新しいチップのデータシートはNDAが必要なようです。 .1Qに対応した6065のコードも6060のコードに入れました。 Gigaのチップのコードもありますが、私は試していません。 MII 1000/100
Micrel
(KENDIN)
KSZ8995 コードはいまのところなさそうです。KS8995XAのような単体のチップもありますが ARM SOCに内蔵されたチップもあります。データシートはネットで入手できます。 対応のコードを作ってレビューしてheadに入れてもらいました。 MicrelはMicrochipに買収されたようです。 SPI 100
DavicomDM8806 なぜか日本国内ではほとんど出回ってない気がします。
Microsemi
(Vitesse)
VSC7385 コードはいまのところなさそうです。この会社はGigaのチップしか作っていない ように思われます。単体ではよく使われているようですが、現在ではSOCメーカーが ほとんど独自にSwitchのソリューションを持っているのでルータではあまり使われて いません。Vitesseは2015/4にMicrosemiに買収されたようです。 MII/SPI 1000
LantiqPSB6970 ドイツの会社で2015年にIntelに買収されたようです。ほとんど日本では使われた 製品は見当たりません。openwrtにはコードがある模様。
TamarackTC9205M IC Plusに2002年に買収されたようです。

2000年より前のSwitchチップにはVLANの機能はありません。VLANはportベースと tagベース(.1q)という仕組みがあります。.1qの仕様の チップが出始めたのは2002年位からだと思う。FreeBSDで内蔵の.1qなVLAN対応の Switchを使うとインターフェースが複数あるように使う事ができる。 データの流れはこんなふうになる。

RTL8366SRが入っているWZR-HP-G300NHをいじってみた。ところがheadに入っている コードはRTL8366RBのコードでRTL8366SRでは動かなかった。RBが入ったルータも 手元にあるが、せっかくなので調べてみたらopenwrtにRBとSRなコードがあり比較 してみたところ、微妙にコントロールレジスタのアドレスが違っていたりした。

そもそもこの機種はGPIOのどこにRTL8366SRがいるのかわからなく1日くらい調べた ところ、19,20ピンにいることがopenwrtなどの情報で分かった。基板のチェック用の パターンがあり、gpioctlでon/offを試し、オシロで信号が確認できた。

RTL-I2C

ヘッダーファイルをコピーして違っているところ修正して試してみたところ、 Chip Identifierはすぐに拾えるようになったが、その後の処理がまったくおこなわれ ない。デバッグライトをもりもり入れて調べたところI2CのACKが返ってこなくてエラー になっているようだ。I2Cは2本の信号線でデータの読み込みと書き込みをおこなうが、 送ったデータにACKが返ってくる仕組みになっている。

get_ack
I2Cのシーケンスのサンプル

RTL8366SRのI2Cは2バイトのアドレスのレジスタ空間で2バイトの読み書きをする仕様の ようだ。

Chip IdentifierのI2Cの処理とその後の処理は違っていて、分割してコーディング されている。startのackが返ってこないとこでエラーになっていてChip Identifier の方の同様の処理を見るとなにやらあやしげなコメントが書いてあって、同じような 処理を入れてみたとこどうにか動くようになった。ただなぜか最初のリセットだけは まだエラーを起こしているが、とりあえず動いているので、そのうち調べてみたい。 後日追記:リセットはACKが返らない仕様のようです。

rtl8366rbのドライバは以下のような構成になる。

どうにかSR用の修正 を入れて下記の設定でLAN側とarge0がタグ無し設定で使えるように なった。

# etherswitchcfg
etherswitch0: VLAN mode: DOT1Q
port0:
        pvid: 1
        flags=0<>
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
port1:
        pvid: 1
        flags=0<>
        media: Ethernet autoselect (none)
        status: no carrier
port2:
        pvid: 1
        flags=0<>
        media: Ethernet autoselect (none)
        status: no carrier
port3:
        pvid: 1
        flags=0<>
        media: Ethernet autoselect (none)
        status: no carrier
port4:
        pvid: 0
        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 0,1,2,3,5
vlangroup1:
        vlan: 2
        members none

残りのTodoとしては、タグ付きVLAN確認、WAN側の設定機能、GreenEtherサポート、 MIBサポートかな。

NATとしてWZR-HP-G301NHを使う事にした。何故かWZR-HP-G300NH(SR)だと対向のMOTOROLA SB5101Jと相性が悪いのかDHCPでアドレス拾えない事があり、RBのWZR-HP-G301NHだと 問題が起きない。まったく同じfirmware(FreeBSD 12-CURRENT)を焼いていたのでSwitch しか違わないはずなのだが。SR固有な問題かこのモジュールだけの問題かは不明。 (2017/2)




くまさんの庵トップへ
Copyright (C) 2015 Hiroki Mori All Rights Reserved.