邯郸第六医院住院有wi-fi吗

记者调查:免费Wi-Fi暗藏危机
“钓鱼”Wi-Fi窃取个人信息
日 11:14日 06:33日 08:54日 08:34日 07:40日 07:12日 07:35日 08:27日 06:40日 06:43日 06:36日 07:24日 07:22
48小时排行
大家都在看第ND03版:南海视窗
“公共场所Wi—Fi覆盖”也是城市竞争力
&&&&5月20日&&&&东莞近日召开会议,提出加快“智慧东莞”建设。该市计划采用“政府推动、购买服务、企业投资、建设运营”的模式实现无线Wi—Fi对主要公共场所全覆盖,积极推动在政府、公园、广场、政务服务中心、事业单位等公共场所提供免费公共Wi—Fi接入服务。&&&&“实现无线Wi—Fi对主要公共场所全覆盖”,这真是一则令人眼馋的消息。在当今手机几乎成为人们信息娱乐生活中心的时代,对于一座城市来说,能够成为城市竞争力的不再仅仅是便捷的公交系统、繁华的商圈,免费Wi—Fi同样算得上一个魅力值爆表的城市硬件。&&&&关注到这一点的城市不止是东莞。去年11月,武汉就开辟了近40个由政府购买服务的公益免费上网热点,市民在覆盖范围内拿着iPad看电视剧毫无障碍。去年,广州也提出,到2015年争取实现大部分的政府服务办事大厅、人才市场、医院、交通枢纽、公园等重要的旅游景点和休息区免费上网覆盖。&&&&在这一领域,南海能否早作打算?本月上旬佛山市政府常务会议通过了《佛山市关于首批公共场所无线局域网(WLAN)试点建设实施方案》,禅城区将作为佛山首批试点区,首批Wi—Fi试点区域主要都分布于禅城。&&&&尽管南海不是首批试点,但从长远来看,这已经是大势所趋。在笔者看来,南海应该有危机意识,根据南海自身的城市、产业分布特点和规划愿景早作打算,尽早走出自己的“无线节奏”。
扫一扫,分享到微信朋友圈
扫一扫,分享到微信朋友圈第六章&深入理解wi-Fi&Simple&Configuration
深入理解Wi-Fi Simple Configuration
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/16234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/16234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
本章主要内容:
介绍Wi-Fi Simple
Configuration相关知识;
介绍Android中WSC的相关代码。
在Wi-Fi相关技术体系中,除了802.11定义的标准规范外,Wi-Fi
Alliance(Wi-Fi联盟)也推出了两项比较重要的技术规范,他们分别是Wi-Fi Simple
Configuration和Wi-Fi P2P。其中:
Wi-Fi Simple
Configuration(以后简写为WSC):该项技术用于简化SOHO环境中无线网络的配置和使用。举一个简单的例子,配置无线网络环境时,网管需要首先为AP设置SSID、安全属性(如身份认证方法、加密方法等)。然后他还得把SSID、密码告诉给该无线网络的使用者。可是这些安全设置信息对普通大众而言还是有些复杂。而有了WSC之后,用户只需输入PIN码(Personal
Identification Number,一串数字),或者摁一下专门的按钮(WSC中,该按钮被称为Push
Button)甚至用户只要拿着支持NFC的手机到目标AP(它必须也支持NFC)旁刷一下,这些安全设置就能被自动配置好。有了这些信息,手机就能连接上目标无线网络了。显然,相比让用户记住SSID、密码等信息,WSC要简单多了。
Peer-to-Peer(以后简写为P2P):P2P的商品名(brand name)为Wi-Fi
Direct。它支持多个Wi-Fi设备在没有AP的情况下相互连接。笔者个人认为P2P是Wi-Fi中最具应用前景的一项技术。例如,在家庭中,用户可直接把手机上的内容通过P2P技术传输到电视机上和家人分享。
注意,P2P和第3章无线网络结构中提到的Independent
BSS完全不同。IBSS中,各个STA属于完全对等的关系,而P2P则不然。关于P2P的细节,我们留待下章再来分析。
在wpa_supplicant(以后简称WPAS)中,WSC的功能点分散在第4章介绍的几条分析路线中,为了避免赘述,本章的分析拟采用如下方法:
首先将介绍WSC所涉及的基础知识。它是本章的核心。
然后再分析WSC相关的代码。这部分代码包括Settings、WifiService相关模块(主要是WifiStateMachine)以及WPAS。
下面,先来介绍WSC的理论知识。
WSC基础知识介绍
WSC规范早期的名字叫Wi-Fi Protected
Setup(简写为WPS)。WFA推出WPA后不久,WPS规范便被推出。随着WPA2的出现,WFA又制订了WPS的升级版,即WSC。WSC的规范(以2.0.2版为例)全文只有150来页。
WSC的目的很简单,就是为了简化无线网络配置(这也是其英文名为Simple
Configuration的原因)。本节将以WSC的技术规范为主,向读者介绍相关的理论知识。
提示:WSC规范中,安全设置信息可以借助Wi-Fi作为传输手段,也可以借助其他传输方式,如NFC传输等。如果这些信息使用Wi-Fi作为传输手段,则称为In-Band交换,否则称为Out-of-Band交换。
6.2.1& WSC应用场景介绍[1]
WSC定义两个应用场景(usage model),分别是Primary
UM和Secondary UM,其中:
UM包括设置一个新的安全的WLAN,并为该WLAN添加无线设备。该场景和前文介绍的WSC应用场景一样。日常生活中,Primary
UM对应的情况更为普遍。
UM包括从WLAN中移除某个无线设备、通过添加新的AP或路由器来扩充WLAN的覆盖范围、密钥信息更换(Re-keying
credentials)等。
UM常见的两种案例包括PIN和PBC。其中,PIN对应的使用案例可用图6-1来表示:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/11234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/11234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
图6-1& WSC
PIN案例示意
图6-1所示为WSC定义的PIN码配置方法,其工作流程为:
1)打开AP和STA。用户首先从STA相关的设置选项中获取一个PIN码。
2)然后用户将STA的PIN码通过AP的设置页面传递给AP。
3)AP和STA将基于这个PIN码完成安全设置协商。然后STA将完成扫描、关联、四次握手等工作以加入目标AP。
PIN码是一个长度为8个数字的字符串,图6-2所示为笔者用Galaxy
Note2测试WSC PIN方法时获取到的PIN信息。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/24234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/24234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
图6-2& Galaxy Note2
WSC PIN设置
图6-2左图所示的页面位于Settings的无线网络设置选项中,有条件的读者不妨一试。
STA中的PIN码需要输入到AP中,图6-3所示为笔者家中无线路由器WSC
PIN设置页面,注意右下角的黑框(里边填写了来自手机的PIN码,笔者测试时从Galaxy
Note2中获取的PIN码是)。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/38062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/38062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
AP设置页面
提示:图6-2和图6-3中所示的PIN码并不一致。此处为笔者有意为之,表示系统每次生成的PIN码不是固定的。
相比PIN而言,PB配置方法(Push Button
Configuration,简称PBC)的使用更加简单。图6-4所示为PBC案例示意图。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/51250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/51250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
PBC案例示意图
由图6-4可知,PBC的工作流程如下:
1)用户打开AP和打印机(支持Wi-Fi)。打印机和AP上都有一个小按钮(注意,规范要求该按钮必须标记上WPS以表示它对WSC的支持)。
2)用户只要在AP和打印机上摁一下该按钮,该操作将触发打印机和AP完成安全设置协商。如此,打印机获取AP的安全设置信息后将顺利加入目标AP。
图6-5所示为笔者家中无线路由器上的WSC按钮。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/11500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/11500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
对于Android智能手机,它可通过软件中的按钮来模拟真实的Push
Button(参考图6-2中左图的“WPS推送按钮”项)。
6.2.2& WSC核心组件及接口介绍[2]
WSC规范定义了三个核心组件,如图6-6所示:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/28828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/28828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
WSC核心组件
图6-6所示为WSC定义的三个核心组件,其中:
Enrollee的角色类似于supplicant,它向Registrar发起注册请求。
Registrar用于检查Enrollee的合法性。另外,Registrar还能对AP进行配置。
AP也需要注册到Registar中。所以,从Registrar角度来看,AP也是Enrollee。
AP和Registrar以及Enrollee三者交互,Enrollee从Registrar那获取AP的安全配置信息,然后Enrollee利用该信息加入AP提供的无线网络。
注意,这三个组件只是逻辑上的概念。在具体实现时,AP和Registrar可以由同一个实体实现,也可分别由不同实体来实现。
1)日常生活中,支持WSC的无线路由器兼具AP和Registrar的功能。这种AP在规范中被称为Standalone
AP。Android智能手机扮演Enrollee的角色。
2)如果AP和Registrar分别由不同实体来实现,这种Registrar也被称为External
Registrar。
除了三大组件之外,规范还定义了组件之间的交互接口。例如图6-6中的E、M、A代表三个核心组件之间交互的接口,这些接口定义了交互双方需要实现的一些功能。
规范中关于E、M、A的介绍非常复杂,笔者不拟照搬规范的内容,而是试图通过一种普适的case来介绍E、M、A的功能。这个case就是AP和Registrar组件实现于一个无线路由器中,即Standalone
AP,而Enrollee由STA实现。STA和Standalone
AP通过Wi-Fi传输数据,即它们将采用In-Band交互手段。
在上述情况下,STA中的Interface
E包括的功能有:
STA首先要寻找周围支持WSC功能的Standalone
AP。此步骤将通过发送携带WSC IE的Probe
Request帧来实现。另外,STA必须能生成动态PIN码。该PIN码将用于检验后续安全配置信息的正确性。
STA关联到Standalone
AP后(注意,仅仅是关联成功。由于缺乏安全配置信息,STA无法和AP开展RSNA流程,即四次握手等工作),双方需要借助Registration
Protocol协议(以后简称RP协议)来协商安全配置信息。所以,STA必须实现RP协议的Enrollee的功能。
Standalone AP中Interface
E包括的功能有:
回复携带WSC IE的Probe
Response帧以表明自己支持WSC功能。
实现RP协议定义的Registrar的功能。
另外,STA和AP可选择实现某种Out-of-Band交互手段,规范中提到的两种手段包括NFC和USB。
对于Interface A来说:
STA必须实现802.1X
supplicant功能,并支持EAP-WSC算法。
Standalone AP需发送携带WSC
IE的Beacon帧来表示自己支持WSC功能。同时,AP还必须支持802.1X
authenticator功能,并实现EAP-WSC算法。
由于Standalone
AP已经集成了三大组件中的AP和Registrar,所以Interface
M的功能几乎简化为0。由于本书不讨论AP的实现,所以此处不拟介绍和它相关的内容。
规范阅读提示:WSC规范关于E、M、A的介绍比较复杂,其中还涉及到UPnP的使用。笔者不拟讨论UPnP方面的内容。对它感兴趣的读者不妨参考笔者的一篇博文:http://blog.csdn.net/innost/article/details/7078539
由上文所述内容可知,WSC的核心知识集中在WSC
IE以及RP协议中,下面将单独用一节来介绍它们。
6.2.3& Registration Protocol介绍[3]
以前面提到的普适case为例,当STA和Standalone
AP采用In-Band交互方法时,RP协议的完整交互流程如图6-7所示:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/47328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/47328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
图6-7&&完整RP协议交互示意图
图6-3中包括两个部分,由“Enter passworkd of
Enrollee”行隔开,其中:
上部分所对应的交互部分被称之为Discovery
Phase。在此阶段中,STA借助Beacon帧或Probe
Request帧搜索周围的AP。对开启了WSC功能的STA来说,这些帧中都必须携带WSC IE。而没有携带WSC
IE的帧则表明发送者不支持或者未开启WSC功能。Discovery
Phase结束后,STA将确定一个目标AP。
此时用户需要将STA显示的PIN码(如图6-2所示)输入到目标AP的设置页面(如图6-3所示)。
接着,STA将关联到目标AP。和非WSC流程不一样的是,STA和AP不会开展4次握手协议,而是先开展EAP-WSC流程。
EAP-WSC流程从EAPOL-Start开始,结束于EAP-Fail帧,一共涉及14次EAPOL/EAP帧交换。在这14次帧交互过程中,STA和AP双方将协商安全配置信息(例如采用何种身份验证方法、何种加密方法,以及PSK等)。另外,这14次帧中,M1到M8属于EAP-WSC算法的内容,它们用于STA和AP双方确认身份以及传输安全配置信息。
虽然EAP-WSC最终以EAP-Fail帧结束,但STA已经和AP借助M1到M8成功完成了安全信息协商。所以,STA已经获得了AP的安全配置情况。另外,由于STA收到的是EAP-Fail帧,所以它会断开和AP的连接(AP会发送Deauthentication帧给STA)。
STA将利用协商好的安全配置信息重新和AP进行关联,后续流程和非WSC的无线网络关联一样,即STA关联到AP后,将开展RSNA工作(如4次握手协议、Group
Handshake流程)。
关于图6-7所涉及的流程,笔者特别强调几点,请读者认真体会:
如果不使用WSC,用户需要为AP设置安全配置信息,然后STA搜索并关联到目标AP。接着,STA和AP将利用4次握手协议和Group
Handshake协议完成RSNA工作。RSNA工作属于WPA和WPA2规范所指定的,STA和AP必须完成RSNA流程。
如果使用WSC,STA和AP共享的只有PIN码(或者用户摁了双方的按钮),为了完成RSNA流程,STA需要从AP那获取安全配置信息。而这个安全配置信息的传递则由图6-7所示的EAPOL/EAP帧交互来完成。有了安全配置信息后,STA后续流程和没有使用WSC的情况一样。
根据上面的描述,我们可知:
WSC的核心工作就是帮助STA和AP完成安全配置信息协商。由于在这个流程中,用户只需输入PIN码或摁按钮,所以用户的工作量极小。WSC工作完成后,STA和AP的工作就和第4章介绍的一样了(STA首先关联到AP,然后完成4次握手协议和Group
Handshake协议)。
下面我们将分别介绍WSC
IE以及EAP-WSC相关知识。首先登场的是WSC IE。
IE和Attribute介绍[4]
IE并不属于802.11规范所定义的IE,而是属于Vendor定义的IE。根据802.11规范,Vendor定义的IE有着如图6-8所示的组成结构:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/25906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/25906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
图6-8& Vendor
根据图6-8所示的结构,WSC
IE对应的设置如下:
ID取值为221。802.11规范中,该值意为“Vendor Specific”。
Length为OUI及Data的长度。
OUI取值为0x00-50-F2-04。其中00-50-F2代表Mircrosoft公司的OUI,04代表WPS。
IE中,Data域的组织结构为一个或多个Attribute(属性)。Attribute的格式为TLV,即Type(长度为2个字节)、Length(长度为2个字节,代表后面Value的长度),Value(最大长度为0xFFFF字节)。
图6-9所示为笔者截获的WSC IE示意图。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/40578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/40578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
图6-9& WSC
由上文可知,WSC
IE的核心是其携带的Attribute。
WSC规范定义了多个Attribute,而了解这些Attribute的内容及作用是学习WSC的必经之路。下面将介绍WSC中一些重要的Attribute。
提示:Attribute不仅被WSC
IE使用,还被后文介绍的EAP-WSC包使用
===================略略略略略略略==============================
5.& EAP-WSC处理流程分析
EAP-WSC流程涉及到EAPOL中的四个状态机(SUPP_PAE、KEY_RX、SUPP_BE、Port
Timers)以及EAP
SM之间的联动。当STA成功关联到AP后,EAPOL及EAP状态机情况如下(详情请参考第4章4.5.3.4.3“eapol_sm_notify_portEnabled分析”一节):
SUPP_PAE为DISCONNECTED状态、KEY_RX为NO_KEY_RECEIVE状态、SUPP_BE为IDLE状态、EAP_SM为DISABLED状态。
根据6.2.3“Registration
Protocol介绍”一节中的图6-7,EAP-WSC流程的开始于STA向AP发送的EAPOL-Start帧。是什么原因导致STA发送EAPOL-Start帧呢?来看下文。
(1)&&发送EAPOL-Start
在STA关联到AP流程的最后,eapol_sm_notify_portEnabled将设置portEnabled为1,根据代码(eapol_supp_sm.c中SM_STEP(SUPP_PAE))以及第4章图4-28(Supplicant
PAE SM状态示意图)可知,SUPP_PAE下一个要进入的状态是CONNECTING,其EA(Entry
Aciton)代码为:
[--&eapol_supp_sm.c::SM_STATE(SUPP_PAE,
CONNECTING)]
SM_STATE(SUPP_PAE, CONNECTING)
//SUPP_PAE_state此时的值为SUPP_PAE_DISCONNECTED,故send_start为0
//下面注意这个判断很重要,我们待会还会回到此处
int send_start = sm-&SUPP_PAE_state ==
SUPP_PAE_CONNECTING;
SM_ENTRY(SUPP_PAE, CONNECTING);
if (send_start) {
sm-&startWhen = sm-&startP
sm-&startCount++;
CONFIG_WPS& //
sm-&startWhen&=&1;
//注意,如果WPAS支持WPS,则startWhen值为1
sm-&startWhen = 3;
//启动Port Timers SM,Port Timers
SM将递减startWhen,并调用eapol_sm_step以重新遍历状态机
&&&&eapol_enable_timer_tick(sm);
sm-&eapolEap = FALSE; ..
//由于send_start为0,所以此时还不会发送EAPOL-Start包
if (send_start)
&eapol_sm_txStart(sm);
根据代码中的注释,当Port Timers
SM运行时,它将递减startWhen变量(结果是startWhen的值变为0),然后通过eapol_sm_step重新遍历状态机。在该函数中,PAE的SM_STEP将被调用以检查是否需要进行状态切换,相关代码如下所示:
[--&eapol_supp_sm.c::SM_STEP(SUPP_PAE)]
SM_STEP(SUPP_PAE)
......//略去不相关的内容
else switch (sm-&SUPP_PAE_state) {
//SUPP_PAE_state还处于CONNECTING状态
SUPP_PAE_CONNECTING:
(sm-&startWhen == 0&&&
sm-&startCount & sm-&maxStart)
&&&&&&&&&&&&SM_ENTER(SUPP_PAE,
CONNECTING);//由于startWhen为0,PAE将重新进入CONNECTING状态
case SUPP_PAE_AUTHENTICATING:
根据上面代码可知,PAE将再次从CONNECTING状态进入CONNECTING状态。请读者回顾SM_STATE(SUPP_PAE,
CONNECTING)函数。这一次sendStart将取值1,所以eapol_sm_txStart会被调用。该函数的代码如下所示:
[--&eapol_supp_sm.c::eapol_sm_txStart]
static void eapol_sm_txStart(struct eapol_sm
//eapol_send函数指针指向wpa_supplicant_eapol_send,相关代码在wpas_glue.c中。请读者自行阅读
sm-&ctx-&eapol_send(sm-&ctx-&eapol_send_ctx,IEEE802_1X_TYPE_EAPOL_START,
(u8 *) "", 0);
sm-&dot1xSuppEapolStartFramesTx++;
sm-&dot1xSuppEapolFramesTx++;
由上述代码可知,eapol_send的实例wpa_supplicant_eapol_send将最终发送EAPOL-Start帧。
(2)&&状态机切换处理介绍
STA发出EAPOL-Start后,AP将发送EAP-Request/Identity包。STA处理EAP-Request/Identity后将回复EAP-Response/Identity包。上述流程将触发EAPOL中的PAE、BE和EAP状态机联动。此联动过程相当复杂。故本节将以EAP-Request/Identity为入口,分析WPAS中状态机的切换处理。
注意:此处的状态机联动实际上反映的是WPAS中EAP包处理的通用流程。学习过程中,请读者务必结合第4章4.4“EAP和EAPOL模块介绍”一节介绍的理论知识。
先来看EAP-Request的处理。WPAS中,EAP包接收的函数是wpa_supplicant_rx_eapol(相关分析请参考第4章4.5.3.5“EAPOL-Key交换流程分析”一节对wpa_supplicant_rx_eapol的介绍)。在那里,我们说过非PSK认证方法将由eapol_sm_rx_eapol处理。故直接来看eapol_sm_rx_eapol函数,代码如下所示:
[--&eapol_supp_sm.c::eapol_sm_rx_eapol]
int eapol_sm_rx_eapol(struct eapol_sm *sm, const
u8 *src, const u8 *buf, size_t len)
const struct ieee802_1x_hdr *& const struct
ieee802_1x_eapol_key *
int data_& int res = 1; size_t
sm-&dot1xSuppEapolFramesRx++;
hdr = (const struct ieee802_1x_hdr *)
sm-&dot1xSuppLastEapolFrameVersion = hdr-&
os_memcpy(sm-&dot1xSuppLastEapolFrameSource, src,
ETH_ALEN);
plen = be_to_host16(hdr-&length);
#ifdef CONFIG_WPS
//workaround中文意思为“变通方案”。在WPAS中,它表示为了兼容某些AP的错误行为(例如发送的EAP包
//格式不符合要求),而采用绕过去的方法来处理
(sm-&conf.workaround&&&
plen & len - sizeof(*hdr) &&
hdr-&type == IEEE802_1X_TYPE_EAP_PACKET &&
len - sizeof(*hdr) & sizeof(struct eap_hdr)) {
data_len = plen + sizeof(*hdr);
switch (hdr-&type) {
case&IEEE802_1X_TYPE_EAP_PACKET:&
//本例中,我们收到的是EAP-Request包,满足此case条件
wpabuf_free(sm-&eapReqData);
sm-&eapReqData = wpabuf_alloc_copy(hdr + 1, plen);
if (sm-&eapReqData) {
&&&&&&&&&&&
sm-&eapolEap&=&TRUE;&
//设置条件变量
&&&&&&&&&&&&eapol_sm_step(sm);
//触发状态机运行
WPAS每收到一个EAP包都会触发上述代码中流程。回顾一下eapol_sm_step中和状态机运转相关的代码:
[--&eapol_supp_sm.c::eapol_sm_step]
void eapol_sm_step(struct eapol_sm
for (i = 0; i & 100; i++) {
sm-&changed = FALSE;
&&&&&&&&SM_STEP_RUN(SUPP_PAE);//先执行SUPP_PAE状态机
&&&&&&&&SM_STEP_RUN(KEY_RX);
//再运转KEY_RX状态机
&&&&&&&&SM_STEP_RUN(SUPP_BE);
//最后运转SUPP_BE状态机
if (eap_peer_sm_step(sm-&eap))
//执行EAP_SM状态机
&&&&&&&&&&&
sm-&changed&= TRUE;
if (!sm-&changed)
&&&&&&&&&&&
其中,eap_peer_sm_step的代码如下所示:
[--&eap.c::eap_peer_sm_step]
int eap_peer_sm_step(struct eap_sm
int res = 0;
do {& //无限循环,直到EAP SM稳定后才退出
sm-&changed = FALSE;
&&&&&&&&SM_STEP_RUN(EAP);
if (sm-&changed)
&&&&&&&&&&&
} while (sm-&changed);
通过上述代码可知,EAPOL和EAP的状态机联动过程如下:
1)EAPOL先按顺序遍历PAE、KEY_RX、BE状态机。
2)然后执行EAP状态机。只有EAP
SM稳定后(即eap_peer_sm_step函数中的sm-&changed为FALSE时)才退出eap_peer_sm_step。
3)如果上述四个状态机有任何一个状态机的状态不稳定(即sm-&changed为TRUE),则继续遍历所有状态机。
特别需要指出的是,状态机A运行时可能会修改一些条件变量从而导致状态机B发生状态切换。虽然第4章对每个状态机的状态切换图都有详细介绍,但读者很难理清楚状态机之间是如何互相影响的。在此,笔者整理了WPAS从发送EAPOL-Start包到接收EAP-Request/Identity以及回复EAP-Reponse/Identity这一过程中四个状态机的切换过程,如图6-34所示:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/41250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" DATA-KE-SRC="http://img.blog.csdn.net/41250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" STYLE="border-style: max-width: 100%;"
TITLE="第六章&深入理解wi-Fi&Simple&Configuration" />
图6-34& EAP-Request/Response
Identity流程中的状态机联动示意
图6-34中:
最上面一行显示了PAE、KEY_RX、BE和EAP_SM的初始状态。由于EAP-WSC不会收发EAPOL-Key帧,所以KEY_RX将不参与联动过程。
图中的方框上部所示为状态机以及当前的状态,格式为状态机名_状态名,如PAE_CONNECTING等。方框下部所示为该状态机对应状态的EA处理(由于篇幅原因,图中EA仅列出了一些重要的处理逻辑)。
当状态机A从一个状态切换到另一个状态时,切换过程用实箭头表示(例如第二行中,PAE_CONNECTING切换到PAE_RESTART,切换条件为“eapolEap为TRUE”。当WPAS收到一个EAP帧时,该变量将在上文介绍的eapol_sm_rx_eapol函数中被设置为TRUE)。
当状态机A在其EA处理中修改了某些条件变量(或者外界设置了某个条件变量)导致状态机B发生状态切换时,其切换过程用虚箭头表示。例如第二行中的PAE_RESTART状态,其EA将设置eapRestart为TRUE,而该条件和portEnabled将共同促使EAP_SM进入INITILIAZE状态。
第二行表示eapol_sm_step第一次循环过程中的状态机切换以处理接收到的EAP-Request/Identity包。但这一轮还不会真正处理EAP包。
第三行表示eapol_sm_step的第二次循环。在这次循环过程中,EAP状态机将处理EAP-Request/Identity包。在解析该包时,发现它包含了Identity信息,所以EAP
SM将进入IDENTITY状态去处理它。处理完毕后,EAP
SM将构造一个EAP-Response/Identity包,并设置eapResp变量为TRUE。
第三行中,eapResp变量将使得BE进入RESPONSE状态,该状态的EA将调用txsuppResp发送这个EAP-Response/Identity包。
当图6-34执行完毕后,EAPOL和EAP状态机将进入稳定状态,这样,eapol_sm_step得以返回。根据EAP-WSC的流程,WPAS下一步将继续接收并处理EAP包。在这以后的过程中(从M1到M8):
PAE保持Authenticating状态不变。
当EAPOL收到一个EAP包后,BE将从RECEIVE状态切换至REQUEST状态。EAP将根据EAP包的信息从IDLE状态转移到其他状态(首先是RECEIVED状态,在该状态中将解析EAP包的内容,根据内容以进入GET_METHOD或METHOD状态以处理EAP包)。
EAP状态机处理完EAP包,BE将进入RESPONSE状态并发送EAP回复包。整个流程将反复执行,直到EAP-WSC流程终结。
所以,对EAP-WSC流程来说,EAPOL状态机的执行过程比较固定。而对EAP
SM来说,它将根据EAP包内容的不同而转移到不同的状态。下面我们将直接进入EAP对应的状态以分析不同EAP包的处理过程。
注意,根据图4-21关于EAP
SM的描述,当portEnabled值为TRUE时,应该从DISABLED状态切换至INITIALIZE状态。不过,我们在4.5.3.3.3“wpa_supplicant_associate分析之三”一节中曾提到说由于force_disabled变量为TRUE,EAP_SM是无法转入INITIALIZED状态的。为什么此处它却可以呢?原来。由于本例使用的key_mgmt是WPA_KEY_MGMT_WPS,所以force_disabled变量将被设置为FALSE,这样EAP
SM就可以转换至INITIALIZE状态了。其间的细节内容请读者参考wpa_supplicant_initiate_eapol及内部所调用的eapol_sm_notify_config函数。
=============================略略略===========
6.4&&本章总结和参考资料说明
6.4.1&&本章总结
本章对Wi-Fi Simple
Configuration和其中的PIN方法进行了深入介绍。主要内容包括:
WSC的理论知识,它是本章的核心。WSC中最重要的是RP协议以及WSC
IE及各种Attribute的作用。希望读者能结合本章给的实例图来认真学习它们。
掌握理论知识后,本章介绍了Android平台中WSC的代码实现。它包括Settings、WifiService相关模块以及wpa_supplicant相关模块。仅就EAP-WSC算法本身而言,其难度并不大。
由于WSC使用了EAP-WSC算法,所以本章还介绍了EAPOL和EAP状态机之间的联动过程。这部分代码的难度比较大,需要结合第4章4.4“EAP和EAPOL模块介绍”一节中的状态机切换图来学习。
注意:WSC规范中还定义了另外一种比较常用的PBC方法。PBC和PIN类似,它也会用到一个PIN码,只不过这个PIN码为“”。读者可阅读参考资料[7]来了解PBC。
6.4.2&&参考资料说明
本章参考资料其实只有一个,即WSC规范2.0.2版。读者可在百度文库上搜索到该文档,其地址为/view/aa2e8a20cfc789eb172dc83d.html
WSC应用场景介绍
WSC-2.0.2第1节“Introduction”
WSC核心组件及接口介绍
WSC-2.0.2第4节“Core Architecture”
Registration
Protocol介绍
WSC-2.0.2第6.1节“In-band Setup Using a Standalone
AP/Registrar”
WSC-2.0.2第8节“Message Encoding”
WSC-2.0.2第7节“Registration Protocol Definition”
http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange
维基百科关于D-H算法的描述,读者可通过它了解D-H的相关知识。
Push Button
Configuration
WSC-2.0.2第11节“Push Button Configuration”。
规范中,PBC的介绍只有7页。建议读者学完本章后再来看它。
转载:http://blog.csdn.net/innost/article/details/
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 wi fi direct 的文章

 

随机推荐