2014年1月6日月曜日

obsA7-008 無線LAN

アクセスポイント(無線LANブリッジ)として使用する場合の設定を行ったときのメモです。

1.無線LAN子機 WLI-UC-GN

BUFFALO WLI-UC-GN、このWLI-UC-GNは、 obs600でも使用していたもの (記事2011年6月19日 obs600-10 BUFFALOアダブタ) で、やや安定感が低く時々はドライバをUnload/Loadしながらで、やがて使わなくなっています。linux-2.6.36のときから、linux-3.2.40にアップグレードした今回のドライバではどうでしょうか。
WLI-UC-GN抜き差ししやすいように、短めの延長ケーブルを使っている。
ドライバのビルドせずともWLI-UC-GNアダプタを刺すだけで認識した。
% tail -f /var/log/syslog
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: new high-speed USB device number 6 using orion-ehci
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: New USB device found, idVendor=0411, idProduct=015d
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: Product: 802.11 n WLAN
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: Manufacturer: Ralink
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: SerialNumber: 1.0
Jan  6 11:11:05 obsa7 kernel: usb 1-1.2: reset high-speed USB device number 6 using orion-ehci
Jan  6 11:11:05 obsa7 kernel: ieee80211 phy18: Selected rate control algorithm 'minstrel_ht'
Jan  6 11:11:05 obsa7 kernel: Registered led device: rt2800usb-phy18::radio
Jan  6 11:11:05 obsa7 kernel: Registered led device: rt2800usb-phy18::assoc
Jan  6 11:11:05 obsa7 kernel: Registered led device: rt2800usb-phy18::quality
Jan  6 11:11:05 obsa7 kernel: usbcore: registered new interface driver rt2800usb
# lsmod
Module                  Size  Used by
rt2800usb              12586  0
rt2800lib              39792  1 rt2800usb
crc_ccitt               1045  1 rt2800lib
rt2x00usb               7293  1 rt2800usb
rt2x00lib              29900  3 rt2x00usb,rt2800lib,rt2800usb
まず始めは、rtl8192cu な GW-USValue-EZを試みたがうまく設定できなかった。
この rt2800usb はすんなりと動いた。
% uname -a #OBSA7標準のこのバージョンを使用
Linux obsa7 3.2.40 #1 Mon Oct 21 14:10:25 JST 2013 armv5tel GNU/Linux

2.ralinkファームウェアインストール

# aptitude install firmware-ralink
The following NEW packages will be installed:
  firmware-ralink
0 packages upgraded, 1 newly installed, 0 to remove and 2 not upgraded.
Need to get 21.4 kB of archives. After unpacking 96.3 kB will be used.
Get: 1 http://ftp.plathome.co.jp/pub/debian/ wheezy/non-free firmware-ralink all 0.36+wheezy.1 [21.4 kB]
Fetched 21.4 kB in 0s (82.6 kB/s)
Selecting previously unselected package firmware-ralink.
(Reading database ... 33634 files and directories currently installed.)
Unpacking firmware-ralink (from .../firmware-ralink_0.36+wheezy.1_all.deb) ...
Setting up firmware-ralink (0.36+wheezy.1) ...

# rt2*.bin rt3*.bin rt73.bin がインストールされる
# ls /lib/firmware/
RTL8192E     mts_cdma.fw  rt2661.bin  rt3090.bin  ti_5052.fw
RTL8192SU    mts_edge.fw  rt2860.bin  rt73.bin   whiteheat.fw
edgeport     mts_gsm.fw   rt2870.bin  rtl_nic   whiteheat_loader.fw
kaweth      rt2561.bin   rt3070.bin  rtlwifi
keyspan_pda  rt2561s.bin  rt3071.bin  ti_3410.fw

3.hostapdのインストール

% wget http://hostap.epitest.fi/releases/hostapd-2.0.tar.gz
% tar zxf hostapd-2.0.tar.gz
% cd hostapd-2.0/hostapd
% cp defconfig .config
% echo CONFIG_LIBNL32=y >> .config

% diff defconfig .config  #CONFIG_IEEE80211N=yも変更した
139c139
< #CONFIG_IEEE80211N=y
---
> CONFIG_IEEE80211N=y
269a270
> CONFIG_LIBNL32=y

% sudo apt-get libnl-genl-3-dev libssl-dev
% make
# make install
# /usr/local/bin/hostapd -v
hostapd v2.0
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2012, Jouni Malinen  and contributors

