LinuxのWi-Fi関連の部分を少し調査したお話。

Hostapdというユーザ空間でAPを管理できるツールを足がかりに、LinuxのWLAN関連の部分を調べて行きたいと思います。

Hostapdのちょっと詳しいお話について

Hostapdでは、古いカーネルドライバのためにいくつかのドライバを用意しているらしく、今主流になって使われているcfg80211やmac80211というドライバ以外にも、HostAP, madwifi, prism54というドライバを持っているらしい。

en:users:documentation:hostapd [Linux Wireless]

nl80211以前のドライバでは、マネジメントフレームを送受信するためにはモニターモードのインターフェースが必要で、普通のパケットを送信するためにはマスターモードのインターフェースが必要だった。そのため、1つのAPを用意するのに2つのインターフェースを束縛する必要があった。だが、nl80211では、NL80211_CMD_FRAMEとNL_CMD_REGISTER_FRAMEというマネジメントフレームを送受信するインターフェースが実装された。それによってユーザ空間で、1つのインターフェースだけを用いてAPを用意することが可能になった。mac80211ドライバを用いてAPを実装する際には、nl80211を利用するのが推奨されているらしい。

nl80211, cfg80211, mac80211の役割について

今回の調査においては、[nl|cfg|mac]80211について調べたいので、他のドライバはパスで。

非常にわかりやすいStack Overflowの質問を見つけた。

stackoverflow.com

もともとnl80211, cfg80211, mac80211は、Wireless Extensionsという(昔使われていた)APIを置き換えるものとして設計された。ユーザ空間から無線デバイスを制御するために、カーネル空間とユーザ空間の間でIPCをする必要がある。普通のI/Oデバイスではioctlが用いられるイメージがあるが、nl80211, cfg80211, mac80211ではnetlinkというIPCの方法を用いている。

カーネル空間では、Wi-Fiバイスを制御するためにcfg80211というモジュールが動いていて、ユーザ空間側からcfg80211と通信するためのライブラリが、nl80211である。mac80211の方は、より詳しいことを知らないと行けなさそうなので、とりあえずパス。おそらく、802.11のPHY層までのデバイスドライバMAC層を提供するのがmac80211の役割なんだと思う。だけど、あまりはっきり「そうだ」と言い切れるほど詳しいわけではないので、802.11の仕様を調べるときにでも一緒に調べてみたいと思います。

https://i.stack.imgur.com/TNLK1.png

netlinkについて

ざっくりと言ってしまえば、IPCの手法の一つ。宛先としてPID?を指定する。カーネル空間とユーザ空間で、ネットワークの情報をやりとりする際に用いられている。socket(AF_NETLINK)を用いてオープンするらしい。

Raspberry Piの無線について

Raspberry Pi 3Bに載っている802.11のチップはBCM43438らしく、3B+に乗っているチップはCYW43455で、こっちはデュアルバンドで通信が可能になっているらしい。また、Raspberry Pi 3B+ではEthernetポートがGigabit Ethernetになっている上に、PXEブートも可能になっているらしい。

Linuxの無線ドライバについて

今回は、(まずは)Raspberry Piについてのみ考えれば良いので、brcmfmacだけとりあえず意識しておけば良さそう。

en:users:drivers [Linux Wireless]

その他

elixir.bootlin.com

elixir.bootlin.com

elixir.bootlin.com