2009年2月1日

LinuxでAtherosチップ搭載Wi-Fiカードを使用する

CentOSはRed Hat Enterprise Linux (以下RHEL) を元に商用部分を削除して再構成したLinuxです。

[CentOS]
http://centos.org/

今回はAtheros製チップ搭載Wi-FiカードのNEC「WL54AG」をCentOS 5で動かしてみます。
また、暗号化はWEPではなくWPAを使用してみます。

[WL54AG]
http://121ware.com/product/atermstation/product/warpstar/satellite/wl54ag.html

(1)ドライバのインストール (カーネルパッチ)
まずは、CentOSはAtheros製チップにデフォルトで対応していません。
カーネルパッチとして提供されているドライバを適用しなければなりません。
MadWifiというソフトを導入します。
今回は安定版を使用します。

[MadWifi]
http://madwifi.org/

[MadWifi 安定版ダウンロードサイト]
http://sourceforge.net/projects/madwifi/

私はmadwifi-0.9.4.tar.gzをダウンロードし、gzipやtarで /tmp/madwifi-0.9.4/ に展開しました。
このmadWifiはコンパイルを行う必要があるため、CentOSには事前に開発環境をインストールしておく必要があります。
さて、RHEL系のCentOSはこのままではMadWifiはコンパイルエラーとなってしまいます。
compat.hを書き換えます。

/tmp/madwifi-0.9.4/include/compat.h の139行目から167行目まで削除します。

//////////////////////////////////////////////////
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
return skb->end;
}

………

static inline void skb_reset_mac_header(struct sk_buff *skb)
{
skb->mac.raw = skb->data;
}
//////////////////////////////////////////////////
※compat.hをviやEmacsなどで開いてこれらの行を削除。

そして削除した行に次の定義文を追加します。

//////////////////////////////////////////////////
#define skb_end_pointer(_skb) ((_skb)->end)
#define skb_tail_pointer(_skb) ((_skb)->tail)
#define skb_set_network_header(_skb, _offset) \
do { (_skb)->nh.raw = (_skb)->data + (_offset); } while (0)
#define skb_reset_network_header(_skb) \
do { (_skb)->nh.raw = (_skb)->data; } while (0)
#define skb_mac_header(_skb) ((_skb)->mac.raw)
#define skb_reset_mac_header(_skb) \
do { (_skb)->mac.raw = (_skb)->data; } while (0)
//////////////////////////////////////////////////
※バックスラッシュ(\)に注意。

後は/tmp/madwifi-0.9.4/で次のコマンドを実行するとカーネルにパッチが適用されWi-Fiカード「WL54AG」が認識できるようになります。
# make
# make install

(2)ネットワークインターフェイスの作成
/etc/sysconfig/network-scripts/ifcfg-ath0 ファイルを作成します。
自動認識でifcfg-wifi0が作成される場合もありますが、Madwifiはath0インターフェイスを使用するようなのでifcfg-ath0を作成します。

//////////////////////////////////////////////////
DEVICE=ath0
ONBOOT=yes
BOOTPROTO=dhcp
HWADDR=
TYPE=Wireless
USERCTL=no
IPV6INIT=no
ESSID=<使用するステーションのESSIDを記入>
MODE=Managed
RATE=Auto
IWPRIV="mode 3 bgscan 0 xr 1 burst 1 ar 1 compression 1"
/////////////////////////////////////
/////////////

・MODE=Managed

 →インフラストラクチャー・モードを明示的に使用します。
・IWPRIV="mode 3 bgscan 0 xr 1 burst 1 ar 1 compression 1"
 →mode … 1は802.11a規格、2は802.11b規格、3は802.11g規格
 →bgscan … 1にするとバックグラウンドでステーションを探します。今回はステーションは固定なので0にします。
 →xr … Atheros製チップの機能「XR」を使用