#hostapd.confはとりあえず動いた状態でまだ吟味できていない
# cat /etc/hostapd/hostapd.conf
interface=wlan0
bridge=br0
driver=nl80211
country_code=JP
ieee80211d=1
ssid=MYSSID
channel=6
hw_mode=g
wpa=2
wpa_passphrase=MYPASSPHRASE
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ieee80211n=1
wmm_enabled=1
#

4.hostapdの実行

# /usr/local/bin/hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
rfkill: Cannot open RFKILL control device
Using interface wlan0 with hwaddr 4c:e6:76:XX:XX:XX and ssid "MYSSID"
^C 起動を確認して中断し、backgroundの-Bをつけて起動。
# /usr/local/bin/hostapd -B /etc/hostapd/hostapd.conf

# iwconfig 2>&1|egrep -v "^$|no wireless"
wlan0     IEEE 802.11bgn  Mode:Master  Frequency:2.437 GHz  Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

mon.wlan0  IEEE 802.11bgn  Mode:Monitor  Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 4c:e6:76:XX:XX:XX
          inet6 addr: fe80::4ee6:76ff:XXX:YYYY/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:36414 errors:0 dropped:0 overruns:0 frame:0
          TX packets:48406 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4066244 (3.8 MiB)  TX bytes:39695195 (37.8 MiB)

# tail -f /var/log/syslog
Jan  6 11:44:59 obsa7 kernel: device wlan0 entered promiscuous mode
Jan  6 11:44:59 obsa7 kernel: br0: port 2(wlan0) entering forwarding state
Jan  6 11:44:59 obsa7 kernel: br0: port 2(wlan0) entering forwarding state
Jan  6 11:45:02 obsa7 ntpd[3148]: Listen normally on 32 wlan0 fe80::4ee6:76ff:XXX:YYYY UDP 123
Jan  6 11:45:02 obsa7 ntpd[3148]: peers refreshed
Jan  6 11:45:10 obsa7 kernel: wlan0: no IPv6 routers present
Jan  6 11:45:14 obsa7 kernel: br0: port 2(wlan0) entering forwarding state

Jan  6 11:45:58 obsa7 hostapd: wlan0: STA 84:7a:88:XX:XX:XX IEEE 802.11: authenticated
Jan  6 11:45:58 obsa7 hostapd: wlan0: STA 84:7a:88:XX:XX:XX IEEE 802.11: associated (aid 1)
Jan  6 11:45:58 obsa7 hostapd: wlan0: STA 84:7a:88:XX:XX:XX RADIUS: starting accounting session 52CA18AB-00000000
Jan  6 11:45:58 obsa7 hostapd: wlan0: STA 84:7a:88:XX:XX:XX WPA: pairwise key handshake completed (RSN)
syslogにこのようなメッセージで"WPA: pairwise key handshake completed"がでてるとOK。

5.rt2800usbドライバのアンロード/ロード

別ドライバGW-USValue-EZなどrtl8192cuをテストするのにドライバのアンロード/ロードをするたびに、wlan0,wlan1,wlan2...とインターフェイス名が変わるのはおもしろくないので、wlan0固定で使えるように以下のようなスクリプトを書いて回避するようにした。
インターフェイス名はこのファイルが影響するもよう
# tail -3 /etc/udev/rules.d/70-persistent-net.rules

# USB device 0x:0x (rt2800usb)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="4c:e6:76:3c:a9:01", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

#70-persistent-net.rulesの後ろ3行を削除して、ドライバをロードすると、
#いつも"wlan0" になるが、もっとスマートな方法がありそうな...

