目錄
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 能夠穩定、高效地運行。