引言
Linux 无线驱动的开源项目backports的分析。
介绍
整个驱动代码分成两个结构。80211通用的功能提取出来做成通用层,这一部分叫做soft mac。 而一些与芯片处理相关的部分代码放在各个芯片目录下,这部分是芯片的特定mac层。
一般而言 mac驱动有两个方面,一是数据转发,二是管理。我们把这两个方面,分别叫作数据层面和管理层面,或是数据面与管理面。
soft mac层的三个层次
soft mac 层就是/net/mac80211部分代码,它向上完成了与linux kernel的对接,并使用linux 的genl方式, 为用户层程序访问配置无线驱动提供了接口。单就管理面而言有四个模块。如下图:
nl80211层
这一层的代码在/net/wireless/nl80211.c。这是用户程序调用相关的系统调用在内核的入口。 处理各种不同的命令。它向下会调用cfg80211层。 linux为配置有线接口定义了一些ioctl的命令字,由于无线接口的可配置项远远比有线接口的可配置多很多。 ioctl命令字空间也有限,所以为无线接口的管理面定义了使用netlink 的genl全新的接口,叫做nl80211。
cfg80211层
这一层负责管理层面的工作。不关心数据转发的业务。 驱动扫描到一个物理芯片时,此芯片(代码中叫wiphy)会注册到cfg80211层。cfg80211层就组织好所有无线接口, 以及他们的属性。它可以处理的业务有:
- 无线虚接口相关,如channel,创建无线虚接口;加密密钥管理等。
- 过程管理相关,station的过程管理部分(扫描,上下线)
- 还有一部分与linux相关的,如输出sysfs;注册ethtool等。
cfg80211_rdev_list 全局变量,用于组织和管理wiphy。注意这可不是一个无线的虚拟接口。
mac80211层
这一层既负责管理层面,也要负责数据层面。
这一层主要关心的是无线虚拟接口,station等。而无线的虚拟接口会把所有的无线虚拟接口组织管理起来。 在管理层面上,wiphy会向cfg80211注册时会把mac80211_config_ops作为自己的config_ops。 这样管理层会通过mac80211层。通过这一层再下发到芯片层。
数据层面的处理主要是rx和tx两方面。 因为linux 的bridge只处理以太报文;所以此层会完成这种帧的转换;在接收时此层完成把无线数据帧(802.11) 转成以太数据(802.3),并交给linux的网络协议栈处理。发送的过程与之相反。