80211 发送速率选择算法分析
轉:https://blog.csdn.net/junglefly/article/details/48974077
?
1. 介紹
《802.11無線網絡權威指南? 第二版》中對于選速和降速的描述:
市面上所有802.11接口均支持某種降速機制,可以根據不同網絡環境調整所使用的數據傳輸速率。速率選擇主要決定一張網卡該在何時提高速率以提高鏈路品質。802.11標準并未規范工作站如何決定降速(或者升速),因此速率選擇如何實現就留給芯片組廠商自行決定。幾乎所有芯片組具有自己的一套選速機制,因此大多數802.11接口的操作方式均有所不同。速率選擇是可編程的,一般由驅動程序控制。
最常被用來判斷何時應該變速的算法,其實是通過一些不是那么嚴格的信號質量測量。信號質量可以直接就信噪比加以測量,或者間接觀察有多少幀需要重傳。直接測量信噪比可以針對最近一個幀的瞬間信號質量,或者就最近一段時間所接收到的一定數量的幀取平均數。有些芯片會直接測量信噪比,不過隨后會將之轉換為相應的“信號質量signal quality”。當信號質量變差,芯片就會以降速來應變。
至于間接測量,則是監測瞬間或者平均遺失多少幀,然后予以適當補償。采用間接測量的算法簡單來說就是:如果幀已經遺失且幀重試計數器已經用盡,那就降速到下一檔,然后重試一遍。反復進行以上步驟直到幀送出,或者一直嘗試到以最低速率都無法成功傳送為止。采用間接信號質量測量的芯片組或許會稍微修改上述算法,以避免耗費過多時間在物理層所支持的所有速度間逐次降速。尤其是近來的芯片組均支持不少的速率,在較低速率上反復重試將會相當費時。
?
1.1 發送速率的選擇
?
代碼中的數據結構如下所示:
?
/* MIMO Tx parameter, ShortGI, MCS, STBC, etc.? these are fields in TXWI. Don't change this definition!!! */
typedef union _HTTRANSMIT_SETTING {
#ifdef RT_BIG_ENDIAN
???????? struct {
?????????????????? USHORT MODE:2;?? /* Use definition MODE_xxx. */
?????????????????? USHORT iTxBF:1;
?????????????????? USHORT rsv:1;
?????????????????? USHORT eTxBF:1;
?????????????????? USHORT STBC:2;????? /* SPACE */
?????????????????? USHORT ShortGI:1;
?????????????????? USHORT BW:1;???????? /* channel bandwidth 20MHz or 40 MHz */
?????????????????? USHORT MCS:7;?????? /* MCS */
???????? } field;
#else
???????? struct {
?????????????????? USHORT MCS:7;?????? /* MCS */
?????????????????? USHORT BW:1;???????? /* channel bandwidth 20MHz or 40 MHz */
?????????????????? USHORT ShortGI:1;
?????????????????? USHORT STBC:2;????? /* SPACE */
?????????????????? USHORT eTxBF:1;
?????????????????? USHORT rsv:1;
?????????????????? USHORT iTxBF:1;
?????????????????? USHORT MODE:2;?? /* Use definition MODE_xxx. */
???????? } field;
#endif
???????? USHORT word;
} HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING;
?
?
?
由上面的代碼可知:
* ?Ralink是通過APHardTransmit函數來發送所有的幀的。而驅動在發送數據時的速率是直接用節點的成員變量PMacEntry->HTPhyMode;
* ?在發送一個報文時,它找到對應的節點,就可以取出當前的速率。
* ?至于PMacEntry->HTPhyMode,driver中是通過APMlmeDynamicTxRateSwitching函數(call this routine every second ,walk through MAC table, see if need to change AP's TX rate towardeach entry)來實現對每個節點的速率的周期性維護。
?
2. 算法分析
2.1 算法的流程
在算法中會使用到如下的速率表,算法中會使用該表中的TrainUp以及TrainDown來決定是降速還是升速。
如下是傳輸速率表的一個例子:
?
UCHAR RateSwitchTable[] = {
/* Item No.?? Mode?? Curr-MCS?? TrainUp?? TrainDown????????????????
Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/
??? 0x11, 0x00,? 0,? 0,? 0,?????????????????? /* Initial used item after association;連接后剛開始使用這個速率表項*/
??? 0x00, 0x00,? 0, 40, 101,
??? 0x01, 0x00,? 1, 40, 50,
??? 0x02, 0x00,? 2, 35, 45,
??? 0x03, 0x00,? 3, 20, 45,
??? 0x04, 0x21,? 0, 30, 50,
??? 0x05, 0x21,? 1, 20, 50,
??? 0x06, 0x21,? 2, 20, 50,
??? 0x07, 0x21,? 3, 15, 50,
??? 0x08, 0x21,? 4, 15, 30,
?? ?0x09, 0x21,? 5, 10, 25,
??? 0x0a, 0x21,? 6,? 8, 25,
??? 0x0b, 0x21,? 7,? 8, 25,
??? 0x0c, 0x20, 12,? 15, 30,
??? 0x0d, 0x20, 13,? 8, 20,
??? 0x0e, 0x20, 14,? 8, 20,
??? 0x0f, 0x20, 15,? 8, 25,
??? 0x10, 0x22, 15,? 8, 25,
??? 0x11, 0x00,? 0,? 0,? 0,
??? 0x12, 0x00,? 0,? 0,? 0,
??? 0x13, 0x00,? 0,? 0,? 0,
??? 0x14, 0x00,? 0,? 0,? 0,
??? 0x15, 0x00,? 0,? 0,? 0,
??? 0x16, 0x00,? 0,? 0,? 0,
??? 0x17, 0x00,? 0,? 0,? 0,
??? 0x18, 0x00,? 0,? 0,? 0,
??? 0x19, 0x00,? 0,? 0,? 0,
??? 0x1a, 0x00,? 0,? 0,? 0,
??? 0x1b, 0x00,? 0,? 0,? 0,
??? 0x1c, 0x00,? 0,? 0,? 0,
??? 0x1d, 0x00,? 0,? 0,? 0,
??? 0x1e, 0x00,? 0,? 0,? 0,
??? 0x1f, 0x00,? 0,? 0,? 0,
};
?
表項對應的數據結構為:
typedef struct _RTMP_TX_RATE_SWITCH
{
???????? UCHAR?? ItemNo;
#ifdef RT_BIG_ENDIAN
???????? UCHAR???? Rsv2:2;
???????? UCHAR???? Mode:2;
???????? UCHAR???? Rsv1:1;????
???????? UCHAR???? BW:1;
???????? UCHAR???? ShortGI:1;
???????? UCHAR???? STBC:1;
#else
???????? UCHAR???? STBC:1;
???????? UCHAR???? ShortGI:1;
???????? UCHAR???? BW:1;
???????? UCHAR???? Rsv1:1;
???????? UCHAR???? Mode:2;
???????? UCHAR???? Rsv2:2;
#endif??????
???????? UCHAR?? CurrMCS;
???????? UCHAR?? TrainUp;
???????? UCHAR?? TrainDown;
} RTMP_TX_RATE_SWITCH, *PRTMP_TX_RATE_SWITCH;
?
上面的接口中我們重點關注TrainUp和TrainDown。
如果發包錯誤率(PER: Packet Error Rate)大于等于TrainDown,并且一秒鐘內發包數量大于一定數值,Driver就會選擇降速;
如果發包錯誤率小于等于TrainUp, 并且一秒鐘內發包數量大于一定數值,Driver就會選擇升速;
??算法流程參見下圖:
?
?
?
2.2算法的分析
* ?如果上一秒統計的總的發送報文數<=15,那么僅根據Rssi來選擇發送的速率,原則是選擇出滿足RSSI條件的最大的發送速率;
* ?如果發送報文個數>15個,根據發包錯誤率來決定未來的傳輸速度。
? ? ? ?# ?如果發包錯誤率(PER: Packet Error Rate)大于等于TrainDown,Driver就會選擇降速;
? ? ? ?# ?如果發包錯誤率小于等于TrainUp,Driver就會選擇升速;
?
---------------------
作者:飛越叢林
來源:CSDN
原文:https://blog.csdn.net/junglefly/article/details/48974077
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
轉載于:https://www.cnblogs.com/newjiang/p/10804495.html
總結
以上是生活随笔為你收集整理的80211 发送速率选择算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python黑屏改成白底_Python
- 下一篇: 光纤vs.铜缆:为什么光纤是智能、可持续