【问题标题】:How nl80211 library & cfg80211 work?nl80211 库和 cfg80211 如何工作?
【发布时间】:2020-05-09 06:46:07
【问题描述】:

我想详细了解nl80211cfg80211 的工作原理。函数流,nl80211 如何与wpa_supplicantiw 等网络工具交互。

请给我一些有用的链接或参考书籍。

【问题讨论】:

标签: c linux-kernel linux-device-driver wifi


【解决方案1】:

为了能够从用户空间控制无线驱动程序,使用了内核和用户空间之间的一些 IPC 通信过程。

  • 最初使用的是 ioctl 和供应商相关的 API。
  • 1996 年,Jean Tourrilhes 创建了wireless extensions(WE 或 WEXT)。

无线扩展 (WE) 是一个通用 API,允许驱动程序 暴露给特定的用户空间配置和统计信息 常见的无线局域网。

  • 2006 年,John Linville 创建了mac80211,Johannes Berg 创建了cfg80211nl80211。它旨在共同取代无线扩展。

    +-------------+
    |             |
    |  Userspace  |
    |             |
    +-------------+
          ^
    - - - | - - - - 
          | nl80211
          v
    +-------------+
    |             |
    |  cfg80211   |
    |             |
    +-------------+
    +-------------+
    |             |
    |  mac80211   |
    |   driver    |
    |             |
    +-------------+
    

重要的一点是nl80211/cfg80211/mac80211不再使用ioctl,他们使用netlink

因此,iwhostapdwpa_supplicant 等工具使用一些 netlink 库(如 libnllibnl-tiny)和 netlink 接口公共标头,当然是 nl80211.h

没有那么多文档,但我建议你阅读libnl documentation,然后阅读iw source code(因为我使用libnl)。

【讨论】:

  • nl80211 充当用户空间和内核空间之间的接口.....我很难理解控制流从用户空间到内核空间的时间点
  • 你读过this。 Netlink 可以比作内核和用户空间之间的套接字。因此用户可以以请求-响应方式(例如iw dev wlan0 link)和/或以事件方式(例如iw dev wlan0 event)使用它。
  • 感谢您的链接,但我已经浏览了该页面.....对于用户 n 内核空间之间的交互,创建了一个套接字......但是当涉及到跟踪代码时,我无法从用户空间跟踪到内核空间......如果有人可以帮助请尽快回复
  • 您可以在linux-wireless mailing list 中搜索,甚至可以尝试询问他们。如果您有回复,请发布,我很感兴趣,我现在没有足够的时间去做!
  • ^ 链接已失效,这是一个存档版本:web.archive.org/web/20160316163624/http://…
【解决方案2】:

关于nl80211cfg80211 如何与系统的其他部分(user spacekernelhardware)一起工作的更详细的图片。

  • nl80211 是用户空间软件(iwwpa_supplicant 等)和内核(cfg80211mac80211 内核模块和特定驱动程序)之间的接口。
  • WiFi 驱动程序和硬件可以是全 MAC 或软 MAC(请参阅 Wireless_network_interface_controller)。
  • cfg80211_ops 是一组全 MAC 驱动程序和 mac80211 模块注册到 cfg80211 模块的操作。
  • ieee80211_ops 是 Soft-MAC 驱动程序注册到 mac80211 模块的一组操作。

【讨论】:

  • lspci -k | grep -A 3 -i "network" 返回“正在使用的内核驱动程序:iwlwifi”。然后 modinfo iwlwifi | grep 依赖返回“cfg80211”。但是我如何检查 nl80211 和 mac80211。还有,我怎么知道驱动是否支持AP模式?
【解决方案3】:

查看我的回复 How to learn the structure of Linux wireless drivers (mac80211)?

wpa_supplicant,您可以按照src/drivers/driver_nl80211.c中的代码。这是一个 wpa_supplicant 驱动程序(不是内核驱动程序,而是wpa_supplicant 代码中使用的抽象),它使用libnl 与内核cfg80211 模块进行通信。例如,当wpa_supplicant 发出扫描时,wpa_driver_nl80211_scan 会被调用。它使用名为NL80211_CMD_TRIGGER_SCAN 的命令和扫描所需的所有参数构建netlink 消息。

【讨论】:

    【解决方案4】:

    我已经为 linux 中的无线堆栈创建了一个基本的代码流程图,
    一路从 wpa_supplicant > cfg80211 > mac80211 > ath9k_htc。

    已针对 linux 内核 5.4.31 跟踪代码。

    这里是link

    【讨论】:

    • 哇,太棒了。你用什么软件来制作这个图表?
    • @ItachiTensie 我没有使用任何软件,我只是用谷歌绘图制作的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多