nl80211
同 wpa_supplicant、hostapd 一样,nl80211 也可以管理无线网络,不同的是 wpa_supplicant 和 hostapd 是通过 nl80211 管理无线网络。
Linux平台上目前常用的专门针对无线网络设备编程的API有两套
- 最早的一套API由HP公司员工Jean Tourrilhes于1997年开发,全称为Linux Wireless Extensions。一般缩写为wex或wext。这套API使得用户空间的程序能通过ioctl函数来控制无线网卡驱动。
- 由于利用ioctl开展编程的方式不太符合Linux驱动开发的要求,所以后来Linux又提供了cfg80211和nl80211两套编程接口用于替代wext。其中,cfg80211用于驱动开发,而nl80211 API供用户空间进程使用以操作那些利用cfg80211 API开发的无线网卡驱动。
注意:ioctl不符合Linux驱动开发要求主要体现在:
- ioctl的原型为int ioctl(int fd, unsigned long cmd, ...),最后三个点代表它支持可变个数的参数。但对于一个经过严格定义的系统调用来说,支持可变个数参数的做法似乎显得有些随性。
- ioctl的参数不仅个数不固定,其参数类型也无法通过函数原型来加以说明。这同样对于一个严谨的系统调用来说,也是不可接受的。
相比wext,nl80211的使用难度较大,因为在nl80211框架中,用户进程和Kernel通信的手段没有使用wext中的ioctl,而是采用了netlink机制。所以,虽然nl80211.h仅是定义了一些枚举值和有限的数据结构,但其操作却比较复杂。netlink是Linux平台上一种基于socket的IPC通信机制,它支持:
- 用户空间进程和Kernel通信。
- 用户空间中进程间的通信。
不过,相比其他IPC机制,netlink最常用之处还是用户空间进程和kernel模块间的通信。鉴于netlink的复杂性,开源世界提供了几个较为完备的基于netlink编程的框架,其中最著名的就是libnl。而Android也充分发扬拿来主义,在其system/core/libnl_2目录中移植并精简了libnl项目的代码,得到一个小巧的libnl_2工程。
libnl 框架如下:
以下三个库都基于其核心库libnl。
- libnl-route:用于和Kernel中的Routing子系统交互。
- libnl-nf:用于和Kernel中的Netfilter子系统交互。
- libnl-genl:用于和Kernel中的Generic Netlink模块交互。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2021-06-17 objcopy 格式转换
2021-06-17 链接操作
2021-06-17 C 库函数 --- fflush() 强制清空缓冲区