主流无线芯片厂商的自动信道选择算法小结

主流无线芯片厂商的自动信道选择算法小结

文章目录

  • 主流无线芯片厂商的自动信道选择算法小结
    • 1、MTK芯片自动信道选择算法
      • 1.1 MTK的自动信道选择实现了以下3种算法:
    • 2、RealTek芯片自动信道选择算法
    • 3、BRCM芯片自动信道选择算法
      • 3.1 以下命令用于测试autochannel:
      • 3.2 acs算法流程
      • 3.3 自动信道选择包含以下注意事项:

在介绍自动信道选择算法之前,先介绍一下相关的术语及名词解释。
主流无线芯片厂商的自动信道选择算法小结_第1张图片
802.11h针对802.11a无线网络在5GHz频段工作时遇到的信道干扰问题而制定,其所定义的机制能使基于802.11a的无线系统避免与雷达和其他同类系统中的宽带技术相干扰,保障无线通信的畅通。802.11h涉及两种技术:

  • (1)一种是动态频率选择(DFS),即接入点不停地扫描信道上的雷达,接入点和相关的基站随时改变频率,最大限度地减少干扰,均匀分配WLAN流量;
  • (2)另一种技术是传输功率控制(TPC),总的传输功率或干扰将减少3dB。

1、MTK芯片自动信道选择算法

代码目录: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();

1.1 MTK的自动信道选择实现了以下3种算法:

主流无线芯片厂商的自动信道选择算法小结_第2张图片

  • (1)ChannelAlgApCnt:通过统计每个信道的AP个数来计算干扰值,选择AP个数少的信道。
  • (2)ChannelAlgCCA:通过CCA值和Rssi计算。
  • (3)ChannelAlgBusyTime:通过BusyTime计算。

2、RealTek芯片自动信道选择算法

代码目录: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算法,当找不到干净信道时,通过该矩阵来进行信道评估。

3、BRCM芯片自动信道选择算法

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

3.1 以下命令用于测试autochannel:

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。

3.2 acs算法流程

在信道选择期间,acs算法执行下述的步骤,主要是acs_select_chspec()。策略0,7使用acs_pick_chanspec_default(),其他的策略使用acs_pick_chanspec()进行信道选择功能(选择总分最高的信道)。切换到新的信道后,acs状态机将切换回CHANIM_STATE_DETECTING。

  • (1)、acs算法调用wl chanspecs wlan驱动(基于当前频段和国家码)构造候选信道列表,实现在acs_build_candidates()。
  • (2)、如果OBSS_COEX设置为Enabled or Auto,acs算法使所有无法通过2.4G频段上共存规则的信道无效,实现在acs_coex_check()。
  • (3)、如果acs配置标志(c_info->flags,acs_cli acs_flags)中设置了ACS_FLAGS_INTF_THRES_CCA(默认未开启),acs算法将检查CCASTATS_NOPKT干扰,实现在acs_candidate_check_intf(),如果stats->ccastats[CCASTATS_NOPKT]>c_info->acs_policy.intf_threshold,则认为有干扰。
  • (4)、如果acs配置标志中设置了ACS_FLAGS_INTF_THRES_BGN(默认未开启),acs算法将检查background Noise干扰,实现在acs_candidate_check_intf(),如果stats->bgnois> c_info->acs_policy.intf_threshold,则认为有干扰。
  • (5)、默认情况,acs算法在2.4G下,仅使用1,6,11信道,限制使用其他所有信道;通过设置nvram中的acs_2g_ch_no_restrict参数为1解除限制,默认情况下,参数未设置。
  • (6)、acs算法根据所选择的策略里的权重来计算当前所有剩余信道的评分,实现在acs_candidate_score(),见acs候选信道评分章节。
  • (7)、acs算法调用信道选择函数,默认是a_pol->chan_selector=acs_pick_chanspec_default(),还有一种是a_pol->chan_selector=acs_pick_chanspec(),这种除了策略0,7,其余策略都是基于CH_SCORE_TOTAL,选择总分最高的。

以下是默认算法流程:

  • 查找所有信道中CNS分数最低的信道(best_CNS),实现在acs_remove_noisy_cns()
  • 禁止所有信道中CNS分数< best_CNS + acs_trigger_value(acs_cli acs_trigger_var)。
  • 如果有多个有效信道,则acs算法基于CH_SCORE_BSS score选择bss计数最小的信道。基于CH_SCORE_BSS score,如果bss数相等,2.4G时再基于CH_SCORE_INTFADJ score选择远离干扰的信道,5G再基于高信道,实现在acs_pick_better_score()。
  • (8)、如果没有有效信道,则回退较低的带宽(从80MHz到40MHz或从40MHz到20MHz),然后重复步骤(1)-(7)。

3.3 自动信道选择包含以下注意事项:

  • (1)、评估附近BSS 的信道和带宽使用情况。
  • (2)、确定附近BSS对信道和带宽选择带来的影响。
  • (3)、确定控制边带。(仅适用用地支持40MHz的AP)
  • (4)、通过附近设备的性能来平衡正在选择频道的AP的预期性能。

自动信道选择在测试过程中,存在如下测试场景:比如说在频闭环境下,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的值,并通过分配一定的权值,可以优化自动信道选择算法。

你可能感兴趣的:(Linux,WLAN,wifi算法)