するときは1にします。
 →burst … Atheros製チップの機能「Super AG」のフレームバースティングを使用するときは1にします。
 →ar … Atheros製チップの機能「Super AG」の無線ネットワーク最適化を使用するときは1にします。
 →compression … Atheros製チップの機能「Super AG」のリアルタイム圧縮を使用するときは1にします。

IWPRIVの「Super AG」についてはcompressionだけを指定すれば良いような気もしますが。。。

(3)ドライバロード定義の追記

/etc/modprobe.conf にMadwifiドライバのロード定義を追記します。
//////////////////////////////////////////////////
alias ath0 ath_pci
options ath_pci countrycode=392 autocreate=sta
//////////////////////////////////////////////////

これでWi-Fiカード「WL54AG」が認識されWEPまでは使用できるようになります。
次はWPAを使用するためwpa_supplicantを設定します。

(4)wpa_supplicant.confの設定
wpa_supplicantはWi-FiのWPAの使用を支援するデーモンです。
まずはパスフレーズからハッシュを生成し、 /etc/wpa_supplicant/wpa_supplicant.conf へ追記します。
# /usr/sbin/wpa_passphrase straypenguin 'パスフレーズ' >> /etc/wpa_supplicant/wpa_supplicant.conf

パスフレーズはステーション側に設定しているWPAのパスフレーズを指定します。
あとは必要なパラメータを追記し、整理します。
//////////////////////////////////////////////////
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

network={
scan_ssid=0
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
ssid=<ステーションのESSID>
#psk=<パスフレーズ>
psk=<ハッシュされたパスフレーズ>
priority=1
}
//////////////////////////////////////////////////
・proto=WPA
 →WPA か WPA2のどちらを使用するか指定します。
・key_mgmt=WPA-PSK

 →鍵の管理にWPA-PSKを使用することを明示的に指定します。
・pairwise=CCMP TKIP
 →ユニキャスト用に、ASK (CCMP) とTKIPのどちらかを受け入れるか指定します。上記は両方受け入れる設定です。
・group=CCMP TKIP
 →ユニキャスト用に、ASK (CCMP) とTKIPのどちらかを受け入れるか指定します。上記は両方受け入れる設定です。
・ssid=<ステーションのESSID>

 →使用するステーションのESSIDを指定します。
・psk=
 →使用するWPAのパスワードを指定します。平文そのものでも良いですが、ハッシュした値を記載した方が安全です。
・priority=1
 →複数のステーションが使用できるときの優先度を指定します。

(5)wpa_supplicant起動パラメータの設

/etc/sysconfig/wpa_supplicant に設定を書き込みます。
//////////////////////////////////////////////////
# wlan0 and wifi0
# INTERFACES="-iwlan0 -iwifi0"
INTERFACES="-iath0"
# ndiswrapper and prism
# DRIVERS="-Dndiswrapper -Dprism"
DRIVERS="-Dmadwifi"
///////////////////////////////////////
///////////
・INTERFACES="-iath0"
 →ベースデバイスであるwifi0ではなくVAPであるath0を指定します。
・DRIVERS="-Dmadwifi"
 →Madwifiのドライバを使用するように指定します。
  動作しない場合は DRIVERS="-Dwext" を試してみてください。

(6)
wpa_supplicantの起動設定
ifupより前にwpa_supplicantを起動するため起動順番を変更します。
/etc/rc.d/init.d/wpa_supplicant の5行目を次のように変更します。
//////////////////////////////////////////////////
# chkconfig: 2345 09 88
//////////////////////////////////////////////////

wpa_supplicantのデーモンの自動起動をONにします。
# chkconfig wpa_supplicant on

再起動してみます。

これでCentOSでも無線LANが使用できるようになりました。
なお、DNS設定をお忘れなく。

気をつけなければならない点は、カーネルのアップデートを行うとカーネルパッチとして提供されているMadWifiのドライバが使えなくなってしまう点です。
再度、madWifiの「make」と「make install」を行うことで利用可能になります。

0 件のコメント: