在介绍自动信道选择算法之前,先介绍一下相关的术语及名词解释。
802.11h针对802.11a无线网络在5GHz频段工作时遇到的信道干扰问题而制定,其所定义的机制能使基于802.11a的无线系统避免与雷达和其他同类系统中的宽带技术相干扰,保障无线通信的畅通。802.11h涉及两种技术:
代码目录:ap\ap_autoChSel.c
主要函数:APAutoSelectChannel();
AutoChannelSelect:主要有以及几种策略
0 :Disable
1 :Old Channel Selection Algorithm, Ues the number of AP and inference status to choose, 根据AP数量与干扰状态去选择。
2 :New Channel Selection Algorithm, Ues the False CCA count and Rssi to choose, 根据False CCA数量与RSSI去选择。
3 :BusyTime,MT7612没有这个。
可以通过以下命令来选择不同的自动信道选择算法:iwpriv ra0 set AutoChannelSel=1/2/3
AutoChannelSkipList:配置当ACS启动时,需要跳过的信道。
1;3;6;
ACSCheckTime:
0 :Disable
N :单位是小时,配置自动信道选择的定时检查时间。
配置命令:iwpriv ra0 set ACSCheckTime=0
涉及函数Set_AutoChannelSelCheckTime_Proc();
代码目录:wireless/rtl8192cd/8192cd_sme.c
主要函数:selectClearChannel(struct rtl8192cd_priv *priv);
设值信道选择算法:iwpriv wlan0 set_mib acs_type 1或者setmib acs_type 1
1、当存在干净信道时,此时重叠信道上也不存在ap,通过函数find_clean_channel()就可以选择干净的信道;
2、在信道不干净时,首先判断打流环境,打流通过rx_count的值来判断,当rx_count的值大于MAC_RX_COUNT_THRESHOLD时,该信道存在大流量,统计该信道上的cca值和rx_count值;
3、当rx_count不大于MAC_RX_COUNT_THRESHOLD时,该信道没有大流量,统计rx_count的权重到score中,同时统计每个信道ap的个数,每个信道上ap的权值跟所在信道ap的rssi值来分配不同的权重。
此外,在rtl芯片中,还存在一种nhm算法,当找不到干净信道时,通过该矩阵来进行信道评估。
autochannel:auto channel selection:
1 :to issue a channel scanning;
2 :to set chanspec based on the channel scan result;
without argument to only show the chanspec selected;
ssid must set to null before this process, RF must be up
wl down :关闭WLAN接口。
wl spect 0:关闭频谱管理,仅适用于5GHz。
wl ssid "":将ssid设置为NULL,以避免扫描期间关联。
wl up:打开WLAN接口。
wl autochannel 1:进行信道扫描并获取候选信道的频道规格。
wl autochannel :显示自动信道选择的信道规格。
wl autochannel 2: 将wl autochannel 1扫描的结果设置chanspec。
wl ssid foo:创建BSS,此操作会生效chanspec。
在信道选择期间,acs算法执行下述的步骤,主要是acs_select_chspec()。策略0,7使用acs_pick_chanspec_default(),其他的策略使用acs_pick_chanspec()进行信道选择功能(选择总分最高的信道)。切换到新的信道后,acs状态机将切换回CHANIM_STATE_DETECTING。
以下是默认算法流程:
自动信道选择在测试过程中,存在如下测试场景:比如说在频闭环境下,1/6/11信道各打流10M/40M/80M;此事应该要选择最小流所在的信道,但是实际情况确实,无法通过某个参量值来衡量当前信道流量的大小,cca是评估信道的空闲程度,在一定条件下,可以判断当前是否有流,但无法真是反应流的大小,在屏蔽房中自动信道选择抓取如下log:
1ch0M_6Ch20M_11Ch40M // 1信道0M流,6信道20M流,11信道40M流
priv->chnl_ss_mac_rx_count[0]=4
priv->chnl_ss_mac_rx_count[1]=3
priv->chnl_ss_mac_rx_count[2]=0
priv->chnl_ss_mac_rx_count[3]=0
priv->chnl_ss_mac_rx_count[4]=1
priv->chnl_ss_mac_rx_count[5]=297
priv->chnl_ss_mac_rx_count[6]=2
priv->chnl_ss_mac_rx_count[7]=0
priv->chnl_ss_mac_rx_count[8]=0
priv->chnl_ss_mac_rx_count[9]=3
priv->chnl_ss_mac_rx_count[10]=1117
priv->chnl_ss_mac_rx_count[11]=2
priv->chnl_ss_mac_rx_count[12]=0
ch:1 fa=203 , cca=8 , fa_l=33, cca_l=3, sc=2051, cu=49
ch:2 fa=402 , cca=9 , fa_l=55, cca_l=3, sc=2136, cu=66
ch:3 fa=138 , cca=2 , fa_l=21, cca_l=0, sc=5977, cu=40
ch:4 fa=590 , cca=0 , fa_l=72, cca_l=0, sc=9272, cu=79
ch:5 fa=736 , cca=6 , fa_l=82, cca_l=2, sc=10152, cu=86
ch:6 fa=355 , cca=311 , fa_l=50, cca_l=84, sc=9399, cu=88
ch:7 fa=818 , cca=2 , fa_l=87, cca_l=0, sc=11045, cu=90
ch:8 fa=741 , cca=0 , fa_l=82, cca_l=0, sc=19089, cu=86
ch:9 fa=524 , cca=6 , fa_l=67, cca_l=2, sc=18876, cu=75
ch:10 fa=652 , cca=9 , fa_l=76, cca_l=3, sc=17973, cu=82
ch:11 fa=85 , cca=301 , fa_l=12, cca_l=83, sc=14505, cu=87
ch:12 fa=516 , cca=3 , fa_l=67, cca_l=1, sc=17118, cu=75
ch:13 fa=975 , cca=0 , fa_l=98, cca_l=0, sc=14399, cu=98
由上述log可知,在打流的信道,cca值要远大与不打流的信道,在没有打流的信道上,cca值很小。但是在屏蔽箱中打流,则会出现另一种现象:
ch:1 fa_count=0 , cca_count=168 , rx_count=709, sc=-1
ch:2 fa_count=244 , cca_count=246 , rx_count=8, sc=-1
ch:3 fa_count=499 , cca_count=509 , rx_count=2, sc=-1
ch:4 fa_count=828 , cca_count=826 , rx_count=0, sc=828
ch:5 fa_count=379 , cca_count=380 , rx_count=0, sc=379
ch:6 fa_count=214 , cca_count=208 , rx_count=0, sc=214
ch:7 fa_count=182 , cca_count=183 , rx_count=0, sc=182
ch:8 fa_count=58 , cca_count=57 , rx_count=0, sc=58
ch:9 fa_count=360 , cca_count=356 , rx_count=0, sc=-1
ch:10 fa_count=345 , cca_count=352 , rx_count=0, sc=-1
ch:11 fa_count=37 , cca_count=244 , rx_count=416, sc=-1
ch:12 fa_count=305 , cca_count=309 , rx_count=3, sc=-1
ch:13 fa_count=599 , cca_count=603 , rx_count=0, sc=-1
ch:1 fa_count=73 , cca_count=192 , rx_count=95, sc=15798
ch:2 fa_count=272 , cca_count=289 , rx_count=1, sc=19128
ch:3 fa_count=508 , cca_count=523 , rx_count=0, sc=21732
ch:4 fa_count=686 , cca_count=693 , rx_count=1, sc=23372
ch:5 fa_count=279 , cca_count=300 , rx_count=0, sc=23802
ch:6 fa_count=178 , cca_count=187 , rx_count=8, sc=24112
ch:7 fa_count=172 , cca_count=185 , rx_count=3, sc=22336
ch:8 fa_count=212 , cca_count=209 , rx_count=0, sc=19552
ch:9 fa_count=461 , cca_count=465 , rx_count=0, sc=20560
ch:10 fa_count=304 , cca_count=312 , rx_count=0, sc=23344
ch:11 fa_count=30 , cca_count=200 , rx_count=209, sc=21644
ch:12 fa_count=415 , cca_count=437 , rx_count=2, sc=20924
ch:13 fa_count=788 , cca_count=784 , rx_count=0, sc=17296
从rx_count的值来看,1信道和11信道在打流,实际情况也是1信道和11信道在打流,但cca值都很高,在屏蔽箱和屏蔽房的环境相差较大,跟据cca来判断信道流量的大小不太合适。
小结:
针对多信道打流,acs要选择打流最小的信道,可以通过评判busytime的值,mtk芯片厂家可以通过busytime来评估信道流量的大小,同样realtek芯片厂家也可以通过读取busytime所对应的寄存器的值来评估信道流量的大小,但是在rtl8192cd芯片中,该寄存器的值并未被用来评估信道,具体原因不得而知,但实验结果表明,rtl8192cd芯片中,busytime对应的寄存器的值可以一定程度上反应信道流量的大小,在周围环境较复杂时,可以通过获取busytime的值,并通过分配一定的权值,可以优化自动信道选择算法。