代码地址: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…