同 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模块交互。
标签:Kernel,libnl,ioctl,API,Linux,nl80211 From: https://www.cnblogs.com/god-of-death/p/18253177