Linux Wireless之WIFI监管域处理流程

Linux Wireless之WIFI监管域处理流程
Linux Wireless之WIFI监管域处理流程 | DDNotesLinux Wireless之WIFI监管域处理流程1. 概述Linux无线监管域(Regulatory Domain)是cfg80211无线子系统中的核心组件负责管理无线设备的频段、功率、信道使用规则等参数。 前面有简单介绍了Linux下的WIFI无线监管域 https://mp.weixin.qq.com/s/MWMEiofdlPP4UD7vwaGiKA https://notes.z-https://notes.z-dd.online/2026/06/08/Linux%20Wireless%E4%B9%8BWIFI%E7%9B%91%E7%AE%A1%E5%9F%9F%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/Linux Wireless之WIFI监管域处理流程1. 概述Linux无线监管域(Regulatory Domain)是cfg80211无线子系统中的核心组件负责管理无线设备的频段、功率、信道使用规则等参数。前面有简单介绍了Linux下的WIFI无线监管域https://mp.weixin.qq.com/s/MWMEiofdlPP4UD7vwaGiKAhttps://notes.z-dd.online/2025/10/27/WIFI%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C%E4%B9%8B%E6%97%A0%E7%BA%BF%E7%9B%91%E7%AE%A1%E5%9F%9F/今天来看看整个监管域处理流程基于内核v7.1.0-rc6。2. 机制演进Linux无线监管域机制经历了三个主要阶段演进CRDA用户空间方案 (早期)内核通过udev事件通知用户空间需要监管域CRDA守护进程响应请求通过nl80211发送监管规则需要udev规则KERNELregulatory*, ACTIONchange, SUBSYSTEMplatform, RUN/sbin/crda内置数据库方案 (中期)引入 regulatory.db 固件文件编译时可链接到内核通过 request_firmware_nowait() 异步加载支持签名验证load_builtin_regdb_keys()保留CRDA作为后备方案CONFIG_CFG80211_CRDA_SUPPORT自监管设备方案 (现代)引入 REGULATORY_WIPHY_SELF_MANAGED 标志设备固件/驱动自行管理监管域忽略外部提示通过 regulatory_set_wiphy_regd() 接口设置不共享监管信息独立于系统其他设备3. 整体架构图CODE┌─────────────────────────────────────────────────────────────────────────────────┐│ Linux无线监管域架构 │├─────────────────────────────────────────────────────────────────────────────────┤│ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ││ │ 用户空间 │ │ CRDA/ │ │ regulatory │ │ 内置数据库 │ ││ │ iw/ip │ │ regdb │ │ .db文件 │ │ │ ││ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ ││ │ │ │ │ ││ ▼ ▼ ▼ ▼ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ nl80211 接口层 │ ││ │ NL80211_CMD_SET_REG / NL80211_CMD_REQ_SET_REG / NL80211_CMD_GET_REG │ ││ └────────────────────────────────┬────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ 监管域核心 (reg.c) │ ││ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ ││ │ │ 请求队列 │ │ 提示处理 │ │ 域交集算法 │ │ 数据库查询 │ │ ││ │ │ reg_requests│ │ reg_process │ │ intersect │ │ query_regdb │ │ ││ │ │ _list │ │ _hint │ │ │ │ │ │ ││ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ ││ └────────────────────────────────┬────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ 监管域应用层 │ ││ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ ││ │ │ wiphy更新 │ │ 信道处理 │ │ 规则应用 │ │ 通知机制 │ │ ││ │ │ update_all │ │ handle_ │ │ map_regdom │ │ nl80211_ │ │ ││ │ │ _wiphy │ │ channel │ │ _flags │ │ send_event │ │ ││ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ ││ └────────────────────────────────┬────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ 无线驱动层 │ ││ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ ││ │ │ 驱动提示 │ │ 自监管设备 │ │ 信标发现 │ │ DFS处理 │ │ ││ │ │ regulatory │ │ wiphy_self │ │ found_ │ │ radar_ │ │ ││ │ │ _hint │ │ _managed │ │ beacon │ │ detected │ │ ││ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────────────────────┘4. 监管域初始化流程4.1 初始化流程图CODE┌─────────────────────────────────────────────────────────────────────────────────┐│ 监管域初始化流程 │├─────────────────────────────────────────────────────────────────────────────────┤│ ││ cfg80211_init() ││ │ ││ ▼ ││ ┌────────────────────┐ ││ │ regulatory_init() │ reg.c:4328 ││ └─────────┬──────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 1. 创建虚拟设备 reg_fdev │ ││ │ faux_device_create(regulatory, NULL, NULL) │ ││ └─────────┬──────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 2. 设置初始世界监管域 │ ││ │ rcu_assign_pointer(cfg80211_regdomain, │ ││ │ cfg80211_world_regdom) │ ││ └─────────┬──────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 3. 初始化用户alpha2为 97 (未配置) │ ││ │ user_alpha2[0] 9; user_alpha2[1] 7 │ ││ └─────────┬──────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 4. regulatory_init_db() │ ││ │ late_initcall (内核模块) 或直接调用 (可加载模块) │ ││ └─────────┬──────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 4.1 load_builtin_regdb_keys() │ ││ │ 加载内置签名密钥 │ ││ └─────────┬──────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 4.2 regulatory_hint_core(00) │ ││ │ 发送核心监管提示 (世界监管域) │ ││ └─────────┬──────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌────────────────────────────────────────────────────┐ ││ │ 4.3 检查模块参数 ieee80211_regdom │ ││ │ 如果非00调用 regulatory_hint_user() │ ││ └────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────────────────────┘4.2 世界监管域定义C// reg.c:233static const struct ieee80211_regdomain world_regdom {.n_reg_rules 8,.alpha2 00,.reg_rules {/* 2.4GHz: 信道 1-11 */REG_RULE(2412-10, 246210, 40, 6, 20, 0),/* 2.4GHz: 信道 12-13 */REG_RULE(2467-10, 247210, 20, 6, 20, NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),/* 2.4GHz: 信道 14 (仅日本) */REG_RULE(2484-10, 248410, 20, 6, 20, NL80211_RRF_NO_IR | NL80211_RRF_NO_OFDM),/* 5GHz: 信道 36-48 */REG_RULE(5180-10, 524010, 80, 6, 20, NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),/* 5GHz: 信道 52-64 (DFS) */REG_RULE(5260-10, 532010, 80, 6, 20, NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW | NL80211_RRF_DFS),/* 5GHz: 信道 100-144 (DFS) */REG_RULE(5500-10, 572010, 160, 6, 20, NL80211_RRF_NO_IR | NL80211_RRF_DFS),/* 5GHz: 信道 149-165 */REG_RULE(5745-10, 582510, 80, 6, 20, NL80211_RRF_NO_IR),/* 60GHz: 信道 1-3 */REG_RULE(561602160*1-1080, 561602160*31080, 2160, 0, 0, 0),}};5. 监管域请求处理流程5.1 请求来源与处理流程图CODE┌─────────────────────────────────────────────────────────────────────────────────┐│ 监管请求处理流程 │├─────────────────────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ 用户空间 │ │ 驱动 │ │ AP国家IE │ │ 核心 │ ││ │ iw set │ │ regulatory│ │ country │ │ regulatory│ ││ │ reg │ │ _hint() │ │ _ie │ │ _hint_ │ ││ │ country │ │ │ │ │ │ core() │ ││ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ ││ │ │ │ │ ││ ▼ ▼ ▼ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ regulatory_hint_*() 函数族 │ ││ │ - regulatory_hint_user() reg.c:3244 │ ││ │ - regulatory_hint() reg.c:3316 │ ││ │ - regulatory_hint_country_ie() reg.c:3344 │ ││ │ - regulatory_hint_core() reg.c:3225 │ ││ └────────────────────────────────────┬─────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ queue_regulatory_request() reg.c:3209 │ ││ │ 1. 转换alpha2为大写 │ ││ │ 2. 加入 reg_requests_list 链表 │ ││ │ 3. 调度 reg_work 工作队列 │ ││ └────────────────────────────────────┬─────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ reg_todo() 工作队列处理 reg.c:3200 │ ││ └────────────────────────────────────┬─────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ reg_process_pending_hints() reg.c:3084 │ ││ │ 1. 检查 last_request-processed 状态 │ ││ │ 2. 从 reg_requests_list 取出第一个请求 │ ││ │ 3. 调用 reg_process_hint() 处理 │ ││ └────────────────────────────────────┬─────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ reg_process_hint() reg.c:3013 │ ││ │ │ ││ │ switch(initiator) { │ ││ │ ┌─────────────────────────────────────────────────────────────┐ │ ││ │ │ BY_CORE ──► reg_process_hint_core() reg.c:2675 │ │ ││ │ │ BY_USER ──► reg_process_hint_user() reg.c:2734 │ │ ││ │ │ BY_DRIVER ► reg_process_hint_driver() reg.c:2790 │ │ ││ │ │ BY_COUNTRY ►reg_process_hint_country_ie() reg.c:2894 │ │ ││ │ └─────────────────────────────────────────────────────────────┘ │ ││ └────────────────────────────────────┬─────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ reg_query_database() reg.c:1111 │ ││ │ 1. query_regdb_file() - 查询内置数据库 │ ││ │ 2. call_crda() - 调用CRDA用户空间守护进程 │ ││ └────────────────────────────────────┬─────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────────────────────┐ ││ │ set_regdom() reg.c:3942 │ ││ │ 设置监管域并应用到所有wiphy │ ││ └──────────────────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────────────────────┘5.2 请求处理结果枚举C// reg.c:73enum reg_request_treatment {REG_REQ_OK, // 继续处理请求REG_REQ_IGNORE, // 忽略请求REG_REQ_INTERSECT, // 需要与当前域交集REG_REQ_ALREADY_SET, // 已设置相同域无需处理};6. 监管域设置流程作者: Shell链接: https://notes.z-dd.online/2026/06/08/Linux%20Wireless%E4%B9%8BWIFI%E7%9B%91%E7%AE%A1%E5%9F%9F%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/来源: DDNotes著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。。。。 。。。更多请关注我的博客https://notes.z-dd.online/或我的