# cat /etc/init.d/bridge.sh
#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
LINK=`cat /etc/LIF`  #もしくはLINK=eth0
WIF=${WIF:=eth1}
case "$1" in
  start)
    echo -n "Configuring bridge interfaces..."
    ps ax|grep dhclient|grep -qv grep
    if [ $? != 1 ]; then
       killall dhclient
    fi
    lsmod | grep -q rt2800usb
    if [ $? != 1 ]; then
       rmmod rt2800usb rt2800lib crc_ccitt rt2x00usb rt2x00lib
    fi
    RDIR="/etc/udev/rules.d"
    RULE="70-persistent-net.rules"
    RSRC=${RDIR}/${RULE}
    WLAN="wlan0"
    if [ -f $RSRC ]; then
           grep -q $WLAN $RSRC
           if [ $? = 0 ]; then
              RTMP="/tmp/${RULE}"
              cp -p $RSRC $RTMP
              POS1=`egrep -n $WLAN $RTMP |head -1| cut -d: -f1`
              POS0=`expr ${POS1} - 2`
              sed -e ${POS0},${POS1}d $RTMP > $RSRC
           fi
    fi
   #diff /tmp/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules
   # vi /etc/udev/rules.d/70-persistent-net.rules  ...  sed /wlan0/d
    brctl addbr br0
    brctl addif br0 $LINK
    ifconfig $LINK 0.0.0.0 up
    sleep 1
    modprobe rt2800usb
    ( sleep 2; /sbin/dhclient -q ${WIF}; sleep 5; \
      /usr/local/bin/hostapd -B /etc/hostapd/hostapd.conf ) &
    echo "done."
      ;;
  stop)
    echo -n "Deconfiguring bridge interfaces..."
    ps ax|grep hostapd|grep -qv grep
    if [ $? != 1 ]; then
        killall hostapd
    fi
    killall dhclient
    ifconfig -a|grep -q br0
    if [ $? != 1 ]; then
       ifconfig br0 0.0.0.0 down
    fi
    ifconfig $LINK 0.0.0.0 down
    lsmod | grep -q rt2800usb
    if [ $? != 1 ]; then
       rmmod rt2800usb rt2800lib crc_ccitt rt2x00usb rt2x00lib
    fi

    brctl delif br0 $LINK
    brctl show|grep -q $LINK
    if [ $? != 1 ]; then
       brctl delif br0 $LINK
    fi
    brctl show|grep -q br0
    if [ $? != 1 ]; then
       brctl delbr br0
    fi
    echo -n "dhclient $LINK . "
    /sbin/dhclient -q $LINK
    echo "done."
      ;;
  *)
    echo "Usage: $0 {start|stop}" >&2
    exit 1
      ;;
esac
#
/etc/network/interfaces に指定するのがスマートなのでしょうが、テスト時の柔軟さを優先すると、スクリプト書きが好みです。 安定して動作するか、転送速度・性能を含めて経過観察していきたい。

6.WLI-UC-GN稼働状況(追記2014.4.21)

OBS A7 は実に安定している。堅牢ということばが似合うルータだ。
遅ればせながら、# aptitude update と # aptitude safe-upgrade を行い
kernel-image や OpenSSL を含むアップデートを行う前に、wlan0のインターフェイス を確認しておく。
% date
Mon Apr 21 09:39:04 JST 2014

% uptime
 09:39:29 up 93 days, 19:35,  2 users,  load average: 0.05, 0.09, 0.06

% ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 4c:e6:76:3c:a9:01
          inet6 addr: fe80::4ee6:76ff:fe3c:a901/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:34453010 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36020512 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2098197015 (1.9 GiB)  TX bytes:3952858575 (3.6 GiB)
wlan0は連続93日稼働で、TX側36020512パケットで(3.6 GiB)となっている。
br0       Link encap:Ethernet  HWaddr 00:0a:85:09:01:74
          inet addr:192.168.1.30  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20a:85ff:fe09:174/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44300752 errors:0 dropped:2 overruns:0 frame:0
          TX packets:67218375 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5603503687 (5.2 GiB)  TX bytes:83616546596 (77.8 GiB)
ちなみにブリッジinterface br0には77.8 GiB流量があったようだ。
ここまでの約3ヶ月、WLI-UC-GNは問題なく、とても良く働いてくれている。

そして、iPerfでobsA7とiMac間をパフォーマンス測定すると。
(obsA7側) % iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.1.30 port 5001 connected with 192.168.1.62 port 65098
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.1 sec  37.5 MBytes  31.1 Mbits/sec

(iMac側) % iperf -c obsa7
------------------------------------------------------------
Client connecting to obsa7, TCP port 5001
TCP window size:  129 KByte (default)
------------------------------------------------------------
[  5] local 192.168.1.62 port 65098 connected with 192.168.1.30 port 5001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0-10.1 sec  37.5 MBytes  31.2 Mbits/sec
およそ無線LANでは、31Mbits/secと計測できた。

ちなみに有線LANだと。以下のように132Mbits/secと計測した。
(obsA7側) % iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.1.30 port 5001 connected with 192.168.1.61 port 65039
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec   157 MBytes   132 Mbits/sec

(iMac側) % iperf -c obsa7
------------------------------------------------------------
Client connecting to obsa7, TCP port 5001
TCP window size:  129 KByte (default)
------------------------------------------------------------
[  5] local 192.168.1.61 port 65039 connected with 192.168.1.30 port 5001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0-10.0 sec   157 MBytes   132 Mbits/sec
# iwconfig
wlan0     IEEE 802.11bgn  Mode:Master  Frequency:2.437 GHz  Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
mon.wlan0  IEEE 802.11bgn  Mode:Monitor  Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
今は、/etc/hostapd/hostapd.conf のhw_mode=gだが、ここが11nでいつか動けばいいなぁ。