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

名称

ieee80211_amrr802.11 ネットワークドライバの転送速度制御サポート

書式

#include < net80211/ieee80211_amrr.h>

void
ieee80211_amrr_init( struct ieee80211_amrr *, struct ieee80211vap *, int amin, int amax, int interval);

void
ieee80211_amrr_cleanup( struct ieee80211_amrr *);

void
ieee80211_amrr_setinterval( struct ieee80211_amrr *, int interval);

void
ieee80211_amrr_node_init( struct ieee80211_amrr *, struct ieee80211_amrr_node *, struct ieee80211_node *);

int
ieee80211_amrr_choose( struct ieee80211_node *, struct ieee80211_amrr_node *);

void
ieee80211_amrr_tx_complete( struct ieee80211_amrr_node *, int ok, int retries);

void
ieee80211_amrr_tx_update( struct ieee80211_amrr_node *, int txnct, int success, int retrycnt);

解説

ieee80211_amrr は、 net80211 ソフトウェアレイヤ (層) を使用するドライバのための AMRR 転送速度制御アルゴリズムの実装です。速度制御アルゴリズムは、それぞれのフレームのための転送速度を選択に対して責任があります。スループットアルゴリズムを最大にするには、操作条件のために適切な最も高い速度を使用するように試みます。速度は、状態が変化するように変化します。 2 つのステーションの間の距離は、変化し、一時的な雑音は、シグナルの品質などに影響する存在であるかもしれません。 ieee80211_amrr は、それの作業を行うためにドライバからの非常に簡単な情報を使用します: フレームが成功して配信されたかどうかと、いくつの転送の試みが行われたかです。これは、事実上任意の無線デバイスでの使用を有効にしますが、それは、その有効性を制限します -- それが、難しい環境でよく機能する、そして/または、すばやく変化状態に応答すると期待しません。

ieee80211_amrr は、速度を選択する各ステーション毎に vap 毎の状態とノード毎の状態を必要とします。 API は、各 vap とノードのドライバのプライベートな拡張領域の状態をあらかじめ割り付けられるようにドライバに対して設計されています。例えば、 ral(4) ドライバは、次のように vap を定義します:

struct rt2560_vap { 
        struct ieee80211vap     ral_vap; 
        struct ieee80211_beacon_offsets ral_bo; 
        struct ieee80211_amrr   amrr; 
 
        int      (*ral_newstate)(struct ieee80211vap *, 
                      enum ieee80211_state, int); 
};

amrr 構造体メンバは、次の vap 作成メソッドで初期化される ieee80211_amrrral(4) のための vap 毎の状態を保持しています:

ieee80211_amrr_init(&rvp->amrr, vap, 
    IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, 
    IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD, 
    500 /* ms */);

ノードは、次のよう定義されています:

struct rt2560_node { 
        struct ieee80211_node   ni; 
        struct ieee80211_amrr_node amrr; 
};

初期化では、ドライバの iv_newassoc メソッドで行われます:

static void 
rt2560_newassoc(struct ieee80211_node *ni, int isnew) 
{ 
        struct ieee80211vap *vap = ni->ni_vap; 
 
        ieee80211_amrr_node_init(&RT2560_VAP(vap)->amrr, 
            &RT2560_NODE(ni)->amrr, ni); 
}

いったん ieee80211_amrr 状態がセットアップされると、転送速度は、転送パスで ieee80211_amrr_choose() を呼び出すことによって要求されます。例えば:

tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; 
if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { 
 rate = tp->mcastrate; 
} else if (m0->m_flags & M_EAPOL) { 
 rate = tp->mgmtrate; 
} else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { 
 rate = tp->ucastrate; 
} else { 
 (void) ieee80211_amrr_choose(ni, &RT2560_NODE(ni)->amrr); 
 rate = ni->ni_txrate; 
}

固定された転送速度が設定されないとき、速度は、ユニキャストデータフレームだけに選択されることに注意してください。他の場合は、 net80211 転送パラメータで取り扱われます。また、 ieee80211_amrr_choose() は、 ni_txrate で選択された速度で書き込むことに注意してください。これは、ユーザアプリケーションにエクスポートされるように、値をコピーすることを排除するので、それらは、ステータスの現在の転送速度を表示することができます。

ドライバが行わなければならない残りの作業は、フレームの転送が ieee80211_amrr_tx_complete() を使用して完了するとき、 ieee80211_amrr へステータスをフィードバックすることです。統計を検索するためにデバイスをポーリングするドライバは、(代わりにまたはさらに) ieee80211_amrr_tx_update() を使用することできます。

August 4, 2009 FreeBSD