http://blog.csdn.net/myarrow/article/details/9271515
1. 基本概念
• cfg80211: 用于对无线设备进行配置管理。与FullMAC, mac80211和nl80211一起工作。(Kernel态)
• mac80211: 是一个driver开发者可用于为SoftMAC无线设备写驱动的框架 (Kernel态)。
• nl80211: 用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议(User态)
• WNIC : Wireless Network Interface Controller, 它总是指望硬件执行协议(如IEEE802.11)描述的功能。
• MLME: 即MAC(Media Access Control ) Layer Management Entity,它管理物理层MAC状态机。
• SoftMAC: 其MLME由软件实现,mac80211为SoftMAC实现提供了一个driver API。 即:SoftMAC设备允许对硬件执行更好地控制,允许用软件实现对802.11的帧管理,包括解析和产生802.11无线帧。目前大多数802.11设备为SoftMAC,而FullMAC设备较少。
• FullMAC: 其MLME由硬件管理,当写FullMAC无线驱动时,不需要使用mac80211。
• wpa_supplicant: 是用户空间一个应用程序,主要发起MLME命令,然后处理相关结果。
•
2. cfg80211
cfg80211是Linux 802.11配置API。cfg80211用于代码wext(Wireless-Extensions),nl80211用于配置一个cfg80211设备,且用于kernel与userspace间的通信。wext现处理维护状态,没有新的功能被增加,只是修改bug。如果需要通过wext操作,则需要定义CONFIG_CFG80211_WEXT。
cfg80211 and nl80211: 基于消息机制,使用netlink接口
wext: 基于ioctl机制
• 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。
3. mac80211
它是一个driver开发者可用于为SoftMAC无线设备写驱动的框架,mac80211为SoftMAC设备实现了cfg80211回调函数,且mac80211通过cfg80211实现了向网络子系统注册和配置。配置由cfg80211通过nl80211和wext实现。
mac80211在体系结构中的位置如下图所示:
4. socket
http://wireless.kernel.org/en/developers/Documentation/
IEEE802.11协议基础知识
http://blog.csdn.net/myarrow/article/details/9306961
1. 802.11管理功能–用户接入过程
STA (工作站)启动初始化、开始正式使用、AP 传送数据幀之前,要经过三个阶段才能接入:
(1) 扫描(SCAN)
(2) 认证(Authentication)
(3) 关联(Association)
1.1 802.11管理–扫描(SCAN)
1) 若无线站点 STA 设成 Ad-hoc (无AP)模式:
STA先寻找是否已有 IBSS(与STA所属相同的SSID)存在,如有,则参加(join);若无, 则会自己创建一个IBSS,等其他站来 join。
2) 若无线站点 STA 设成 Infrastructure (有AP)模式:
--主动扫描方式 (特点:能迅速找到)
•依次在每个信道上发送Probe request报文,从Probe Response中获取BSS的基本信息, Probe Response包含的信息和Beacon帧类似
-- 被动扫描方式 (特点:找到时间较长,但STA节电)
• 通过侦听AP定期发送的Beacon帧来发现网络, Beacon帧中包含该AP所属的BSS的基本信息以及AP的基本能力级,包括: BSSID(AP的MAC地址)、 SSID、支持的速率、支持的认证方式,加密算法、 Beacons帧发送间隔,使用的信道等 • 当未发现包含期望的SSID的BSS时,STA可以工作于IBSS状态
1.2 802.11管理功能–认证(Authentication)
802.11支持两种基本的认证方式: • Open-system Authentication 1) 等同于不需要认证,没有任何安全防护能力 2) 通过其他方式来保证用户接入网络的安全性,例如Address filter、用户报文中的SSID
• Shared-Key Authentication 1) 采用WEP加密算法 2) Attacker可以通过监听AP发送的明文Challenge text和STA回复的密文Challenge text计算出WEP KEY
另外, STA可以通过Deauthentication来终结认证关系。
1.3 802.11管理功能–关联(Association)
1) Association
• STA通过Association和一个AP建立关联,后续的数据报文的收发只能和建立Association关系的AP进行 2) Reassociation • STA在从一个老的AP移动到新AP时通过Reassociation和新AP建立关联 • Reassociation前必须经历Authentication过程 3) Deassociation • STA通过Deassociation和AP解除关联关系
2. 802.11相关协议
3. 802.11帧格式
3.1 802.11 MAC Header(MAC头)
• Frame Control(帧控制域)
• Duration/ID(持续时间/标识)
• Address(地址域)
• Sequence Control(序列控制域)
3.1.1 Frame Control(帧控制域)
• Protocol Version(协议版本):通常为0;
• Type(类型域)和Subtype(子类型域):共同指出帧的类型;
• To DS:表明该帧是BSS向DS发送的帧;
• From DS:表明该帧是DS向BSS发送的帧;
• More Frag:用于说明长帧被分段的情况,是否还有其它的帧;
• Retry(重传域):用于帧的重传,接收STA利用该域消除重传帧;
• Pwr Mgt(能量管理域):1:STA处于power_save模式;0:处于active模式;
• More Data(更多数据域):1:至少还有一个数据帧要发送给STA ;
• Protected Frame: 1:帧体部分包含被密钥套处理过的数据;否则:0;
• Order(序号域):1:长帧分段传送采用严格编号方式;否则:0。
3.1.2 Duration/ID(持续时间/标识)
表明该帧和它的确认帧将会占用信道多长时间;对于帧控制域子类型为:Power Save-Poll的帧,该域表示了STA的连接身份(AID, Association Indentification)。
3.1.3 Address(地址域)
Address(地址域):源地址(SA)、目的地址(DA)、传输工作站地址(TA)、接收工作站地址(RA),SA与DA必不可少,后两个只对跨BSS的通信有用,而目的地址可以为单播地址(Unicast address)、多播地址(Multicast address)、广播地址(Broadcast address)。
3.1.4 Sequence Control(序列控制域)
Sequence Control(序列控制域):由代表MSDU(MAC Server Data Unit)或者MMSDU(MAC Management Server Data Unit)的12位序列号(Sequence Number)和表示MSDU和MMSDU的每一个片段的编号的4位片段号组成(Fragment Number)。
3.2 Frame Body(帧体部分)
包含信息根据帧的类型有所不同,主要封装的是上层的数据单元,长度为0~2312个字节,可以推出,802.11帧最大长度为:2346个字节;
3.3 FCS(校验域)
包含32位循环冗余码。
3.4 地址格式
1) 方案一:
A和B 在同一个IBSS,A->B (Ad hoc无线自组网中的数据帧的地址格式)。
2) 方案二:
从AP发出的无线数据帧中的地址格式。
3) 方案三:
发到AP的无线数据帧中的地址格式。
4) 方案四:
通过无线分布系统传输的无线数据帧中的地址格式。
4. WLAN拓扑结构
WLAN有以下三种网络拓扑结构:
1) 独立基本服务集(Independent BSS, IBSS)网络(也叫ad-hoc网络);
2) 基本服务集(Basic Service Set, BSS)网络;
3) 扩展服务集(Extent Service Set, ESS)网络。
其各自的特点如下所示:
4.1 IBSS-无AP
也叫Ad Hoc 网(无线自组网):IBSS (Independent BSS,独立基本服务集),无AP,站点间直接通信。
4.2 BSS-有AP
又名Infrastructured网(基础设施网):有AP(Access Point, 接入点),无线站点通信首先要经过AP。
4.3 ESS-有AP和DS
ESS:属 Infrastructured 网 ( DS:分配系统,AP:接入点, SSID:ESS扩展服务集标识符。一个移动节点使用某 ESS 的 SSID 加入到该扩展服务集中,一旦加入ESS,移动节点便可实现从该ESS的一个BSS到另一个BSS的漫游)
5. 802.11帧类型
针对帧的不同功能,可将802.11中的MAC帧细分为以下3类:
• 数据帧:用于在竞争期和非竞争期传输数据;
• 控制帧:用于竞争期间的握手通信和正向确认(RTS信道预约、CTS预约成功、ACK等)、结束非竞争期等,为数据帧的发送提供辅助功能;
• 管理帧:主要用于STA与AP之间协商、关系的控制,如关联、认证、同步等。
Frame Control(帧控制域)中的Type(类型域)和Subtype(子类型域)共同指出帧的类型,当Type的B3B2位为00时,该帧为管理帧;为01时,该帧为控制帧;为10时,该帧为数据帧。而Subtype进一步判断帧类型,如管理帧里头细分为关联和认证帧
5.1 管理帧 (Management Frame)
Type | SubType | FrameType |
00 | 0000 | Association request (连接请求) |
00 | 0001 | Association response (连接响应) |
00 | 0010 | Reassociation request(重连接请求) |
00 | 0011 | Reassociation response(重连接联响应) |
00 | 0100 | Probe request(探测请求) |
00 | 0101 | Probe response(探测响应) |
00 | 1000 | Beacon(信标,被动扫描时AP 发出,notify) |
00 | 1001 | ATIM(通知传输指示消息) |
00 | 1010 | Disassociation(解除连接,notify) |
00 | 1011 | Authentication(身份验证) |
00 | 1100 | Deauthentication(解除认证,notify) |
00 | 1101~1111 | Reserved(保留,未使用) |
ATIM:Announcement Traffic Indication Message,ATIM仅在ATIM窗口期间传送,ATIM没有负载。
5.2 控制帧 (Control Frame)
Type | Subtype | Frametype |
01 | 1010 | Power Save(PS)- Poll(省电-轮询) |
01 | 1011 | RTS(请求发送,即: Request To Send ,预约信道,帧长20字节) |
01 | 1100 | CTS(清除发送,即:Clear To Send ,同意预约,帧长14字节) |
01 | 1101 | ACK(确认) |
01 | 1110 | CF-End(无竞争周期结束) |
01 | 1111 | CF-End(无竞争周期结束)+CF-ACK(无竞争周期确认) |
RTS和CTS用于信道预约,CF-End+CF_ACK和ACK用于确认正确接收到帧。
1) ACK帧
5.3 数据帧 (Data Frame)
Type | Subtype | Frametype |
10 | 0000 | Data(数据) |
10 | 0001 | Data+CF-ACK |
10 | 0010 | Data+CF-Poll |
10 | 0011 | Data+CF-ACK+CF-Poll |
10 | 0100 | Null data(无数据:未传送数据) |
10 | 0101 | CF-ACK(未传送数据) |
10 | 0110 | CF-Poll(未传送数据) |
10 | 0111 | Data+CF-ACK+CF-Poll |
10 | 1000 | Qos Data |
10 | 1001 | Qos Data + CF-ACK |
10 | 1010 | Qos Data + CF-Poll |
10 | 1011 | Qos Data + CF-ACK+ CF-Poll |
10 | 1100 | QoS Null(未传送数据) |
10 | 1101 | QoS CF-ACK(未传送数据) |
10 | 1110 | QoS CF-Poll(未传送数据) |
10 | 1111 | QoS CF-ACK+ CF-Poll(未传送数据) |
Linux Wireless子系统初始化
http://blog.csdn.net/myarrow/article/details/9300823
1. cfg80211_init
• cfg80211_wq工作队列主要处理以下工作:
1) 清除:wireless_dev.cleanup_work
2) 扫描:cfg80211_registered_device.scan_done_wk
3) 事件:cfg80211_registered_device.event_work
• 注册netlink,其名为:"nl80211",其操作为:nl80211_ops
net/wireless/core.c
[cpp] view plain copy
- static int __init cfg80211_init(void)
- {
- int err;
- // 注册网络命名空间
- err = register_pernet_device(&cfg80211_pernet_ops);
- if (err)
- goto out_fail_pernet;
- // 注册ieee80211_class类
- err = wiphy_sysfs_init();
- if (err)
- goto out_fail_sysfs;
- // 注册网络通知,以接收网络事件
- err = register_netdevice_notifier(&cfg80211_netdev_notifier);
- if (err)
- goto out_fail_notifier;
- // 注册netlink "nl80211",其操作为nl80211_ops
- err = nl80211_init();
- if (err)
- goto out_fail_nl80211;
- // 创建sys/class/ieee80211目录
- ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);
- err = regulatory_init();
- if (err)
- goto out_fail_reg;
- // 创建名为“cfg80211”的内核线程
- cfg80211_wq = create_singlethread_workqueue("cfg80211");
- if (!cfg80211_wq)
- goto out_fail_wq;
- return 0;
- out_fail_wq:
- regulatory_exit();
- out_fail_reg:
- debugfs_remove(ieee80211_debugfs_dir);
- out_fail_nl80211:
- unregister_netdevice_notifier(&cfg80211_netdev_notifier);
- out_fail_notifier:
- wiphy_sysfs_exit();
- out_fail_sysfs:
- unregister_pernet_device(&cfg80211_pernet_ops);
- out_fail_pernet:
- return err;
- }
- subsys_initcall(cfg80211_init);