当前位置:首页>Linux>Linux Wireless之WIFI扫描

Linux Wireless之WIFI扫描

  • 2026-06-28 13:23:12
Linux Wireless之WIFI扫描

Linux Wireless之WIFI扫描

Linux 下的 Wi-Fi 扫描流程横跨用户层、内核通用层与驱动层,核心路径是 应用 → nl80211 → cfg80211 → mac80211/驱动 → 硬件
下面从最新的内核源码(7.1.0-rc6)来看看整个过程。

一、整体架构总览

WiFi 扫描在 Linux 中分为以下几层,从上到下依次为:

┌─────────────────────────────────────────────────────────────────┐
│                    用户空间 (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 扫描请求结构

┌──────────────────────────────────────────────────────────────┐
│              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 内部扫描状态

┌──────────────────────────────────────────────────────────────┐
│     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) 完整流程

用户空间 (wpa_supplicant / iw)
    │
    │ ① 发送 NL80211_CMD_TRIGGER_SCAN Netlink 消息
    │    携带: 频率列表、SSID列表、IE、扫描标志、MAC随机化参数
    ▼
┌───────────────────────────────────────────────────────────────┐
│  nl80211_trigger_scan()                     [nl80211.c:10805] │
│  ─────────────────────────────────────────────────────────── │
│  ② 解析 Netlink 属性:                                         │
│     - NL80211_ATTR_SCAN_FREQUENCIES (信道列表)                 │
│     - NL80211_ATTR_SCAN_SSIDS (SSID 列表)                     │
│     - NL80211_ATTR_IE (附加 IE)                               │
│     - NL80211_ATTR_SCAN_FLAGS (扫描标志)                      │
│     - NL80211_ATTR_MAC / NL80211_ATTR_MAC_MASK (MAC随机化)    │
│  ③ 分配 cfg80211_scan_request_int 结构                        │
│  ④ 填充 channels[], ssids[], ie 数据                          │
│  ⑤ rdev->scan_req = request                                   │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────────┐
│  cfg80211_scan()                            [scan.c:1069]     │
│  ─────────────────────────────────────────────────────────── │
│  ⑥ 检查 WIPHY_FLAG_SPLIT_SCAN_6GHZ 标志:                      │
│     ├─ 未设置: 直接调用 rdev_scan(rdev, request)               │
│     └─ 已设置 (6GHz 拆分扫描):                                 │
│        ├─ 统计非 6GHz 信道数量                                 │
│        ├─ 如果只有 6GHz 信道: cfg80211_scan_6ghz()             │
│        └─ 否则: 先扫描非 6GHz 信道, 完成后再扫描 6GHz         │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────────┐
│  rdev_scan()                                [rdev-ops.h:458]  │
│  ─────────────────────────────────────────────────────────── │
│  ⑦ 调用 rdev->ops->scan(rdev->wiphy, &request->req)          │
│     这是驱动注册的扫描回调函数                                  │
│     对于 mac80211 驱动: ieee80211_scan()                       │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────────┐
│  ⑧ 同时发送 NL80211_CMD_TRIGGER_SCAN 多播通知                  │
│     nl80211_send_scan_start()              [nl80211.c:20200]  │
│     → 多播到 NL80211_MCGRP_SCAN 组                             │
└───────────────────────────────────────────────────────────────┘

3.2 mac80211 层扫描处理

ieee80211_scan()                              [cfg.c:3289]
    │
    │ ⑨ 验证接口类型 (STATION/ADHOC/MESH/P2P_CLIENT/P2P_DEVICE)
    │    检查 AP 模式下是否允许扫描
    ▼
ieee80211_request_scan()                      [scan.c:1196]
    │
    ▼
