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

问题描述 投票:0回答:1

Linux无线驱动mac80211中有这么多结构。像

struct net_device
struct ieee80211_hw
struct ieee80211_vif
struct ieee80211_local
等等。如此多的结构我不明白它们包含什么信息以及它们何时初始化。

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

linux wifi linux-device-driver device-driver
1个回答
56
投票

您可能想查看 Johannes Berg(mac80211 维护者)的幻灯片这里

它们可能有点过时,但应该为您提供一个起点。

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

  1. 当我们谈论 WiFi 时,了解用户空间与内核通信的路径有 2 条,这一点很重要:
    • 数据路径:接收到的数据从无线驱动程序传递到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
    通常会呼叫较低级别的司机。对于完整的 MAC 硬件,特定的硬件驱动程序位于 cfg80211 的正下方。下面的驱动程序
    cfg80211
    通过使用
    cfg80211
    cfg80211_ops struct
    注册了一组操作。例如,请参阅 brcmfmac 驱动程序 (
    drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
    )
  3. 对于软 MAC 硬件,有
    mac80211
    ,它是实现 802.11 MAC 层的内核模块。在这种情况下,
    cfg80211
    将与
    mac80211
    对话,后者将依次使用特定于硬件的较低级别驱动程序。一个例子是 iwlwifi(适用于英特尔芯片)。
  4. mac80211
    通过使用
    cfg80211
    将自身注册到
    cfg80211_ops
    (请参阅
    net/mac80211/cfg.c
    )。特定硬件驱动程序通过使用
    mac80211
    (例如
    ieee80211_ops struct
    )向
    drivers/net/wireless/iwlwifi/mvm/mac80211.c
    注册自身。
  5. 您连接的新 NIC 的初始化是从堆栈底部向上进行的。特定于硬件的驱动程序通常会在探测硬件后调用 mac80211 的
    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
    ) 代表连接的单个物理设备。
  6. 在单个物理设备(也称为 phy)之上,您可以设置多个虚拟接口。这些本质上就是您所知道的 wlan0 或 wlan1,您可以使用
    ifconfig
    进行控制。每个这样的虚拟接口都由
    ieee80211_vif
    表示。该结构最后还包含由硬件驱动程序访问的私有结构。多个接口可用于运行诸如 wlan0 上的站和 wlan1 上的 AP 之类的东西(这取决于硬件功能)。
© www.soinside.com 2019 - 2024. All rights reserved.