Linux无线驱动mac80211中有这么多的结构。像struct net_device
, struct ieee80211_hw
, struct ieee80211_vif
and struct ieee80211_local
等等。如此多的结构我不明白它们包含什么信息以及它们何时初始化。
我如何了解它们以及无线驱动程序的整个架构?
您可能想查看 Johannes Berg(mac80211 维护者)的幻灯片here https://wireless.wiki.kernel.org/_media/en/developers/documentation/mac80211.pdf.
它们可能有些过时,但应该为您提供一个起点。
Linux WiFi 内核堆栈的高级描述:
- It's important to understand there are 2 paths in which userspace communicates with the kernel when we're talking about WiFi:
-
数据路径:接收到的数据从无线驱动程序传递到netdev核心(通常使用
netif_rx()
)。从那里,网络核心将通过 TCP/IP 堆栈代码传递它,并将其排队到用户空间进程将从中读取它的相关套接字上。在 Tx 路径上,数据包将从 netdev 核心发送到无线驱动程序,使用ndo_start_xmit()
打回来。驱动程序通过使用注册(像其他网络设备,如以太网驱动程序)一组操作回调struct net_device_ops
.
-
控制路径:此路径是用户空间如何控制 WiFi 接口/设备并执行诸如scan / 验证 / 协会。用户空间接口基于netlink,称为
nl80211
(see include/uapi/linux/nl80211.h
)。你可以发送命令 and 获取事件响应.
- 当您发送一个
nl80211
它最初处理的命令cfg80211
内核模块(它的代码位于net/wireless
处理程序在net/wireless/nl80211.c
).
cfg80211
通常会呼叫较低级别的驱动程序。的情况下完整的 MAC 硬件具体的硬件驱动程序位于 cfg80211 的正下方。下面这位司机cfg80211
注册一组操作cfg80211
通过使用cfg80211_ops struct
。例如,请参阅 brcmfmac 驱动程序 (drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
)
- For 软MAC硬件有
mac80211
这是实现 802.11 MAC 层的内核模块。在这种情况下cfg80211
将与mac80211
这将依次使用硬件特定的较低级别驱动程序。一个例子是 iwlwifi(适用于 Intel 芯片)。
-
mac80211
将自身注册到cfg80211
通过使用cfg80211_ops
(see net/mac80211/cfg.c
)。特定的硬件驱动程序将其自身注册为mac80211
通过使用ieee80211_ops struct
(例如drivers/net/wireless/iwlwifi/mvm/mac80211.c
).
- 您连接的新 NIC 的初始化是从堆栈自下而上进行的。硬件特定驱动程序将调用 mac80211
ieee80211_allow_hw()
通常在探测硬件之后。ieee80211_alloc_hw()
获取硬件驱动程序使用的私有数据结构的大小。它依次调用cfg80211 wiphy_new()
实际分配的空间是否足以容纳 wiphy 结构,ieee80211_local struct
(这是由mac80211
)和硬件驱动程序私有数据(分层见于ieee80211_alloc_hw
代码)。ieee80211_hw
是一个嵌入结构ieee80211_local
这对硬件驱动程序是“可见的”。所有这些(wiphy
, ieee80211_local
, ieee80211_hw
) 代表连接的单个物理设备。
- 在单个物理设备(也称为 phy)之上,您可以设置多个虚拟接口。这些本质上就是您所知道的 wlan0 或 wlan1,您可以使用它们进行控制
ifconfig
。每个这样的虚拟接口都由一个表示ieee80211_vif
。该结构最后还包含由硬件驱动程序访问的私有结构。多个接口可用于运行 wlan0 上的站和 wlan1 上的 AP 之类的东西(这取决于硬件功能)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)