Linux无线驱动mac80211中有这么多结构。像
struct net_device
、struct ieee80211_hw
、struct ieee80211_vif
和struct ieee80211_local
等等。如此多的结构我不明白它们包含什么信息以及它们何时初始化。
我如何了解它们以及无线驱动程序的整个架构?
您可能想查看 Johannes Berg(mac80211 维护者)的幻灯片这里。
它们可能有点过时,但应该为您提供一个起点。
Linux WiFi 内核堆栈的高级描述:
netif_rx()
)。从那里,网络核心将通过 TCP/IP 堆栈代码传递它,并将其排队到用户空间进程将从中读取它的相关套接字上。在 Tx 路径上,数据包将使用 ndo_start_xmit()
回调从 netdev 核心发送到无线驱动程序。驱动程序通过使用 struct net_device_ops
.nl80211
(参见 include/uapi/linux/nl80211.h
)。您可以发送命令并获取事件响应。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
)mac80211
,它是实现 802.11 MAC 层的内核模块。在这种情况下,cfg80211
将与mac80211
对话,后者将依次使用特定于硬件的较低级别驱动程序。一个例子是 iwlwifi(适用于英特尔芯片)。mac80211
通过使用 cfg80211
将自身注册到 cfg80211_ops
(请参阅 net/mac80211/cfg.c
)。特定硬件驱动程序通过使用 mac80211
(例如 ieee80211_ops struct
)向 drivers/net/wireless/iwlwifi/mvm/mac80211.c
注册自身。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
) 代表连接的单个物理设备。ifconfig
进行控制。每个这样的虚拟接口都由 ieee80211_vif
表示。该结构最后还包含由硬件驱动程序访问的私有结构。多个接口可用于运行诸如 wlan0 上的站和 wlan1 上的 AP 之类的东西(这取决于硬件功能)。