OpenFlow化したWHR-G301Nのコントローラ接続を無線経由に

安いルーターをOpenFlow化できるよ!という話を知ったので、試していました。ついでに、ケーブル繋ぐのがめんどくさいので無線経由で飛ぶように。

OpenFlow化

ここは手順通りに。

イメージも手順もすぐ使えるようになっていて、非常にありがたいことです。なにやら今年のInteropで何か受賞されたそうで。

改造元

改造といってもファーム入れ替えるだけですが。購入対象のルーターはこれ。

BUFFALO おまかせ節電 11n/g/b対応 無線LANルーター Air Station 単体 WHR-G301N

BUFFALO おまかせ節電 11n/g/b対応 無線LANルーター Air Station 単体 WHR-G301N

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.

来てる…?


キタ━(゚∀゚)━!!


本日ここまで。