funini.com 自由研究 Wireless LAN

Linux 無線LANの憂鬱

Linux での無線LAN環境は大変混沌としています。 iwconfig というコマンドがあるため、これでifconfig のように簡単に設定ができるかと 思いきや、wpa の場合はwpa_supplicant を用います。 しかも、ドライバがやたらとLinuxカーネルのバージョンに依存したり、 同じドライバなのに wpa_supplicant に指定するドライバ名が異なったりします。
なぜこんな風になってしまったのか、今後はどうなっていくのかをまとめてみます。

ドライバとは

コンピュータは CPU とメモリがあれば基本要素は終わりなのですが、 それだけでは普通役に立ちません。 計算元のデータは外部から入れてあげないといけないし、計算結果を保存する場所も必要です。 人間が操作するための色んな機械も必要です。これらを「デバイス」といいます。 マウスとか、ハードディスクとか、LANカードとか、一つ一つ全部が「デバイス」です。
これらのデバイスは、必ずしも標準化されていないため、カーネルの基本機能ではなく、「ドライバ」として提供されています。 ドライバは、カーネルの一部になって、そのデバイスから情報を読み書きしたり、デバイスに情報を設定したりします。 実行モードはカーネルと同じ特権モードになることができます。

ドライバと ioctl


Unix では、色んなデバイスを表すのに /dev/*** というデバイスファイルというものを用います。 これは特別なファイルで、普通直接編集したり書き込んだりはしませんが、ある決まった書き方(write)や読み方(read)をすると、ドライバ経由でデータをやりとりすることができます。 仕組みとしては、ドライバに 「readされたらこの関数を実行する」「write されたらこの関数を実行する」というのが登録されていて、あるデバイスを read すると、そのデバイスのドライバの read に対応する関数が呼び出されます。read, write は、連続したバイト列を入出力するのに便利な方法です。
ドライバとのデータのやりとりは、read/write だけではなく、色々な方法があります。中でも少し異色なものとして、ioctl があります。 これは、デバイスに2つの引数を渡すことが出来ます。一つはコマンドで、もう一つは整数値 (多くの場合、構造体のアドレス)です。 OS はこの ioctl の口を提供するだけで、中で何をするかについてはドライバに任せています。 これにより、ユーザはドライバと直接通信することができます。

ioctl は便利な仕組みですが、ポイントはどんなコマンドを実行すると何が起こるのかドライバ任せである点です。 このため、特定のソフトとドライバが通信するには便利ですが、様々なデバイスで共通にあるソフトを使う場合は、標準化が不可欠になります。

Wireless Extensions デビュー

Linux での無線LANサポートとして、Jean T によってWireless Extensions が作成されました。 これは無線 LAN 向けのの ioctl と、標準的なドライバの書き方を規定したものです。 Wireless Extensions は、当初は JT の個人的なプロジェクト (個人的に無線LANを使ってみるためのプロジェクト) でしたが、その後、Linux 本家に取り入れられ、今ではカーネルの一部になっています。
WEは、あまり Linuxのバージョンに依存せずに進化しています。 例えば、WE 独自のバージョンをつけていて、2.4 系列・2.6 系列の区別なく進んでいます。 ワイヤレスのドライバも、カーネルよりはこのWEのバージョンに依存しています。

WE 入門

ドライバを自分で書く人はあまりいないと思うので、ioctl を用いた情報取得について簡単に 紹介してみます。 linux/wireless.h を見ると、以下のような内容が並んでいます。


例えば、ESS-ID を設定してみましょう。 以下のようなプログラムを書いてみます。


WPA と WPA Supplicant

無線LANはブロードバンド時代の到来とともに大ブレイクし、 今や一人暮らしでも wep では暗号化強度が足りず、新しい暗号化方式として wpa が用いられるようになりました。

Linux Wiress プロジェクト

Linux としても、