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

名称

ieee80211_proto802.11 状態マシンサポート

書式

#include < net80211/ieee80211_var.h>


void
ieee80211_start_all( struct ieee80211com *);

void
ieee80211_stop_all( struct ieee80211com *);

void
ieee80211_suspend_all( struct ieee80211com *);

void
ieee80211_resume_all( struct ieee80211com *);

enum ieee80211_state;
int
ieee80211_new_state( struct ieee80211vap *, enum ieee80211_state, int);


void
ieee80211_wait_for_parent( struct ieee80211com *);

解説

802.11 デバイスドライバをサポートする net80211 レイヤ (層) は、vap の操作を制御するためにステートマシンを使用します。これらのステートマシンは、vap 操作モードにしたがって異なります。ステーションモードのステートマシンは、プロトコル仕様の 802.11 の MLME 状態に従います。他のステートマシンは、より簡単であり、BSS のためのスキャンまたは動作するチャネルの自動的選択のような操作上の作業を反映します。複数の vap が操作可能であるときに、ステートマシンは、チャネルを選択するような操作を調整するために使用されます。また、ステートマシンのメカニズムは、 net80211 レイヤ (層) をドライバにバインドするために役立ちます。これは、以下でさらに説明されます。

次の状態が、ステートマシンのために定義されています:

IEEE80211_S_INIT
デフォルトの初期状態。この状態の vap は、任意の動的な状態を保持するべきではありません (例えば、ノードテーブルの関連ステーションのためのエントリ)。ドライバは、ハードウェアを不活発にしなければなりません。例えば、そこでは、割り込みの発火するべきではありません。
IEEE80211_S_SCAN
BSS のためにスキャンするか、または操作のチャネルを選択します。また、スキャンは、他の状態で起こるかもしれないことに (例えば、バックグラウンドスキャンがアクティブであるとき) 注意してください。操作可能な状態またはビーコンミス (ステーションモードで) のようなイベントの後に、最初に vap を持って来るとき、この状態に入ります。
IEEE80211_S_AUTH
(ステーションモードで) アクセスポイントへの認証。この状態は、通常、BSS を選択した後に IEEE80211_S_SCAN から到達されますが、認証ハンドシェイクが失敗するなら、 IEEE80211_S_ASSOC または IEEE80211_S_RUN からも到達するかもしれません。
IEEE80211_S_ASSOC
(ステーションモードで) アクセスポイントへの関連。この状態は、成功して認証した後に IEEE80211_S_AUTH から到達されるか、または DisAssoc フレームが受信されるなら、 IEEE80211_S_RUN から到達されます。
IEEE80211_S_CAC
チャネルの有用性のチェック (Channel Availability Check (CAC))。 DFS が有効にされるときだけ、この状態に入り、操作のために選択されたチャネルは、CAC を必要とします。
IEEE80211_S_RUN
操作可能性。この状態では、vap は、データフレームを転送し、関連するステーションのための要求を受け付け、等を行うことができます。また、関連する“port”が認可されているかどうかによってデータトラフィックは、ゲートで制御されることに注意してください。 WPA/802.11i/802.1x が操作可能であるときに、認証は、別々に起こるかもしれません。例えば、ステーションモードで、 wpa_supplicant(8) は、ハンドシェイクは完了しなければならず、ポートが認証される前に、必要なキーを詳細に調べなければなりません。この状態では、BSS は、操作可能であり、関連する状態は、有効であり、使用されます。例えば、 ic_bssic_bsschan は、使用可能となるように保証されます。
IEEE80211_S_CSA
Channel Switch Announcement (CSA) は、保留中 (pending) です。 CSA が (ステーションモードの) アクセスポイントから受信されるか、またはローカルステーションが、チャネルを変更する準備しているとき、この状態は、単に IEEE80211_S_RUN から到達されます。この状態では、トラフィックは、CSA にセットする Mute によって、音を消されます。
IEEE80211_S_SLEEP
(ステーションモードの) 電源を節約するためにスリープします。この状態は、電源節約操作が有効にされ、ローカルステーションが低電源モードを入るために十分アイドルと見なされるとき、 IEEE80211_S_RUN から単に到達されます。

状態は、(上に示されているように) 順序付けられていることに注意してください。例えば、vap は、フレームを転送することができる前に、 IEEE80211_S_RUN または“greater” (より大きく) でなければなりません。特定の net80211 データは、特定の状態でのみ有効です。例えば、動作している BSS のためのチャネルを指定する iv_bsschan は、 IEEE80211_S_RUN または、より大きいものを除いて、決して使用されるべきではありません。

状態の変更

ステートマシンの変更は、通常、ビーコンミスのような ioctl(2) 要求、受信されたフレーム、または外部のイベントに応答して net80211 レイヤ (層) に内部で扱われます。 ieee80211_new_state() 関数は、vap でステートマシンの変更を起こすために使用されます。新しい状態とオプションの引数が、供給されます。要求は、最初に、複数の vap の調整を扱うために処理されます。例えば、複数の vap が IEEE80211_S_SCAN への変更を要求するなら、一度に 1 つの vap のみをスキャンすることができます、最初は、実行するために許可され、他は、スキャン操作が選択されたチャネルが採用した時間に完了するまで、 延期 されます。同様に、 net80211 は、ステーションが (新しいチャネルのための AP vap が長引く) それが関連している AP に続くように移動する必要がある AP とステーション vap のような vap の組み合わせの調整を取り扱います。別の重要な調整は、 IEEE80211_S_CACIEEE80211_S_CSA の取り扱いです。わずか 1 つの vap を、いつも、活発に状態を変えることができます。事実上は、スキャンとビーコンミスの取り扱いのような同期する作業にも使用される専用の taskqueue(9) スレッドの net80211 単一スレッドステートマシン論理。

マルチ vap スケジューリング/コーディネートが完了した後に、vap ごとの iv_newstate メソッドは、状態変更作業を実行するために呼び出されます。ドライバは、プライベートな状態をセットアップするためにこのエントリを使用し、次に、事前に定義されたメソッドポインタ (OOP-用語で、それらは、“super method” (スーパメソッド) と呼ばれます) を使用して net80211 レイヤ (層) への呼び出しをディスパッチします。

net80211 は、特別に 2 つの状態変更を扱います。 IEEE80211_S_RUN への遷移で、vap の転送キューの IFF_DRV_OACTIVE ビットは、クリアされるので、トラフィックが流れることができます。 IEEE80211_S_INIT への遷移で、vap に関連しているスキャンキャッシュの任意の状態は、フラッシュされ、転送キューの保留中の任意のフレームは、フラッシュされます。

ドライバの統合

ドライバは、それら自体のコードを挿入し、状態変更によって必要とされるセットアップ作業を扱うために iv_newstate メソッドを上書きすることを期待されます。そうでなければ、ドライバは、 SIOCSIFFLAGS ioctl 要求を通してマークされることに応じて ieee80211_start_all() を呼び出さなければなりません、そしてそれらは、 suspend/resume サポートを実装するために ieee80211_suspend_all() と ieee80211_resume_all() を使用するべきです。

また、 IEEE80211_S_INIT 状態にすべての vap を強制するための ieee80211_stop_all() 呼び出しがありますが、これは、ドライバで必要とされるべきではありません。制御は、通常 net80211 によって取り扱われるか、またはカードのイジェクトまたは vap の破壊の場合には、作業は、ドライバの外側で開始されます。

歴史

ステートマシンの概念は、 NetBSD 1.5 ではじめて登場した、オリジナルの ieee80211 コードをベースとする一部でした。
August 4, 2009 FreeBSD