全网最强Android Wi-Fi架构与80211协议栈解读(W字)

文章涉及的格式以及代码没有尽心修改,另外设计的一些图片也没有修改,这里放一个钩子,完整的内容可以移步公众号 – 无线技术栈 阅读,期待你的关注~

往期精彩
文章目录
Android Wi-Fi整体架构以及80211协议架构
Wi-Fi编程API介绍(WEXT)
Wext(Wireless Extension)
WexT编程规范介绍
WexT API使用实例
nl80211
nl80211架构介绍
netlink消息传递
nl80211支持的消息和函数(nl80211_ops)
wpa_supplicant netlink初始化及实例
cfg80211
cfg80211架构介绍
cfg80211驱动代码分析
mac80211
mac80211架构介绍
mac80211驱动代码架构介绍
mac80211驱动涉及的数据结构
mac80211主要代码流程

往期精彩
零零散散分门别类开展了好几个主题,目前基本处于并发整理的阶段中,希望给深耕无线技术的兄弟姐妹贡献一点自己的力量~
目前关于Wi-Fi架构的文章如下:
Wi-Fi架构(四)-- 网络工厂1
Wi-Fi架构(三)-- Wifi大管家ClientModeImpl
Wi-Fi架构(二)-- Wi-Fi打开问题实战2.2
Wi-Fi架构(二)-- Wi-Fi打开流程2.1
Wi-Fi架构(一)

目前关于Wi-Fi网络的文章如下:
TCP/IP(八)- 全网介绍TCP/IP最细的文章
TCP/IP(七)- 在数据链路层迷路的TCP包&工厂AP搭建建议
TCP/IP(六)- 全网介绍TCP/IP最全的文章
TCP/IP(五)- 我确定可以说清楚IP
TCP/IP(四)- 你确定可以说清楚IP

目前关于Wi-Fi新技术的文章如下:
吞吐系列(一)- Wi-Fi7吞吐性能拆解
Wi-Fi技术简介(八)-- Wi-Fi7技术解析
Wi-Fi7 MLO(Multi-Link Operation)

目前关于安全的文章如下:
802.11 - Wi-Fi连接发生mic failure怎么办
Wi-Fi四种安全协议 - WEP、WPA、WPA2、WPA3,看完秒懂

目前关于网络编程的文章如下:
TCP/IP(九)- Socket编程实战

目前关于Wi-Fi通识的文章如下:
Wi-Fi技术简介(七)-- 理解基本概念与专业术语
Wi-Fi技术简介(六)-- 理解基本概念与专业术语
Wi-Fi技术简介(六)-- 网络是如何工作的

目前关于Android的文章如下:
Android Tombstone分析定位(二)
一次wlan固件crash的debug经历
Android架构(一)- Binder系列

目前关于802.11系列的文章如下:
11AX省电 - TWT技术
Wi-Fi技术简介(五)-- DCF

以及还有一些不知道关于什么的文章:
HarmonyOS应用开发者高级认证证书获取
父亲节快乐, 到今天才读懂朱自清父亲的背影

Android Wi-Fi架构以及80211协议架构
先画一张图,整体看一下wifi的整体架构:

图片
Android Wi-Fi整个框架如上图,对于frameworks层的一些业务逻辑后续再详细拆解,这一节侧重说清楚802.11协议栈的整体结构,802.11协议栈主要位于kernel空间,简单来说,802.11协议栈主要需要完成以下工作;
nl80211:

nl80211是Linux内核中用于与用户空间应用程序进行通信的接口。它通常通过Netlink协议与用户空间的网络管理工具和配置程序进行交互,例如iw命令行工具。nl80211提供了一种标准化的方式,使用户空间能够配置和管理无线设备、扫描网络、设置连接参数等。具体工作包括:

设备配置:允许用户空间配置无线设备的各种属性,如频率、功率、接口模式等。

网络扫描:启动和管理对无线网络的扫描,并将结果传送到用户空间。

连接管理:处理连接建立、断开和切换等操作。

事件通知:向用户空间发送与无线设备状态变化相关的事件。

cfg80211:

cfg80211提供了一种抽象接口,用于与无线设备驱动程序进行通信。它定义了一组操作,这些操作允许无线核心(mac80211)与设备特定的驱动程序进行交互,而无需关注具体的硬件细节。主要工作包括:

设备抽象:为不同的无线设备提供统一的接口,使得核心无线代码可以与各种不同的设备驱动程序进行交互。

硬件抽象:屏蔽底层硬件的差异,提供统一的接口给上层协议栈使用。

扫描协调:协调和管理无线设备的扫描操作,确保不同设备驱动程序的一致性。

mac80211:

mac80211是Linux内核中的一个核心组件,实现了802.11协议的大部分功能,包括管理帧的处理、帧的传输、QoS (Quality of Service) 管理等,也是基于802.11标准实现的一个标准驱动,我们在阅读802.11协议的同时可以参阅这部分代码的实现。具体工作包括:

帧处理:解析和构建 802.11 帧,包括管理帧(如认证、关联等)和数据帧。

调度和传输:管理帧的发送和接收,包括数据帧的传输机制(如 CSMA/CA)。

QoS 支持:实现 802.11e 标准,支持服务质量的管理和优先级传输。

认证与关联:处理设备连接到网络的认证和关联过程。

