Linux SDIO WIFI Marvell8801/Marvell88w8801(四) --- Linux Wi-Fi架构

代码工程的GITHUB连接:点进进入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架构介绍主要分为以下图示几部分
在这里插入图片描述

1 Linux wireless架构

首先来看以下这种图。
在这里插入图片描述
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做简短介绍。

2 对接口IOCTL的架构介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看完以上理论介绍,那么我们就来看下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的处理函数指针,如图:
在这里插入图片描述

  • int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
  • Called when a user request an ioctl which can’t be handled by
  • the generic interface code. If not defined ioctl’s return
  • not supported error code.
    具体处理函数在woal_do_ioctl 里面,所以上面的接收过程为
    woal_do_ioctl-》woal_android_priv_cmd,然后再此函数中有以下处理

所以就整个mlanutl的发送,marvell wifi driver的接收就就串起来
在这里插入图片描述
总结: ioctl <—> linux kernel <—> woal_do_ioctl

3 对接口WEXT的架构介绍

在这里插入图片描述
WEXT也是通过socket通信,wpa_supplicant的code太多,我们就不从main函数分析,我们只是看下WEXT socket的init,wpa_supplicant的发送,marvell的WEXT的接收

3.1 Wpa_supplicant WEXT socket的init

在这里插入图片描述

3.2 Wpa_supplicant WEXT的发送

此部分还是已连接为例
在这里插入图片描述

3.3 Marvell wifi driver WEXT的接收

Marvell wifi driver里面会有iw_handler的函数指针结构体
在这里插入图片描述
此结构体也是赋连同其他的结构体赋值给net_device中的其中一个结构体成员
在这里插入图片描述
在Marvell中的代码为:
在这里插入图片描述
也就是说只要在外部程序调用WEXT,最终都会透过函数此接口进来

总结:ioctl <—> linux kernel <—> woal_handler_def中woal_handler的特定函数指针

4 对接口LIBNL的介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
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

发布了207 篇原创文章 · 获赞 556 · 访问量 76万+

猜你喜欢

转载自blog.csdn.net/XiaoXiaoPengBo/article/details/103927918