3.4 Linux Wi-Fi编程API介绍
前面一直在介绍Wi-Fi规范方面的内容。从本节开始,将向读者介绍Linux平台中Wi-Fi编程方面的知识。
提示 相比前文而言,本节内容较为轻松。但编程只不过是规范的某种实现,掌握规范才是理解无线网络技术的核心。这也是本书内容组织和编排的指导原则,希望读者能认真体会。
Linux平台上目前常用的专门针对无线网络设备编程的API有两套[40]。
·最早的一套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驱动开发要求主要体现在以下两方面。
1)ioctl的原型为int ioctl(int fd,unsigned long cmd,…),最后省略号代表它支持可变个数的参数。但对于一个经过严格定义的系统调用来说,支持可变个数参数的做法似乎显得有些随性。
2)ioctl的参数不仅个数不固定,其参数类型也无法通过函数原型来加以说明。这同样对于一个严谨的系统调用来说,也是不可接受的。
本节将重点介绍用户空间中的Wi-Fi API,wext和nl80211。不过在介绍之前,请读者思考一个问题:为什么Wi-Fi需要在用户空间进行编程呢?
答案 目前的无线网卡分为两种,一种为SoftMAC。这类网卡中,MLME的处理基本上在软件层(即驱动或用户空间),这样可带来较大的灵活性。另外,一些认证相关的操作,也可由软件来控制。另一种网卡称为FullMAC。这类网卡的MLME全在硬件处理。相比SoftMAC而言,其灵活性很小。所以目前市面上SoftMAC网卡占绝大多数,而cfg80211就仅支持SoftMAC类型的网卡。