1、无线数据包的主要数据流(从pci总线到phy error)
PCIDRVTAB_ENTRY
wl_pci_probeàwl_attach
netdev_attach
wl_dpc
wl_ecos_comm_wlc_dpc
wlc_dpc(出现tx phy error)
2、出现问题
当使用大流量无线数据包冲击路由器的时候,会出现无线掉线丢包严重,甚至掉线问题,(特别是使用迅雷下载)但是正常使用不会出现该现象。
3、问题分析
分析问题主要是原厂和我方沟通、讨论,最主要的是修改然后验证结果,定位到问题点是大流量无线数据包冲击路由器的时候,出现phy发不出数据包,然后无线出现掉线。原厂原来的给的补丁如下:
static int phy_err_cnt = 0;
phy_err_cnt++;
if( phy_err_cnt >= 3 )
{
WL_ERROR((“wl%d: HAMMERING info, CNT = %d\n”, wlc_hw->unit , wlc_hw->phyerr_cnt ));
wl_init(wlc->wl);
phy_err_cnt = 0;
}
patch原理:
在wlc_dpc要向上层发送数据包是,phy累计3次没有发出数据包,则调用wl_init。这种办法不能完全规避问题,只是暂时缓解,有的时候甚至根本没有效果,并且如果出现一次无线掉线问题,会连续出现,所以原厂给的这种规避措施根本没有效果。
4、 解决办法
原厂从我方提供的日志文件和与我方的沟通和验证中,导致phy分析出现异常的可能原因,经过多次的验证,得出结论:
1) 无线收发数据包的缓冲队列溢出;
2) 无线数据包进入ampdu模块出现异常
鉴于以上两点,暂时无法从根本上解决问题,所以给出了以下的规避方法:
1)当rx缓冲队列溢出时,添加清空缓冲队列的处理,并设置wl_init标志位为1
在接收到无线数据包后,无线收包缓冲队列一系列的数据会被更新;可能出现的情况是,phy发不出数据包的时候,是因为无线缓冲队列已经溢出,重启无线wl_init,但是重启后无线缓冲队列并没有被释放,当再次接收到无线数据包的时候,还是会出现rx缓冲队列overflow,所以还是会连续出现无线掉线情况;
这种情况的规避措施:
在收到无线数据包的时候,更新缓冲队列接收数据长度之前,使用一个临时变量,记录原来的缓冲队列的溢出长度,然后接收数据包,更新缓冲队列的数据,得到新的缓冲队列的溢出长度。如果缓冲队列有溢出,则重启无线;
当接收无线数据包,在无线聚合模块中,当等待超时时,在原有的处理上,设置wl_init的标志位为1
在ampdu(无线聚合)模块中,在wlc_ampdu_resp_timeout函数中,当ampud的应答器超时时,原来做了一些处理,比如一些统计信息的递增,主要做的工作是wlc_ampdu_release_all_ordered,丢掉了对应的ampdu的队里中的一部分包,然后等待下一个数据包序列到达,我们添加的动作是设置wl_init的标志位为1。
3)添加Big_hammer机制
为了解决视屏卡顿,在wlc_watchdog_timer中,添加big_hammer机制。如果phyerr_cnt累计3次发不出包,或是数据包在插入tx的有优先级权重队列过程失败或是tx队列累计3次,内存块释放失败时,设置视频卡顿的标志位为1,启用Big_hammer。
4)wl_init/Big_hammer/Wl_down对无线处理比较
wl_init 在保留原来连接不断开的情况下,调用wl_reste重置无线的一些模块,比如bmac和ampdu以及phy等,然后调用wlc_reinit对reset的模块进行重新初始化,在此过程中,只会极少的丢包,客户端几乎感知不到;
wl_bighammer在保留原来连接不断开的情况下,清空rx缓冲队列,down掉无线但是调用wlc_radio_upd迅速恢复,并调用wl_join恢复无线连接
wl_down 会关闭无线,断开无线连接。
三者的对无线的影响由小到大,恢复时间由短到长,处理也会从表面更深入。其实,选择wl_bighammer是对wl_init和wl_down的一种折中,既不会导致无线掉线,也会从一定程度上恢复无线的基本功能,使之正常运行。
5、无线性能测试项
无线主要测试一下项目:
1、无线近距离和远距离lan到wan、无线加密、无线桥接(wisp、wds、apclient)
2、无线无干扰环境下衰减、穿墙(分别穿1、2、3堵墙)、无线覆盖
3、无线抗干扰、挂机老化、高低温、待机量、小包转发