2010/01/25

AlixでXG-601を使って無線LAN APを作ってみる

XG-601なカードを調べてみる

XG-601のスペックは以前調べていて、WEPまでの対応と書かれていました。 WPAに対応するためにはハードウェアサポートが必須だと思っていたのですが、ここに勘違いがあったようです。

たまたまマイコミの森井教授の記事を眺めていてWPA-TKIPはWEPとほぼ互換な機能だとありました。 これならソフトウェアだけで動くのかもしれないと思い、alixにXG-601を装着して無線LANクライアントとhostapdによるAP(Access Point)化を試してみました。

Lennyでの無線LAN環境の構築

とりあえず次のようなパッケージを導入しました。

  • wireless-tools
  • wpasupplicant
  • libnl-dev
  • bridge-utils

hostapdはパッケージだと0.5.xで古いので、hostapdの配布元からダウンロードしてコンパイルする事にしました。 最終的に開発版のhostapd-0.7.1.tar.gzを使って動かしています。

hostapdのコンパイルをalix上で行なうのであれば、build-essentialパッケージで一括か、gcc, make libc6-devパッケージを個別にインストールするのが良いと思われます。

Debian lennyとXG-601で無線LANを使うための作業と資料

Ubuntuではfirmwareなどが準備に準備されているため追加の作業は必要ありません。 firmwareは無線LANカードに搭載されたMIPSやARMといったCPU用のバイナリコードです。

Debian lennyではこのfirmwareが準備されていないため自前で配置します。 以前調べた時にみつけた参考資料として、debianでのprism系無線LANドライバを使うためのドキュメントがあります。 lennyで試す時にp54pciドライバが読み込むfirmwareを/lib/firmwareディレクトリに配置しました。

$ sudo wget -O /lib/firmware/isl3886 http://daemonizer.de/prism54/prism54-fw/fw-softmac/lmac_2.7.0.0.arm
$ sudo wget -O /lib/firmware/isl3886pci http://daemonizer.de/prism54/prism54-fw/fw-softmac/2.13.12.0.arm

このファイルを読み込ませるためには、p54pciモジュールを削除してから再度読み込ませるか、システムをリブートします。

$ sudo /sbin/modprobe -r p54pci
$ sudo /sbin/modprobe p54pci
クライアントとして起動

まずはhostapdを使わず、クライアントとして動かすために/etc/network/interfacesファイルを編集しました。

以前書いたUbuntu 9.10を無線LANクライアントにする記事を参考にinterfacesファイルの設定をコピーしています。 インタフェースはwlan0という名前なので、ra0となっていた個所はwlan0で書き換えました。 その他はssidwpa_passphraseを書き換えて、設定ファイルを閉じたらifupを使ってインタフェースを起動します。

$ sudo ifup wlan0

これでlenny付属のカーネル2.6.26-2-486では問題なく動きました。 ここまでは順調なんですよね。すくなくともクライアントとして動かす分には問題なさそうです。

XG-601を使った無線LAN APの構築

いよいよ本命のXG-601 AP化にとりかかってみます。

br0インタフェースの準備

他のAP構築を説明する記事では、wlan0自体にはIPアドレスを割り当てず、eth0とブリッジするためにbr0をよく使っています。

もしbr0を使わない方法も考えられて、wlan0にIPアドレスを割り当ててゲートウェイとして使う事で、無線LANクライアントをNATで閉じ込めるか、wlan0をデフォルトゲートウェイとするサブネットワークを構成するといった対応があると思います。 いずれにしても新たにサブネットワークを準備する必要性がないので、eth0が接続されている既存の192.168.10.0/24の一部として無線LANクライアントを構成する事にしました。

interfacesファイルを編集しますが、必ずbridge-utilsパッケージを導入してください。

変更前:/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 192.168.10.10
  netmask 255.255.255.0
  gateway 192.168.10.1

変更:/etc/network/interfaces

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
  address 192.168.10.10
  netmask 255.255.255.0
  gateway 192.168.10.1
  bridge_ports eth0 wlan0

ここで一度システムを再起動して、br0に192.168.10.10のアドレスが割り当てられるか確認します。

hostapdをコンパイル

開発版のhostapd-0.7.10を準備しました。 コンパイルの手順はどちらも同じです。

