IEEE802.11协议栈

news/2024/10/28 0:21:03/

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计算,每个速率都会进行计算。计算结果有平滑效果,所以新的结果对于所选择的速率有合理的影响。


http://www.ppmy.cn/news/622722.html

相关文章

Docker中安装Gitlab详细全教程

Docker中安装Gitlab详细全教程 前言一、安装Gitlab1.搜索影像2.下载影像3.启动Git服务4.查看Gitlab是否已经启动 二、配置Gitlab1.首先,先进入容器2.修改gitlab.rb文件3.修改gitlab.rb文件中的IP与端口号3.配置gitlab.yml文件4.重启服务5.退出命令行,推出…

windows和docker容器的ssh连接

windows和docker容器的ssh连接 1、背景及概述 关系:宿主机(windows10)----》VMware虚拟机(10.0.0.150)----》docker容器(192.17.0.2) 目的:在windows电脑ssh到linux虚拟机中的docker容器中&…

termux开启ssh服务与连接(用户密码登录)

结果:termux开启ssh这个问题也是耗费了我不少时间,结果最后发现是最低级的错误,用xshell连接的时候,输入的端口是22,后面才知道termux的默认端口是8022,但还是用xshell的命令行输入端口为8022去连接&#x…

IEEE802.X协议族

802.X协议是由(美)电气与电子工程师协会提出,刚刚完成标准化的一个符合IEEE802 协议集的局域网 接入控制协议,全称为基于端口的 访问控制协议。能够在利用IEEE 802局域网优势的基础上提供一种对连接到局域网的用户进行认证和授权的…

【80211协议】21.3.17

21.3.17 VHT传输规范 21.3.17.1 发射频谱掩膜 注1:如果存在额外的监管限制,设备必须同时满足监管要求和本小节中定义的掩模。 注2:本小节中的发射光谱掩模图不是按比例绘制的。 注3:TX中心频率泄漏等级规则请参见21.3.17.4.2。本款中的光谱掩模要求不适…

802标准

IEEE 802委员会成立于1980年2月,它的任务是制定局域网和城域网标准。802委员会目前有20多个分委员会,它们研究的内容分别如下。 (1) 802.1局域网体系结构、寻址、网络互联和网络管理。 (2) …

termux/utermux开启ssh并用用户名和密码登陆

注意: 这里连接的是termux/termux,不是termux/termux里面安装的其他系统 这里的termux/utermux指的是安卓模拟linux终端, termux/utermux软件 termux/utermux的ssh默认使用8022端口 安装软件慢的话请自行百度 termux换清华源,utermux直接左边划一下一键…

IEEE802.1 802.11协议标准

IEEE802.1标准提供了一个对整个IEEE802系列协议的概述,描述了IEEE802标准和开放系统基本参照模型(即ISO的OSI7层模型)之间的联系,解释这些标准如何和高层协议交互,定义了标准化的媒体接入控制层(MAC&#x…