OpenFlow化したWHR-G301Nのコントローラ接続を無線経由に
安いルーターをOpenFlow化できるよ!という話を知ったので、試していました。ついでに、ケーブル繋ぐのがめんどくさいので無線経由で飛ぶように。
OpenFlow化
ここは手順通りに。
イメージも手順もすぐ使えるようになっていて、非常にありがたいことです。なにやら今年のInteropで何か受賞されたそうで。
改造元
改造といってもファーム入れ替えるだけですが。購入対象のルーターはこれ。
BUFFALO おまかせ節電 11n/g/b対応 無線LANルーター Air Station 単体 WHR-G301N
- 出版社/メーカー: バッファロー
- 発売日: 2009/12/05
- メディア: Personal Computers
- 購入: 61人 クリック: 964回
- この商品を含むブログ (43件) を見る
WHR-G301NAという型番も、謎のバックアップソフトが増えているだけでハードウェアは同じようです。
リンクはGigabitではなく100Mです。ただパケットをソフトウェア転送するので、リンク速度より先にCPU性能が引っかかるのではないかと思われます。まだ計測してないけど。
余談。今のルーター売り場って、素人相手に電波のハイパワーを売りにしてるんですね。やめてくれー。
書き換え
OpenFlowはversion 1.1が出ていますが、繋がるコントローラがないものを動かしても仕方ないため、とりあえず1.0を使います。とりあえず、といっても、自分の目的からすると、複雑怪奇な上位動作が乗っている必要はありません。研究したいわけじゃないので。だから、ずっと1.0かも。
先のページのファームウェアを、ルーター管理画面から投入。プログレスバーの類が一切出ないので、失敗したか?と思いましたが、再起動がかかった後にtelnetで繋ぎに行ったら成功しました。よかったよかった。
ハードウェアスペックを見てみると、以下のようになっていました。(適宜切り取り)
root@OpenWrt:/# cat /proc/cpuinfo system type : Atheros AR7240 rev 2 machine : Buffalo WHR-G301N processor : 0 cpu model : MIPS 24Kc V7.4 BogoMIPS : 265.42 root@OpenWrt:/# cat /proc/meminfo MemTotal: 29464 kB root@OpenWrt:/# df -h Filesystem Size Used Available Use% Mounted on rootfs 1.1M 208.0K 880.0K 19% / /dev/root 1.8M 1.8M 0 100% /rom tmpfs 14.4M 68.0K 14.3M 0% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock4 1.1M 208.0K 880.0K 19% /overlay overlayfs:/overlay 1.1M 208.0K 880.0K 19% /
無線を使う
最低限の動作確認
無線ルーターなのでハードウェアは載っていますが、設定で無効になっています。
有効にするのは簡単。disableにしてる行を消すだけ。
root@OpenWrt:/# cat /etc/config/wireless config wifi-device radio0 option type mac80211 option channel 11 option macaddr 00:00:00:00:00:00 option hwmode 11ng option htmode HT20 list ht_capab SHORT-GI-40 list ht_capab TX-STBC list ht_capab RX-STBC1 list ht_capab DSSS_CCK-40 # REMOVE THIS LINE TO ENABLE WIFI: option disabled 1 config wifi-iface option device radio0 option network lan option mode ap option ssid OpenWrt option encryption none
コメントにある通り、disableの行を消すなりコメントアウトするなりで、再起動すれば動きます。
おう…繋ぎ放題!
上記の/etc/config/wirelessで暗号化なしになってるからですね。ここを直せば暗号化もかかります。
細かい設定方法はOpenWRTのページへ。
しかし今の目的は、このルーターをAPとして無線接続したいのではないので、とりあえずここまで。のちのち、無線からのトラフィックをOpenFlowに流したくなったら、また触ることにしましょう。(若干そちらの方が面白そうな気はする)
既存の無線APに接続
/etc/config/wireless を書き換えます。
config wifi-iface option device radio0 option network lan option mode sta option ssid XXXXX option encryption psk2 option key 'xxxxx'
encryptionについては先ほどのOpenWrtのページを参照。
認証がうまくいくと、dmesgにそれっぽい表示が出ます。
[ 20.860000] wlan0: authenticate with 00:00:00:00:00:00 [ 20.870000] wlan0: send auth to 00:00:00:00:00:00 (try 1/3) [ 20.870000] wlan0: authenticated [ 20.910000] wlan0: associate with 00:00:00:00:00:00 (try 1/3) [ 20.910000] wlan0: RX AssocResp from 00:00:00:00:00:00 (capab=0x411 status=0 aid=2) [ 20.910000] wlan0: associated
あとはwlan0インタフェースにIPを振ってやればいいでしょう。どうも/etc/config/networkでの設定がうまくいかなくて、現在はrc.localでifconfigしているというひどい状態ですが、動いてはいます。
うまくいくと…という例を書きましたが、うまくいかないと大変です。失敗したことを示すメッセージがdmesgで見えるのみでは済まなくて、CPUを使い切るような動作が走るようで、滅茶苦茶重くなります。パスワードを一文字変えて失敗動作を試してみたら、大変なことになりました。再起動して最速で/etc/config/wirelessの該当部分を書き換えることで復活しましたが、操作ひとつに10秒近く待つような状態でした。
OpenFlow接続の確認
接続先のコントローラは、/etc/config/openflowで指定。
root@OpenWrt:/# cat /etc/config/openflow config 'ofswitch' option 'dp' 'dp0' option 'ofports' 'eth0.1 eth0.2 eth0.3 eth0.4' option 'ofctl' 'tcp:192.168.1.10:6633' option 'mode' 'outofband'
ofctlのIPアドレスだけ変えればよいでしょう。
ofportsに無線のポートが指定できるのか、modeにinboundも指定できるのかなど気になるけども、必要になったときに試す方向で…
接続確認
先ほど接続先として指定したIPアドレス+ポート番号にて、OpenFlow1.0対応のコントローラを起動して待ち受けます。
最初はtremaを使おうと思いましたが、Windows+Cygwinでは簡単には動きそうにありませんね。rubygemsでインストールすると、インストール時にエラーがいっぱい出た挙句に起動すると「ビルドされていない」と出るし、ソースコードもビルドできない…。まだ本格的に開発するわけではなく、繋がってくれれば良いので、今回はpoxを使いました。
WHR-G301N(192.168.1.254)
↓↑
無線ルーター(192.168.1.1)
↓↑
コントローラ(pox)を動かすPC(192.168.1.10)
~/open-source/pox % ./pox.py openflow.of_01 --address=192.168.1.10 --port=6633 POX 0.0.0 / Copyright 2011 James McCauley DEBUG:core:POX 0.0.0 going up... DEBUG:core:Running on CPython (2.6.8/Jun 9 2012 11:30:32) INFO:core:POX 0.0.0 is up. This program comes with ABSOLUTELY NO WARRANTY. This program is free software, and you are welcome to redistribute it under certain conditions. Type 'help(pox.license)' for details. DEBUG:openflow.of_01:Listening for connections on 192.168.1.10:6633 INFO:openflow.of_01:[Con 1/150868562123] Connected to 00-00-00-00-00-00 Ready.
来てる…?
本日ここまで。