如何学习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)的结构? 的相关文章

  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs

随机推荐