EN JA
IEEE80211_SCAN(9)
IEEE80211_SCAN(9) FreeBSD Kernel Developer's Manual IEEE80211_SCAN(9)

名称

ieee80211_scan802.11 スキャンサポート

書式

#include < net80211/ieee80211_var.h>


int
ieee80211_start_scan( struct ieee80211vap *, int flags, u_int duration, u_int mindwell, u_int maxdwell, u_int nssid, const struct ieee80211_scan_ssid ssids[]);

int
ieee80211_check_scan( struct ieee80211vap *, int flags, u_int duration, u_int mindwell, u_int maxdwell, u_int nssid, const struct ieee80211_scan_ssid ssids[]);

int
ieee80211_check_scan_current( struct ieee80211vap *);

int
ieee80211_bg_scan( struct ieee80211vap *, int);

int
ieee80211_cancel_scan( struct ieee80211vap *);

int
ieee80211_cancel_scan_any( struct ieee80211vap *);

int
ieee80211_scan_next( struct ieee80211vap *);

int
ieee80211_scan_done( struct ieee80211vap *);

int
ieee80211_probe_curchan( struct ieee80211vap *, int);

void
ieee80211_add_scan( struct ieee80211vap *, const struct ieee80211_scanparams *, const struct ieee80211_frame *, int subtype, int rssi, int noise);

void
ieee80211_scan_timeout( struct ieee80211com *);

void
ieee80211_scan_assoc_fail( struct ieee80211vap *, const uint8_t mac[IEEE80211_ADDR_LEN], int reason);

void
ieee80211_scan_flush( struct ieee80211vap *);

void
ieee80211_scan_iterate( struct ieee80211vap *, ieee80211_scan_iter_func, void *);

void
ieee80211_scan_dump_channels( const struct ieee80211_scan_state *);

void
ieee80211_scanner_register( enum ieee80211_opmode, const struct ieee80211_scanner *);

void
ieee80211_scanner_unregister( enum ieee80211_opmode, const struct ieee80211_scanner *);

void
ieee80211_scanner_unregister_all( const struct ieee80211_scanner *);

const struct ieee80211_scanner *
ieee80211_scanner_get( enum ieee80211_opmode);

解説

net80211 ソフトウェアレイヤ (層) は、スキャンのための拡張可能なフレームワークを提供しています。スキャンは、ステーションが (インフラストラクチャと IBSS モードで) 結合するために BSS を位置付ける手続きか、または (AP または IBSS マスタとして動作するとき) 使用するチャンネルです。スキャンは、“active”または“passive”のいずれかです。アクティブなスキャンによって、1 つ以上の ProbeRequest フレームは、各チャンネルを訪問して送信されます。 passive 要求によって、スキャンの設定の各チャンネルは、訪問されますが、転送されるフレームは、ありません。ステーションは、トラフィックのため listen (接続を受け付け) するだけです。アクティブなスキャンは、規制強制によって ProbeRequest フレームを送信する前に、まだ、トラフィックのために listen (接続を受け付け) する必要があることに注意してください。

スキャン操作は、(スキャンセットを) 検査するための 1 組のチャンルを構成する、各チャネルを訪問して (例えば、どんな BSS が存在しているか) 情報を集めることを含み、次に結合する BSS のような決定を行うために結果を分析します。このプロセスは、できるだけ速くする必要があるので、 net80211 は、スキャンセットを知的に構築するようなことを行い、必要な限りチャネル上に存在します。スキャンの結果は、キャッシュされ、スキャンキャッシュは、可能であるとき、スキャンすることを避けるため、そしてインフラストラクチャモードで動作するとき、アクセスポイントの間のローミングを有効にするために使用されます。

スキャンは、オペレーティングモードごとに policy を実装するプラグ着脱可能なモジュールによって扱われます。コアスキャンサポートは、これらのモジュールをサポートするためにインフラストラクチャを提供して、共通の API を net80211 レイヤ (層) の残りにエクスポートします。ポリシモジュールは、訪問するためのチャネルを決定し、決定をするために記録される状態を決定し、スキャンの結果として返される最終的なステーション/チャネルを選択します。

スキャンは、操作可能なの状態への vap を始めに持って来るとき、オプションで、ローミングと不正な AP モニタリングを行うためのスキャンキャッシュを維持するためにバックグラウンドで、同期して行われます。スキャンは、 IEEE80211_S_SCAN 状態へのリンケージを除いて、 vap を治める net80211 ステートマシンに結ばれません。一度に 1 つの vap だけがスキャンされます。このスケジューリングポリシは、 ieee80211_new_state() のハンドルであり、スキャンコードにトランスペアレントです。

スキャンは、チャンネルセットと任意の希望の SSID のもの、と BSSID のものを (潜在的に) 抑制する 1 組のパラメータによって制御されます。 net80211 は、すべての利用可能なオペレーティングモードで動作する標準のスキャナモジュールを搭載し、“background scanning” (バックグラウンドスキャン) と“roaming” (移動) 操作をサポートします。

スキャナモジュール

スキャンモジュールは、 net80211 レイヤ (層) を接続するために登録メカニズムを使用します。特定のオペレーティングモードのためのスキャンモジュールを登録するために ieee80211_scanner_register() と (通常、モジュールアンロードで) エントリをクリアするために ieee80211_scanner_unregister() または ieee80211_scanner_unregister_all() を使用します。オペレーティングモードのためにいつでも、1 つのスキャナモジュールのみを登録することができます。

ドライバのサポート

