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

use*_*124 14 linux wireless device-driver linux-device-driver 802.11

Linux无线驱动程序mac80211中有如此多的结构.之类的东西struct net_device,struct ieee80211_hw,struct ieee80211_vifstruct ieee80211_local等.这么多结构我不明白它们包含什么信息以及何时初始化它们.

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

eya*_*lsh 44

您可以在这里查看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.
    • 控制路径:此路径是用户空间控制WiFi接口/设备并执行扫描/认证/关联等操作的方式.用户空间接口基于netlink并被调用nl80211(请参阅参考资料include/uapi/linux/nl80211.h).您可以发送命令获取响应事件.
  2. 当您发送nl80211命令时,它最初由cfg80211内核模块处理(它的代码在下net/wireless,处理程序在其中net/wireless/nl80211.c). cfg80211通常会打电话给较低级别​​的司机.在Full MAC硬件的情况下,特定的HW驱动程序位于cfg80211下方.下面的驱动程序通过使用cfg80211注册一组操作.例如,参见brcmfmac driver()cfg80211cfg80211_ops structdrivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
  3. 对于软MAC硬件,存在mac80211实现802.11 MAC层的内核模块.在这种情况下,cfg80211将讨论mac80211哪个将依次使用硬件特定的低级驱动程序.这方面的一个例子是iwlwifi(适用于英特尔芯片).
  4. mac80211cfg80211通过使用cfg80211_ops(参见net/mac80211/cfg.c)注册自己.特定的HW驱动程序mac80211使用ieee80211_ops struct(例如drivers/net/wireless/iwlwifi/mvm/mac80211.c)注册自己.
  5. 已连接的新NIC的初始化从堆栈的底部向上发生.硬件专用驱动程序ieee80211_allow_hw()通常在探测硬件后调用mac80211 .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)表示连接的单个物理设备.
  6. 在单个物理设备(也称为phy)之上,您可以设置多个虚拟接口.这些基本上就是你所知道的wlan0或wlan1 ifconfig.每个这样的虚拟接口由一个表示ieee80211_vif.此结构还包含最终由HW驱动程序访问的私有结构.多个接口可用于运行wlan0上的站点和wlan1上的AP(这可能取决于HW功能).