__ieee80211_start_scan()                      [scan.c:731]
    │
    │ ⑩ 决定扫描方式:
    │
    ├─── 硬件扫描 (hw_scan) ───────────────────────────────────┐
    │    │                                                     │
    │    │  分配 hw_scan_req 结构                               │
    │    │  设置 SCAN_HW_SCANNING 标志                         │
    │    │  调用 ieee80211_prep_hw_scan() 准备信道列表和 IE    │
    │    │  调用 drv_hw_scan() → ops->hw_scan()                │
    │    │  驱动接管扫描, 完成后调用 ieee80211_scan_completed() │
    │    │                                                     │
    │    └─────────────────────────────────────────────────────┘
    │
    ├─── 单信道在网扫描 (on-channel) ──────────────────────────┐
    │    │                                                     │
    │    │  设置 SCAN_ONCHANNEL_SCANNING 标志                   │
    │    │  调用 drv_sw_scan_start() 通知驱动                   │
    │    │  发送 Probe Request 或等待 Beacon                    │
    │    │                                                     │
    │    └─────────────────────────────────────────────────────┘
    │
    └─── 软件扫描 (sw_scan) ──────────────────────────────────┐
         │                                                     │
         │  设置 SCAN_SW_SCANNING 标志                          │
         │  调用 ieee80211_start_sw_scan():                     │
         │    - drv_sw_scan_start() 通知驱动                    │
         │    - 停止 off-channel VIF                            │
         │    - 发送 NullFunc (PS bit)                          │
         │    - 配置过滤器                                      │
         │    - 启动 scan_work 状态机                           │
         │                                                     │
         └─────────────────────────────────────────────────────┘

3.3 软件扫描状态机

这是 mac80211 中最核心的扫描驱动逻辑:

                    ieee80211_scan_work()  [scan.c:1095]
                              │
                              ▼
                    ┌─────────────────┐
                    │   SCAN_DECISION │ ◄──────────────────────┐
                    │   [scan.c:923]  │                        │
                    └────────┬────────┘                        │
                             │                                 │
              ┌──────────────┼──────────────┐                  │
              │              │              │                  │
              ▼              ▼              ▼                  │
    所有信道完成      需要返回运营信道    继续扫描下一信道            │
         │              │              │                       │
         ▼              ▼              ▼                       │
    扫描完成       ┌──────────┐  ┌───────────────┐             │
                  │SCAN_     │  │ SCAN_SET_     │             │
                  │SUSPEND   │  │ CHANNEL       │             │
                  │[.1062]   │  │ [scan.c:990]  │             │
                  └────┬─────┘  └───────┬───────┘             │
                       │                │                      │
                       ▼                ├──────┐               │
                  返回运营信道            │      │               │
                  (200ms)               │      ▼               │
                       │           被动信道  主动信道            │
                       │           (无IR)   (有IR)             │
                       ▼              │      │                │
                  ┌──────────┐        │      ▼                │
                  │SCAN_     │        │  ┌───────────────┐    │
                  │RESUME    │        │  │ SCAN_SEND_    │    │
                  │[.1077]   │        │  │ PROBE         │    │
                  └────┬─────┘        │  │ [scan.c:689]  │    │
                       │              │  └───────┬───────┘    │
                       │              │          │            │
                       │              ▼          ▼            │
                       │          等待被动    发送 Probe        │
                       │          驻留时间    Request          │
                       │              │          │            │
                       └──────────────┴──────────┴────────────┘
                                      │
                                      ▼
                              ┌──────────────┐
                              │ 扫描完成      │
                              │ __ieee80211_  │
                              │ scan_completed│
                              └──────────────┘

各状态详细说明:

状态
函数
作用
SCAN_DECISIONieee80211_scan_state_decision()
决定下一步: 完成/暂停/切信道/发Probe
SCAN_SET_CHANNELieee80211_scan_state_set_channel()
切换到目标信道, 设置驻留时间
SCAN_SEND_PROBEieee80211_scan_state_send_probe()
为每个 SSID 发送 Probe Request
SCAN_SUSPENDieee80211_scan_state_suspend()
临时返回运营信道处理缓存帧 (200ms)
SCAN_RESUMEieee80211_scan_state_resume()
恢复扫描, 停止 VIF
SCAN_ABORT
-
扫描被中止

3.4 扫描结果上报流程

┌───────────────────────────────────────────────────────────────┐
│  硬件接收到 Beacon / Probe Response 帧                          │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
ieee80211_scan_rx()                           [scan.c:277]
    │
    │ 过滤: 只处理 Probe Response / Beacon / S1G Beacon
    │ 验证信道匹配
    │ 检查 Probe Response 地址是否匹配扫描请求
    ▼
ieee80211_bss_info_update()                   [scan.c:168]
    │
    │ 填充 cfg80211_inform_bss 结构:
    │   - signal (信号强度)
    │   - channel (信道)
    │   - boottime_ns (引导时间)
    │   - parent_tsf / parent_bssid
    ▼
cfg80211_inform_bss_frame_data()              [scan.c:3246]
    │
    │ 解析管理帧: BSSID, TSF, Capability, Beacon Interval, IEs
    │ 判断帧类型 (Beacon / Probe Response)
    ▼
