【※ 当記事は2020年7月2日時点の情報です】
ペイヴメント(@pavement1234)です。
バージョン情報
Linux Kernel 3.14
SWインタフェースとは?
インターフェースとは?を読んでみました。
要はAPIのことです。
ソフトウェアインターフェースは、プログラム間でデータや指示をやり取りする手順や形式を定めたもの。
代表的なものとして、OSやミドルウェア、ライブラリなどの機能を外部から呼び出して利用するための規約であるAPI(Application Programming Interface)がある。
他にもABI(Application Binary Interface)やプロセス間通信の仕様なども含まれ、さらに広義にはネットワークを介してソフトウェア間で連携するための通信プロトコルや、複数のソフトウェアで共通して利用される汎用的なファイル形式などを指すこともある。
無線LANドライバのSWインタフェースとは?
超ざっくり書くとこんな感じです。
今回は④を整理してみます。
アプリ・ミドルウェア層
①アプリケーション
②サプリカント
カーネル層
③TCPスタック
④ネットワークミドルウェア(net_device/libnl)
⑤無線LANドライバ
⑥バスドライバ
⑦ホストCPUドライバ
④ネットワークミドルウェア(net_device/libnl)
2007年頃、カーネル2.6で動作する無線LANドライバはnet_deviceが一般的でした
(以下の図はこのページから参照)。
最近はlibnlが一般的な気がします。
IntelのN-6300もlibnlでした。
Linuxにおける無線LANのソフト構成を見るとよりわかりやすいです。
wpa_supplicant:STA(ステーション)として動作
802.1X/WPA認証、接続処理を担当
hostapd:SoftAP(アクセスポイント)として動作
iw:ドライバの設定、状態取得を実施
libnl:ユーザー空間とカーネル空間のI/F
cfg80211:チャンネル等の設定を担当
mac80211:スキャン、接続等のコア処理を担当
WLANドライバ:バスドライバ(SDIO、PCIe等)を制御
バスドライバ:SDIO、PCIe等のI/Fを通じてデバイスを制御
ユーザー空間では、wpa_suppliant、hostapd、iwが動作し、
カーネル空間ではcfg80211、mac80211、ドライバが動作します。
libnlはwpa_supplicant等のユーザー空間で動作するソフトと
cfg80211とのインターフェースです。
ソケットを通じてユーザーランドとカーネルモードとの間で
メッセージのやり取りをします。
使用するデバイスによっては、mac80211を使わないこともありますし、
wpa_supplicantが直接ドライバにioctlを発行して
(libnlを使わずに)制御することもあります。
これらの情報を総合的に扱っているのはLinux Wirelessだと思います。
このサイトの記事で私が一番よく見るのが
CRDA(Central Regulatory Domain Agent)です。
CRDAはregdbと呼ばれる国(カントリーコード)毎の
無線の法規制情報(利用可能チャネル、電波強度など)を管理する
データベース管理エージェントです。
これらのコンポーネント構成を理解するのに
このサイトにあった以下の図がわかりやすかったです。
まとめ
今回、
④ネットワークミドルウェア(net_device/libnl)についてまとめました。
②サプリカント、
③TCPスタック、
⑤無線LANドライバ、
⑥バスドライバ、
⑦ホストドライバなどもどこかで深堀したいと思います。