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

名称

IEEE80211802.11 ネットワークレイヤ (層)

書式

#include < net80211/ieee80211_var.h>

void
ieee80211_ifattach( struct ieee80211com *ic, const uint8_t macaddr[IEEE80211_ADDR_LEN]);

void
ieee80211_ifdetach( struct ieee80211com *ic);

解説

IEEE 802.11 デバイスドライバは、 IEEE80211 ソフトウェアレイヤ (層) によって提供されたインフラストラクチャを使用するために書かれています。このソフトウェアは、ifnet クローニング、状態管理、と 802.11 デバイスと相互に作用するアプリケーションによるユーザ管理 API を含んでドライバのためのサポートのフレームワークを提供します。ほとんどのドライバは、プロトコルサービスのための IEEE80211 レイヤ (層) に依存しますが、機能性を押しつけるデバイスは、直接デバイスに接続するためのレヤイ (層) をバイパスします (例えば、 ndis(4) エミュレーションサポートは、これを行います)。

IEEE80211 デバイスドライバは、基本的なデバイスからクローン化されたネットワークインタフェース (通称 vap) を通してユーザにエクスポートされる仮想の無線 (radio) API を実装しています。これらのインタフェースには、インタフェースの存続期間に固定されているオペレーティングモード (station, adhoc, hostap, wds, monitor など) があります。複数の並列インタフェースをサポートできるデバイスによって、複数の vap をクローン化できます。これは、それぞれ異なったセキュリティモデルで、AP vap と 1 つ以上の WDS vap または複数の AP vap のような興味深いアプリケーションの構築を有効にします。 IEEE80211 イレヤ (層) は、複数の vap のスケジュールを含む、ほとんどの 802.11 状態と座標 vap 状態の変更を仮想化します。仮想化されない状態は、現在のチャネルと WME/WMM パラメータを含んでいます。プロトコル処理は、一般的にホストとデバイスの間の移動するデータに対して純粋に責任があるドライバで IEEE80211 レイヤ (層) で完全に処理されます。同様に、 IEEE80211 は、ドライバに入らずに、ほとんどの ioctl(2) 要求を扱います。代わりに、ドライバは、それらの関与を必要とする状態変更について通知されます。

IEEE80211 レイヤ (層) によって定義された仮想無線 (radio) インタフェースは、ドライバが特定の規則に従うために構造化されなければならないことを意味します。いつでも単一のインタフェースだけをサポートするドライバは、まだこれらの規則に従わなければなりません。

データ構造

仮想の無線 (radio) アーキテクチャは、単一のデバイスごとの ieee80211com 構造と 1 つ以上の ieee80211vap 構造の間の状態に分割されます。ドライバは、アタッチされたデバイスと vap の作成の間でこれらの構造の様々な共有された状態をセットアップすると予想されますが、そうでなければ、読み込み専用として、それらを扱うべきです。 ieee80211com 構造は、デバイスの ifnet への付属データとして IEEE80211 レイヤ (層) によって割り付けられます。それは、 if_l2com 構造のメンバを通してアクセスされます。 ieee80211vap 構造は、“vap create” (vap 作成) メソッドでドライバによって割り付けられ、任意のドライバのプライベートな状態で拡張されるべきです。データ構造を割り付けるためにドライバ制御を与えるこのテクニックは、他の IEEE80211 データ構造に使用され、パブリックな IEEE80211 状態と共にドライバプライベートな状態を維持するために開発されるべきです。

他のメインデータ構造は、ステーションまたはノード、ローカル BSS の相手側を追跡するテーブルと、現在の利用可能な無線 (radio) チャネルのセットを定義するチャネルテーブルです。両方のテーブルは、 ieee80211com 構造にバインドされ、すべての vap によって共有されます。ノードへの長続きする参照は、早過ぎる再利用を防ぐためにカウントされます。特に、あらゆる送信/受信されたパケットは、ノード参照を保持します (転送のために明白、または受信で暗黙のいずれか)。

また、 ieee80211comieee80211vap 構造は、ドライバが、書き込む、および特定の操作を制御を上書きするメソッドポインタの収集を保持しています。これらのメソッドは、ドライバが IEEE80211 レイヤ (層) にバインドされる主要なの方法で、下記に説明されています。

ドライバのアタッチ/デタッチ

