IEEE802.11协议栈
1、概述
mac80211:是一个Linux内核子系统,是驱动开发者可用于为SoftMAC无线设备写驱动的框架。mac80211在内核空间实现STA模式,在用户空间实现AP模式(hostapd)。
cfg80211:用于对无线设备进行配置管理,与FullMAC,mac80211和nl80211一起工作。
nl80211:用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议。
MLME:即MAC(Media Access Control) Layer Management Entity,它管理物理层MAC状态机。
SoftMAC:其MLME由软件实现,mac80211为SoftMAC实现提供了一个API。即:SoftMAC设备允许对硬件执行更好地控制,允许用软件实现对802.11的帧管理,包括解析和产生802.11无线帧。目前大多数802.11设备为SoftMAC,而FullMAC设备较少。
FullMAC:其MLME由硬件管理,当写FullMAC无线驱动时,不需要使用mac80211。
wpa_supplicant:是用户空间一个应用程序,主要发起MLME命令,然后处理相关结果。
hostpad:是用户空间一个应用程序,主要实现station接入认证管理。
cfg80211是Linux802.11配置API。cfg80211用于代码wext(Wireless-Extensions),nl80211用于配置一个cfg80211设备,且用于kernel与userspace间的通信。wext现处理维护状态,没有新的功能被增加,只是修改bug。如果需要通过wext操作,则需要定义ONFIG_CFG80211_WEXT。
cfg80211and nl80211:基于消息机制,使用netlink接口
wext:基于ioctl机制(madwifi wext 等已经在linxu内核中被移除linux 2.6.26)
struct ieee80211_hw:表示硬件信息和状态
ieee80211_alloc_hw:每个driver调用ieee80211_alloc_hw分配ieee80211_hw,且以ieee80211_ops为参数
ieee80211_register_hw:每个driver调用ieee80211_register_hw创建wlan0和wmaster0,并进行各种初始化。
struct ieee80211_ops:每个driver实现它的成员函数,且它的成员函数都以struct ieee80211_hw做为第一个参数。在struct ieee80211_ops中定义了24个方法,以下7个方法必须实现:tx,start,stop,add_interface,remove_interface,config和configure_filter。
2、体系结构
图2-1系统框架
3、代码结构
ieee80211_i.h(主要数据结构)
main.c(主函数入口)
iface.c(虚拟接口处理)
key.c,key.h(密钥管理)
sta_info.c,sta_info.h(用户管理)
pm.c(功率管理)
rate.c,rate.h(速率控制函数)
rc80211*(速率控制算法)
rx.c(帧接收路径代码)
tx.c(帧发送路径代码)
scan.c(软件扫描代码)
mlme.c(station/managed模式MLME)
ibss.c(IBSSMLME)
cfg.c,cfg.h,wext.c(配置入口代码)
aes*,tkip*,wep*,michael*,wpa*(WPA/RSN/WEP代码)
wme.c,wme.h(QoS代码)
util.c(公共函数)
4、数据结构
ieee80211_local/ieee80211_hw
每个数据结构代表一个无线设备(ieee80211_hw嵌入到ieee80211_local)
ieee80211_hw是ieee80211_local在驱动中的可见部分
包含无线设备的所有操作信息
sta_info/ieee80211_sta
代表每一个station
可能是mesh,IBSS,AP,WDS
ieee80211_sta是驱动可见部分
ieee80211_conf
硬件配置
当前信道是最重要的字段
硬件特殊参数
ieee80211_bss_conf
BSS配置
多BSSes类型(IBSS/AP/managed)
包含比如基础速率位图
perBSS parameters in case hardware supports creating/associating withmultiple BSSes
ieee80211_key/ieee80211_key_conf
代表加密/解密密钥
ieee80211_key_conf提供给驱动用于硬件加速
ieee80211_key包含book-keeping和软件解密状态
ieee80211_tx_info
大部分复杂数据结构
skb内部控制缓冲区(cb)
经历三个阶段:1、由mac80211初始化;2、由驱动使用;3、由发送状态通告使用
ieee80211_rx_status
包含接收帧状态
驱动通过接收帧传给mac80211
ieee80211_sub_if_data/ieee80211_vif
包含每个虚拟接口信息
ieee80211_vif is passed to driver for those virtual interfaces the driver knowsabout (no monitor,VLAN)
包含的sub-structures取决于模式
5、主要流程
配置
所有发起来自用户空间(wext或者nl80211)
managed和IBSS模式:触发状态机(基于workqueue)
有些操作或多或少直接通过驱动传递(比如信道设置)
接收路径
通过函数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
发送路径
帧传递给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
mangement/MLME
状态机运行依赖于用户请求
标准方法如下:
proberequest/response
authrequest/response
assocrequest/response
notificationrequest/response
IBSS
尝试寻找IBSS
加入IBSS或者创建IBSS
如果没有配对,则周期性地尝试寻找IBSS并加入
创建接口路径
创建接口由用户空间通过nl80211发起
分配网络设备空间(包含sdata对象空间)
初始化网络设备
初始化sdata对象(包括设备类型,接口类型,设备操作函数等等)
注册网络设备
把sdata对象加入local->interfaces
删除接口路径
删除接口由用户空间通过nl80211发起
把sdata对象从local->interfaces移除
移除网络设备
创建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
删除station路径
删除station由用户空间通过nl80211发起
删除sta_info对象的key对象
把sta_info对象从local->sta_pending_list移除
调用local->ops->sta_remove通知驱动移除station
删除sta_info对象的速率控制对象
把sta_info对象从local->sta_list移除
扫描请求路径
扫描请求由用户空间通过nl80211发起
如果支持硬件扫描,调用local->ops->hw_scan()执行硬件扫描
否则,调用ieee80211_start_sw_scan()执行软件扫描
延时唤醒ieee80211_scan_work()
扫描状态机路径
如果存在硬件扫描请求,调用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、切换点
配置
wirelessextensions (wext)
cfg80211(通过nl80211和用户空间通信)
wext
设置SSID,BSSID和其他关联参数
设置RTS/fragmentationthresholds
managed/IBSS模式的加密密钥
cfg80211
扫描
用户管理(AP)
mesh管理
虚拟接口管理
AP模式加密密钥
从mac80211到速率控制
速率控制不是驱动的一部分
每个驱动有自己的速率控制选择算法
速率控制填充ieee80211_tx_info速率信息
速率控制获取发送状态
从mac80211到驱动
驱动方法(ieee80211_ops)
mac80211有一些输出函数
参考include/net/mac80211.h
7、主要函数
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传递给驱动
8、速率控制
Minstrel是mac80211从MadWifi移植过来的速率控制算法,支持多速率重传和提供最好速率。
工作原理
我们定义衡量吞吐量(发包数)的成功,用发送的比特数。
这个措施将获取无线接口的最大速率编号来调整传输速度。而且,这表示在优先使用11Mpbs速率的情况将不使用1Mbps速率。这个模块将记录所有已发送包的成功结果。通过这个数据,模块就有充分的信息去决定哪个包最成功。但是,需要一个可变参数。去强制模块检查最理想的速率。所以,一些百分比的包使用非正常速率进行发送。
重传序列
一些器件自己已经创建多速率重传序列。比如Atheros11abg芯片组有四个段。每一段指导硬件采用某些速率来发送当前包,和固定的重传次数。当包发送成功,剩余重传序列被忽略。重传次数的选择是根据期望在26ms内发包出去,或者失败。重传序列是通过两个合理的规则计算的,如果包是一个普通发送包(90%的包)那么重传数是bestthroughput,nextbest throughput,bestprobability,lowestbaserate。如果是采样包(10%的包)那么重传数是randomlookaround,bestthroughput,bestprobability,lowestbaserate。表格如下:
重传数是经过调整的,所以重传序列部分发送时间小于26ms。表格修改如下:
EWMA
EWMA(ExponentialWeighted MovingAverage)是Minstrel速率算法的核心。每秒钟实现10次EWMA计算,每个速率都会进行计算。计算结果有平滑效果,所以新的结果对于所选择的速率有合理的影响。
IEEE802.11协议栈相关推荐
- 计算机网络(十九)-IEEE802.11无线局域网
IEEE802.11是无线局域网的通用的标准,它是由IEEE所定义的无线网络通信的标准. 802.11的MAC帧头格式 3.无线局域网分类 有固定基础设施无线局域网 wifi名称其实就是服务集标识符. ...
- ieee802.11数据radiotap介绍
之前写有文章介绍了在Linux系统用wireshark或tcpdump抓无线网卡数据包.分析包时发现每一数据帧前面都有一个叫radiotap的东西.它包含了如信号强度.频率等信息.当时没有研究,直接跳 ...
- IEEE802.11信道PDP与频谱分布
%实现IEEE802.11信道仿真,画出IEEE802.11信道的PDP曲线与频谱图 clear,clf scale = 1e-9;%纳秒量级 Ts = 50*scale;%采样时间间隔,50ns t ...
- IEEE802.11规定了多种WLAN通信标准,其中(61)与其他标准采用的频段不同,因而不能兼容。【答案】A
IEEE802.11规定了多种WLAN通信标准,其中(61)与其他标准采用的频段不同,因而不能兼容. (61)A.IEEE802.11a B.IEEE802.11b C.IEEE802.11g D.I ...
- WLAN无线局域网IEEE802.11协议一
1. 无线网络简介 1.1.无线网络的历史 在1971年时,夏威夷大学的研究员创造了第一个基于封包式技术的无线电通讯网络.这被称作ALOHNET的网络,这是最早期的无线局域网络 (WLAN).1990 ...
- Wifi和IEEE802.11标准
1.简介 wifi原先是无线保真的缩写,Wi-Fi的英文全称为wireless fidelity,在无线局域网的范畴是指"无线相容性认证",实质上是一种商业认证,同时也是一种无线联 ...
- 计算机网络ieee标准,IEEE802.11标准演进
在各种无线局域网技术交织的战国时代,WLAN.蓝牙.HomeRF.UWB等竞相绽放,但IEEE802.11系列的WLAN应用最为广泛.自从1997年IEEE802.11标准实施以来,先后有802.11 ...
- 无线网标准IEEE802.11
无线网标准IEEE802.11 IEEE802.11标准家族 1.IEEE802.11: 1997年标准化,工作频段为ISM 2.4GHz,物理层为FHSS.DSSS(Barker),传输速率为:1M ...
- 无线网标准IEEE802.11 (转)
IEEE802.11标准家族 1.IEEE802.11: 1997年标准化,工作频段为ISM 2.4GHz,物理层为FHSS.DSSS(Barker),传输速率为:1Mbps.2Mbps. 2.I ...
最新文章
- 在程序中集成地址簿、电子邮件和地图功能
- 新消费风口再“热闹”,红利依然握在伊利、康师傅们手里
- Oracle数据库之数据类型
- LeetCode 454. 四数相加 II(哈希)
- 手把手教你如何安装Mac OS X 图文详细教程
- 引入css外部样式表的注意事项
- 一个操作系统的实现01
- windows进程间通信
- 冒泡排序-C语言版(带图详细)
- 含泪入坑 GMSSL
- CNN--MINIST
- 拼多多运营模式分析 | 如何杀出电商重围?
- python 计算标准体重程序
- python 闲鱼_python之tk学习,闲鱼搜索-小记
- 还记得愤怒的小鸟嘛?今天用Python给大家安排一波!
- vatic—视频标注工具安装出现error及注意事项
- surfer9 与Arcgis9.3 完美生成等值线和等值面方法
- element 走马灯实现图片轮播
- 基层主管如果没这些心态,难!
- 万拓单控存储DS1800
热门文章
- Codeforces 861D - Polycarp's phone book 字典树/hash
- Linux 利用lsof命令恢复删除的文件
- Xcode7在运行包含HTTP协议的程序时报错解决方法 App Transport Security has blocked a cleartext HTTP (http)...
- 添加/移除事件处理程序
- QEMU KVM Libvirt手册(7): 硬件虚拟化
- Fragment与FragmentActivity的关系
- C#.NET 通用权限管理系统组件 大数据多表分页获取部分列的参考方法
- C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)
- MySQL Access denied错误的缘故情由
- 组成新数python_大数相加 简单实现 Python 版本