通常、スキャン操作は、 net80211 レイヤ (層) によって管理されます。ドライバは、スキャンの最初と作業が終ったときに呼び出される ic_scan_startic_scan_stop メソッドを提供しなければなりません。これらは、Beacon と ProbeResponse フレームの受信を有効にし、任意の BSSID マッチングを無効にするような作業を取り扱うべきです。 ic_set_channel メソッドは、スキャンしている間にチャネルを変更するために使用されます。 net80211 は、ProbeRequest フレームを生成し、 ic_raw_xmit メソッドを使用してそれらを転送します。スキャンの間に受信されたフレームは、通常の受信パスを使用して net80211 にディスパッチされます。最も容易にスキャン作業をファームウェアへ押しつけるデバイスは、これが、 net80211 のスキャンマシンのスケジューラへの制御を延期するので、一度にチャネルベースで動作することによって、 net80211 と一致します。しかし、ドライバが、スキャンキャッシュに結果を入れるために ieee80211_add_scan() ルーチンを使用して結果を手動でディスパッチするなら、マルチチャネルスキャンは、サポートされます。

スキャン要求

スキャン要求は、 IEEE80211_SCAN_REQUEST ioctl を経由してか、またはスキャンすることを必要とする vap のステートマシンに変更することを通して、起こります。いずれにしても、最初にスキャンキャッシュをチェックすることができ、それが適切に“warm”と考えられるなら、その内容は、現在のチャネルを残さずに使用されます。チェックせずにスキャンを始めるために、キャッシュ ieee80211_start_scan() を呼び出すことができます。そうでなければ、最初にスキャンキャッシュをチェックするために ieee80211_check_scan() を使用することができ、キャッシュ内容が期限切れであるなら、スキャンを開始します。スキャンキャッシュをチェックして、次にスキャンするために以前に設定されたスキャンパラメータを使用する省略表現である ieee80211_check_scan_current() もあります。

バックグラウンドスキャンは、コルーチンの形式で ieee80211_bg_scan() を使用して行われます。このルーチンへの最初の呼び出しは、BSS チャンネルに戻る前に、時間の制限された期間に対して実行するバックグラウンドスキャンを開始します。その後の呼び出しは、すべてのチャネルが訪問されるまで、スキャンセットを通して進みます。通常、これらの後の呼び出しは、ステーションのためのアクセスポイントによってバッファリングされたフレームの受け取りを許可する時刻を決められています。

スキャン操作が指定された vap によって開始されるなら、 ieee80211_cancel_scan() を使用するか、または vap がそれを開始したことに関係なく強制的に終了するために ieee80211_cancel_scan_any() を使用して、スキャン操作をキャンセルすることができます。これらの要求は、フレームが送信されるとき、バックグラウンドスキャンをキャンセルするために転送パスで net80211 によってほとんど使用されます。ドライバは、これらの要求 (または、このページに説明された呼び出しのほとんど) を使用する必要はないはずです。

ieee80211_scan_next() と ieee80211_scan_done() ルーチンは、スキャンセットを通して明白な繰り返しを行い、通常、ドライバによって使用されるべきではありません。 ieee80211_probe_curchan() は、アクティブなスキャンの間にチャネルを訪問するとき、ProbeRequest フレームを転送する作業を扱います。チャネル属性が IEEE80211_CHAN_PASSIVE でマークされるとき、この関数は、任意のフレームが転送される前に準備し、 (規制された制約に従うために) 802.11 トラフィックが最初に受信されます。

最小/最大の滞留時間 (dwell time) パラメータは、チャネルを訪問するために費やされた時間を抑制するために使用されます。最大の滞留時間は、トラフィックのために listen (接続を受け付け) するために費やされた時間を抑制します。最小の滞留時間は、到達され、1 つ以上のフレームが、受信され、次に、チャネルの変更が直ちに行われるとき -- この時間を減少するために使用されますドライバは、 iv_scan_mindwell メソッドを通してこのふるまいを上書きすることができます。

スキャンキャッシュの管理

スキャンキャッシュの内容は、スキャンポリシモジュールによって管理され、このモジュールの外側で不透明 (サイズおよび形がわからない) です。 net80211 スキャンフレームワークは、相互作用のための API のものを定義します。スキャンキャッシュの内容の正当性は、 IEEE80211_SCAN_VALID 要求をとおしてユーザ空間にエクスポートされる iv_scanvalid によって制御されます。

スキャン操作を始めるとき、 ieee80211_scan_flush() で、または IEEE80211_SCAN_FLUSH フラグを設定することによって、明白にキャッシュの内容をフラッシュすることができます。

スキャンキャッシュエントリは、 ieee80211_add_scan() ルーチンで作成されます。通常、Beacon または ProbeResponse フレームを受け取で。既存のエントリは、最新情報に基づいて、通常更新されますが、 RSSI と読み込みの雑音レベルのようないくつかの情報は、平均を提示するために組み合わされます。

キャッシュの内容は、 ieee80211_scan_timeout() 呼び出しを通して古くなります。通常、これらは、他のステーションテーブル活動と共に起こります。すべて IEEE80211_INACT_WAIT 秒 (デフォルト 15)。

個々のキャッシュエントリは、 ieee80211_scan_assoc_success() で使用可能であるとマークされ、Authentication/Association 要求への応答がないか、または (キャッシュの追い立て、またはブラックリストのエントリを急がせるかもしれない) 否定応答が受信されるなら、識別するために引数をとる後者で、 ieee80211_scan_assoc_fail() で失敗します。

ieee80211_scan_iterate() の呼び出しを使用してキャッシュの内容を見ることができます。キャッシュエントリは、 IEEE80211_SCAN_RESULTS 要求を通してユーザアプリケーションにエクスポートされるパブリックな形式でエクスポートされます。

March 29, 2010 FreeBSD