ドライバは、 ieee80211_ifattach() 関数で IEEE80211 レイヤ (層) にアタッチします。ドライバは、制御を渡す前に、任意のドライバにプライベートなデータ構造を割り付けて、セットアップすると予想されます。 ieee80211com 構造は、 IEEE80211 レイヤ (層) をセットアップするために要求される状態で前もって初期化されなければなりません:
ic_ifp
物理的なデバイスの ifnet への逆ポインタ。
ic_caps
デバイス/ドライバのケーパビリティ。完全説明については、下記を参照してください。
ic_channels
デバイスが操作できるチャネルのテーブル。これは、ドライバによって始めに提供されますが、規制の状態を変更する呼び出しを通して変更されます。
ic_nchan
ic_channels のエントリの数。

ieee80211_ifattach() からの返りで、ドライバは、そのプライベートなルーチンを登録するために ieee80211com 構造でデフォルトコールバック関数を上書きすると期待されます。“*”でマークされたメソッドは、ドライバによって提供されなければなりません。

ic_vap_create*
(オペレーティングモードの) 指定されたタイプの vap インスタンスを作成します。任意の固定 BSSID および MAC アドレスは、提供されます。マルチ bssid 操作をサポートするドライバは、要求された BSSID を尊重するか、またはそれら自体を割り当てます。
ic_vap_delete*
ic_vap_create で作成された vap インスタンスを破壊します。
ic_getradiocaps
無線 (radio) のために調整されたチャネルのリストを返します。デフォルトのメソッドは、(空白が許される) チャネルの現在のリストを返します。
ic_setregdomain
規制状態を変更する要求を処理します。ルーチンは、要求を拒否するか、または変更を抑制します (例えば、転送電力容量 (caps) を減少します)。デフォルトのメソッドは、すべての提案されている変更を受け付けます。
ic_send_mgmt
802.11 管理フレームを送信します。デフォルトのメソッドは、 IEEE80211 状態を使用するフレームを組み立て、 ic_raw_xmit メソッドを通してそれをドライバに渡します。
ic_raw_xmit
生の 802.11 フレームを転送します。デフォルトのメソッドは、フレームを落して、コンソールにメッセージを生成します。
ic_updateslot
802.11 IFS スロット時刻変更の後にハードウェア状態を更新します。デフォルトのメソッドはありません。ポインタは、NULL であるかもしれません、その場合、それが使用されません。
ic_update_mcast
マルチキャストパケットフィルタで変更のためにハードウェアを更新します。デフォルトメソッドは、コンソールメッセージを印刷します。
ic_update_promisc
プロミスキャスモードの設定で変更のためにハードウェアを更新します。デフォルトのメソッドは、コンソールメッセージを印刷します。
ic_newassoc
(ステーションモードで) 新しい AP への関連のための、または (例えば、AP モードで) 新しいステーションを関連付けるとき、ドライバ/デバイス状態を更新します。デフォルトのメソッドはありません。ポインタは、NULL であるかもしれません、その場合、それが使用されません。
ic_node_alloc
ieee80211_node 構造を割り付けて、初期化します。このメソッドは、スリープすることはできません。デフォルトのメソッドは、 malloc(9) を使用して 0 のメモリを割り付けます。ドライバは、それら自体のニーズのために拡張記憶域を割り付けるためにこのメソッドを上書きするべきです。ドライバによって割り付けられたメモリは、メモリ割り付けの統計のバランスをとるために M_80211_NODE でタグ付けされなければなりません。
ic_node_free
ic_node_alloc によって割り付けられたノードの記憶域を再要求します。ドライバは、プライベート状態をクリーンアップするためにそれら自体のメソッドに 介入 すると予想されますが、 IEEE80211 が、そのプライベート状態を再要求することができるように、このメソッドを通して呼び出さなければなりません。
ic_node_cleanup
ic_node_alloc によって作成された ieee80211_node の状態をクリーンアップします。この操作は、ノードが実際に付属状態をクリーンアップするために再要求されるよりずっと前に呼び出される ic_node_free と区別されます。例えば、ノードが転送キューのパケットによって保持される参照のために再要求されてはならないとき、これは、起こるかもしれません。ドライバは、通常 ic_node_free の代わりに ic_node_cleanup に介入します。
ic_node_age
ノードに関連しているリソースを古くして、潜在的に再要求します。デフォルトのメソッドは、(AP モードの) 電源節約キューのフレームと (A-MPDU を使用するステーションのための) 受信再順序付けキューの保留中 (pending) のフレームを古くします。
ic_node_drain
ノードに関連しているすべてのオプションのリソースを再要求します。この呼び出しは、供給不足のとき、リソースを解放するために使用されます。
ic_node_getrssi
指定されたノードのために .5 dBm 単位で Receive Signal Strength Indication (RSSI) を返します。このインタフェースは、 ic_node_getsignal によって返された情報の部分集合を返します。デフォルトのメソッドは、 ieee80211_input(9) または ieee80211_input_all(9) に渡された最後の 10 個のサンプルを超えるフィルタされた平均を計算します。
ic_node_getsignal
ステーションのための (.5 dBm 単位の) RSSI とノイズレベル (noise floor) を返します。デフォルトのメソッドは、上で説明される RSSI を計算します。返されたノイズレベルは、 ieee80211_input(9) または ieee80211_input_all(9) に供給された最後の値です。
ic_node_getmimoinfo
IEEE80211_IOC_STA_INFO ioctl 要求を支持してステーションのための MIMO 無線 (radio) 状態を返します。デフォルトのメソッドは、何も返しません。
ic_scan_start*
スキャンのためのドライバ/ハードウェア状態を準備します。このコールバックは、スリープ可能なコンテキストで行われます。
ic_scan_end*
完了してスキャンの後のドライバ/ハードウェア状態をを復旧します。このコールバックは、スリープ可能なコンテキストで行われます。
ic_set_channel*
ic_curchan を使用して現在の無線 (radio) チャネル使用を設定します。このコールバックは、スリープ可能なコンテキストで行われます。
ic_scan_curchan
チャネルのスキャンを開始します。このメソッドは、各チャネルの変更の直後に呼び出され、チャネルをスキャンして、スキャンリストの次のチャネルに進めるタイマをスケジュールするために作業を開始しなければなりません。このコールバックは、スリープ可能なコンテキストで行われます。デフォルトのメソッドは、アクティブなスキャン作業 (例えば、ProbeRequest フレームの送信) を扱って、チャネルのために最大の滞留時間に従って、 ieee80211_scan_next(9) への呼び出しをスケジュールします。スキャン作業をファームウェアに押し付けるドライバは、通常、チャネルごとのスキャン活動の引き金となるこのメソッドを使用します。
ic_scan_mindwell
スキャンするとき到達するチャネルの最小の滞留時間を扱います。このイベントは、1 つ以上のステーションがチャネルに見つかり、最小の滞留時間に達したとき、引き金となります。このコールバックは、スリープ可能なコンテキストで行われます。デフォルトのメソッドは、できるだけ早く次のチャネルに進むようにスキャン機械装置にシグナルを出します。ドライバは、(例えば、スキャンがファームウェアによって扱われるなら)、さらなる作業を先取りするために、このメソッドを使用するか、またはチャネルの最大の滞留時間を強制するための要求を無視できます。
ic_recv_action
受信された Action フレームを処理します。デフォルトのメソッドは、それぞれの Action フレームのクラスのためにハンドラをセットアップするためのメカニズムを提供する ieee80211_recv_action(9) を指します。
ic_send_action
Action フレームを転送します。デフォルトのメソッドは、それぞれの Action フレームのクラスのためにハンドラをセットアップするためのメカニズムを提供する ieee80211_send_action(9) を指します。
ic_ampdu_enable
転送される A-MPDU が指定されたステーションと AC のために有効にされるべきであるかチェックします。デフォルトのメソッドは、 A-MPDU が有効にされるべきであるかどうか決定するために vap ごとの閾値に逆らって AC トラフィック速度ごとにチェックします。また、このメソッドの速度制限 ADDBA は、要求が受信側に制限されたリソースがあるとき、あまりに頻繁に作られないように、要求します。
ic_addba_request
A-MPDU 転送凝集を要求します。デフォルトのメソッドは、ローカル状態をセットアップし、 ADDBA Request Action フレームを発行します。ドライバは、転送 A-MPDU を操作するのためにプライベート状態をセットアップする必要があるなら、このメソッドに介入します。
ic_addb_response
受信された ADDBA Response Action フレームを処理し、転送 A-MPDU を行うために必要なリソースをセットアップします。
ic_addb_stop
指定されたステーションと AC のために A-MPDU 転送ストリームをシャットダウンします。デフォルトのメソッドは、DelBA Action フレームを送信した後に、ローカル状態を再要求します。
ic_bar_response
転送された BAR 制御フレームへの応答を処理します。
ic_ampdu_rx_start
TID のための指定されたステーションから A-MPDU データを受信する準備をします。
ic_ampdu_rx_stop
TID のための指定されたステーションから A-MPDU データの受信を終了します。

