代码工程的GITHUB连接:
https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi
1.Linux SDIO WIFI Marvell8801/Marvell88w8801(一) — 代码及文档介绍
2. Linux SDIO WIFI Marvell8801/Marvell88w8801(二) — Marvell88w8801驱动编译
3. Linux SDIO WIFI Marvell8801/Marvell88w8801(三) — Linux驱动以及组件的使用
4. Linux SDIO WIFI Marvell8801/Marvell88w8801(四) — Linux Wi-Fi架构
5. Linux SDIO WIFI Marvell8801/Marvell88w8801(五) — Linux SDIO API介绍
6. Linux SDIO WIFI Marvell8801/Marvell88w8801(六) — Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
7. Linux SDIO WIFI Marvell8801/Marvell88w8801(七) — Marvell Linux Wi-Fi driver初始化
8. Linux SDIO WIFI Marvell8801/Marvell88w8801(八) — Marvell Linux Wi-Fi driver 对接芯片上行下行接口介绍
关于Linux wifi架构介绍主要分为以下图示几部分
首先来看以下这种图。
Linux wifi一般APP跟wifi driver交互会有三个途径
1)ioctl,以我们上一篇文章使用的Marvell APP里面的mlanutl和uaputl.exe为代表。
2)Wext.以图上的iwpriv,iwlist,iwconfig为代表
3)Libnl以图上的wpa_supplicant,iw ,hostapd为代表
补充:iw,hostapd的源码我没有看过,所以不能妄加评论,但是wpa_supplicant是可以走WEXT的
Marvell wifi driver支持三种接口,如下图所示
Marvell wifi driver已经整合了以上三种(IOCTL,WEXT,LIBNL)交互方式,具体如下
后续的三个小节我们针对IOCTL,WEXT以及LIBNL做简短介绍。
看完以上理论介绍,那么我们就来看下mlanutl怎样和Marvell wifi driver交互
我们拿连接为例(此部分我们连接一个没有密码的),至于这么做的原因我们只是想搞懂架构,而不是里面的处理方式,所以尽量使其简单化
连接的命令,我们在上一篇文章有介绍,再贴出一次
This command is used to assoc essid with asynced mode,and driver will auto retry if driver auto assoc enabled.
Usage:
mlanutl mlanX assocessid <"[essid]">
Where
<"[essid]"> is the essid which need to be associated with asynced mode.
Examples:
mlanutl mlan0 assocessid “IoT_lwos_wifi”
Mlanutl的入口函数我们截图表示,其中牵扯到的内容有,main函数入参,socket,如果有不懂的请自行查阅内容
下面我们来看process_command的函数
{“assocessid”, process_assocessid}, 连接对应的是这一项,分析下process_assocessid
其中组buffer的过程code中很简单,最出来的样子为:
MRVL_CMDassocessidIoT_lwos_wifi
我们来重点看下sockets发送的流程
既然有了发送,我们来看下Marvell的接收过程
补充知识:Linux wifi有一个叫做net_device的结构体,在这里假设Linux的kernel的版本超过2.6.39,net_device结构体中另外有一组叫做net_device_ops的函数指针,里面有定义ioctl的处理函数指针,如图:
所以就整个mlanutl的发送,marvell wifi driver的接收就就串起来
总结: ioctl <—> linux kernel <—> woal_do_ioctl
WEXT也是通过socket通信,wpa_supplicant的code太多,我们就不从main函数分析,我们只是看下WEXT socket的init,wpa_supplicant的发送,marvell的WEXT的接收
此部分还是已连接为例
Marvell wifi driver里面会有iw_handler的函数指针结构体
此结构体也是赋连同其他的结构体赋值给net_device中的其中一个结构体成员
在Marvell中的代码为:
也就是说只要在外部程序调用WEXT,最终都会透过函数此接口进来
总结:ioctl <—> linux kernel <—> woal_handler_def中woal_handler的特定函数指针
libnl也是通过socket通信,同样,我们来说下wpa_supplicant的libnl的发送,marvell wifi driver libnl的接收部分
Wpa_supplicant基于libnl的发送
send_and_recv_msgs
Marvell wifi driver基于libnl的接收
woal_cfg80211_ops 结构体中某个函数指针
总结: wpa_supplicant <—> libnl <—> linux kernel <—> Marvell wifi