WiFi“管家”------hostapd的工作流程

目錄

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77462.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv2 快速入門與核心概念:更快、更準的目標檢測利器

今天&#xff0c;我們就來聊聊 YOLO 系列的第二代—— YOLOv2&#xff0c;看看它是如何在速度的基礎上&#xff0c;進一步提升檢測精度的。 目標檢測的重要性&#xff1a;讓機器“看懂”世界 想象一下&#xff0c;自動駕駛汽車需要實時識別道路上的車輛、行人、交通標志&…

[蒼穹外賣 | 項目日記] 第三天

前言 實現了新增菜品接口實現了菜品分頁查詢接口實現了刪除菜品接口實現了根據id查詢菜品接口實現了修改菜品接口 今日收獲&#xff1a; 今日的這幾個接口其實和之前寫的對員工的操作是一樣的&#xff0c;都是一整套Curd操作&#xff0c;所以今天在技術層面上并沒有…

Go語言入門到入土——三、處理并返回異常

Go語言入門到入土——三、處理并返回異常 文章目錄 Go語言入門到入土——三、處理并返回異常1. 在greetings.go中添加異常處理代碼2. 在hello.go中添加日志記錄代碼3. 運行 1. 在greetings.go中添加異常處理代碼 處理空輸入的異常&#xff0c;代碼如下&#xff1a; package g…

創維E900V20C-國科GK6323V100C-rtl8822cs-安卓9.0-短接強刷卡刷固件包

創維E900V20C&#xff0f;創維E900V20D-國科GK6323V100C-安卓9.0-強刷卡刷固件包 創維E900V20C 刷機說明&#xff1a; 1、用個老款4G&#xff0c;2.0的U盤&#xff0c;fat32&#xff0c;2048塊單分區格式化&#xff0c; 5個文件復制到根目錄&#xff0c;插盒子靠網口U口&…

視頻分析設備平臺EasyCVR安防視頻管理系統,打造電石生產智能視頻監控新體系

一、背景介紹 電石生產中的出爐工序是整個生產流程中最為繁重且危險的環節。在開堵爐眼的過程中&#xff0c;電石極易發生飛濺現象&#xff0c;尤其在進行吹氧操作時&#xff0c;人員灼傷的風險極高。鑒于此&#xff0c;該工序正逐步由傳統的人工操作模式向智能化方向轉變。然…

Verilog的整數除法

1、可變系數除法實現----利用除法的本質 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2025/04/15 13:45:39 // Design Name: // Module Name: divide_1 // Project Name: // Target Devices: // Tool Versions: // Description: // // Depe…

UniApp + Cursor + Devbox 全欄平臺開發教程:從0到完整項目打造

本文基于B站熱門教程《一口氣學會小程序 / App / H5開發:UniApp教程 + Cursor + Devbox》,https://www.bilibili.com/video/BV1W7QZYMEus/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=a1428945043b2df41c1896acb90d942a,進行全面擴展…

ESP32-idf學習(一)搭建環境和點燈

一、前言 先說一下查到的數據&#xff08;不保證準確&#xff09;&#xff1a; 1、連續四年Wi-Fi MCU全球市場份額第一&#xff0c;產品應用于智能家居、工業自動化、醫療健康等泛IoT領域?&#xff0c;2024 年營收突破 20 億元&#xff08;同比 40%&#xff09;&#xff0c;…

hooker frida版just_trust_me.js 2025升級 支持boringssl unpinning

曾幾何時&#xff0c;我翻版了 Xposed 的 just_trust_me.apk&#xff0c; just_trust_me.js 腳本仿佛是一張通行證&#xff0c;讓我們在 SSL Pinning 的高墻前輕松穿越。 但時代變了。BoringSSL、Cronet、靜態 inline hook、動態 verify callback……一切都變得更加隱蔽和棘手…

通信算法之269 : OFDM信號的循環自相關特性用于無人機圖傳信號識別