いったん IEEE80211 レイヤ (層) が、ドライバにアタッチされると、通常、作業を終了するために行われたもう 2 ステップがあります:

  1. デバイスを通して渡される、生の 802.11 のパケットを捕獲するために“radiotap サポート”をセットアップします。これは、 ieee80211_radiotap_attach(9) への呼び出しで行われます。
  2. 割り込みを有効にするような、任意の最終的なデバイスのセットアップを行います。

状態は、 ieee80211_ifdetach() への呼び出しで破壊され、再要求されます。この呼び出しは、ドライバへの複数のコールバックをもたらすかもしれないので、任意のクリティカルなドライバ状態が再要求される前に、行われるできであることに注意してください。 ieee80211_ifdetach() からの戻りで、すべての関連する vap と ifnet 構造は、ユーザアプリケーションに再要求されるか、またはアクセス不可能であるので、再入される心配なしで分解ドライバ状態に安全です。ドライバは、それが物理的なデバイスのために割り付けた ifnet で if_free(9) を呼び出すことに責任があります。

ドライバのケーパビリティ

ドライバ/デバイスのケーパビリティは、 ieee80211com 構造のいくつかのフラグの組を使用して指定されます。一般的なケーパビリティは、 ic_caps によって指定されます。ハードウェアの暗号のケーパビリティは、 ic_cryptocaps によって指定されます。 802.11n ケーパビリティは、もしあれば ic_htcaps によって指定されます。 IEEE80211 レイヤ (層) は、次の同等なフィールドを通して各 vap へのこれらのケーパビリティの部分集合を伝播します: iv_caps, iv_cryptocapsiv_htcaps です。次の一般的なケーパビリティが定義されています:
IEEE80211_C_STA
デバイスは、ステーション (通称、インフラストラクチャ) モードで動作できます。
IEEE80211_C_8023ENCAP
デバイスは、転送のために渡される 802.3 でカプセル化されたフレームを必要とします。デフォルトで、 IEEE80211 は、(PLCP ヘッダのない) 802.11 フレームとしてすべての外向きのフレームをカプセル化します。
IEEE80211_C_FF
デバイスは、Atheros Fast-Frame をサポートします。
IEEE80211_C_TURBOP
デバイスは、Atheros Dynamic Turbo がモードをサポートします。
IEEE80211_C_IBSS
デバイスは、adhoc/IBSS モードで動作できます。
IEEE80211_C_PMGT
デバイスは、ステーションモードのダイナミックな電源管理 (別名、電源節約) をサポートします。
IEEE80211_C_HOSTAP
デバイスは、インフラストラクチャモードの Access Point として動作できます。
IEEE80211_C_AHDEMO
デバイスは、Adhoc Demo モードで動作できます。このモードで、デバイスは、生の 802.11 フレームを送信するか、または受信するために純粋に使用されます。
IEEE80211_C_SWRETRY
デバイスは、転送されたフレームのソフトウェア再試行をサポートします。
IEEE80211_C_TXPMGT
デバイスは、転送されたフレームでダイナミックな転送電力をサポートします。また、Transmit Power Control (TPC) として知られています。
IEEE80211_C_SHSLOT
デバイスは、(802.11g のための) 短いスロット時間操作をサポートします。
IEEE80211_C_SHPREAMBLE
デバイスは、(802.11g のための) 短い前置き操作をサポートします。
IEEE80211_C_MONITOR
デバイスは、モニタモードで動作できます。
IEEE80211_C_DFS
デバイスは、レーダ検出および DFS をサポートします。 IEEE80211 によって DFS プロトコルサポートを取り扱うことができますが、デバイスは、レーダイベントを検出できなければなりません。
IEEE80211_C_MBSS
デバイスは、(802.11s Draft 3.0 によって定義されるように) MeshBSS (MBSS) モードで動作できます。
IEEE80211_C_WPA1
デバイスは、WPA1 操作をサポートします。
IEEE80211_C_WPA2
デバイスは、WPA2/802.11i 操作をサポートします。
IEEE80211_C_BURST
デバイスは、フレームバースト (burst) をサポートします。
IEEE80211_C_WME
デバイスは、WME/WMM 操作をとサポートします (現在のところ、ほとんどの EDCF がある QoS フレームの送信と受信をサポートします)。
IEEE80211_C_WDS
デバイスは、4 アドレスのフレームの送信/受信をサポートします。
IEEE80211_C_BGSCAN
デバイスは、バックグラウンドスキャンをサポートします。
IEEE80211_C_TXFRAG
デバイスは、断片化された 802.11 フレームの転送をサポートします。
IEEE80211_C_TDMA
デバイスは、TDMA モードで動作できます。

