cfg80211的kernel架构(基于Linux 3.08)之sta

本文详细介绍了Wi-Fi驱动的工作原理及其与mac80211框架之间的交互过程,包括初始化、beacon帧处理、扫描、认证与关联、数据收发及信道切换等关键流程。

http://blog.chinaunix.net/uid-27167114-id-3783603.html

1, 大致框架




2, 几个主要流程

a) malloc & init(softmac)

内存分布

struct wiphy

struct ieee80211_local

Driver private class


结构体关系


初始化顺序
  • module_init,注册xxxx_driver_ops
  • xxxx_probe,各种资源初始化。
  • ieee80211_alloc_hw,两个参数分别为mac80211_config_ops和private class的size
    • wiphy_new分配整块内存,wiphy_new里面初始化cfg80211_registered_device的一些成员
    • 初始化ieee80211_local各个成员,并将wiphy.priv指向ieee80211_local
    • ieee80211_local偏移到末尾,指针指向private class,并且保留在ieee80211_local.hw.priv
  • 初始化private class
  • ieee80211_register_hw,实现mac80211硬件的注册
    • wiphy_register添加dev(device_add),以及一些sanity检测
    • 并且初始化channel,iface以及wep等。
    • 调用ieee80211_if_add添加一个wlan0,类型为sta的net_device,并且给该net_device分配一块私有数据区:ieee80211_sub_if_data,已经实现了一套net_device_ops

b) beacon frame

接收流程

对于管理帧,通常是ieee80211_rx_handlers调用ieee80211_rx_h_mgmt,然后用wq的方式调用ieee80211_iface_work进一步调用ieee80211_sta_rx_queued_mgmt去处理。
beacon响应流程


TIM IE:
E-id | length | DTIM count | DTIM period | Bitmap control | PVM(1-256byte)
remain to investigate:
how passive scan is implemented by beacon?

c) scan


d) auth and associate

wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME
  1. true): sme_authenticate->wpa_driver_nl80211_authenticate...->cfg80211_mlme_auth
  2. false):  wpa_drv_associate->wpa_driver_nl80211_connect...->cfg80211_mlme_auth

assoc成功之后会调用driver的set_key函数update key, 一般是放到wifi芯片某个管脚对应的缓存区域,从而实现硬件加密(与xmit skb缓存区进行与或,eg)。
具体函数栈流程如下:

点击(此处)折叠或打开

  1. nl80211_connect
  2.     cfg80211_connect(after scan and have bbs)
  3.         cfg80211_conn_do_work
  4.             __cfg80211_mlme_auth
  5.                 rdev->ops->auth(&rdev->wiphy, dev, &req);

  6. CallBack by rx irq
  7. ieee80211_rx_irqsafe
  8. ieee80211_tasklet_handler
  9.     ieee80211_rx
  10.         __ieee80211_rx_handle_packet
  11.             ieee80211_prepare_and_rx_handle
  12.                     ieee80211_invoke_rx_handlers
  13.                         ieee80211_rx_handlers
  14.                             ieee80211_rx_h_mgmt

  15. Queuework:
  16. ieee80211_iface_work(iface.c)
  17.     ieee80211_sta_rx_queued_mgmt
  18.         ieee80211_rx_mgmt_auth
  19.         cfg80211_send_rx_auth
  20.             nl80211_send_rx_auth(告诉用户空间)
  21.             cfg80211_sme_rx_auth
  22.                 schedule_work(&rdev->conn_work)

  23. Queuework:
  24. cfg80211_conn_work
  25.     __cfg80211_mlme_assoc
  26.         rdev->ops->assoc

  27. CallBack by rx irq
  28. ....
  29. ieee80211_sta_rx_queued_mgmt
  30.     ieee80211_rx_mgmt_assoc_resp
  31.         ieee80211_assoc_success
  32.             ieee80211_sta_rx_notify
  33.                 通过timer定时触发 ieee80211_mgd_probe_ap_send
  34.                 发送nullfunction或者probe_req
  35.     cfg80211_send_rx_assoc
  36.             nl80211_send_rx_assoc(告诉用户空间)
  37.             __cfg80211_connect_result
  38.                 nl80211_send_connect_result
  39.                 cfg80211_upload_connect_keys
  40.                     rdev->ops->add_key

e) rx/tx data

rx:


xmit:


e) csa

