1. mac80211概览


目录

文章目录

  • 1. mac80211概览
  • 2. mac80211架构
  • 3. mac80211代码结构
  • 4. mac80211数据结构体
    • 4.1 ieee80211 local/ieee80211 hw
    • 4.2 sta_info/ieee80211_sta
    • 4.3 ieee80211_conf
    • 4.4 ieee80211 bss conf
    • 4.5 ieee80211 key/ieee80211 key conf
    • 4.6 ieee80211 tx info
    • 4.7 ieee80211 rx status
    • 4.8 ieee80211 sub if data/ieee80211 vif
  • 5. mac80211主要流程
    • 5.1 配置
    • 5.2 接收路径
    • 5.3 发送路径
    • 5.4 mangement/MLME
    • 5.5 IBSS
    • 5.6 创建接口路径
    • 5.7 删除接口路径
    • 5.8 创建station路径
    • 5.9 删除station路径
    • 5.10 扫描请求路径
    • 5.11 扫描状态机路径
  • 6. MAC80211切换点
    • 6.1 配置
    • 6.1 wext
    • 6.2 cfg80211
    • 6.3 从mac80211到速率控制
    • 6.4 从mac80211到驱动
    • 6.5 mac80211主要函数

  mac80211是linux kernel中的一个子系统,它为无线设备soft-MAC/half-MAC提供了分享实施方案,包含MLME和另外一些代码

2. mac80211架构

3. mac80211代码结构

kernel提供的驱动API,该文件定义了mac8011源码中使用的API:

include/net/mac80211.h

以下是net/mac80211源码中除了头文件外的重要组成:

files function
Kconfig, Makefile build system
ieee80211_i.h most internal data structures
main.c (reg/dereg)
iface.c virtual interface handling
key.c, key.h key management
sta_info.c, sta_info.h Station (peer) management
pm.c power management (suspend/hibernate)
rate.c, rate.h internal rate control functions
rc80211*.c rate control algorithms
rx.c frame receive path
tx.c frame transmit path
scan.c software scanning cod
ht.c, agg-rx.c, agg-tx.c HT/aggregation code
meshf, hwmp, plink,pathtblg.fc,hg 802.11s mesh
mlme.c Station/managed mode MLME
ibss.c IBSS MLME
cfg.c, cfg.h, wext.c conguration entry points
event.c events to userspace
spectmgmt.c spectrum management code
aes*, tkip., wep., michael., wpa. WPA/RSN/WEP code
wme.c, wme.h some QoS code
util.c utility functions
led.c, led.h LED handling
debugfs* debugfs code

4. mac80211数据结构体

4.1 ieee80211 local/ieee80211 hw

这两个结构体用来表示每一个无线设备, ieee80211_hwieee80211_local 的队驱动可视的一部分,它们包含了所有无线设备的操作信息。

4.2 sta_info/ieee80211_sta

表示任何一个站点peer,mesh peer,IBSS peer,AP,WDS peer,也能做DLS peer。 ieee80211_sta是对驱动可视的一部分。它们的生命周期管理依赖RCU

4.3 ieee80211_conf

表示硬件的配置信息,最重要的是当年的频率,它是硬件最特殊的参数结构体

4.4 ieee80211 bss conf

表示BSS的配置,且包含所有类别的BSSes。

4.5 ieee80211 key/ieee80211 key conf

表示加密和解密的key。

4.6 ieee80211 tx info

最复杂的数据结构体,用在skb的控制buffer中。

4.7 ieee80211 rx status

包含了接收帧的状态,可以通过mac80211驱动接收数据帧

4.8 ieee80211 sub if data/ieee80211 vif

包含了每个虚拟接口的信息。包括的子结构体

  • ieee80211 if ap
  • ieee80211 if wds
  • ieee80211 if vlan
  • ieee80211 if managed
  • ieee80211 if ibss
  • ieee80211 if mesh

5. mac80211主要流程

5.1 配置

所有发起来自用户空间(wext或者nl80211) managed和IBSS模式:触发状态机(基于workqueue) 有些操作或多或少直接通过驱动传递(比如信道设置)

5.2 接收路径

  通过函数 ieee80211_rx() 接收帧 调用 ieee80211_rx_monitor() 拷贝帧传递给所有监听接口 调用 invoke_rx_handlers() 处理帧 如果是数据帧,转换成802.3帧格式,传递给上层协议栈 如果是管理帧/控制帧,传递给MLME 接收处理钩子(invoke_rx_handlers).

