A33上AP6210 ap和sta无法自由切换的问题

2019-07-13 09:30发布

公司一个视频监控的项目,需要在全志A33上实现wifi作为ap和sta进行视频的传输和控制。 作为sta的话,一开始用wpa_supplicant交叉编译,然后移植到板子上就能正常启动了,可以连接wifi并且可以和外网www.baidu.com ping通。 如果作为AP端的话(如果网卡支持的话,我的板子上用的是wifi和蓝牙二合一的ap6210)那就需要hostapd来启动热点作为AP端。 但是在进行了一系列的,复杂的交叉编译,(使用到的有hostapd ,dhcpd,libssl,wpa_supplicant等等,在我的下载资源中有打包下载)然后移植到板子上,然后运行 我天!这是什么鬼!当时直接崩溃了!辛辛苦苦编译的hostapd,出现了这个问题,咋办?          CFG80211-ERROR) check_dev_role_integrity : device role select failed
谁知道这个鬼问题到底错在哪,是hostapd的问题,还是网卡本身不兼容,还是驱动的问题。我了个擦,没办法网上查吧。然后在网上查啊查,一查绝望了,国内基本上没人遇到过!!只有老外遇到过这种问题。那就看吧,还好老外的邮件往来对话还算简单明晰。再看过一个老外的对话后,发现他们大多遇到的是在PC端的问题,解决问题很简单,就是一个配置文件的问题。和我的情况不一样!!!只能靠自己搞了。 解决问题: 1、找问题的出处,对于这一段报错代码check_dev_role_integrity : device role select failed在linux内核中进行搜索果然报错的是内核!!所以问题可以从内核这里找,肯定是网卡驱动这一部分和hostapd不匹配出现了这个device role select failed。 2.然后根据这个报错代码一步一步追踪,sourceinsight还是比较好用的,在驱动文件drivers/net/wireless/bcmdhd/dhd_linux.c 最后确定了一个变量op_mode 的值不匹配。个人认为这个值应该是hostapd可以改变成相应的模式的,但是事实不是这样。那咋办啊???然后我找到了op_mode和dhd->op_mode进行匹配的函数,dhd_preinit_ioctls(dhd_pub_t *dhd),这个函数主要是进行前期的模式匹配的,我就在一开始的位置将op_mode = DHD_FLAG_HOSTAP_MODE;加上,然后抱着试试看的态度,重新编译内核。然后烧录运行hostapd。哇塞!!竟然成功了!!太惊喜了!!作为一个小白,个人还是很有成就感的,虽然不算解决了问题,但是至少定位到了问题在哪!!至少AP这部分可以测试一下,后面再从根本上解决该问题。 然后,我在使用sta模式,唉!不行了!显示错误为当前模式为host_ap模式。wpa_supplicant,运行不了!
然后思索 ,我强制改变了模式,导致了sta失败。那么,我找到op_mode初始化的值,然后去掉之前强制赋予的模式,然后再运行hostapd和wpa_supplicant,并且在内核中添加打印信息,发现op_mode竟然没有改变,也就是op_mode的值是无法改变的。在内核代码中也确实没有找到op_mode进行赋值的地方。那么,怎么办?一个偶然的发现,让我找到了该问题的解决办法。在查看op_mode的声明的时候有这样的一行代码
只有这一个地方有出现op_mode ,那这是什么意思呢?我没见过。看函数名应该时候一个参数什么的。然后,百度呗。 原来module_param函数是在加载驱动模块的时候传参用的!!!那么就是说op_mode可以在加载驱动的时候改变!!我天!这太坑爹了吧!!!真没想到,是这样的结果,对于应用层来说这太难操作了,我理解的是这样子。接下来就试试可行不,insmod bcmdhd.ko op_mode=1 //sta insmod bcmdhd.ko op_mode =2 //ap 果然,成功运行!!问题解决了,但是,个人还是有疑问,为什么要通过这种方式传参来改变模式,我接触过的网卡芯片就这一款,不知道其他的网卡芯片是如何实现这个op_mode的转换的,但是肯定没有我这个样子的,因为我没有搜到和我一样情况的帖子。 现在记录下来,给遇到相同情况的人指明一条路,也希望这方面的大神给我解疑答惑微笑