我想知道 iwlist 命令如何在 Linux 中扫描可用的无线网络。我阅读了它的源代码,发现有一个 ioctl 调用,使用 SIOCSIWSCAN 来触发扫描,并使用 SIOCGIWSCAN 来获取扫描结果。但是这些系统调用如何捕获和分析信标帧呢?
iwlist(8) 和其他无线工具为支持 Linux 无线扩展 (WEXT) 的不同无线设备驱动程序提供公共前端。每个驱动程序都会向 WEXT 注册处理程序,以实现此接口定义的设备特定操作。对于扫描,两个处理程序是触发扫描(命令 SIOCSIWSCAN)和获取扫描结果(命令 SIOCGIWSCAN)。设备完成扫描后,会通过 netlink 接口向 WEXT 发送 SIOCGIWSCAN 事件。然后,侦听此套接字的应用程序可以发出 SIOCGIWSCAN 命令以从设备获取扫描结果。请注意,设备可以自由选择如何实施扫描。例如,它可以被动监听信标或通过发送探测请求主动扫描。
上面对向设备发送命令的机制故意含糊不清,因为有传统方式(ioctl)和新方式(netlink - cfg80211)。但举一个具体的例子,考虑一下传统的方式。 ioctl 调用在 WEXT 模块中实现,但处理此命令的代码在设备驱动程序中实现。当用户空间应用程序进行 ioctl 时,WEXT 会查找设备驱动程序的处理程序并运行它。