現在の Linux バージョンでは、nl80211がワイヤレス サブシステムと「対話」する正しい方法です。すべてのドライバーとすべての動作モード (マスター、クライアント、モニターなど) でチャネルを任意に設定することはできないことに注意してください。一部のドライバーでは、対応するインターフェイスが「ダウン」している場合にのみチャネルの変更が許可されます。クライアント (「マネージド」) などのモードでは、チャネルはアクセス ポイントによって定義されるため、まったく設定できません。
また、すべてのワイヤレス デバイス ドライバが mac80211/cfg80211 を使用しているわけではないことにも注意してください。それを使用していないドライバーについては、古いワイヤレス拡張 API を使用するか、(さらに悪いことに) ドライバー固有の独自の API を使用する必要があります。
残念ながら、nl80211 インターフェースに関する最新の完全なドキュメントはないようです。私が間違っている場合は、私を修正してください!
他のプログラムのソース コードを調べるというあなたのアプローチは、合理的な方法のようです。コマンド ライン ユーティリティのソース コードを使用することもできます。チャンネルを設定するオプションがあります:iw
iw
$ iw --help
Usage: iw [options] command
Options:
--debug enable netlink debugging
--version show version (3.2)
Commands:
…
dev <devname> set channel <channel> [HT20|HT40+|HT40-]
…
iw
のphy.cの91ff行目。が実行されたときに呼び出されるコードを見つけることができますiw wlan0 set channel
。ただし、このコードは明らかに読みにくいものです。属性NL80211_CMD_SET_WIPHY
と組み合わせたコマンドが良いよう
です。NL80211_ATTR_WIPHY_FREQ
このSO 回答では、nl80211 を使用するためのスケルトン プログラムを見つけることができます。また、Aircrack-ng ( src/osdep/linux.c
, 関数linux_set_channel_nl80211
) のコードは設計図として機能する可能性があります。