家庭用ルータでEthernetのサポートのメモです。
構成のタイプ
- Ethernetが一口でWIFIへのゲートウェイとして動作する
例:FON2100,CG-WLCVR54AG
SOCに内蔵のMACに外付けのPHYでEthernetをサポートするタイプです。該当する製品はかなり少ないです。
- 内部のSOCにネットワークインターフェースが一つでSwitchチップをつかって二つのネットワークを構成
例:FON2201,FON2305(SOC内蔵Switch)
.1Qやこれと類似した機能で、ポート毎に違うVLANをわりあて複数のインターフェースとして利用します。
このタイプで注意が必要なのは、起動時にブートローダーが通常のSwitchとして起動してしまうと、WANからLANへ(逆も)の通信がもれてしまう事です。ブートローダーがSwitchを機能しない状態でOSを起動して、OSが設定するまで、機能が有効にならないようにするのが理想の方法です。しかしブートローダーがネットワークが使えないと、デバッグするときに不便なので各ポートがSOCのみと通信できる状態にするのが良いかもしれません。またブートローダーではWAN側だけ有効にしないという機種もありました。
- SOCに二つのネットワークインターフェースがあり、片方がWANで片方がLAN用にSwitchに接続
例:WZR-HP-G301NH,WZR2-G300N
ほとんどのSwichチップは一つのポートを切り離して一つのPHY相当として動作させることができます。この機能を利用してインターフェースの一つは切り離したポートへ接続して、もう一つのインターフェースをスイッチへ接続されているポートへつないでいます。この場合PHYの状態はSWITCH側のMDIOから入ってくるのですこし複雑です。
KS8995MAのデーターシートから
PHYに接続されたMACは直接MDIOで接続されていない事がほとんどで、FreeBSDではmdioproxyという仕組みがあり、他の接続を使ってPHYの状態を取得することができます。
このタイプの場合は二つのインターフェースを別々のIPで使う事も出来るが、FreeBSDではif_bridge(4)を使い、一つのネットワークにする事も出来る。
ifconfig bridge create
ifconfig fv0 up
ifconfig fv1 up
ifconfig bridge0 addm fv0 addm fv1 up
ifconfig bridge0 inet 192.168.1.1 netmask 255.255.255.0
二つインターフェースがあっても、接続仕様が不明で片方しか使えない事もあります。
FreeBSDには二つのインターフェースで耐障害性を上げるlagg(4)というドライバがあるようです。
もちろんPHYを二つつけて2ポートを構成することもできるが、そのような製品は見た事がない。
SwitchとSOCの接続
SOCからの制御はSwitchのレジスタへの書き込みでおこなわれます。レジスタはデフォルト設定を入れておけるEEPROMと対称なアドレス構成のケースが多いです。SwitchチップとSOCのコントロール接続は以下のような種類があります。
- MDIO
例:IC Plus IP175C, RealTek RTL8305SC, Infineon ADM6996FC
このタイプが一番多いと思われます。PHYへの接続と同じインターフェースでSwitchのコントロールをおこないます。MDIO/MDCの二本の信号線でのデータの送受信をおこないます。
MDIOというPHYからケーブルの接続があるかと10T/100Tなどの種類を返す機能があります。これを拡張してSwitchのコントロールに使っているのですが、上記の二つインターフェースがある場合で、片方にはMDIOの接続が無いケースもあります。
MDIOではMDIO/MDCの制御線とINT/PHYという割り込み線があるのですが、割り込み線は使われていない事が多いようです。この場合ポートの状態はポーリングで確認します。
MDIOは32×32のレジスタで16Bitの値を扱います。より自由に大きなデータを扱いたいなどの目的で、下記のI2C,SPIの利用がおこなわれているものと思われます。
MDIOのサポートはEthernet機能の一部なのですが、ビット処理でのアクセス(dev/deや私の作ったrt1310のif_fv)やレジスタアクセスだけで出来るタイプ(dev/rtなどのほとんどにif)があります。if_fvでetherswitchのポートポーリングをcalloutで連続して行うと落ちてしまうので、ポーリングしないようにしたら問題なく動いています。おそらくビットアクセスは古い仕組みでcpuにとって負荷が高くリスクが大きいののではないかと思われます。
- I2C
例:RealTek RTL8366RB
I2Cは二本の信号線でデータをやり取りします。I2Cではマスターに対して複数のスレーブがつけられて、それぞれアドレスを持っています。アドレスは基本的には固定でデータシートなどで確認できます。I2Cの機能があるSOCの場合にはそのドライバを使ってアクセスしますが、無い場合はGPIOの2本を使ってアクセスすることもできます。
RTL8366RBの場合MDIOはなく、I2Cだけでの制御になります。
- SPI
例:Micrel KSZ8995MA
SPIは4本の信号線でデータの送受信をこないます。マスターとスレーブ一対一のバスになります。
MicrelのKSZ8995シリーズは最初にSPIの制御機能がないEがでて、その後SPIの付いた、M,Xが出たようです。この後のMAにはSPIがありますが、XAには無い事になっています。
- MEMORYMAP
例:Ralink RT3050
SOC内蔵のSwichでMEMORYMAPでレジスタアクセスできる仕様があります。RT3050ではPHYの変化を割り込みで拾えるようです。
- 無し
ごくまれにSwitchチップのピンコントロールで設定してありSOCからの制御が全くできない(デフォルトでしか使えない)ルータも存在するようです。このメモはこの残念なパターンに遭遇してしまったので書きました。
EEPROMに設定を持ってデフォルトとすることもできますが、わざわざ部品を増やしてコストを増やすくらいだったらコントロールをSOCにつないでソフトで制御し部品コストを減らした方がよいので、なにか特殊な事情がないかぎり、ありえないと思います。
おそらく初期のルーターでは開発工数削減のためSOCとはつながずEEPROMに設定を入れるようなことをしていたようです。
Switchの初期化
セキュリティを考えると、Switchは完全に設定が終わるまでは有効にしないのが良いのですが、そうするとbootがtftp出来なくなったりして不便だったりします。tftpするときにswitchを初期化するタイプのu-bootもあるようです。たまにswitchのコマンドが用意されたu-bootなども存在しますが、多くのbootが初期化でswitchを有効化してしまっています。
たまにu-bootでSwitch制御用のmdioコマンドをサポートしている物もあります。初期値ではポートは有効にせずにmdioコマンドで有効にするという方法もあるかもしれません。
Switchチップに初期化のためのEEPROMを付ける事で起動後の動作をチップの初期値から変更する事もできますが、パターンがあっても実装してあるのは見た事がありません。