};
size_t ie_len;
struct cfg80211_match_set *match_sets; int n_match_sets; s32 rssi_thold; /* internal */
struct wiphy *wiphy; struct net_device *dev; /* keep last */
struct ieee80211_channel *channels[0];
扫描过程分析
扫描有两种:被动扫描和主动扫描
被动扫描(passive scanning)可以节省电池的电力,因为不需要传送任何信号。在被动扫描中,工作站会在频道表(channel list)所列的各个频道之间不断切换,并静候Beacon 帧的到来。所收到的任何帧都会被暂存起来,以便取出传送这些帧之BSS 的相关数据。作被动扫描的过程中,工作站会在频道间不断切换,并且会记录来自所收到之Beacon 信息的信息。Beacon 在设计上是为了让工作站得知,加入某个基本服务组合(basic service set,简称BSS)所需要的参数,以便进行通讯。在图8-2 中,行动式工作站以被动扫描找出该区所有BSS;通过聆听来自前三部基站的Beacon 帧。如果该工作站并未收到来自第四部基站的Beacon,就会回报目前只发现三个BSS。
在主动扫描(active scanning)中,工作站扮演比较积极的角色。在每个频道上,工作站 都会岭出Probe Request 帧,请求某个特定网络予以回应。主动扫描系主动试图寻找网络,而不是听候网络宣告本身的存在。使用主动扫描的工作站将会以如下的程序扫描频道表所列的频道:
1.跳至某个频道,然后等候来讯显示(indication of an imcoming frame),或者等到ProbeDelay 计时器逾时。如果在这个频道收得到帧,就证明该频道有人使用,因此可以加以探测。此计时器用来防止某个闲置频道让整个程序停摆;工作站不会一直听候帧到来。 2.利用基本的DCF 访问程序取得介质使用权,然后送出一个Probe Request 帧。 3.至少等候一段最短的频道时间(即MinChannelTime)。
a.如果介质并不忙碌,表示没有网络存在。因此可以跳至下个频道。
b.如果在MinChannelTime 这段期间介质非常忙碌,就继续等候一段时间,直到最长的频道时间(即MaxChannelTime),然后处理任何的Probe Response 帧。 当网络收到搜寻其所属之延伸服务组合的Probe Request(探查要求),就会发出Probe
Response(探查回应)帧。为了在舞会中找到朋友,各位或许会绕著舞池大声叫喊对方的名字。
一、接收上层的扫描命令和上报给上层的扫描事件 上层的扫描命令有:
enum nl80211_commands { 。。。 NL80211_CMD_GET_SCAN, // get scan results NL80211_CMD_TRIGGER_SCAN, // trigger a new scan with the given parameters,属于主动扫描,发送probe request(包含指定的SSID). NL80211_CMD_NEW_SCAN_RESULTS, //上报wpa_supplicant,表示扫描结束 NL80211_CMD_SCAN_ABORTED, // scan was aborted,上报扫描被终止
。。。 NL80211_CMD_START_SCHED_SCAN,//触发周期性的扫描,扫描间隔为NL80211_ATTR_SCHED_SCAN_INTERVAL(netlink命令的属性字段中),假如netlink的属性字段(NL80211_ATTR_SCAN_SSIDS)中包含SSID,扫描属于主动扫描,会发送probe request;假如没有SSID,执行被动扫描,假如NL80211_ATTR_SCAN_FREQUENCIES定义了扫描的channel列表,假如NL80211_ATTR_SCAN_FREQUENCIES没有设置,整个频率段都会触发一次扫描。 NL80211_CMD_STOP_SCHED_SCAN, //stop a scheduled scan NL80211_CMD_SCHED_SCAN_RESULTS, //上报给wpa_supplicant的扫描结果 NL80211_CMD_SCHED_SCAN_STOPPED,//上报给wpa_supplicant,表示扫描结束 。。。 }
二、接收底层上报的扫描事件 事件有:扫描完成事件,
驱动会填充struct cfg80211_scan_request在往上报给cfg80211, 见代码流程图:
代码分析
主动扫描:cfg80211接收到上层下发的NL80211_CMD_TRIGGER_SCAN命令后,解析struct genl_info结构,获取struct cfg80211_registered_device和struct wireless_dev的结构体指针,获取struct nlattr的属性集。属性集有:(NL80211_ATTR_IE,NL80211_ATTR_SCAN_FREQUENCIES,NL80211_ATTR_SCAN_SSIDS,)。然后解析属性集,组合成struct cfg80211_scan_request。通过设备驱动或者MAC80211注册的struct cfg80211_ops结构体中的scan回调函数执行扫描命令。扫描命令下发成功后,通过nl80211_send_scan_start通知上层已经成功下发扫描命令。
加密模块CCMP, TKIP,WEP
在cfg80211模块中可以配置三种加密方式,目前一般情况下都没有配置使用。有些wifi芯片在固件中处理,目前只有realtec芯片有在驱动中调用加解密过程。 MSDU: MAC Service Data Unit,MAC服务数据单元
MPDU(MAC Protocol Data Unit,MAC协议数据单元): 经过802.11封装过的数据帧。MSDU经过添加完整性校验MIC、分帧、添加IV、加密、添加MAC头部后,成为MPDU struct lib80211_crypto_ops {
const char *name; struct list_head list;
/* init new crypto context (e.g., allocate private data space,
* select IV, etc.); returns NULL on failure or pointer to allocated * private data on success */ void *(*init) (int keyidx);
/* deinitialize crypto context and free allocated private data */ void (*deinit) (void *priv);
/* encrypt/decrypt return < 0 on error or >= 0 on success. The return * value from decrypt_mpdu is passed as the keyidx value for
* decrypt_msdu. skb must have enough head and tail room for the * encryption; if not, error will be returned; these functions are * called for all MPDUs (i.e., fragments). */
int (*encrypt_mpdu) (struct sk_buff * skb, int hdr_len, void *priv); int (*decrypt_mpdu) (struct sk_buff * skb, int hdr_len, void *priv); /* These functions are called for full MSDUs, i.e. full frames.
* These can be NULL if full MSDU operations are not needed. */ int (*encrypt_msdu) (struct sk_buff * skb, int hdr_len, void *priv); int (*decrypt_msdu) (struct sk_buff * skb, int keyidx, int hdr_len, void *priv); int (*set_key) (void *key, int len, u8 * seq, void *priv); int (*get_key) (void *key, int len, u8 * seq, void *priv); /* procfs handler for printing out key information and possible * statistics */
char *(*print_stats) (char *p, void *priv);
/* Crypto specific flag get/set for configuration settings */ unsigned long (*get_flags) (void *priv);
unsigned long (*set_flags) (unsigned long flags, void *priv); /* maximum number of bytes added by encryption; encrypt buf is * allocated with extra_prefix_len bytes, copy of in_buf, and * extra_postfix_len; encrypt need not use all this space, but * the result must start at the beginning of the buffer and correct * length must be returned */
int extra_mpdu_prefix_len, extra_mpdu_postfix_len; int extra_msdu_prefix_len, extra_msdu_postfix_len; struct module *owner;
}; 疑问:
1. 代码中如何实现对数据帧,管理帧,控制帧加密?工作流程如何 2. 加密解密的具体实现,
CCMP
CCMP(Counter CBC-MAC Protocol) 计数器模式密码块链消息完整码协议。CCMP主要是两个算法所组合而成的,分别是CTR mode以及CBC-MAC mode。CTR mode为加密算法,CBC-MAC用于讯息完整性的运算。在IEEE 802.11i 规格书中,CCMP为default mode,在所谓的RSN network中,扮演相当重要的角色[1]。以下将分别简介CTR mode以及CBC-MAC。 WPA = IEEE 802.11i draft 3 =IEEE802.1X/EAP+WEP(选择性项目)/TKIP WPA2 = IEEE 802.11i = IEEE 802.1X/EAP+WEP(选择性项目)/TKIP/CCMP
CTR全名是Advanced Encryption Standard (AES) in Counter Mode,在CCMP使用的AES 是based on Rijndael Algorithm所发展出的算法[2],主要是经过NIST修改并且认证,不再有TKIP protocol支持WEP系统的既有攻击,所以在安全强度上,有一定的水平。
CBC-MAC全名是Cipher Block Chaining Message Authentication Code,就如同其名,主要是针对message block作运算,最后输出message authentication code,达到验证message的效果(因为CTR并没有提供authentication的机制)。
CBC-MAC加解密过程主要是把Message block经由block cipher algorithm加密后,再把输出给下一个block当input使用。一开始第一个block没有input所以IV用0代入。在CCMP里
会把低位的64-bit无条件的去掉,只取高位64-bit当做MIC。 参考http://baike.http://www.wodefanwen.com//view/3228863.htm
TKIP
代码实现过程
加密可以在固件里处理,STATION对接收的数据进行解密,对发送的数据需要加密。
有很多设备的加解密都在固件里处理。有部分wifi设备会把数据的加解密放在驱动中完成。下面举例说明,在驱动中的加解密过程。并且说明是哪种加密方式。 下面分几个模块来分析加解密流程:
Realtek的rtl8192e芯片:drivers\\staging\\rtl8192e
static struct lib80211_crypto_ops rtllib_crypt_tkip = { .name = \ .init = rtllib_tkip_init, .deinit = rtllib_tkip_deinit, .encrypt_mpdu = rtllib_tkip_encrypt, .decrypt_mpdu = rtllib_tkip_decrypt, .encrypt_msdu = rtllib_michael_mic_add, .decrypt_msdu = rtllib_michael_mic_verify, .set_key = rtllib_tkip_set_key, .get_key = rtllib_tkip_get_key, .print_stats = rtllib_tkip_print_stats, .extra_mpdu_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_mpdu_postfix_len = 4, /* ICV */ .extra_msdu_postfix_len = 8, /* MIC */ .owner = THIS_MODULE, };
关于数据帧的内容字节数可以参考:《IEEE802.11-2012.pdf》8.3.2章节 Hostap中的加解密过程:drivers\\net\\wireless\\hostap\\
Mac80211
手机侧一般都是做为station来完成功能的,可以参考openwrt开源代码来学习无线路由器侧的代码。下面分三部分学习MAC80211模块。这里的MAC80211主要是指linux内核中做为station的mac层的部分协议。代码路径位于net/mac80211。
Mac层协议
一、术语
aggregate medium access control (MAC) protocol data unit (A-MPDU): A structure containing multiple MPDUs, transported as a single physical layer convergence procedure (PLCP) service data unit (PSDU) by the physical layer (PHY).
aggregate medium access control (MAC) service data unit (A-MSDU): A structure containing multiple MSDUs, transported within a single (unfragmented) data medium access control (MAC) protocol data unit (MPDU)。
PLCP(PhysicalLayerConvergenceProcedure):物理层会聚协议物理层会聚协议(PLCP)是映射ATM信元到物理媒体的规范,定义特定的管理信息。 参考文章:
《无线局域网:IEEE802.11标准》:http://net.chinaunix.net/3/2008/11/13/1311496.shtml 《IEEE802.11-2012.pdf》 MAC层具有三个主要功能:
a) 无线介质访问 b) 网络连接
c) 提供数据验证和保密 无线介质访问
在IEEE802.11标准中定义了两种无线介质访问控制的方法,它们是: ●分布式访问方式(DCF)
分布式访问方式类似于IEEE802.3有线局域网的介质访问控制协议,它采用具有冲突避免的载波侦听多路访问。
分布式访问控制方式是物理层兼容的工作站和访问节点(AP)之间自动共享无线介质的主要的访问协议。802.11网络采用CSMA/CA协议进行无线介质的共享访问,是分散控制,无任何中央控制点。而802.3以太网标准的MAC协议(CSMA/CD)会因碰撞而浪费网络资源。载波侦听可以让MAC层监测介质是处于繁忙还是空闲状态。物理层(PHY)提供信道的物理检测,把物理信道评估结果发送到MAC层,作为确定信道状态信息的一个因素。 MAC控制机制利用帧中持续时间字段的保留信息实现虚拟监测协议,这一保留信息发布(向所有其他工作站)本工作站将要使用介质的消息。MAC层监听所有MAC帧的持续时间字段,如果监听到的值大于当前的网络分配矢量(NAV)值,就用这一信息更新该工作站的NAV。NAV工作起来就像一个计数器,开始值是最后一次发送的帧的持续时间字段值,然后倒计时到0。当NAV的值为0,且PHY控制机制表明有空闲信道时,这个工作站就可以发送帧了。 ●中心网络控制方式(PCF)
中心网络控制方式是一个无竞争访问协议,它是一种基于优先级别的访问,适用于节点安装有点控制器的网络。
PCF方式提供可选优先级的无竞争的帧传送。在这种工作方式下,由中心控制器控制来自工作站的帧的传送,所有工作站均服从中心控制器的控制,在每一个无竞争期的开始时间设置它们的NAV(网络分配矢量)值。当然,对于无竞争的轮询(CF-Poll帧),工作站可以有选择地进行回应。 在无竞争期开始,中心控制器首先获得介质的控制权,并遵循PIFS对介质进行访问;因此,中心控制器可以在无竞争期保持控制权,等待比工作在分布式控制方式下更短的发送间隔。 网络连接
当工作站接通电源之后,首先通过被动或主动扫描方式检测有无现成的工作站和访问节点可供加入。加入一个BSS(基本服务组)或ESS(扩展服务组)之后,工作站从访问节点接收SSID、时间同步函数(TSF:Timer Synchronization Function)、计时器的值和物理(PHY)安装参数。
在被动扫描模式下,工作站对每一个信道都进行一段时间的监听,具体时间的长短由ChannelTime参数确定。该工作站只寻找具有本站希望加入的SSID的信标帧,搜索到这个信标后,继而便分别通过认证和连接过程建立起连接。
在主动扫描方式下,工作站发送包含有该站希望加入的SSID信息的探询(Probe)帧,然后开始等待探询响应帧(Probe Reponse Frame),探询响应帧将标识所需网络的存在。 认证和加密
IEEE802.11标准提供两种认证服务,以此来增强网络的安全性: (1)开放系统认证(Open System Authentication)
这是系统缺省的认证服务。不需要对发送工作站进行身份认证时,一般采用开放系统认证。如果接收工作站通过MIB中的aAuthenticationType参数指明其采用开放系统认证模式,那么采用开放系统认证模式的发送工作站可认证任何其他工作站和AP。 (2)共享密钥认证(Shared Key Authentication) 与开放系统认证相比,共享密匙认证方式提供更高的安全检查级别。采用共享密匙认证的工作站必须执行WEP。 (3)加密
802.11规范定义了可选的WEP,以使无线网络具有和有线网络相同的安全性。如果要避免网络受到安全威胁攻击,就必须同时实施WEP和认证服务。
Station侧
Ap侧
无线网卡驱动 接口驱动