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

moiiocjp  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(136)

Linux无线驱动mac80211中有太多的结构,像struct net_devicestruct ieee80211_hwstruct ieee80211_vifstruct ieee80211_local等等,太多的结构,我不知道它们包含什么信息,以及它们是什么时候初始化的。
我如何了解它们以及无线驱动程序的整个架构?

sdnqo3pr

sdnqo3pr1#

你可能想看看约翰内斯贝格(mac 80211维护者)的幻灯片here
他们可能有点过时,但应该给你一个给予的地方开始。
Linux WiFi内核堆栈的高级描述:

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

相关问题