Chapter4 Part 1 WPAS简介

1 wpa_supplicant简介

一个开源软件项目,实现了Station对无线网络进行管理和控制的功能

列举几个重要的功能:
1.支持WPA和IEEE 802.11i所定义的大部分功能
2.支持多种EAP Method
3.对各种无线网卡和驱动的支持

2 wpa_supplicant_8

wpa_supplicant_8包含3个主要子目录
1.hostapd:手机进入Soft AP模式,需要hostapd提供AP的功能
2.wpa_supplicant:Station模式,也叫Managed模式
3.src:前两者都包含一些通用的数据结构和处理方法,这些内容放在此目录

该书分两条路线分析wpa_supplicant和相关的功能模块
路线1:介绍wpa_supplicant的初始化过程,此路线帮助读者了解wpa_supplicant中常见的数据结构及之间的关系
路线2:命令行下发命令触发wpa_supplicant进行相关工作,此路线帮助读者了解wpa_supplicant中的命令处理、scan、association、4-way handshake等相关处理流程

3 wpa_supplicant架构

wpa_supplicant包含500多个文件,20万行代码(任重道远)
内部模块构成如下
在这里插入图片描述

重要模块有:
1.wpa_supplicant所有模块围绕事件(event loop模块)展开
它是基于事件驱动的
事件驱动:和消息驱动类似,主线程等待事件的发生并处理它们(wpa_supplicant没有使用多线程编程),所有事件处理都在主线程中完成
2.位于event loop模块下方的driver i/f接口模块用于隔离和底层驱动直接交互的那些driver控制模块(如wext、ndiswrapper),称为driver wrapper,这种隔离作用,能最大程度保持平台以及驱动无关性
driver wrapper经常要返回一些信息给上层,这些信息通过driver event的方式反馈给wpa_supplicant其他模块处理
3.wpa_supplicant实现了EAP和EAPOL状态机,此外,还定义了自己的状态机(WPA/WPA2 state machine)
4.wpa_supplicant实现多种EAP方法,如EAP method模块,还包含TLS模块和crypto模块用于支持对应的EAP方法
5.l2_packet模块用于收发EAPOL和EAP消息
6.wpa_supplicant通过configuration模块配置参数
7.wpa_supplicant是C/S结构中的server端,通过ctrl i/f模块向客户端提供通信接口

目前常用的Client端wpa_cli(无界面的命令行程序)和wpa_gui(UI用Qt实现)

4 wpa_supplicant命令

在Android平台,wpa_supplicant的客户端是位于Framework中的WifiService
用户在Settings界面进行wifi相关的操作最终都会经过WifiService通过发送命令的方式转交给pwa_supplicant执行

wpa_supplicant定义了许多命令,比如
1.PING 客户端用它判断wpa_supplicant是否正常工作,wpa_supplicant收到需要回复PONG
2.MIB (Management Information Base),客户端用此命令获取设备的MIB信息
3.STATUS 客户端获取wpa_supplicant的工作状态
4.ADD_NETWORK 为wpa_supplicant添加一个新的无线网络,它将返回新网络的ID(从0开始),此network id后续被客户端用来指明想操作的无线网络
5.SET_NETWORK 用于设置指定无线网络的信息
6.ENABLE_NETWORK 使能某个无线网络

除了接收来自Client的命令,wpa_supplicant也会主动向Client发送命令
例如,wpa_supplicant需用户输入密码,这类命令称为Interactive Request

wpa_supplicant向客户端发送命令遵循以下格式

CTRL-REQ-<field name>-<network id>-<human readable text>

比如以下命令表示需要用户为0号网络输入密码:

CTRL-REQ-PASSWORD-0-Password needed for SSID WIFI-WCN

客户端处理完毕后,需要回复:

CTRL-RSP-<field name>-<network id>-<value>

目前支持的field包括PASSWORD、IDENTITY(EAP中的identity或者用户名)、PIN等

wpa_supplicant还可以通过形如以下命令向客户端通知一些事情

CTRL-EVENT-<field>-<text>
5 wpa_supplicant控制API

WifiService与wpa_supplicant交互时必须使用wpa_supplicant提供的API,这些API声明于wpa_ctrl.h

客户端使用wpa_ctrl时首先分配控制对象
下面是创建和销毁控制对象

//ctrl_path代表unix域socket的位置
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
//注销wpa_ctrl控制对象
void wpa_ctrl_close(struct wpa_ctrl *ctrl);

下面这个函数用于发送命令给wpa_supplicant

//回复的消息保存在reply中
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
		     char *reply, size_t *reply_len,
		     void (*msg_cb)(char *msg, size_t len));

msg_cb是一个回调函数,该参数的设计和wpa_supplicant中C/S通信机制的设计有关

从Client角度来看,它发送的命令所对应的回复属于solicited event(有请求的事件)
前面提到的CTRL-EVENT事件(通知事件)对应为unsolicited event(未请求的事件)
当Client等待某个命令的回复时,wpa_supplicant同时可能有些通知事件发送Client,它们不是该命令的回复,所以不能通过上述函数的reply参数返回,必须通过msg_cb来处理
简单来说,msg_cb用于客户端在等待命令回复的时候处理那些unsolicited event

wpa_supplicant规定只有打开通知事件监听功能的wpa_ctrl对象,才能在wpa_ctrl_request中通过msg_cb获取通知事件
打开通知事件监听功能相关的API如下

//打开
int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
//打开通知事件监听功能的wpa_ctrl对象能直接调用wpa_ctrl_recv来接受unsolicited event
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);

综上,常见做法是创建两个wpa_ctrl对象来简化自己的逻辑处理
一个打开了通知事件监听功能的wpa_ctrl对象将只通过wpa_ctrl_recv来接收通知事件
另外一个wpa_ctrl专职于发送命令和接收回复(它不调用wpa_ctrl_attach,所以不会收到通知事件)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值