wpa_supplicant 框架

wpa_supplicant 框架1 系统架构 AndroidWiFi 系统引入了 wpa supplicant 它的整个 WiFi 系统以 wpa supplicant 为核心来定义上层用户接口和下层驱动接口 整个 WiFi 系统架构如下图所示 1 1WifiService 由 SystemServer 启动的时候生成的 Connecttivit 创建 负责启动关闭 wpa supplicant 启动和关闭 WifiMonitor 线程 把命令下发给 wpa supplicant 以及更新 WIFI 的状态 处理其它模块通过 IWifiManager 接

1.系统架构

1.1 WifiService

1.2 WifiMonitor

负责从wpa_supplicant接收事件通知。

1.3 wpa_supplicant

  1. 读取配置文件
  2. 初始化配置参数,驱动函数
  3. 让驱动scan当前所有的bssid
  4. 检查扫描的参数是否和用户设置的相符
  5. 如果相符,通知驱动进行权限和认证操作
  6. 连上AP

1.4 Wifi驱动模块

厂商提供的source,主要进行load firware和kernel的wireless进行通信

1.5 Wifi电源管理模块

主要控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口或USB接口通信

1.6 Wifi工作步骤

  1. Wifi启动
  2. 开始扫描
  3. 显示扫描的AP
  4. 配置AP
  5. 连接AP
  6. 获取IP地址
  7. 上网

2、 wpa_supplicant 初始化流程

2.1. main()函数:

2.2. wpa_supplicant_init()函数:

wpa_supplicant *ifaces /* 每个网络接口都有一个对应的wpa_supplicant数据结构,该指针指向最近加入的一个,在wpa_supplicant数据结构中有指针指向next */ wpa_params params /* 启动命令行中带的通用的参数 */ ctrl_iface_global_priv *ctrl_iface /* global的控制接口 */ ctrl_iface_dbus_priv *dbus_ctrl_iface /* dbus 的控制接口 */ 

2.3. wpa_supplicant_add_iface()函数:

wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN; wpa_supplicant_req_scan(wpa_s, interface_count, ); 

2.4. wpa_supplicant_run()函数:

3. Wpa_supplicant提供的接口

从通信层次上划分,wpa_supplicant提供向上的控制接口 control interface,用于与其他模块(如UI)进行通信,其他模块可以通过control interface 来获取信息或下发命令。Wpa_supplicant通过socket通信机制实现下行接口,与内核进行通信,获取信息或下发命令。

3.1 上行接口

Wpa_supplicant提供两种方式的上行接口。一种基于传统dbus机制实现与其他进程间的IPC通信;另一种通过Unix domain socket机制实现进程间的IPC通信。

3.1.1 Dbus接口

该接口主要在文件“ctrl_iface_dbus.h”,“ctrl_iface_dbus.c”,“ctrl_iface_dbus_handler.h”和“ctrl_iface_dbus_handler.c”中实现,提供一些基本的控制方法。

3.1.2 Unix domain socket 接口

该接口主要在文件“wpa_ctrl.h”,“wpa_ctrl.c”,“ctrl_iface_unix.c”,“ctrl_iface.h”和“ctrl_iface.c”实现。

(1)“wpa_ctrl.h”,“wpa_ctrl.c”完成对control interface的封装,对外提供统一的接口。其主要的工作是通过Unix domain socket建立一个control interface 的client结点,与作为server的wpa_supplicant结点通信。

主要功能函数:

struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path); /* 建立并初始化一个Unix domain socket的client结点,并与作为server的wpa_supplicant结点绑定 */ 
void wpa_ctrl_close(struct wpa_ctrl *ctrl); /* 撤销并销毁已建立的Unix domain socket的client结点 */ 
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)); /* 用户模块直接调用该函数对wpa_supplicant发送命令并获取所需信息 */ 
int wpa_ctrl_attach(struct wpa_ctrl *ctrl); /* 注册 某个 control interface 作为 monitor interface */ 
int wpa_ctrl_detach(struct wpa_ctrl *ctrl); /* 撤销某个 monitor interface 为 普通的 control interface */ 
int wpa_ctrl_pending(struct wpa_ctrl *ctrl)/* 判断是否有挂起的event 事件 */ 
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len); /* 获取挂起的event 事件 */ 
static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx, void *sock_ctx) /* 接收并解析client发送request命令,然后根据不同的命令调用底层不同的处理函数; * 然后将获得response结果回馈到 client 结点。 */ 
static void wpa_supplicant_ctrl_iface_send(struct ctrl_iface_priv *priv, int level, const char *buf, size_t len) /* 向注册的monitor interfaces 主动发送event事件 */ 

(3)“ctrl_iface.h”和“ctrl_iface.c”主要实现了各种request命令的底层处理函数。

3.2 下行接口

(2)“driver_nl80211.h”,“driver_nl80211.c”实现了netlink形式的wpa_driver_ops,通过netlink完成与kernel的信息交互。

(3)“l2_packet.h”和“l2_packet_linux.c”主要用于实现PF_PACKET socket接口,通过该接口,wpa_supplicant可以直接将802.1X packet发送到L2层,而不经过TCP/IP协议栈。

其中主要的功能函数为:

struct l2_packet_data * l2_packet_init( const char *ifname, const u8 *own_addr, unsigned short protocol, void (*rx_callback)(void *ctx, const u8 *src_addr, const u8 *buf, size_t len), void *rx_callback_ctx, int l2_hdr); /* 创建并初始化PF_PACKET socket接口,其中rx_callback 为从L2接收到的packet 处理callback函数 */ 
void l2_packet_deinit(struct l2_packet_data *l2); /* 销毁 PF_PACKET socket接口 */ 
int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, const u8 *buf, size_t len); /* L2层packet发送函数,wpa_supplicant用此发送L2层 802.1X packet */ 
static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx); /* L2层packet接收函数,接收来自L2层数据后,将其发送到上层 */ 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217580.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:15
下一篇 2026年3月18日 上午9:15


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号