功率管理:管理设备的功耗,实现节能机制。

安全性支持:实现加密和认证机制,保护无线通信的安全性。

综合来看,可以说nl80211、cfg80211和mac80211在WLAN kernel中的工作主要包括:

设备配置和管理:通过 nl80211 提供用户空间与内核的通信接口,允许配置和管理无线设备。

驱动程序抽象和硬件管理:通过cfg80211提供设备驱动程序与核心无线代码之间的抽象接口,使得不同的设备驱动程序可以统一与上层协议栈进行交互。

802.11协议实现:通过mac80211实现了802.11协议的核心功能,包括帧处理、调度、QoS 管理、认证和关联,以及安全性支持等。

这些组件共同作用,使得 Linux 内核能够支持多种无线设备,并提供统一的接口和功能,以便于用户空间应用程序和网络管理工具的使用和开发;

Wi-Fi编程API介绍
在Linux平台上,Wi-Fi模块涉及到以下几个层次:
Framworks:主要为应用提供SDK接口以及L2层一些必须的逻辑实现;
wpa_supplicant&hostapd:它俩是Wi-Fi的daemon进程,负责用户空间和内核空间的通信,也有一些802.11规范的实现;
kernel:内核空间,主要包括cfg80211&nl80211&mac80211的实现;
driver&firmware:厂商驱动;
那么,为了实现用户空间与内核空间的通信,Linux平台提供了两套API编程规范:
Wext(Wireless Extension):
最早的一套是Linux Wireless Extension,缩写我们熟悉一点,就是wex或者wext,其主要是基于ioctl,但是随着系统的迭代升级,其逐渐被取代,主要原因有两个:
(1)基于ioctl编程,有一个缺陷就是ioctl的原型函数参数可变,其设计理念与Linux严格的编程理念不一致;

ioctl(int fd, unsigned long cmd, …)

(2)ioctl的参数不仅个数不固定,其参数类型也无法通过函数原型来加以说明。这显然与Linux安全设计理念不一致。

WEXT编程规范介绍
WEXT主要基于ioctl进行开发,而ioctl实际上是一种系统调用,可以同时满足读写功能;
wext编程规范遵循了802.11规范,其API定义于wireless.h文件中,下边简单介绍一下其涉及的几个基本数据结构以及编程实例:

//ioctl编程命令编号
kernel_platform/msm-kernel/include/uapi/linux/wireless.h

234 /* -------------------------- IOCTL LIST -------------------------- /
235
236 /
Wireless Identification /
237 #define SIOCSIWCOMMIT 0x8B00 /
Commit pending changes to driver /
238 #define SIOCGIWNAME 0x8B01 /
get name == wireless protocol /
239 /
SIOCGIWNAME is used to verify the presence of Wireless Extensions.
240 * Common values : “IEEE 802.11-DS”, “IEEE 802.11-FH”, “IEEE 802.11b”…
241 * Don’t put the name of your driver there, it’s useless. /
242
243 /
Basic operations /
244 #define SIOCSIWNWID 0x8B02 /
set network id (pre-802.11) /
245 #define SIOCGIWNWID 0x8B03 /
get network id (the cell) /
246 #define SIOCSIWFREQ 0x8B04 /
set channel/frequency (Hz) /
247 #define SIOCGIWFREQ 0x8B05 /
get channel/frequency (Hz) /
248 #define SIOCSIWMODE 0x8B06 /
set operation mode /
249 #define SIOCGIWMODE 0x8B07 /
get operation mode /
250 #define SIOCSIWSENS 0x8B08 /
set sensitivity (dBm) /
251 #define SIOCGIWSENS 0x8B09 /
get sensitivity (dBm) /
252
253 /
Informative stuff /
254 #define SIOCSIWRANGE 0x8B0A /
Unused /
255 #define SIOCGIWRANGE 0x8B0B /
Get range of parameters /
256 #define SIOCSIWPRIV 0x8B0C /
Unused /
257 #define SIOCGIWPRIV 0x8B0D /
get private ioctl interface info /
258 #define SIOCSIWSTATS 0x8B0E /
Unused /
259 #define SIOCGIWSTATS 0x8B0F /
Get /proc/net/wireless stats /
260 /
SIOCGIWSTATS is strictly used between user space and the kernel, and
261 * is never passed to the driver (i.e. the driver will never see it). /
262
263 /
Spy support (statistics per MAC address - used for Mobile IP support) /
264 #define SIOCSIWSPY 0x8B10 /
set spy addresses /
265 #define SIOCGIWSPY 0x8B11 /
get spy info (quality of link) /
266 #define SIOCSIWTHRSPY 0x8B12 /
set spy threshold (spy event) /
267 #define SIOCGIWTHRSPY 0x8B13 /
get spy threshold */

external/kernel-headers/original/uapi/linux/wireless.h
//定义wireless版本
#define WIRELESS_EXT 22

常用的数据结构:
1.iwreq
/*

  • The structure to exchange data for ioctl.
  • This structure is the same as ‘struct ifreq’, but (re)defined for
  • convenience…
  • Do I need to remind you about structure size (32 octets) ?
    /
    struct iwreq {
    union
    {
    char ifrn_name[IFNAMSIZ]; /
    if name, e.g.“eth0” “wlan0”/
    } ifr_ifrn;
    /
  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值