OFDM信號的循環自相關特性是其循環平穩性的核心體現,如下: [相關仿真代碼,聯系,提供] 一、循環自相關特性來源 ?循環前綴引入周期性? OFDM符號通過添加循環前綴(CP)形成符號周期結構,導致信號具有循環平穩性?26。每個符號的CP與尾部數據重復,在時延等于FFT長度(N…

vue3環境搭建、nodejs22.x安裝、yarn 1全局安裝、npm切換yarn 1、yarn 1 切換npm

vue3環境搭建 node.js 安裝 驗證nodejs是否安裝成功 # 檢測node.js 是否安裝成功----cmd命令提示符中執行 node -v npm -v 設置全局安裝包保存路徑、全局裝包緩存路徑 在node.js 安裝路徑下 創建 node_global 和 node_cache # 設置npm全局安裝包保存路徑&#xff08;新版本…

基于尚硅谷FreeRTOS視頻筆記——6—滴答時鐘—上下文切換

FreeRTOS滴答 FreeRTOS需要有一個時鐘參照&#xff0c;并且這個時鐘不會被輕易打斷&#xff0c;所以最好選擇systick 為什么需要時間參照 就是在高優先級任務進入阻塞態后&#xff0c;也可以理解為進入delay&#xff08;&#xff09;函數后&#xff0c;需要有一個時間參照&…

使用最新threejs復刻經典貪吃蛇游戲的3D版,附完整源碼

基類Entity 建立基類Entity&#xff0c;實現投影能力、動畫入場效果&#xff08;從小變大的彈性動畫&#xff09;、計算自己在地圖格位置的方法。 // 導入gsap動畫庫&#xff08;用于創建補間動畫&#xff09; import gsap from gsap// 定義Entity基類 export default class …

Redis——網絡模型之IO講解

目錄 前言 1.用戶空間和內核空間 1.2用戶空間和內核空間的切換 1.3切換過程 2.阻塞IO 3.非阻塞IO 4.IO多路復用 4.1.IO多路復用過程 4.2.IO多路復用監聽方式 4.3.IO多路復用-select 4.4.IO多路復用-poll 4.5.IO多路復用-epoll 4.6.select poll epoll總結 4.7.IO多…

Jenkins 多分支流水線: 如何創建用于 Jenkins 狀態檢查的 GitHub 應用

使用 Jenkins 多分支流水線時&#xff0c;您可以將狀態檢查與 GitHub 拉取請求集成。 以下是狀態檢查的示例 要實現這些類型的狀態檢查&#xff0c;您需要創建一個與 Jenkins 主實例集成的 GitHub 應用。 在本博客中&#xff0c;我們將介紹如何創建一個 GitHub 應用&#xff…

大模型如何突破“知識盲區”?一場靜悄悄的技術革命正在發生

大模型如何突破“知識盲區”&#xff1f;一場靜悄悄的技術革命正在發生 凌晨三點&#xff0c;程序員李然盯著屏幕上的報錯信息苦笑。他正在調試的智能客服系統&#xff0c;又一次把"北京今日體感溫度"回答成了"建議穿羽絨服"。這不是代碼錯誤&#xff0c;…

【SQL Server】數據探查工具1.0研發可行性方案

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 想搶先解鎖數據自由的寶子&#xff0c;速速戳我&#xff01;評論區蹲一波 “蹲蹲”&#xff0c;揪人嘮嘮你的超實用需求&#xff01; 【SQL Server】數據探查工具1.0研發可行性方案…

Qt GUI 庫總結

Qt GUI 庫總結 Qt GUI 庫&#xff08;QtGui&#xff09;是 Qt 框架中負責圖形用戶界面&#xff08;GUI&#xff09;開發的核心模塊。本文將一步步詳解 QtGui&#xff0c;從基礎入門到高級應用&#xff0c;幫助你全面掌握其功能。以下內容包括環境配置、基本功能、核心特性及進…

如何在米爾-STM32MP257開發板上部署環境監測系統

本文將介紹基于米爾電子MYD-LD25X開發板&#xff08;米爾基于STM35MP257開發板&#xff09;的環境監測系統方案測試。 摘自優秀創作者-lugl4313820 一、前言 環境監測是當前很多場景需要的項目&#xff0c;剛好我正在論壇參與的一個項目&#xff1a;Thingy:91X 蜂窩物聯網原型…

網絡互連與互聯網3

1.SMTP簡單郵件傳輸協議&#xff0c;用于發送電子郵件&#xff0c;默認情況下是明文傳輸&#xff0c;沒有加密機制。 SSL是一種安全協議&#xff0c;對電子郵件進行加密傳輸。 POP3主要用于接收電子郵件 IMAP用于接收電子郵件 2.采用存儲-轉發方式處理信號的設備是交換機 …