cfg80211_inform_bss_data()                    [scan.c:2253]
    │
    │ 验证信号强度、信道、6GHz 功率类型
    │ 创建 cfg80211_bss_ies 结构
    ▼
__cfg80211_bss_update()
    │
    │ 查找已有的 BSS 条目:
    │   - 找到: 更新 IE 和信号强度
    │   - 未找到: 插入新的 BSS 到哈希表和链表
    │
    │ 处理 Multi-BSSID (MBSSID) 非传输 BSS
    ▼
返回 cfg80211_bss 引用

3.5 扫描完成流程

┌───────────────────────────────────────────────────────────────┐
│  硬件扫描完成 / 软件扫描遍历完所有信道                              │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
ieee80211_scan_completed()                    [scan.c:540]
    │ (EXPORTED, 驱动调用)
    │
    │ 设置 SCAN_COMPLETED 标志 (如果中止还设置 SCAN_ABORTED)
    │ 排入 scan_work 工作队列
    ▼
ieee80211_scan_work() 检测到完成              [scan.c:1122]
    │
    ▼
__ieee80211_scan_completed()                  [scan.c:448]
    │
    │ ① 多频段硬件扫描: 启动下一频段扫描 (如果需要)
    │ ② 释放 hw_scan_req
    │ ③ 恢复功率等级和过滤器配置
    │ ④ 通知 MLME: ieee80211_mlme_notify_scan_completed()
    │    → 重启 STA 定时器
    │ ⑤ 通知 IBSS
    │ ⑥ 重新排队延迟的工作
    │ ⑦ 启动下一个 ROC (Remain On Channel)
    │
    ▼
cfg80211_scan_done()                          [scan.c:1183]
    │ (EXPORTED, mac80211 调用)
    │
    │ 存储 scan_info (aborted, tsf, bssid)
    │ 排入 scan_done_wk 工作队列
    ▼
__cfg80211_scan_done()                        [scan.c:1178]
    │
    ▼
___cfg80211_scan_done()                       [scan.c:1107]
    │
    │ ① 检查是否需要 6GHz 后续扫描
    │ ② 构建 Netlink 消息:
    │    - 正常完成: NL80211_CMD_NEW_SCAN_RESULTS
    │    - 被中止:   NL80211_CMD_SCAN_ABORTED
    │ ③ 处理 NL80211_SCAN_FLAG_FLUSH (清除过期 BSS)
    │ ④ 发送多播到 NL80211_MCGRP_SCAN
    ▼
用户空间收到扫描结果通知

3.6 扫描结果查询流程

用户空间 (wpa_supplicant / iw scan)
    │
    │ NL80211_CMD_GET_SCAN (dumpit)
    ▼
nl80211_dump_scan()                           [nl80211.c:12092]
    │
    │ 首次调用: cfg80211_bss_expire() 过期旧 BSS
    │
    │ 遍历 rdev->bss_list:
    │   └── nl80211_send_bss()               [nl80211.c:11933]
    │       │
    │       │ 构建 NL80211_CMD_NEW_SCAN_RESULTS 消息
    │       │ 包含 NL80211_ATTR_BSS 属性:
    │       │   - BSSID, TSF, IEs (Probe Response + Beacon)
    │       │   - Beacon Interval, Capability
    │       │   - Frequency, Signal (mBm)
    │       │   - Seen ms ago (上次看到时间)
    │       │   - Parent TSF, Parent BSSID
    │       │   - Chain Signal 等
    │       ▼
    │       返回给用户空间
    │
    │ 分页: 多次 dump 调用返回所有 BSS 条目
    ▼
用户空间获取完整扫描结果

3.7 定时扫描 (Scheduled Scan) 流程

用户空间
    │
    │ NL80211_CMD_START_SCHED_SCAN
    ▼
┌───────────────────────────────────────────────────────────────┐
│  nl80211_start_sched_scan()               [nl80211.c:11497]   │
│  ─────────────────────────────────────────────────────────── │
│  验证支持 (max_sched_scan_reqs, ops->sched_scan_start)        │
│  cfg80211_sched_scan_req_possible() 检查资源限制              │
│  解析: match_sets, scan_plans, channels, ssids               │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────────┐
│  rdev_sched_scan_start()                  [rdev-ops.h:888]    │
│  → rdev->ops->sched_scan_start()                              │
└───────────────────────────┬───────────────────────────────────┘
                            │
          ┌─────────────────┴─────────────────┐
          ▼                                   ▼
    mac80211 驱动                        直接 cfg80211 驱动
          │
          ▼