$ tar xvzf hostapd-0.7.1.tar.gz
$ cd hostapd-0.7.1/hostapd
$ cp defconfig .config
$ vi .config
$ make

$ diff defconfig .configの結果

23c23
< #CONFIG_DRIVER_NL80211=y
---
> CONFIG_DRIVER_NL80211=y

最終的にはデーモンとして起動しますが、設定途中でメッセージを端末に出力しつつ動作を確認する(-ddオプション)には次のように動かします。

$ cd ~/hostapd-0.7.1/hostapd
$ sudo ./hostapd -dd hostapd.conf

XG-601なPRISM GTカードは明示的にはサポート対象の中には入っていません。 ただp54pciモジュールはSoftMACに対応しているはずで、driver=nl80211でカバーされる範囲に入っているはずなのでこれを指定したところkernelのバージョンによっては問題なく動きました。

ただp54pciなカードをnl80211として動かすというところが後々の問題の原因なのかもしれません。

lenny+hostapd-0.7.1で稼働するカーネルのバージョン

まずデフォルトの2.6.26ではhostapdは動きませんでした。 安定して動いているのはlinux-2.6.30.10です。

linux-2.6.31がコンパイルすら失敗するのは御愛嬌としても、linux-2.6.31.x〜linux-2.6.33-rc5(mainline)までしばらく動かすとkernel panicを引き起すという現象が発生しています。

linux-2.6.30.10カーネルのコンパイルについては、別の記事(Debian Lennyでのカーネルコンパイル)を参考にしてください。

hostapdの設定ファイル

動きを確認したhostapd.confの設定ファイルは次のようになっています。

$ egrep -v ^# hostapd.conf| grep -v ^$

hostapd.confファイル

interface=wlan0
bridge=br0
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=xxxxxxxxxxxx
country_code=JP
ieee80211d=1
hw_mode=g
channel=9
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
ieee8021x=0
eapol_key_index_workaround=0
eap_server=0
own_ip_addr=127.0.0.1
wpa=1
wpa_passphrase=xxxxxxxxxxxxxxxxxxxxxxxxx
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=TKIP CCMP
Windows Vistaからアクセスしてみる

デフォルトの2.6.26では起動すらしてくれないので、linux-2.6.32.4を最初に試してみました。

このAPにInspiron 640mのWindows Vista SP2 32bitからアクセスしてみました。 ちゃんとインターネットにも接続できるのですが、linux-2.6.31以降では数分するとkernel panicを起します。

kernel panic時のメッセージ

[  216.410165] BUG: unable to handle kernel paging request at ffffffab
[  216.412286] IP: [<d096f965>] p54_tx+0x545/0x750 [p54common]
[  216.412286] *pde = 0081d067 *pte = 00000000
[  216.412286] Thread overran stack, or stack corrupted
...
[  216.412286] Call Trace:
[  216.412286]  [<c04adf9b>] ? llc_rcv+0x2b/0x2f0
[  216.412286]  [<c049337b>] ? kfree_skb+0x3b/0x80
[  216.412286]  [<c04adf9b>] ? llc_rcv+0x2b/0x2f0
[  216.412286]  [<c049e667>] ? netif_receive_skb+0x367/0x580
[  216.412286]  [<d0912ccf>] ? __ieee80211_tx+0x8f/0xc0 [mac80211]

このメッセージに続くところをみてみると、p54_txのところで問題が発生しているのに呼び出し元はnetif_receive_skbみたいなんですよね。「p54_rxじゃないんだ…」とか思っても、ここら辺の知識はほとんどないのでお手上げです。 メモリリークのスピードが速すぎて観測できないのかもしれないけれど、 skbの取り扱いにバグがあるんじゃないかな…、と思います。

もう手に負えないので、いくつかのバージョンを試してlinux-2.6.30.10は問題もなく、いまのところ安定して動く事がわかりました。

まとめ

結局のところ2.6.30.10では無事に稼働し、2.6.31では無線LAN自体が動きませんでした。 2.6.30.10では安定しているので、これを家の無線LAN APとして使っていこうと思います。 余裕があれば実家にコレガのWLBAR-54GTが余っているので、そこからXG-601を取り出して少しづつバージョンを上げて原因を追っていこうと思います。ま、やっても自分の力じゃ無理な感じがしますけどね。

0 件のコメント: