無線LANアクセスポイント化【7】
Category : サーバ管理日記
Published by M-naka on 2005/11/27
ハードル高いな……。
 IEEE802.11gな無線LANアクセスポイントの構築に挑戦。

 従来使用していたアクセスポイントはPrismチップ+hostapドライバによるIEEE802.11b規格のもの。規格上は最大11Mbpsだが、実効速度は数Mbps程度。Webブラウズには支障が無いが、ファイルサーバへのアクセス、特に録画ファイルの読み出しが難しい。ビットレートの低いDivXで録画しているCasperのファイルは問題ないが、MPEG2で録画しているAmatsuのファイルは見られなかった。

 現在最も普及しているIEEE802.11gの無線LANチップはAtheros Communications製。で、Atherosチップには「Madwifi(Multiband Atheros Driver for wifi)」という、Linux用(でいいのか?)ドライバが存在する。このMadwifiはMasterモード、すなわちアクセスポイントモードをサポートしており、hostapのように無線LANアクセスポイントを構築することができる。

 このMadwifi、オープンソースではあるものの、コア部分の「HAL(Hardware Access Layer)」と呼ばれるモジュールはクローズドソースとなっている。どうもAtheros自身はオープンソースにしたいようなのだが、ハードウェア実装されている暗号化モジュール(WEPやらTKIPやら)の制御系までオープンにされるのが国家的にイクナイ!らしく、アメリカ連邦通信委員会にオープンソース化を止められているらしい(FCCレギュレーション)。そのため、HALモジュールはバイナリの形で配布されている。また、クローズドソースの部分があるためにLinuxカーネルにも取り込んでもらうことができない、ということらしい。機能的にはほぼ同等ながらオープンソースなドライバで動くPrism54とは対照的である。メーカーとしてフルオープンソースドライバを提供するのはダメだけど、コミュニティが勝手に出す分には構わない、ということなのだろうか?

 話が横に逸れたが、以下、Madwifiを使ったIEEE802.11g無線LANアクセスポイントの構築方法を記す。


1.サーバの設定と無線LANカードの準備
 今回IEEE802.11gアクセスポイント化するのはVine3.1で動作中のCasper。理由はIEEE802.11bアクセスポイントとして動作しており、原則としてカードの取替えとドライバのセットアップだけで済むと判断したため(実際はもっと大変だが)。
 手持ちのAtherosチップの載ったカードはアイオーデータの「WN-G54/CB3」とコレガの「CG-WLCB54GS」。これを使う。どちらも一応Madwifiで動作実績があるようだ。

2.Madwifiのコンパイルとインストール
 現在Madwifiは過渡期らしく、旧来の延長であるMadwifiと、新チップへの対応やSuper-G(高速化技術)やX-Range(長距離化技術)へのいち早い対応を表明しているMadwifi-ng(NewGenerationの略か?)の2種類がある。手持ちのカードは比較的新しいのと、Super-G対応モデルなので、Madwifi-ngを使うことにした。ソースtarボールもMadwifiとMadwifi-ngでダウンロードサイトが異なる。Madwifi-ngはここで入手。
 インストール自体は簡単で、tarボールを展開し、make→make installで終了。ドライバは/lib/modules/(kernel version)/net以下にインストールされる。インストール後、「modprobe ath_pci」でドライバモジュールがロードされる。

3.PCカードスロット周り
 hostapでIEEE802.11bなAPを構築したときにPCカードスロットを当然使えるようにしているので、とりあえずカードを交換することから始める。cardctl identでカード情報を拾える……ハズなのだが、認識できない。lspciではAtheros製チップが載っているという情報までは拾えているので、何か変だ。
 デバイスがドライバを掴んでいるかどうかを確認するため、dmesgを見てみると、「ath_pci: cannot reserve PCI memory region」というエラーが出ている。何じゃこれは?
 調べてみると、これはカーネル側の問題のようだ。メモリアロケーションエラーというやつ。以前Amatsuにキャプチャボードを取り付けたときにメモリスタック4KB上限問題があってカーネルを総入れ替えしたことがあったが、それと同様の問題のようだ(詳しく判らないのが悔しいが)。
 カーネルソースのdrivers/pcmcia/yenta.c「yenta_allocate_res」のmask 値を「~0xfff;」から「~0xffff;」に変更し、カーネルモジュールを作り直す(yenta_socketはモジュールなので)。これでメモリアロケーションの上限値が上がる。
 カーネルモジュールを入れ替えて再起動し、cardctl identするとAtheros Communicationsの文字が。正しく認識されたようだ。


 続く。