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)

TypeSubTypeFrameType
000000
Association request (连接请求)
00
0001Association response (连接响应)
00
0010Reassociation request(重连接请求)
00
0011Reassociation response(重连接联响应)
00
0100Probe request(探测请求)
00
0101Probe response(探测响应)
00
1000
Beacon(信标,被动扫描时AP 发出,notify)
00
1001ATIM(通知传输指示消息)
00
1010Disassociation(解除连接,notify)
00
1011Authentication(身份验证)
00
1100Deauthentication(解除认证,notify)
00
1101~1111
Reserved(保留,未使用)

    ATIM:Announcement Traffic Indication Message,ATIM仅在ATIM窗口期间传送,ATIM没有负载。

5.2 控制帧 (Control Frame)

TypeSubtypeFrametype
011010Power Save(PS)- Poll(省电-轮询)
01
1011RTS(请求发送,即: Request To Send ,预约信道,帧长20字节)
01
1100CTS(清除发送,即:Clear To Send ,同意预约,帧长14字节)
01
1101ACK(确认)
01
1110CF-End(无竞争周期结束)
01
1111CF-End(无竞争周期结束)+CF-ACK(无竞争周期确认)

     RTS和CTS用于信道预约,CF-End+CF_ACK和ACK用于确认正确接收到帧

    1) ACK帧


5.3 数据帧 (Data Frame)

TypeSubtypeFrametype
100000Data(数据)
10
0001Data+CF-ACK
10
0010Data+CF-Poll
10
0011Data+CF-ACK+CF-Poll
10
0100Null data(无数据:未传送数据)
10
0101CF-ACK(未传送数据)
10
0110CF-Poll(未传送数据)
10
0111Data+CF-ACK+CF-Poll
10
1000Qos Data
10
1001Qos Data + CF-ACK
10
1010Qos Data + CF-Poll
10
1011Qos Data + CF-ACK+ CF-Poll
10
1100QoS Null(未传送数据)
10
1101QoS CF-ACK(未传送数据)
10
1110QoS CF-Poll(未传送数据)
10
1111QoS 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
  1. static int __init cfg80211_init(void)  
  2. {  
  3.     int err;  
  4.         // 注册网络命名空间  
  5.     err = register_pernet_device(&cfg80211_pernet_ops);  
  6.     if (err)  
  7.         goto out_fail_pernet;  
  8.         // 注册ieee80211_class类  
  9.     err = wiphy_sysfs_init();  
  10.     if (err)  
  11.         goto out_fail_sysfs;  
  12.         // 注册网络通知,以接收网络事件  
  13.     err = register_netdevice_notifier(&cfg80211_netdev_notifier);  
  14.     if (err)  
  15.         goto out_fail_notifier;  
  16.         // 注册netlink "nl80211",其操作为nl80211_ops  
  17.     err = nl80211_init();  
  18.     if (err)  
  19.         goto out_fail_nl80211;  
  20.         // 创建sys/class/ieee80211目录  
  21.     ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);  
  22.   
  23.     err = regulatory_init();  
  24.     if (err)  
  25.         goto out_fail_reg;  
  26.         // 创建名为“cfg80211”的内核线程  
  27.     cfg80211_wq = create_singlethread_workqueue("cfg80211");  
  28.     if (!cfg80211_wq)  
  29.         goto out_fail_wq;  
  30.   
  31.     return 0;  
  32.   
  33. out_fail_wq:  
  34.     regulatory_exit();  
  35. out_fail_reg:  
  36.     debugfs_remove(ieee80211_debugfs_dir);  
  37. out_fail_nl80211:  
  38.     unregister_netdevice_notifier(&cfg80211_netdev_notifier);  
  39. out_fail_notifier:  
  40.     wiphy_sysfs_exit();  
  41. out_fail_sysfs:  
  42.     unregister_pernet_device(&cfg80211_pernet_ops);  
  43. out_fail_pernet:  
  44.     return err;  
  45. }  
  46. subsys_initcall(cfg80211_init);  

Logo

更多推荐