Linux Wireless之WIFI扫描 | DD'NotesLinux Wireless之WIFI扫描Linux 下的 Wi-Fi 扫描流程横跨用户层、内核通用层与驱动层,核心路径是 应用 → nl80211 → cfg80211 → mac80211/驱动 → 硬件。下面从最新的内核源码(7.1.0-rc6)来看看整个过程。 一、整体架构总览WiFi 扫描在 Linux 中分为以下几层,从上到下依次为: ┌────────────────────────
https://notes.z-dd.online/2026/06/04/Linux%20Wireless%E4%B9%8BWIFI%E6%89%AB%E6%8F%8F/
Linux Wireless之WIFI扫描
Linux 下的 Wi-Fi 扫描流程横跨用户层、内核通用层与驱动层,核心路径是 应用 → nl80211 → cfg80211 → mac80211/驱动 → 硬件。
下面从最新的内核源码(7.1.0-rc6)来看看整个过程。
一、整体架构总览
WiFi 扫描在 Linux 中分为以下几层,从上到下依次为:
CODE
┌─────────────────────────────────────────────────────────────────┐
│ 用户空间 (Userspace) │
│ wpa_supplicant / iw / NetworkManager │
│ 通过 Netlink Socket 发送命令 │
└───────────────────────────┬─────────────────────────────────────┘
│ NL80211_CMD_TRIGGER_SCAN
│ NL80211_CMD_GET_SCAN
│ NL80211_CMD_START_SCHED_SCAN
▼
┌─────────────────────────────────────────────────────────────────┐
│ nl80211 (Netlink 802.11 接口层) │
│ net/wireless/nl80211.c │
│ 解析用户空间命令 → 构造扫描请求 → 调用 cfg80211 │
└───────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ cfg80211 (无线配置子系统) │
│ net/wireless/scan.c, core.c │
│ 扫描请求管理 / BSS 数据库 / 扫描结果过期 / 6GHz 拆分扫描 │
└───────────────────────────┬─────────────────────────────────────┘
│ rdev->ops->scan()
│ (或 mac80211: ieee80211_scan)
▼
┌─────────────────────────────────────────────────────────────────┐
│ mac80211 (软 MAC 层) │
│ net/mac80211/scan.c, cfg.c │
│ 软件扫描状态机 / 硬件扫描调度 / 扫描结果收集 │
└───────────────────────────┬─────────────────────────────────────┘
│ drv_hw_scan() / drv_sw_scan_start()
▼
┌─────────────────────────────────────────────────────────────────┐
│ 硬件驱动 (Hardware Driver) │
│ iwlwifi / ath11k / mt76 / rtw89 / ... │
│ 控制射频硬件发送 Probe Request / 接收 Beacon/Probe Response │
└─────────────────────────────────────────────────────────────────┘
二、核心数据结构
2.1 扫描请求结构
CODE
┌──────────────────────────────────────────────────────────────┐
│ struct cfg80211_scan_request │
│ (include/net/cfg80211.h:2895) │
├──────────────────────────────────────────────────────────────┤
│ ssids[] / n_ssids -- 要扫描的 SSID 列表 │
│ channels[] / n_channels -- 要扫描的信道列表 │
│ ie / ie_len -- 附加的 IE 信息 │
│ flags -- 扫描标志 (随机化等) │
│ mac_addr / mac_addr_mask -- MAC 地址随机化 │
│ bssid -- 指定 BSSID 扫描 │
│ duration -- 信道驻留时间 │
│ rates[NL80211_NUM_BANDS] -- 每个频段的速率掩码 │
│ wdev / wiphy -- 关联的无线设备 │
│ scan_6ghz -- 是否包含 6GHz 信道 │
│ scan_6ghz_params[] -- 6GHz 扫描参数 │
│ no_cck -- 不使用 CCK 速率 │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ struct cfg80211_sched_scan_request │
│ (include/net/cfg80211.h:3025) │
├──────────────────────────────────────────────────────────────┤
│ reqid -- 请求 ID │
│ ssids[] / n_ssids -- 匹配的 SSID │
│ channels[] / n_channels -- 扫描信道 │
│ match_sets[] / n_match_sets-- RSSI 匹配集 │
│ scan_plans[] / n_scan_plans-- 扫描计划 (间隔+迭代次数) │
│ flags -- 标志 │
│ mac_addr / mac_addr_mask -- MAC 随机化 │
│ min_rssi_thold -- 最小 RSSI 阈值 │
│ delay -- 延迟报告 │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ struct cfg80211_bss │
│ (include/net/cfg80211.h:3174) │
├──────────────────────────────────────────────────────────────┤
│ bssid[ETH_ALEN] -- BSS 标识 │
│ channel -- 信道 │
│ ies / beacon_ies / proberesp_ies -- IE 数据 │
│ signal -- 信号强度 (mBm) │
│ beacon_interval -- Beacon 间隔 │
│ capability -- 能力字段 │
│ ts_boottime -- 引导时间戳 │
│ hidden_beacon_bss -- 隐藏 SSID 关联 │
│ transmitted_bss -- MBSSID 传输 BSS │
│ nontrans_list -- 非传输 BSS 列表 │
└──────────────────────────────────────────────────────────────┘
2.2 cfg80211 内部扫描状态
CODE
┌──────────────────────────────────────────────────────────────┐
│ struct cfg80211_registered_device (net/wireless/core.h) │
├──────────────────────────────────────────────────────────────┤
│ scan_req -- 当前活跃的扫描请求 │
│ int_scan_req -- 内部拆分扫描请求 (6GHz) │
│ scan_msg -- 延迟的扫描完成消息 │
│ scan_done_wk -- 扫描完成工作队列项 │
│ sched_scan_req_list -- 活跃的定时扫描请求链表 │
│ sched_scan_res_wk -- 定时扫描结果工作队列项 │
└──────────────────────────────────────────────────────────────┘
三、完整扫描流程
3.1 普通扫描 (Trigger Scan) 完整流程
作者: Shell
链接: https://notes.z-dd.online/2026/06/04/Linux%20Wireless%E4%B9%8BWIFI%E6%89%AB%E6%8F%8F/
来源: DD'Notes
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
。。。 。。。
799

被折叠的 条评论
为什么被折叠?