ieee80211_sched_scan_start()              [cfg.c:3351]
    │
    ▼
__ieee80211_request_sched_scan_start()    [scan.c:1331]
    │
    │ 构建扫描 IE、速率掩码
    │ 调用 drv_sched_scan_start() → ops->sched_scan_start()
    │ 存储 sched_scan_req 和 sched_scan_sdata
    ▼
    │
    ├─ cfg80211_add_sched_scan_req() 加入链表
    │
    ▼
┌───────────────────────────────────────────────────────────────┐
│  驱动定期执行扫描, 发现匹配网络时上报结果                      │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
ieee80211_sched_scan_results()              [scan.c:1431]
    │ (EXPORTED, 驱动调用)
    ▼
cfg80211_sched_scan_results()               [scan.c:1302]
    │
    │ 设置 report_results = true
    │ 排入 sched_scan_res_wk 工作队列
    ▼
cfg80211_sched_scan_results_wk()            [scan.c:1276]
    │
    │ 遍历 sched_scan_req_list 中 report_results=true 的请求
    │ 发送 NL80211_CMD_SCHED_SCAN_RESULTS 多播
    ▼
用户空间收到定时扫描结果

停止定时扫描:
    NL80211_CMD_STOP_SCHED_SCAN
    → nl80211_stop_sched_scan()           [nl80211.c:11550]
    → cfg80211_stop_sched_scan_req()      [scan.c:1340]
    → rdev_sched_scan_stop()
    → 发送 NL80211_CMD_SCHED_SCAN_STOPPED

3.8 6GHz 拆分扫描流程

┌───────────────────────────────────────────────────────────────┐
│  6GHz 频段扫描采用 "拆分扫描" 策略                             │
│  (WIPHY_FLAG_SPLIT_SCAN_6GHZ)                                 │
│                                                               │
│  原因: 6GHz 信道数量多, 与 2.4/5GHz 合并扫描耗时过长           │
└───────────────────────────┬───────────────────────────────────┘
                            │
                            ▼
第一阶段: 扫描 2.4GHz + 5GHz 信道
    │
    │ cfg80211_scan() 中拆分出非 6GHz 信道
    │ rdev_scan() 执行扫描
    │
    ▼
扫描完成回调 ___cfg80211_scan_done()
    │
    │ 检测到还有 6GHz 信道未扫描
    ▼
cfg80211_scan_6ghz()                          [scan.c:841]
    │
    │ 从 RNR (Reduced Neighbor Report) 元素中获取:
    │   - 协同 AP 的信道信息
    │   - Short SSID 匹配
    │ 构建 6GHz 专用扫描请求:
    │   - PSC (Preferred Scanning Channels) 信道
    │   - 协同 AP 关联的信道
    │   - unsolicited probe 信道
    │
    │ rdev_scan() 执行 6GHz 扫描
    ▼
第二阶段完成, 发送最终扫描结果

四、关键函数索引表

4.1 nl80211 层 (net/wireless/nl80211.c)

行号
函数
功能
10805
nl80211_trigger_scan()
解析用户空间扫描请求, 启动扫描
11054
nl80211_abort_scan()
中止正在进行的扫描
11497
nl80211_start_sched_scan()
启动定时扫描
11550
nl80211_stop_sched_scan()
停止定时扫描
12092
nl80211_dump_scan()
导出扫描结果到用户空间
11933
nl80211_send_bss()
发送单个 BSS 条目
20200
nl80211_send_scan_start()
多播扫描开始通知
20219
nl80211_build_scan_msg()
构建扫描完成/中止消息
20239
nl80211_send_scan_msg()
多播扫描完成通知

4.2 cfg80211 层 (net/wireless/scan.c)

行号
函数
功能
1069
cfg80211_scan()
扫描入口, 处理 6GHz 拆分
1107
___cfg80211_scan_done()
扫描完成核心处理
1183
cfg80211_scan_done()
导出函数, 驱动调用通知扫描完成
841
cfg80211_scan_6ghz()
6GHz 拆分扫描处理
1302
cfg80211_sched_scan_results()
导出函数, 定时扫描结果通知
1340
cfg80211_stop_sched_scan_req()
停止定时扫描请求
2253
cfg80211_inform_single_bss_data()
BSS 信息录入核心函数
3246
cfg80211_inform_bss_frame_data()
导出函数, 报告收到的 Beacon/Probe Response
468
__cfg80211_bss_expire()
过期旧的 BSS 条目