ieee80211_rx_h_passive_scan
ieee80211_rx_h_check
ieee80211_rx_h_decrypt
ieee80211_rx_h_check_more_data
ieee80211_rx_h_sta_process
ieee80211_rx_h_defragment
ieee80211_rx_h_ps_poll
ieee80211_rx_h_michael_mic_verify
ieee80211_rx_h_remove_qos_control
ieee80211_rx_h_amsdu
ieee80211_rx_h_mesh_fwding
ieee80211_rx_h_data
ieee80211_rx_h_ctrl
ieee80211_rx_h_action
ieee80211_rx_h_mgmt

5.3 发送路径

  帧传递给 ieee80211_subif_start_xmit() 把帧转换成802.11格式,丢弃发给未认证工作站的单播包,除了来自本地的EAPOL帧 如果是MONITOR接口,在帧头部增加radiotap信息 调用 invoke_tx_handlers() 处理帧 调用 drv_tx() ,把帧传递给驱动 发送处理钩子(invoke_tx_handlers).

ieee80211_tx_h_dynamic_ps
ieee80211_tx_h_check_assoc
ieee80211_tx_h_ps_buf
ieee80211_tx_h_select_key
ieee80211_tx_h_sta
ieee80211_tx_h_rate_ctrl
ieee80211_tx_h_michael_mic_add
ieee80211_tx_h_sequence
ieee80211_tx_h_fragment
ieee80211_tx_h_stats
ieee80211_tx_h_encrypt
ieee80211_tx_h_calculate_duration

5.4 mangement/MLME

  状态机运行依赖于用户请求 标准方法如下: probe request/response auth request/response assoc request/response notification request/response

5.5 IBSS

尝试寻找IBSS 加入IBSS或者创建IBSS 如果没有配对,则周期性地尝试寻找IBSS并加入

5.6 创建接口路径

创建接口由用户空间通过nl80211发起 分配网络设备空间(包含sdata对象空间)
初始化网络设备 初始化sdata对象(包括设备类型,接口类型,设备操作函数等等) 注册网络设备 把sdata对象加入 local->interfaces

5.7 删除接口路径

删除接口由用户空间通过nl80211发起 把sdata对象从 local->interfaces 移除 移除网络设备.

5.8 创建station路径

创建station由用户空间通过nl80211发起 分配 sta_info 对象空间 初始化 sta_info 对象(包括侦听间隔,支持速率集等等). 初始化 sta_info 对象的速率控制对象 把 sta_info 对象加入 local->sta_pending_list . 调用 local->ops->sta_add 通知驱动创建station 把 sta_info 对象加入 local->sta_list.

5.9 删除station路径

删除station由用户空间通过 nl80211 发起 删除 sta_info 对象的key对象 把sta_info对象从 local->sta_pending_list 移除 调用 local->ops->sta_remove 通知驱动移除station 删除sta_info 对象的速率控制对象 把 sta_info 对象从 local->sta_list 移除.

5.10 扫描请求路径

扫描请求由用户空间通过nl80211发起 如果支持硬件扫描,调用 local->ops->hw_scan() 执行硬件扫描 否则,调用 ieee80211_start_sw_scan() 执行软件扫描 延时唤醒 ieee80211_scan_work() .

5.11 扫描状态机路径

如果存在硬件扫描请求,调用drv_hw_scan() 进行扫描,如果失败,调用ieee80211_scan_completed() 完成扫描 如果存在扫描请求,同时未进行扫描,调用__ieee80211_start_scan() 进行软件扫描,如果失败,调用ieee80211_scan_completed() 完成扫描 根据 next_scan_state 调用相应的处理函数 如果next_delay==0,则继续根据 next_scan_state 调用相应的处理函数 延时唤醒 ieee80211_scan_work() .

6. MAC80211切换点

6.1 配置

wireless extensions (wext)
cfg80211 (通过nl80211和用户空间通信)

6.1 wext

设置SSID,BSSID和其他关联参数 设置RTS/fragmentation thresholds managed/IBSS模式的加密密钥

6.2 cfg80211

扫描
用户管理(AP)
mesh管理
虚拟接口管理
AP模式加密密钥

6.3 从mac80211到速率控制

速率控制不是驱动的一部分 每个驱动有自己的速率控制选择算法 速率控制填充ieee80211_tx_info 速率信息 速率控制获取发送状态

6.4 从mac80211到驱动

驱动方法(ieee80211_ops) mac80211有一些输出函数 参考include/net/mac80211.h

6.5 mac80211主要函数

ieee80211_alloc_hw()

分配wiphy对象空间(保证私有数据和硬件私有数据32字节对齐,wiphy包含ieee80211_local和驱动私有数据)
初始化wiphy对象(包括重传次数,RTS门限等等)
初始化 ieee80211_local(包括重传次数,工作队列,接口链表等等)
初始化 sta_pending_list 链表
初始化 sta_list 链表

ieee80211_register_hw()

分配 int_scan_req 数据结构 初始化支持接口类型(包括MONITOR接口)
注册wiphy
初始化WEP
初始化速率控制算法
注册STA接口(默认wlan0)

ieee80211_rx()

拷贝skb,同时在skb头部增加radiotap信息,传递给所有监听接口 如果是数据帧,根据MAC地址查找station 如果station没有找到,把skb传递给所有接口处理 数据帧:转换成802.3帧格式,传递给网络协议栈 管理帧/控制帧:传递给MLME

ieee80211_xmit()

如果skb来自监听接口,移除skb头部的radiotap信息进行skb预处理(包括设置QoS优先级,设置分段标志,ACK应答标志等等)
选择加密密钥 选择速率(ESP8089采用硬件速率控制,所以mac80211速率控制无效)
加密(mac80211采用硬件加速,所以mac80211加密无效) 通过local->ops->tx()把skb传递给驱动

转自:mac80211概览

网卡驱动学习四、mac80211概览相关推荐

  1. 网卡驱动学习一、wireless基础知识(cfg80211 mac80211 nl80211)

    1. 基本概念 cfg80211: 用于对无线设备进行配置管理.与FullMAC, mac80211和nl80211一起工作.(Kernel态) mac80211: 是一个driver开发者可用于为S ...

  2. DPDK 网卡驱动学习

    DPDK版本19.02 初始化: /* Launch threads, called at application init(). */ int rte_eal_init(int argc, char ...

  3. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

    本文将介绍网络连接建立的过程.收发包流程,以及其中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的服务器端程序,我们会先调用socket函数创建 ...

  4. Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)

    在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...

  5. Linux 网卡驱动学习(九)(层二转发)

    1.mac 地址表的自学习过程 port1上的A计算机要与port2上的B计算机通信时,A发到交换机上,交换机收到信息后,交换机先记录发port1所相应的a的mac地址并记录在自己的mac表中,然后再 ...

  6. Linux 网卡驱动学习(二)(网络驱动接口小结)

    [摘要]前文我们分析了一个虚拟硬件的网络驱动样例.从中我们看到了网络设备的一些接口.事实上网络设备驱动和块设备驱动的功能比較相似,都是发送和接收数据包(数据请求). 当然它们实际是有非常多不同的. 1 ...

  7. 网卡驱动学习五、hostapd 移植测试

    文章目录 1. openssl-1.1.1h 移植 1.1 openssl 简介 1.2 openssl-1.1.1h 下载 1.2 openssl-1.1.1h 解压配置 1.3 openssl-1 ...

  8. arm平台linux的ethtool配置,ARM-Linux驱动--DM9000网卡驱动分析(四)

    原标题:ARM-Linux驱动--DM9000网卡驱动分析(四) 硬件平台:FL2440 (S3C2440) 内核版本:2.6.35 主机平台:Ubuntu 11.04 内核版本:2.6.39 交叉编 ...

  9. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

最新文章

  1. 客快物流大数据项目(十一):Docker应用部署
  2. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(2):添加一个控制器
  3. 在LINUX下架设防火墙
  4. android StringBuffer的使用
  5. java mqtt客户端_java 实现mqtt发送和接收消息客户端具体用法及测试代码
  6. Educational Codeforces Round 20 B. Distances to Zero
  7. echarts 折线图数据太多会导致卡顿_重新定义数据图表,还有比这个更厉害的吗?...
  8. Ubuntu 16.04 折腾日记
  9. 编译安装nginx出错
  10. Java的日期格式化常用方法
  11. 使用powershell命令,为exchange 2007用户配置邮箱数据
  12. matlab中划分训练集和测试集
  13. r library car_医学统计与R语言:双因素重复测量方差分析(Twoway repeated measures ANOVA)...
  14. 智能路由器自建服务器,路由器怎么设置服务器_路由器搭建服务器
  15. PCA(主成分分析)数学原理推导证明
  16. 计算机音乐因为我刚好遇见你,因为我刚好遇见你歌曲
  17. 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)(转载)...
  18. 【无标题】正弦函数的一阶动态电路的三要素法
  19. DM数据库windwos和linux环境单机安装部署
  20. AD8226+AD5293

热门文章

  1. C++ GDI 吃豆人游戏
  2. 【解决方案】智慧加油站三维可视化监管系统
  3. CSS的before属性的用法
  4. Docker2375端口未授权getshell
  5. python比赛积分类算法题_Python算法题(一)——青蛙跳台阶
  6. Redis的五大基本数据类型
  7. Interlaken协议介绍
  8. 信息奥赛一本通 1273:货币系统(evd)
  9. 用LSTM进行情感分析原理
  10. 关于USB匹配电阻的一些疑问和解答