次の一般的な暗号ケーパビリティが定義されています。一般的に、 IEEE80211 は、デバイスが暗号 (cipher) のハードウェア加速ができないとき、ソフトウェアサポートに後退します。キーごとをベースにして、これを行うことができます。また、 IEEE80211 は、ハードウェア AES 加速と組み合わせてソフトウェア Michael 計算を扱うことができます。

IEEE80211_CRYPTO_WEP
デバイスは、ハードウェア WEP 暗号 (cipher) をサポートします。
IEEE80211_CRYPTO_TKIP
デバイスは、ハードウェアが TKIP 暗号 (cipher) をサポートします。
IEEE80211_CRYPTO_AES_OCB
デバイスは、ハードウェア AES-OCB 暗号 (cipher) をサポートします。
IEEE80211_CRYPTO_AES_CCM
デバイスは、ハードウェア AES-CCM 暗号 (cipher) をサポートします。
IEEE80211_CRYPTO_TKIPMIC
デバイスは、TKIP で使用するためにハードウェア Michael をサポートします。
IEEE80211_CRYPTO_CKIP
ハードウェアは、ハードウェア CKIP 暗号 (cipher) をサポートします。

次の一般的な 802.11n ケーパビリティが定義されています。最初のケーパビリティは、802.11n 仕様に現れるように、正確に定義されます。 IEEE80211_HTC_AMPDU で始まるケーパビリティは、 IEEE80211 レイヤ (層) だけで使用されます。

