« 2012年10月 | トップページ | 2012年12月 »

2012年11月

2012年11月11日 (日)

MZK-WNH で動く OpenWRT でイルミネーション

クリスマスまであとひと月ちょっと。世間ではすっかりクリスマスムードです。街を歩いているとところどころイルミネーションが点灯しています。

ふと、ジャンクで買った MZK-WNH の LED でイルミネーションできないかなーって、なんて思ってしまったので挑戦することにしました。

調べてみると OpenWRT には swconfig というコマンドがあって各ポートの LED が制御できるようです。

これを使って、シェルスクリプトを書いてみました。

setLEDs 関数の引数で5つのポートの状態を渡すようにしています。0 は OFF(本当は collision を表示するのですが実質 OFF でしょう (^^;))、1 が ON、2 が点滅です。

最後に、resetLEDs 関数で link を表示する状態に戻しています。

sleep 1 を入れていますが意外に遅くて入れなくても十分見える速度でしたが、イルミネーション的には1秒くらいのゆっくりが良いと思って入れています。

#!/bin/sh

resetLEDs() {
    i=0
    while [ $i -lt 5 ]; do
        swconfig dev rt305x port $i set led 0
        i=`expr $i + 1`
    done
    swconfig dev rt305x set apply 1
}

setLEDs() {
    leds="$1"

    i=0
    while [ $i -lt 5 ]; do
        v=`echo "$leds" | sed -e 's/^\(.\).*$/\1/'`
        leds=`echo "$leds" | sed -e 's/^.//'`
        case "$v" in
        0)  # on when collision
            led_attr=4
            ;;
        2)  # blink
            led_attr=10
            ;;
        1|*) # on
            led_attr=12
            ;;
        esac
        swconfig dev rt305x port $i set led $led_attr
        i=`expr $i + 1`
    done
    swconfig dev rt305x set apply 1
}

setLEDs "00000"; sleep 1
setLEDs "00001"; sleep 1
setLEDs "00010"; sleep 1
setLEDs "00100"; sleep 1
setLEDs "01000"; sleep 1
setLEDs "10000"; sleep 1
setLEDs "00100"; sleep 1
setLEDs "01010"; sleep 1
setLEDs "10001"; sleep 1
setLEDs "20002"; sleep 1
setLEDs "02020"; sleep 1
setLEDs "00200"; sleep 1
setLEDs "20202"; sleep 1
setLEDs "02020"; sleep 1
setLEDs "20202"; sleep 1
setLEDs "02020"; sleep 1

setLEDs "20000"; sleep 1
setLEDs "02000"; sleep 1
setLEDs "00200"; sleep 1
setLEDs "00020"; sleep 1
setLEDs "00002"; sleep 1
setLEDs "00000"; sleep 1

resetLEDs

2012年11月 5日 (月)

【OpenWRT with OpenFlow 1.0 プログラミング】ブリッジを作る

【OpenWRT with OpenFlow 1.0 プログラミング】というタイトルほど大げさではないですが先日公開した MZK-WNH のファームで OpenFlow を使ったブリッジのプログラミングをしてみます。

OpenFlow コントローラなしでお手軽プログラミング。
■手順:
1) 対象の OpenWRT with OpenFlow 1.0 にtelnet でログイン。
2) 以下を実行

dpctl del-flows unix:/var/run/dp0.sock
dpctl add-flow unix:/var/run/dp0.sock idle_timeout=0, hard_timeout=0,actions=FLOOD

できあがりです。
■解説
1行目は全フローエントリを削除する del-flows を実行しています。電源投入後なら不要ですが念のため。
2行目は、どのようなパケットが入ってきても FLOOD 機能で転送するというものです。パケットが入ってきたポート以外のポートにパケットを出力するという便利な機能です。
「FLOOD」は、OpenFlow 1.0 の規格ではオプション扱いで必須機能ではないですが、先日公開したファームの OpenWRT with OpenFlow 1.0 ではサポートされています。
■注意
設定は OpenFlow のプロセスが生きている間のみ有効です。リブートしたり、電源切ったらやり直しです。
■参照
OpenFlow 1.0 の FLOOD の記載については
 P.6
にあります。
以下、抜粋
Optional Action: Forward. The switch may optionally support the following
virtual ports:
  略
  FLOOD: Flood the packet along the minimum spanning tree, not includ-
  ing the incoming interface.
■雑感
最近はどんなに安いものでもL2スイッチが当たり前になってしまい全ポートにパケットをばらまくことはしなくなり、パケットキャプチャをするためにはミラーポートの機能が必要になってきています。
ここで作ったブリッジであれば各ポートにパケットをばらまくのでどのポートからでもキャプチャできます(のはずです...)

« 2012年10月 | トップページ | 2012年12月 »

最近のトラックバック

無料ブログはココログ