高通 无线驱动(wireless driver) 状态机详解
由于公司希望让产品提高无线状态下连接速度,因此就需要修改状态机。去除一些不必要的耗时操作,所以最近主要研究了下高通的wireless的驱动STATION mode 部分。
好了,下面进入正题。
众所周知。 client 和 hostap 关联需要四个步骤(假设采用open 方式,no psk加密)。
1. wlan 管理帧交互流程
1. host端定期向空气中发出beacon帧。 clent端scan各个信道的beacon,并发送probe request 的广播探测帧(即原mac 地址是client本身,目的mac地址是ff:ff:ff:ff:ff:ff).
注:如果这时在上层例如Andorid手机界面。手动指定一个SSID去连接。这时发送的probe request原和目的mac地址不变,但是 会带有host端 ssid的信息。
2. host 收到client端的probe request帧, 检查一下ssid是host 本身。 Host就会发送 probe response帧给client.
3. client 收到host 端的probe response帧。就会给host端发送auth帧。(注意:这个auth帧是80211的auth帧,与wpa,wep加密无关)
4. host端收到client的auth帧。如果验证t通过,会给client返回一个auth帧。
5. client端收到host端返回的auth帧。 就会给host端发送assoc request帧。
6. host收到client的assoc request帧,会给client返回assoc response帧。
7. client收到 host的assoc response帧。表明一次管理帧的关联成功。
这时。如果是OPEN模式。client端就会发送DHCP向 host端拿IP了。
如果是psk机密模式,client端还需要进行一个4次握手的psk数据帧过程。本文就不详细说了。以后有机会再专门介绍一下psk的模式。
2. qca 状态机的流程。
当station 模式的vap 建立起来之后:
在 os/linux/src/osif_umac.c 中
osif_vap_init会调用 wlan_connection_sm_start, 去启动cllient模式的状态机。
这里要明确一下,根据我的了解,qca 状态机分为两部分,一部分叫connection,另一部分叫assoc。分别位于
umac/sme/ieee80211_connection_sm.c
umac/sme/ieee80211_assoc_sm.c 两个文件中。
下面继续跟踪connection 状态机。
connection的状态机主要分为:
INIT(IEEE80211_CONNECTION_STATE_INIT)--->SCAN(IEEE80211_CONNECTION_STATE_SCAN)
--->CONNECTIING(IEEE80211_CONNECTION_STATE_CONNECTING)
--> CONNECTED(IEEE80211_CONNECTION_STATE_CONNECTED)
其中在 CONNECTING 状态部分,qca 会调用 accos 状态机: assoc状态机分为“ASSOC INIT” "ASSOC JOIN" "ASSOC AUTH" "ASSOC ASSOC" "ASSOC RUN".
当 ASSOC RUN状态启动成功.会退出assoc状态机,来到connection 状态机的 CONNECTED状态。至此状态机run成功。
接下来CLIENT 可以个host进行数据帧交互了。
3. 根据状态机优化代码
由于公司的产品host端 和 CLIENT端都有。因此我们就可以针对自己的产品进行流程上的优化。