4.3 mac80211 层 (net/mac80211/scan.c)

行号
函数
功能
731
__ieee80211_start_scan()
扫描启动核心: 决定 hw/sw/onchannel
1095
ieee80211_scan_work()
软件扫描状态机主循环
923
ieee80211_scan_state_decision()
扫描决策状态
990
ieee80211_scan_state_set_channel()
设置信道状态
689
ieee80211_scan_state_send_probe()
发送 Probe Request 状态
448
__ieee80211_scan_completed()
扫描完成处理
540
ieee80211_scan_completed()
导出函数, 硬件扫描完成回调
277
ieee80211_scan_rx()
接收 Beacon/Probe Response
63
ieee80211_inform_bss()
BSS 信息通知回调
1331
__ieee80211_request_sched_scan_start()
定时扫描启动

4.4 驱动接口

文件
回调
功能
include/net/cfg80211.h:5203.scan
cfg80211 驱动扫描回调
include/net/cfg80211.h:5205.abort_scan
cfg80211 驱动中止扫描回调
include/net/cfg80211.h:5306.sched_scan_start
cfg80211 定时扫描启动
include/net/cfg80211.h:5309.sched_scan_stop
cfg80211 定时扫描停止
include/net/mac80211.h:4749.hw_scan
mac80211 硬件扫描回调
include/net/mac80211.h:4751.cancel_hw_scan
mac80211 取消硬件扫描
include/net/mac80211.h:4753.sched_scan_start
mac80211 定时扫描启动
include/net/mac80211.h:4757.sched_scan_stop
mac80211 定时扫描停止

五、Netlink 命令与多播组

┌─────────────────────────────────────────────────────────────┐
│                    Netlink 命令                              │
├──────────────────────────┬──────────────────────────────────┤
│  NL80211_CMD_TRIGGER_SCAN    (1469)  触发扫描               │
│  NL80211_CMD_GET_SCAN        (1470)  获取扫描结果           │
│  NL80211_CMD_NEW_SCAN_RESULTS(1471)  扫描结果通知           │
│  NL80211_CMD_SCAN_ABORTED    (1472)  扫描中止通知           │
│  NL80211_CMD_ABORT_SCAN      (1604)  中止扫描命令           │
│  NL80211_CMD_START_SCHED_SCAN(1537)  启动定时扫描           │
│  NL80211_CMD_STOP_SCHED_SCAN (1538)  停止定时扫描           │
│  NL80211_CMD_SCHED_SCAN_RESULTS    (1539)  定时扫描结果     │
│  NL80211_CMD_SCHED_SCAN_STOPPED    (1540)  定时扫描停止     │
├──────────────────────────┴──────────────────────────────────┤
│                    多播组                                    │
├─────────────────────────────────────────────────────────────┤
│  NL80211_MCGRP_SCAN ("scan")  所有扫描事件发送到此组         │
└─────────────────────────────────────────────────────────────┘

六、扫描标志 (Scan Flags)

┌──────────────────────────────────────────────────────────────┐
│  NL80211_SCAN_FLAG_LOW_PRIORITY          低优先级扫描         │
│  NL80211_SCAN_FLAG_FLUSH                 刷新旧结果           │
│  NL80211_SCAN_FLAG_AP                    AP 模式扫描          │
│  NL80211_SCAN_FLAG_RANDOM_ADDR          使用随机 MAC 地址     │
│  NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME 最大信道驻留时间     │
│  NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP 接受广播探测响应  │
│  NL80211_SCAN_FLAG_OOC_PROBE_OUI        OOC 探测 OUI         │
│  NL80211_SCAN_FLAG_MIN_PREQ_CONTENT     最小探测请求内容      │
└──────────────────────────────────────────────────────────────┘

七、关键时序图

7.1 完整扫描时序 (从触发到结果上报)

时间轴 ──────────────────────────────────────────────────────────►

用户空间     │──NL80211_CMD_TRIGGER_SCAN──►│                    │
             │                              │                    │
nl80211      │  nl80211_trigger_scan()      │                    │
             │  cfg80211_scan()             │                    │
             │  rdev_scan()                 │                    │
             │  nl80211_send_scan_start()   │                    │
             │                              │                    │