IEEE80211_HTCAP_CHWIDTH40
デバイスは、20/40 チャネル幅の操作をサポートします。
IEEE80211_HTCAP_SMPS_DYNAMIC
デバイスは、ダイナミックな SM 電源節約操作をサポートします。
IEEE80211_HTCAP_SMPS_ENA
デバイスは、静的な SM 電源節約操作をサポートします。
IEEE80211_HTCAP_GREENFIELD
デバイスは、Greenfield 前置きをサポートします。
IEEE80211_HTCAP_SHORTGI20
デバイスは、20MHz のチャネルで Short Guard Interval をサポートします。
IEEE80211_HTCAP_SHORTGI40
デバイスは、40MHz のチャネルで Short Guard Interval をサポートします。
IEEE80211_HTCAP_TXSTBC
デバイスは、転送のための Space Time Block Convolution (STBC) をサポートします。
IEEE80211_HTCAP_RXSTBC_1STREAM
デバイスは、STBC 受信のための 1 空間のストリームをサポートします。
IEEE80211_HTCAP_RXSTBC_2STREAM
デバイスは、STBC 受信のための 1-2 空間のストリームをサポートします。
IEEE80211_HTCAP_RXSTBC_3STREAM
デバイスは、STBC 受信のための 1-3 空間のストリームをサポートします。
IEEE80211_HTCAP_MAXAMSDU_7935
デバイスは、7935 オクテットまでの A-MSDU フレームをサポートします。
IEEE80211_HTCAP_MAXAMSDU_3839
デバイスは、3839 オクテットまでの A-MSDU フレームをサポートします。
IEEE80211_HTCAP_DSSSCCK40
デバイスは、40MHz チャネルで DSSS/CCK の使用をサポートします。
IEEE80211_HTCAP_PSMP
デバイスは、PSMP をサポートします。
IEEE80211_HTCAP_40INTOLERANT
デバイスは、40MHz 幅チャネル使用に耐えられません。
IEEE80211_HTCAP_LSIGTXOPPROT
デバイスは、L-SIG TXOP 保護をサポートします。
IEEE80211_HTC_AMPDU
デバイスは、A-MPDU 凝集をサポートします。任意の 802.11n 準拠のデバイスは、A-MPDU 受信をサポートしなければならないので、これは、A-MPDU フレームの transmit (転送) のためのサポートを暗黙のうちに意味することに注意してください。
IEEE80211_HTC_AMSDU
デバイスは、A-MSDU 凝集をサポートします。任意の 802.11n 準拠のデバイスは、A-MPDU 受信をサポートしなければならないので、これは、A-MSDU フレームの transmit (転送) のためのサポートを暗黙のうちに意味することに注意してください。
IEEE80211_HTC_HT
デバイスは、High Throughput (HT) 操作をサポートします。このケーパビリティは、 IEEE80211 で 802.11n の機能性を有効に設定されなければなりません。
IEEE80211_HTC_SMPS
デバイスは、MIMO Power Save (電源節約) 操作をサポートします。
IEEE80211_HTC_RIFS
デバイスは、Reduced Inter Frame Spacing (RIFS) をサポートします。
April 28, 2010 FreeBSD