wpa_supplicant 源碼學習

代碼地址:git clone https://w1.fi/hostap.git
我目前學的的版本是 wpa_supplicant 2.12-devel-hostap_2_11-857-g54930b62b+
五月份左右的提交,是較新的代碼

想做白盒測試。最近開始學習 wpa_supplicant 這個工具。
自學了一個多月吧。 整理了一些代碼跳轉,歡迎指正交流 長期更新

commit b01c4843bb7b785db5a4201f0dc0f30b2047a04d (origin/pending, origin/main, origin/HEAD, main) Author: Shivani Baranwal <quic_shivbara@quicinc.com> Date: Tue May 20 15:06:56 2025 +0530

整理的代碼跳轉

main.c :: main→ c=getopt(argc,argv,"b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuvW");  // 解析參數→ global = wpa_supplicant_init(&params); // 初始化全局 wpa_supplicant contextdriver_ndis_init_ops();// 初始話NDIS驅動→ ret = eap_register_methods();// 注冊EAP 方法→ eloop_init // 初始化事件循環→ eloop.epollfd = epoll_create1(0);// 創建epoll 實例→ eloop.kqueuefd = kqueue();// 創建kqueue實例→ eloop.readers.type = EVENT_TYPE_READ;// 讀事件類型→ eloop.writers.type = EVENT_TYPE_WRITE;// 寫事件類型→ eloop.exceptions.type = EVENT_TYPE_EXCEPTION;// 異常事件類型→ global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);→ wpa_s = wpa_supplicant_add_iface(global, &ifaces[i], NULL); // 注冊添加 接口 比如 wlan0→ wpa_s = wpa_supplicant_alloc(parent); // 分配新的wpa 結構體→ wpa_s->scan_req = INITIAL_SCAN_REQ; // 設置 初次掃描→ wpa_s->global = global; // 設置全局上下文if (wpa_supplicant_init_iface(wpa_s, &t_iface)) // 初始化新接口→ wpa_s->conf = wpa_config_read(wpa_s->confname, NULL, false); // 讀取并解析配置文件→ tail = head = config->ssid; // 初始化網絡配置鏈表指針→ cred_tail = cred_head = config->cred; // 初始化憑證鏈表指針→ identity_tail = identity_head = config->identity; // 初始化身份鏈表指針while (wpa_config_get_line(buf, sizeof(buf), f, &line, &pos)) {→ ssid = wpa_config_read_network(f, &line, id++); // 讀取網絡配置塊if (wpa_config_add_prio_network(config, ssid)) { // 將網絡配置添加到優先級列表→ config->ssid = head; // 更新主配置結構體中的鏈表指針	wpas_init_driver(wpa_s, iface) // 初始化驅動if (wpa_supplicant_set_driver(wpa_s, driver) < 0) // 設置驅動類型if (select_driver(wpa_s, i) == 0)→ wpa_drivers[i]->global_init && global->drv_priv[i] == NULL // 運行 driver 的 global_init => nl80211_global_init→ nl80211_global_init→ if (wpa_driver_nl80211_init_nl_global(global) < 0)→ global->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, process_global_event, global); // 配置libnl回調 在執行nl_recvmsgs 會調用 process_global_event→ process_global_event→ do_process_drv_event(bss, gnlh->cmd, tb); // 調用實際處理函數處理事件  !!!! 函數中會在處理完netlink 中 響應的 觸發wpa_supplicane_event 以外面wpa 狀態機的狀態nl80211_register_eloop_read(&global->nl_event,  // 將 wpa_driver_nl80211_event_receive 注冊為 Netlink socket (global->nl_event) 的可讀事件回調函數。wpa_driver_nl80211_event_receive,	// !!!! 注冊 netlink 接收事件 用于接受驅動返回的數據global->nl_cb, 0);→ wpa_driver_nl80211_event_receive→ res = nl_recvmsgs(handle, cb); // 接收netlink 消息,并觸發回調→ wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname); // 初始化驅動接口→ wpa_s->driver->init2// 執行driver的init2→ wpa_s->driver->init2 :: wpa_driver_nl80211_init→ wpa_driver_nl80211_drv_init→ if (nl80211_init_bss(bss)) // 初始化 BSS 層資源if (wpa_driver_nl80211_finish_drv_init(drv, set_addr, 1, driver_params,p2p_mode))if (wpa_driver_nl80211_capa(drv)) // 獲取并設置驅動能力nl80211_set_param(bss, driver_params // // 設置驅動參數→ eloop_register_read_sock // 注冊socket 讀事件回調→ wpa_driver_nl80211_handle_eapol_tx_status→ wpa_supplicant_event(drv->ctx, EVENT_EAPOL_TX_STATUS, &event);if (wpa_supplicant_init_wpa(wpa_s) < 0) // 初始化WPA 狀態機wpa_supplicant_req_scan(wpa_s, interface_count % 3,100000); // 觸發掃描eloop_register_timeout(sec, usec, wpa_supplicant_scan, wpa_s, NULL); // 注冊 新定時器→ wpa_supplicant_scan→ ret = wpa_supplicant_trigger_scan(wpa_s, scan_params, false, false); // 構造參數并下發到驅動radio_add_work(wpa_s, 0, "scan", next, wpas_trigger_scan_cb,ctx) // 將wpas_trigger_scan_cb添加到工作隊列→ ret = wpa_drv_scan(wpa_s, params);→ wpa_s->driver->scan2 // 調用驅動 執行scan-> wpa_driver_nl80211_scan // !!!! start scan  通過netlink 下發 異步等待netlink回復→ msg = nl80211_scan_common(  // 構造 NL80211_CMD_TRIGGER_SCAN 消息,設置基本掃描參數bss, NL80211_CMD_TRIGGER_SCAN, params); → ret = send_and_recv_cmd(drv, msg); /// 發送Netlink消息并接收響應→ wpa_sm_set_param // 設置wpa相關參數 if (wpa_supplicant_init_eapol(wpa_s) < 0) // 初始化 EAPOL→ exitcode = wpa_supplicant_run(global); // 啟動循環事件wpa_supplicant_daemon(global->params.pid_file // 設置守護進程eloop_register_signal_terminate(wpa_supplicant_terminate, global); // 注冊終止信號處理函數eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); // 注冊重新配置信號處理函數eloop_run() // 運行主事件循環→ wpa_supplicant_deinit // 事件循環退出,清理資源// cfg80211 反饋接收事件 處理
→ do_process_drv_event # 驅動標記 scan 已經開始→ case NL80211_CMD_TRIGGER_SCAN:→ drv->scan_state = SCAN_STARTED→ wpa_supplicant_event(bss->ctx, EVENT_SCAN_STARTED, NULL);# 驅動完成 scan 結果處理 → case NL80211_CMD_NEW_SCAN_RESULTS→ drv->scan_complete_events = 1;send_scan_event(bss, 0, tb, external_scan_event);	// 上報掃描完成wpa_supplicant_event(ctx, EVENT_SCAN_RESULTS, &event); // 發送掃描結果事件到 wpa_supplicant// wpas 事件處理
→ wpa_supplicant_event → case EVENT_SCAN_RESULTS:if (wpa_supplicant_event_scan_results(wpa_s, data))→ res = _wpa_supplicant_event_scan_results(wpa_s, data, 1, 0);→ scan_res = wpa_supplicant_get_scan_results(wpa_s, // 獲取掃描結果data ? &data->scan_info :NULL, 1, NULL);wpas_select_network_from_last_scan(wpa_s, 1, own_request,	// 從上次掃描結果中選擇網絡trigger_6ghz_scan, data);→ selected = wpa_supplicant_pick_network(wpa_s, &ssid); // 選擇合適網絡if (wpa_supplicant_connect(wpa_s, selected, ssid) < 0) // 嘗試連接到選中網絡wpa_supplicant_associate(wpa_s, selected, ssid); // 發起關聯→ wpa_s->own_scan_running = 0; // 更新掃描狀態

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

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

相關文章

[學習] C語言<string.h>中字符串函數全解析

C語言<string.h>中字符串函數全解析 在 C 語言中&#xff0c;字符串處理是程序開發中的重要組成部分。C 標準庫 <string.h> 提供了一系列函數用于操作字符數組&#xff08;即字符串&#xff09;。這些函數以 str 開頭&#xff0c;功能強大、使用廣泛&#xff0c;掌…

OJ搭建:Judge0服務器、DeepSeek服務接入簡介

序 各大OJ平臺上有很多很好的資源&#xff0c;但作為自己的“備課本”總有各種不便&#xff0c;教學生時間久了總是有一些自己的題目和想法&#xff0c;這在教初學的學生時非常突出。所以&#xff0c;很多年前就搞了一些嘗試&#xff0c;包括&#xff1a;在機房搭建ubuntu服務器…

Java的鎖機制問題

鎖機制 1.鎖監視器 在 Java 并發編程中&#xff0c;鎖監視器&#xff08;Monitor&#xff09; 是對象內部與鎖關聯的同步機制&#xff0c;用于控制多線程對共享資源的訪問。以下是核心要點&#xff1a; &#x1f512; 監視器的核心組成 獨占區&#xff08;Ownership&#xff…

老鳳祥的AI智能眼鏡:讓智慧更近生活

在科技進步的潮流中,人工智能技術不斷為我們的生活增添色彩。近日,有關字節跳動旗下的火山引擎與中國珠寶品牌老鳳祥合作開發 AI 智能眼鏡的消息引發了廣泛關注。這款與眾不同的眼鏡因其獨特的功能及技術支持,已經在業內引起了極大反響。 AI眼鏡:老年群體的智能好幫手 根…

Kotlin 中為什么沒有靜態變量和靜態方法—不用static?

Kotlin 的設計核心是&#xff1a; 一切皆對象&#xff1a;消除 static 的「非對象」特性&#xff0c;用 companion&#xff08;對象&#xff09;和頂層函數&#xff08;包級對象&#xff09;替代&#xff0c;讓代碼更統一。避免全局狀態濫用&#xff1a;static 成員是全局可見…

VSCode性能調優:從卡頓到絲滑的終極方案

? 核心價值 "這套配置使某金融核心系統VS Code內存占用從8GB降至1.2GB,加載速度提升15倍" —— 2024某銀行效能優化報告 ?? 性能瓶頸拆解 一、百萬行項目優化方案 ?? 黃金配置參數 // settings.json(核彈級優化) {"files.watcherExclude": {"…

以云織夢,渡數濟世:輝瑞與亞馬遜云科技共譜醫藥新樂章

胖頭陀科技 編輯&#xff1a;沐由 【導讀】“用合規的數據來幫助患者&#xff0c;成為患者回歸健康的一味新藥。”當下&#xff0c;在數字洪流的浪潮中&#xff0c;這味“良藥”正沿著云和AI的脈絡&#xff0c;奔向有需求的千家萬戶…… 如果說到Pfizer&#xff0c;估計十個人…

SpringBoot后端開發知識點總結(持續更新)

目錄 1. 常用易混淆注解解釋1.1 Resource和Autowired注解的區別1.2 PathVariable和RequestParam注解的區別 2. Mybatis-Plus高級特性2.1 強大的通用CRUD接口2.2 代碼生成器 3. IDEA實用快捷鍵4. 前后端聯調關鍵點4.1 代碼示例4.2 聯調要點4.3 調試技巧 1. 常用易混淆注解解釋 …

電腦商城--用戶收貨管理

新增收貨地址 1 新增收貨地址-創建數據表 1.使用use命令先選中store數據庫。 USE store; 2.在store數據庫中創建t_address用戶數據表。 CREATE TABLE t_address (aid INT AUTO_INCREMENT COMMENT 收貨地址id,uid INT COMMENT 歸屬的用戶id,name VARCHAR(20) COMMENT 收貨人姓…

開發者避坑:接入Flux-Kontext API實現文生圖、圖生圖功能

在數字化浪潮背景下&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;技術正加速重塑圖像創作領域。智創聚合API平臺近日宣布整合Flux-Kontext系列模型&#xff0c;通過API接口支持圖生圖和文生圖功能&#xff0c;為開發者及創作者提供高效解決方案。此…

.Net Core 獲取與bin目錄相同文件路徑的文件

在 .NET Core 中&#xff0c;您可以使用以下方法來獲取與 bin 目錄相同的文件路徑。通常&#xff0c;bin 目錄是應用程序編譯后生成的輸出目錄&#xff0c;您可以使用 AppContext.BaseDirectory 或 Directory.GetCurrentDirectory() 來獲取該目錄的路徑。 以下是一些常用的方法…

RN(React Native)技術應用中常出現的錯誤及解決辦法

React Native 作為跨平臺開發框架&#xff0c;在實際應用中可能會遇到一些常見的錯誤。以下是React Native 技術應用中常出現的錯誤及解決辦法&#xff1a; 1. 網絡請求失敗&#xff08;Network Request Failed&#xff09; 原因&#xff1a; 請求地址不正確網絡權限未配置i…

Java 21 的虛擬線程與橋接模式:構建高性能并發系統

Java 21 的虛擬線程與橋接模式&#xff1a;構建高性能并發系統 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&…

HTML5 火焰字體效果教程

HTML5 火焰字體效果教程 這里寫目錄標題 HTML5 火焰字體效果教程前言項目概述基本原理項目結構詳細實現步驟1. HTML結構2. CSS樣式3. JavaScript實現 代碼詳解1. 初始化設置2. 粒子系統3. 生成粒子4. 動畫循環5. 交互控制 擴展和優化建議總結完整代碼 前言 在這篇教程中&#…

SMOTE-XGBoost實戰:金融風控中欺詐檢測的樣本不平衡解決方案

1. 行業問題背景 &#xff08;1&#xff09;金融欺詐檢測的特殊性 在支付風控領域&#xff0c;樣本不平衡是核心痛點。Visa 2023年度報告顯示&#xff0c;全球信用卡欺詐率約為0.6%&#xff0c;但單筆欺詐交易平均損失高達$500。傳統機器學習模型在此場景下表現堪憂&#xff1…

Instagram下載保存 -下載狗解析工具

在日常瀏覽Instagram時&#xff0c;是否有過這樣的煩惱&#xff1a;看到一個精彩的視頻&#xff0c;想要保存下來&#xff0c;卻不知道如何操作&#xff1f;有時候我們會看到一些特別的旅行視頻、搞笑片段&#xff0c;甚至是喜歡的名人分享的內容&#xff0c;簡直是舍不得錯過。…

flink如何基于Pekko實現RPC調用

摘要 通過閱讀flink源碼&#xff0c;了解flink是如何基于Pekko實現遠程RPC調用的 Pekko實現遠程調用 Flink 的 RPC 框架底層是構建在 Pekko 的 actor 模型之上的&#xff0c;了解Pekko如何使用&#xff0c;對后續源碼的閱讀有幫助。 Apache Pekko&#xff08;原為 Akka 的一…

Kafka節點注冊沖突問題分析與解決

一、核心錯誤分析 ERROR Error while creating ephemeral at /brokers/ids/1, node already exists and owner does not match org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode NodeExists問題本質&#xff1a;ZooKeeper中已存在ID為1的broker節…

突破PPO訓練效率瓶頸!字節跳動提出T-PPO,推理LLM訓練速度提升2.5倍

突破PPO訓練效率瓶頸&#xff01;字節跳動提出T-PPO&#xff0c;推理LLM訓練速度提升2.5倍 在大語言模型&#xff08;LLM&#xff09;通過長思維鏈&#xff08;CoT&#xff09;展現出強大推理能力的當下&#xff0c;強化學習&#xff08;RL&#xff09;作為關鍵技術卻面臨訓練…

【Python】dictionary

1 字典功能 字典是可變容器模型&#xff0c;且可存儲任意類型對象&#xff1b; 字典的每個鍵值對 <key: value> 用冒號 : 分割&#xff0c;每個對之間用逗號(,)分割&#xff0c;整個字典包括在花括號 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value…