Linux无线驱动程序mac80211中有如此多的结构。 struct net_device
,struct ieee80211_hw
,struct ieee80211_vif
和struct ieee80211_local
之类的内容等等。这么多结构我不明白它们包含什么信息以及何时初始化它们。
我如何了解它们以及无线驱动程序的整体架构?
答案 0 :(得分:42)
您可以在这里查看Johannes Berg的(mac80211维护者)幻灯片: http://wireless.kernel.org/en/developers/Documentation/mac80211?action=AttachFile&do=get&target=mac80211.pdf
它们可能有点过时,但应该给你一个开始的地方。
Linux WiFi内核堆栈的高级描述:
netif_rx()
)。从那里,网络核心将通过TCP / IP堆栈代码传递它,并将其排队在用户空间进程将从中读取它的相关套接字上。在Tx路径上,数据包将使用ndo_start_xmit()
回调从netdev核心发送到无线驱动程序。驱动程序使用struct net_device_ops
注册(与其他netdevices,如以太网驱动程序)一组操作回调。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()
获取HW驱动程序使用的私有数据结构的大小。它轮流调用cfg80211 wiphy_new()
,它为wiphy结构提供足够的空间实际分配,ieee80211_local struct
(由mac80211
使用)和HW驱动程序私有数据(可以看到分层)在ieee80211_alloc_hw
代码中。
ieee80211_hw
是ieee80211_local
中的嵌入式结构,它对HW驱动程序是“可见的”。所有这些(wiphy
,ieee80211_local
,ieee80211_hw
)代表连接的单个物理设备。ifconfig
控制的wlan0或wlan1。每个这样的虚拟接口由ieee80211_vif
表示。此结构还包含最终由HW驱动程序访问的私有结构。多个接口可用于运行类似wlan0上的站点和wlan1上的AP(这可能取决于硬件功能)。