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の文字が。正しく認識されたようだ。
続く。