Linux Wireless之WIFI扫描

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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

。。。 。。。


更多请关注我的博客:https://notes.z-dd.online/

或我的:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值