目录
1. 启动与初始化
1.1 解析命令行参数
1.2 读取配置文件
1.3 创建接口和 BSS 数据结构
1.4 初始化驱动程序
2. 认证和关联处理
2.1 监听认证请求
2.2 处理认证请求
2.3 处理关联请求
3. 数据转发
3.1 接收客户端数据
3.2 转发数据
4. 断开连接处理
4.1 处理客户端断开请求
4.2 处理超时断开
5. 关闭与清理
5.1 处理退出信号
5.2 释放资源
hostapd 是一个用户空间的守护进程,用于实现 IEEE 802.11 接入点(AP)和认证服务器功能。下面结合 hostapd 代码详细分析其整个工作流程。
1. 启动与初始化
1.1 解析命令行参数
在 main 函数中,首先会解析命令行参数,这些参数可以指定配置文件路径、调试级别等信息。
int main(int argc, char *argv[])
{// 解析命令行参数if (parse_config(argc, argv, &config) < 0) {return -1;}// ...
}
1.2 读取配置文件
根据命令行指定的配置文件路径,读取并解析配置文件,获取 hostapd 运行所需的各种配置信息,如 SSID、密码、认证模式等。
static int parse_config(int argc, char *argv[], struct hostapd_config *config)
{// 读取并解析配置文件if (hostapd_config_read(config_file, config) < 0) {return -1;}// ...
}
1.3 创建接口和 BSS 数据结构
根据配置信息创建 hostapd_iface 和 hostapd_data 数据结构,用于管理接口和基本服务集(BSS)。
struct hostapd_iface *iface;
iface = hostapd_iface_init(config);
if (!iface) {return -1;
}
1.4 初始化驱动程序
调用驱动程序的初始化函数,与无线网卡进行交互,配置网卡为 AP 模式。
if (hostapd_driver_init(hapd) < 0)
{return -1;
}
2. 认证和关联处理
2.1 监听认证请求
hostapd 会监听来自客户端的认证请求帧,当接收到认证请求时,会根据配置的认证模式进行处理。
// 在事件处理循环中处理认证请求
void hostapd_event_loop(struct hostapd_data *hapd)
{while (1) {// 处理网络事件eloop_run();// 检查是否有认证请求if (new_auth_request) {handle_auth_request(hapd, auth_frame);}}
}
2.2 处理认证请求
根据配置的认证模式(如开放系统认证、WPA 认证等)对客户端的认证请求进行验证。
int handle_auth_request(struct hostapd_data *hapd, const u8 *auth_frame)
{// 验证认证请求if (validate_auth_request(hapd, auth_frame)) {// 发送认证响应send_auth_response(hapd, client_addr, AUTH_ACCEPT);} else {send_auth_response(hapd, client_addr, AUTH_REJECT);}return 0;
}
2.3 处理关联请求
客户端认证成功后,会发送关联请求, hostapd 会验证关联请求的合法性,并为客户端分配资源。
int handle_assoc_request(struct hostapd_data *hapd, const u8 *assoc_frame)
{// 验证关联请求if (validate_assoc_request(hapd, assoc_frame)) {// 分配资源allocate_client_resources(hapd, client_addr);// 发送关联响应send_assoc_response(hapd, client_addr, ASSOC_ACCEPT);} else {send_assoc_response(hapd, client_addr, ASSOC_REJECT);}return 0;
}
3. 数据转发
3.1 接收客户端数据
hostapd 通过驱动程序接收来自客户端的数据帧,并进行处理。
void hostapd_event_loop(struct hostapd_data *hapd)
{while (1) {// 处理网络事件eloop_run();// 检查是否有数据帧到达if (new_data_frame) {handle_data_frame(hapd, data_frame);}}
}
3.2 转发数据
根据数据帧的目的地址,将数据帧转发到相应的网络接口或其他客户端。
void handle_data_frame(struct hostapd_data *hapd, const u8 *data_frame)
{// 解析数据帧parse_data_frame(data_frame);// 转发数据forward_data_frame(hapd, dest_addr, data_frame);
}
4. 断开连接处理
4.1 处理客户端断开请求
当客户端发送断开连接请求时, hostapd 会释放客户端占用的资源,并更新相关状态。
int handle_disassoc_request(struct hostapd_data *hapd, const u8 *disassoc_frame)
{// 释放客户端资源release_client_resources(hapd, client_addr);// 更新状态update_sta_status(hapd, client_addr, DISCONNECTED);return 0;
}
4.2 处理超时断开
如果客户端在一段时间内没有活动, hostapd 会主动断开与客户端的连接。
void check_sta_timeout(struct hostapd_data *hapd)
{// 检查客户端是否超时if (is_sta_timeout(hapd, client_addr)) {// 发送断开连接帧send_disassoc_frame(hapd, client_addr);// 释放客户端资源release_client_resources(hapd, client_addr);}
}
5. 关闭与清理
5.1 处理退出信号
当接收到退出信号(如 SIGTERM、SIGINT 等)时, hostapd 会进行清理工作。
static void signal_handler(int sig)
{// 标记退出标志exit_flag = 1;
}
5.2 释放资源
释放之前分配的各种资源,如驱动程序资源、数据结构等。
void hostapd_cleanup(struct hostapd_iface *iface)
{// 释放驱动程序资源hostapd_driver_deinit(hapd);// 释放数据结构os_free(hapd);
}
以上就是 hostapd 的整个工作流程,从启动初始化到处理客户端认证、关联、数据转发,再到断开连接和最终的清理工作。每个步骤都涉及多个模块的协作,确保 hostapd 能够稳定、高效地运行。