如何学习Linux无线驱动程序的结构(mac80211)?

时间:2011-08-23 06:41:28

标签: linux linux-device-driver wireless device-driver 802.11

Linux无线驱动程序mac80211中有如此多的结构。 struct net_devicestruct ieee80211_hwstruct ieee80211_vifstruct ieee80211_local之类的内容等等。这么多结构我不明白它们包含什么信息以及何时初始化它们。

我如何了解它们以及无线驱动程序的整体架构?

1 个答案:

答案 0 :(得分:42)

您可以在这里查看Johannes Berg的(mac80211维护者)幻灯片: http://wireless.kernel.org/en/developers/Documentation/mac80211?action=AttachFile&do=get&target=mac80211.pdf

它们可能有点过时,但应该给你一个开始的地方。

Linux WiFi内核堆栈的高级描述:

  1. 了解当我们谈论WiFi时,用户空间与内核通信的路径有两个是很重要的:
    • 数据路径:接收的数据从无线驱动程序传递到netdev核心(通常使用netif_rx())。从那里,网络核心将通过TCP / IP堆栈代码传递它,并将其排队在用户空间进程将从中读取它的相关套接字上。在Tx路径上,数据包将使用ndo_start_xmit()回调从netdev核心发送到无线驱动程序。驱动程序使用struct net_device_ops注册(与其他netdevices,如以太网驱动程序)一组操作回调。
    • 控制路径:此路径是用户空间控制WiFi接口/设备并执行扫描 / 身份验证 / 关联等操作的方式即可。用户空间界面基于netlink并被称为nl80211(请参阅include/uapi/linux/nl80211.h)。您可以发送命令获取响应事件
  2. 当您发送nl80211命令时,它最初由cfg80211内核模块处理(它的代码位于net/wireless下,处理程序位于net/wireless/nl80211.c)。 cfg80211通常会调用较低级别的驱动程序。如果是完整MAC硬件,则特定硬件驱动程序位于cfg80211下方。 cfg80211下方的驱动程序使用cfg80211cfg80211_ops struct注册一组操作。例如,请参阅brcmfmac驱动程序(drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
  3. 对于软MAC硬件mac80211是实现802.11 MAC层的内核模块。在这种情况下,cfg80211将与mac80211对话,后者将使用硬件特定的低级驱动程序。这方面的一个例子是iwlwifi(适用于英特尔芯片)。
  4. mac80211使用cfg80211cfg80211_ops注册自己(请参阅net/mac80211/cfg.c)。特定硬件驱动程序使用mac80211(例如ieee80211_ops struct)向drivers/net/wireless/iwlwifi/mvm/mac80211.c注册自己。
  5. 您已连接的新NIC的初始化从堆栈的底部向上发生。通常在探测HW之后,HW特定驱动程序将调用mac80211的ieee80211_allow_hw()ieee80211_alloc_hw()获取HW驱动程序使用的私有数据结构的大小。它轮流调用cfg80211 wiphy_new(),它为wiphy结构提供足够的空间实际分配,ieee80211_local struct(由mac80211使用)和HW驱动程序私有数据(可以看到分层)在ieee80211_alloc_hw代码中。 ieee80211_hwieee80211_local中的嵌入式结构,它对HW驱动程序是“可见的”。所有这些(wiphyieee80211_localieee80211_hw)代表连接的单个物理设备。
  6. 在单个物理设备(也称为phy)之上,您可以设置多个虚拟接口。这些基本上就是你所知道的用ifconfig控制的wlan0或wlan1。每个这样的虚拟接口由ieee80211_vif表示。此结构还包含最终由HW驱动程序访问的私有结构。多个接口可用于运行类似wlan0上的站点和wlan1上的AP(这可能取决于硬件功能)。