nl80211库和cfg80211是如何工作的?

50

我希望了解 nl80211cfg80211 的详细工作原理,包括功能流程以及 nl80211 如何与网络工具(如 wpa_supplicantiw)进行交互。


5
这个问题不符合主题范围。请参阅 [help/on-topic]。 - sigjuice
4个回答

71
为了能够从用户空间控制无线驱动程序,内核和用户空间之间使用了一些IPC通信过程。
首先使用具有供应商依赖的API的ioctl。
1996年,Jean Tourrilhes创建了无线扩展(WE或WEXT)。
无线扩展(WE)是一种通用API,允许驱动程序向用户空间公开特定于常见无线局域网的配置和统计信息。
  • In 2006, John Linville creates mac80211 and Johannes Berg creates cfg80211 and nl80211. Together it is intended to replace wireless extensions.

    +-------------+
    |             |
    |  Userspace  |
    |             |
    +-------------+
          ^
    - - - | - - - - 
          | nl80211
          v
    +-------------+
    |             |
    |  cfg80211   |
    |             |
    +-------------+
    +-------------+
    |             |
    |  mac80211   |
    |   driver    |
    |             |
    +-------------+
    
重要的一点是,nl80211/cfg80211/mac80211不再使用ioctl,它们使用netlink

因此,像iwhostapdwpa_supplicant这样的工具使用一些netlink库(如libnllibnl-tiny)和netlink接口公共头文件,当然是nl80211.h

文档不是很多,但我建议你先阅读libnl文档,然后再阅读iw源代码(因为iw使用libnl)。


nl80211充当用户空间和内核空间之间的接口......我很难理解控制流何时从用户空间转到内核空间。 - Rafal
1
你读过这个了吗?Netlink可以被看作是内核和用户空间之间的套接字。因此,用户可以用请求-回应的方式(例如,iw dev wlan0 link)和/或事件的方式(例如,iw dev wlan0 event)使用它。 - jmlemetayer
谢谢提供链接,但是我已经看过了那个页面...为了实现用户空间和内核空间的交互,需要创建一个套接字...但当涉及到跟踪代码时,我无法从用户空间跟踪到内核空间...如果有人能帮忙,请尽快回复。 - Rafal
你可以在linux-wireless邮件列表中搜索,甚至可以尝试向他们提问。如果你得到了回复,请发布出来,我非常感兴趣,但现在没有足够的时间去做! - jmlemetayer
1
链接已失效,这是存档版本的链接:https://web.archive.org/web/20160316163624/http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html - Miscreant

45
稍微详细地介绍了 nl80211cfg80211 如何与系统其他部分(用户空间内核硬件)交互。
  • nl80211 是用户空间软件(iw, wpa_supplicant等)和内核(cfg80211mac80211 内核模块以及特定的驱动程序)之间的接口。
  • WiFi 驱动程序和硬件可以是全MAC或软MAC(参见 Wireless_network_interface_controller )。
  • cfg80211_ops 是由全MAC驱动程序和 mac80211 模块向 cfg80211 模块注册的一组操作。
  • ieee80211_ops 是由软MAC驱动程序向 mac80211 模块注册的一组操作。

enter image description here


lspci -k | grep -A 3 -i "network" 返回了“Kernel driver in use: iwlwifi”。然后modinfo iwlwifi | grep depends返回了“cfg80211”。但是我该如何检查nl80211和mac80211呢?另外,我怎么知道驱动程序是否支持AP模式? - infoclogged

10

我为 Linux 中的无线堆栈创建了一个基本的代码流程图,从 wpa_supplicant > cfg80211 > mac80211 > ath9k_htc 全部包括在内。

该代码追踪适用于 Linux 内核版本 5.4.31。

这是链接:link


哇,太棒了。 你用什么软件创建了这个图表? - Phi Nguyen
2
@ItachiTensie 我没有使用任何软件,我只是用 Google Drawings 制作的... - Akshdeep Singh

9
请参见我对如何学习Linux无线驱动程序(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消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接