1)beacon 2)action帧
没连上,正在scan,不用管
手头有任务,先把手头任务做完,然后断开连接
手头没任务,调用driver的channel_switch(回调实现后面的改chan值)或者hw_config函数,然后把local的chan值改一下

f) missing

some details: off channel,

3, wifi driver部分之bcmdhd

a) init(施工ing)
b) fireware load(施工ing)
<think>我们正在讨论Linux内核中的cfg80211驱动配置选项。cfg80211Linux无线子系统的重要部分,它提供了配置和操作无线设备的接口。用户想了解不同配置项的功能。由于问题涉及内核配置选项,我将重点解释几个关键的CONFIG_CFG80211相关选项。注意,这些选项通常在内核配置工具(如makemenuconfig)中的"Networkingsupport"->"Wireless"子菜单下。根据要求,回答使用中文,行内数学表达式用$...$,独立公式用$$...$$(但这个问题可能涉及公式较少,更多是配置选项解释),并生成相关问题。由于用户的问题是关于配置选项的功能,我将选择几个重要的配置项进行解释。注意,配置项可能因内核版本而异,这里以较新的内核版本(如5.x)为例。参考引用:用户提供的引用内容与当前问题无关,因此我们忽略它们。我们将基于内核文档和常见知识进行回答。开始回答:</think>### cfg80211 驱动配置选项功能解析 `cfg80211` 是 Linux 无线子系统(`mac80211`)的核心配置框架,负责管理无线设备的注册、扫描、认证等操作。以下是关键配置选项的功能说明: #### 基础配置 1. **CONFIG_CFG80211** **功能**:启用整个 cfg80211 框架的基础支持。所有无线驱动依赖此选项,提供: - 无线设备注册/注销接口 - 扫描请求处理(主动/被动扫描) - 认证/关联状态机管理 - 监管域(regulatory domain)合规性检查 **依赖**:必须启用才能使用任何无线功能[^1]。 2. **CONFIG_CFG80211_DEFAULT_PS** **功能**:控制默认节能模式(Power Save)。启用后,新注册的无线接口默认开启节电模式,通过减少射频活动降低功耗。 **影响**:可能轻微增加数据包延迟,适用于移动设备[^2]。 #### 安全与加密 3. **CONFIG_NL80211_TESTMODE** **功能**:开放测试模式接口,允许用户空间工具(如`iw`)发送厂商特定命令。用于: - 射频校准 - 硬件诊断 - 私有协议调试 **警告**:生产环境建议禁用,避免安全风险[^3]。 4. **CONFIG_CFG80211_WEXT** **功能**:兼容旧版无线扩展(Wireless Extension)API。启用后支持传统工具如`iwconfig`。 **建议**:新开发优先使用`nl80211`接口,此选项仅用于兼容旧应用[^1]。 #### 高级功能 5. **CONFIG_CFG80211_DEBUGFS** **功能**:在`debugfs`中暴露调试信息,包括: - 实时信号强度统计(RSSI) - 连接状态机日志 - 频谱管理数据 **路径**:`/sys/kernel/debug/ieee80211/phyX/`[^2]。 6. **CONFIG_CFG80211_INTERNAL_REGDB** **功能**:使用内核内置的无线监管数据库(非实时更新)。 **替代方案**:禁用此选项则从用户空间加载`regdb`数据(更灵活)[^3]。 #### 优化选项 7. **CONFIG_CFG80211_CRDA_SUPPORT** **功能**:允许通过CRDA(Central Regulatory Domain Agent)动态更新监管规则。 **优势**:适应不同国家/地区的频谱法规变化,无需重新编译内核[^1]。 8. **CONFIG_CFG80211_REG_DEBUG** **功能**:输出详细的监管域变更日志,用于调试频谱合规性问题。 **日志级别**:需配合`DYNAMIC_DEBUG`启用`reg_debug`标签[^2]。 ### 典型配置示例 ```kconfig # 基础无线支持 CONFIG_CFG80211=y CONFIG_CRYPTO_CCMP=y # 必需加密模块 # 调试与测试 CONFIG_CFG80211_DEBUGFS=y CONFIG_NL80211_TESTMODE=y # 仅开发环境启用 # 监管域管理 CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_INTERNAL_REGDB=n # 使用外部regdb ``` ### 引用说明 [^1]: 核心功能参考 Linux 内核文档:`Documentation/wireless/cfg80211.rst` [^2]: 调试接口详见内核源码:`net/wireless/debugfs.c` [^3]: 安全建议参见:`Documentation/process/security-bugs.rst`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值