IODataのWN-G300RがHardOffで安く入手できたていたのでZRouter.orgのターゲットにしているのですが、ある時期から不安定になったため確認しています。
問題はある一定期間すると外部からの通信ができなくなる状態でした。
この問題はAdrianさんがatu関係の修正をatherosのswitchに入れてから発生したような気がしました。
atuの修正はswitchが保持しいているMAC ADDRESSテーブルをダンプやフラッシュすることができるようになりました。
# etherswitchcfg atu dump
FreeBSDではGMAC0がarge0でGMAC1がarge1になっています。
AR9341のethernetのコンフィグレーションは以下のようなパターンがあります。
- GMAC0は使わずGMAC1だけでMAC1,MAC5をP0,P4に割り当てて使う
- GMAC0とGMAC1を使いGMAC0をP0でMAC1をP4にしてWAN,LANとして使う
- GMAC0だけを使い外部のGIGAなSWITCHに接続して使う
- GMAC0とGMAC1を使いGMAC0が外部のGIGAなSWITCHに接続して使う
1のケースでもdot1qなVLANが使えるのでWAN,LANのポートにすることは可能です。
P0とP4はEthernet Configuration (ETH_CFG)でSWAPすることもできます。
一般的には2で使うケースが多いのではないかと思われます。次に多いのは3のパターンかもしれません。
MIPSのSOCで100のSwitchを内蔵したチップはたくさんありますが、GIGAのSwitchを内蔵したチップはあまり見たことがありません。これはGigaのチップは結構電気を食うので、CPUとの同居が難しいからかもしれません。
スイッチの一般的な動作ですが、MACアドレスを知っている場合はそのポートにだけパケットを送信します。
送信先のMACアドレスを知らない場合は全部のポートに送信します。この動作の事をFloodingというようです。
もちろんARPリクエストのようなブロードキャストもすべてのポートに送信します。
MACアドレスのテーブルは5分で消えるようになっています。次のパケットが入ってくるまでは、消えてしまったアドレスへの送信は全ポートに送信されます。
なぜかMACアドレスのテーブルをflashしてからCPUのifのMACアドレスでパケットを送信すると、全ポートに送信されるのが正し動作ですが、CPUポートにだけ届きません。
ARPのブロードキャストは届きます。このためarpを削除してARPから始めた場合は通信できます。
本来の動きではない気がしますし、どこで設定できるような気もしますし、atuの修正とは関係ないような気もします。
謎です。
データーシートをながめていてAddress Table Function2にMAC_CLONEというフラグがありました。これはCPUポートのMACアドレスは時間が来ても消えない様な設定のように思われます。これを実装すれば回避できるかもしれません。
FreeBSDのEtherswitchは既存の仕組みを生かしてよくできていると思いますが、実機に入ってどのようなコンフィグレーションになってるのかがわからないので、ちょっと考えてみる必要があるかもしれません。
WN-G300RをZRouterでビルドしたkernelで使うと、WANとLAN 3が入れ替わっています。