mac80211     │  ieee80211_scan()            │                    │
             │  __ieee80211_start_scan()    │                    │
             │                              │                    │
             │  ┌─ SCAN_SET_CHANNEL ──┐    │                    │
             │  │  切换到信道 1       │    │                    │
             │  │  等待驻留时间       │    │                    │
             │  │  SCAN_SEND_PROBE    │    │                    │
             │  │  发送 Probe Request │    │                    │
             │  │  等待响应           │    │                    │
             │  │  SCAN_DECISION      │    │                    │
             │  └─────────────────────┘    │                    │
             │  ... 重复所有信道 ...        │                    │
             │                              │                    │
驱动         │  ── 收到 Beacon/Probe Resp ──►│                   │
             │     ieee80211_scan_rx()       │                   │
             │     cfg80211_inform_bss_*()   │                   │
             │                              │                    │
             │  扫描完成                     │                    │
             │  ieee80211_scan_completed()   │                    │
             │  cfg80211_scan_done()         │                    │
             │                              │                    │
nl80211      │  nl80211_build_scan_msg()    │                    │
             │  ──NL80211_CMD_NEW_SCAN_RESULTS──►│               │
             │                              │                    │
用户空间     │  ◄── 收到扫描结果通知 ────── │                    │
             │  NL80211_CMD_GET_SCAN        │                    │
             │  ◄── 获取完整 BSS 列表 ───── │                    │

八、源文件索引

文件路径
层级
职责
include/uapi/linux/nl80211.h
UAPI
Netlink 命令和属性定义
include/net/cfg80211.h
cfg80211
数据结构、驱动操作、导出 API
include/net/mac80211.h
mac80211
ieee80211_ops 定义
net/wireless/nl80211.c
nl80211
Netlink 命令处理器
net/wireless/scan.c
cfg80211
扫描核心: 请求管理、BSS 数据库、扫描完成
net/wireless/core.c
cfg80211
初始化、清理、定时扫描停止
net/wireless/core.h
cfg80211
内部结构定义
net/wireless/rdev-ops.h
cfg80211
驱动调用包装器
net/mac80211/scan.c
mac80211
扫描状态机、hw/sw 扫描、BSS 通知
net/mac80211/cfg.c
mac80211
cfg80211 操作注册
net/mac80211/mlme.c
mac80211
MLME 扫描完成通知
net/mac80211/driver-ops.h
mac80211
驱动调用包装器

九、总结

Linux 内核 WiFi 扫描流程的核心设计特点:

  1. 1. 分层架构: nl80211 → cfg80211 → mac80211 → 驱动, 每层职责清晰
  2. 2. 异步模型: 扫描请求异步执行, 通过工作队列和 Netlink 多播通知结果
  3. 3. 双模扫描: 支持硬件扫描 (hw_scan, 驱动实现) 和软件扫描 (sw_scan, mac80211 状态机)
  4. 4. 6GHz 拆分: 6GHz 信道单独扫描, 利用 RNR 和 PSC 优化扫描效率
  5. 5. BSS 数据库: cfg80211 维护统一的 BSS 哈希表, 支持过期清理和 MBSSID
  6. 6. 定时扫描: 支持基于扫描计划 (interval + iterations) 的后台扫描
  7. 7. MAC 随机化: 支持扫描时使用随机 MAC 地址保护隐私

欢迎关注:

欢迎添加微信号入群交流:

如果有更多疑问或需要帮助,可点击下方卡片,让「东东的小站AI助手」为您实时答疑:支持24小时在线 ⬇️

更多请点击左下角 阅读原文!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 08:27:44 HTTP/2.0 GET : https://f.mffb.com.cn/a/498787.html
  2. 运行时间 : 0.181161s [ 吞吐率:5.52req/s ] 内存消耗:4,664.18kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=e5335268cb3ea4eb83c28a5ba2093fa5
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000915s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000890s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000329s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000293s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000517s ]
  6. SELECT * FROM `set` [ RunTime:0.000174s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000559s ]
  8. SELECT * FROM `article` WHERE `id` = 498787 LIMIT 1 [ RunTime:0.005391s ]
  9. UPDATE `article` SET `lasttime` = 1783038465 WHERE `id` = 498787 [ RunTime:0.006678s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000254s ]
  11. SELECT * FROM `article` WHERE `id` < 498787 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000508s ]
  12. SELECT * FROM `article` WHERE `id` > 498787 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000457s ]
  13. SELECT * FROM `article` WHERE `id` < 498787 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004059s ]
  14. SELECT * FROM `article` WHERE `id` < 498787 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.007171s ]
  15. SELECT * FROM `article` WHERE `id` < 498787 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.007879s ]
0.182826s