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

2024-01-10

Linux无线驱动mac80211中有这么多的结构。像struct net_device, struct ieee80211_hw, struct ieee80211_vif and struct ieee80211_local等等。如此多的结构我不明白它们包含什么信息以及它们何时初始化。

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


您可能想查看 Johannes Berg(mac80211 维护者)的幻灯片here https://wireless.wiki.kernel.org/_media/en/developers/documentation/mac80211.pdf.

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

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

  1. It's important to understand there are 2 paths in which userspace communicates with the kernel when we're talking about WiFi:
    • 数据路径:接收到的数据从无线驱动程序传递到netdev核心(通常使用netif_rx())。从那里,网络核心将通过 TCP/IP 堆栈代码传递它,并将其排队到用户空间进程将从中读取它的相关套接字上。在 Tx 路径上,数据包将从 netdev 核心发送到无线驱动程序,使用ndo_start_xmit()打回来。驱动程序通过使用注册(像其他网络设备,如以太网驱动程序)一组操作回调struct net_device_ops.
    • 控制路径:此路径是用户空间如何控制 WiFi 接口/设备并执行诸如scan / 验证 / 协会。用户空间接口基于netlink,称为nl80211 (see include/uapi/linux/nl80211.h)。你可以发送命令 and 获取事件响应.
  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. For 软MAC硬件mac80211这是实现 802.11 MAC 层的内核模块。在这种情况下cfg80211将与mac80211这将依次使用硬件特定的较低级别驱动程序。一个例子是 iwlwifi(适用于 Intel 芯片)。
  4. mac80211将自身注册到cfg80211通过使用cfg80211_ops (see net/mac80211/cfg.c)。特定的硬件驱动程序将其自身注册为mac80211通过使用ieee80211_ops struct(例如drivers/net/wireless/iwlwifi/mvm/mac80211.c).
  5. 您连接的新 NIC 的初始化是从堆栈自下而上进行的。硬件特定驱动程序将调用 mac80211ieee80211_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 之类的东西(这取决于硬件功能)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 检测 Android 上的网络连接类型

    如何检测 Android 上的网络连接类型 是否通过ConnectivityManager getActiveNetworkInfo getType 答案是否仅限于 Wifi 和移动设备 如果问题是要确定手机的网络是否已连接且速度是否足以满
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 获取 Wi-Fi 配置文件信息

    我使用的是 Windows 8 1 它没有工具 带有 GUI 来管理 wifi 网络配置文件 所以我正在写一篇对我有帮助的文章 我做了一些谷歌搜索并发现托管 Wifi API https managedwifi codeplex com 并
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe

随机推荐