wpa_supplicant(2) wifi connect AP 跟踪

标签:
it |
WPA-PSK连接
从packages\apps\Settings\src\com\android\settings\wifi\WifiSettings.java
和 WifiDialog.java 开始
1.
如果你点中某个AP
=> onClick执行 (WifiSettings.java)
代码如下:
1.
如果你点中某个AP
=> onClick执行 (WifiSettings.java)
- button ==
WifiDialog.BUTTON_SUBMIT
-
WifiConfiguration config = mDialog.getConfig();(WifiDialog.java中) -
WifiDialog getConfig => ( 因为才你自己选的某个AP 有网络ID, -
所以network id !=-1,mSelected!=null) -
if (config.networkId != -1) { -
if (mSelected != null) { -
-
mWifiManager.updateNetwork(config);
-
-
saveNetworks();
-
}
-
} else { -
int networkId = mWifiManager.addNetwork(config); -
if (networkId != -1) { -
mWifiManager.enableNetwork(networkId, false); -
config.networkId = networkId; -
if (mDialog.edit || requireKeyStore(config)) { -
saveNetworks();
-
} else { -
connect(networkId);
-
}
-
}
-
}
2. 接上面分支1.的 mWifiManager.updateNetwork(config); 继续分析
=> addOrUpdateNetwork (wifiManager.java)
=> wpa_supplicant_ctrl_iface_add_network
看下解释:
# priority: Priority group
#
#
#
#
#
#
3. 又回到java,刚才2.分支中mService.addOrUpdateNetwork部分
=> mService.addOrUpdateNetwork(config);继续往下执行代码如下:
kerneldoc : http://linuxwireless.org/en/developers/Documentation/nl80211/kerneldoc
解释如下:
NL80211_CMD_TRIGGER_SCAN
trigger a new scan with the given parameters
NL80211_ATTR_TX_NO_CCK_RATE is
used to decide whether to send the probe
requests at CCK rate or not.
到这里已经是连接上AP后的处理部分了
=> saveNetworks(); (wifisettings.java)
- D/wpa_supplicant( 2129):
Reading configuration file '/data/misc/wifi/wpa_supplicant.conf'
- D/wpa_supplicant(
2129): ctrl_interface='wlan0:0'
-
wpa_config_read, wpa_config_process_global - D/wpa_supplicant(
2129): update_config=1
-
wpa_config_read, wpa_config_process_global - D/wpa_supplicant(
2129): Line:
5 - start of a new network
block
-
wpa_config_read ,wpa_config_read_network - D/wpa_supplicant(
2129): key_mgmt: 0x2
- D/wpa_supplicant(
2129): priority=1 (0x1)
- D/wpa_supplicant(
2129): Priority group 1
-
wpa_config_read ,wpa_config_debug_dump_networks - D/wpa_supplicant( 2129): id=0 ssid='RD-Test
D/wpa_supplicant( 2129): WPS: Set UUID for interface wlan0
D/wpa_supplicant( 2129): wlan0: P2P: Intra BSS distribution
enabled
V/WifiMonitor( 1363): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=0 BSSID=00:00:00:00:00:00]
V/WifiStateTracker( 1363): Changing supplicant state: SCANNING ==> DISCONNECTED
D/wpa_supplicant( 2129): Setting scan request: 2 sec 0 usec
D/wpa_supplicant( 2129): Reconfiguration completed
V/WifiMonitor( 1363): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=0 BSSID=00:00:00:00:00:00]
V/WifiStateTracker( 1363): Changing supplicant state: SCANNING ==> DISCONNECTED
D/wpa_supplicant( 2129): Setting scan request: 2 sec 0 usec
D/wpa_supplicant( 2129): Reconfiguration completed
上面 mWifiManager.enableNetwork(networkId, false);
=> WifiNative.enableNetworkCommand 发 ENABLE_NETWORK命令
==> wpa_supplicant_ctrl_iface_enable_network
===> wpa_supplicant_enable_network
===> 继续scan
4. 接上面3.分支继续
这时你会看到driver的消息:
Association completed. (bss_info_changed)
字面上看关联成功? 还没发requet associate ?
这时你会看到driver的消息:
字面上看关联成功? 还没发requet associate ?
那么在那里发的request associate ?
前面3.分支,开始我们SET_NETWORK,之后我们又ENABLE_NETWORK
最后发起对我们选择的AP,进行scan2,scan之后就需要等待接收结果
前面3.分支,开始我们SET_NETWORK,之后我们又ENABLE_NETWORK
最后发起对我们选择的AP,进行scan2,scan之后就需要等待接收结果
在前面wap_supplicant init 部分
曾经做过这个动作 wpa_driver_nl80211_init_nl
该函数最后调用:
eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event),
wpa_driver_nl80211_event_receive, drv,
drv->nl_handle_event);
前面解释过是用来接收scan result,mlme,regulator 相关的多播包
其实前面wifi eanalbe 时这部分应该也做,并且如果conf中有Network
它也会去pick network,然后开始连接过程,
现在你是第1次手动连接,同样也是从scan result 中
找到你选择的那个AP,进行连接,看下面:
曾经做过这个动作 wpa_driver_nl80211_init_nl
该函数最后调用:
eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event),
前面解释过是用来接收scan result,mlme,regulator 相关的多播包
其实前面wifi eanalbe 时这部分应该也做,并且如果conf中有Network
它也会去pick network,然后开始连接过程,
现在你是第1次手动连接,同样也是从scan result 中
找到你选择的那个AP,进行连接,看下面:
=>wpa_driver_nl80211_event_receive
通过process_event callback 来继续处理 NL80211_CMD_NEW_SCAN_RESULTS 如下:
这时先会 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout,
取消前面的10s scan timeout eloop
==> send_scan_event
===> wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS,
&event);
====> wpa_supplicant_event_scan_results
=====> _wpa_supplicant_event_scan_results
======>wpas_notify_scan_results(wpa_s);
=======> wpas_wps_notify_scan_results
"Event [WPS-AP-AVAILABLE]"
======> wpa_supplicant_pick_network
从scan results 中选择AP,
根据scan 到的new ap 去匹配 (有prori等)
通过process_event callback 来继续处理 NL80211_CMD_NEW_SCAN_RESULTS 如下:
这时先会 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout,
取消前面的10s scan timeout eloop
终于要开始连接了,这是应该会看到下面的msg:
wlan0: Request association: reassociate: 1
wpa_supplicant_connect 去调用
=======> wpa_supplicant_associate(wpa_s, selected, ssid);
========> sme_authenticate(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss, struct wpa_ssid *ssid)
开始设置一堆参数为driver层auth 调用做准备
就提下params.auth_alg = WPA_AUTH_ALG_OPEN;
其他看代码
=========>wpa_supplicant_set_suites
(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss, struct wpa_ssid *ssid,
u8 *wpa_ie, size_t *wpa_ie_len)
它设置认证和加密的参数,这些参数从
这个AP scan result 发过的被处理后挂在
struct wpa_bss 的最后的IE部分获得
获得 WPA IE ,RSN IE 后就知道了,从message看:
WPA: Selected cipher suites: group WPA_CIPHER_TKIP,
pairwise WPA_CIPHER_CCMP,
key_mgmt WPA_KEY_MGMT_PSK
proto WPA_PROTO_RSN
表示:
group 使用TKIP, 成对密钥 使用CCMP, key manager wpa_psk,
协议为RSN ,就是强健安全网络(RSN)的标准
调用两次wpa_sm_set_param
=======> wpa_supplicant_associate(wpa_s, selected, ssid);
WPA: Selected cipher suites: group WPA_CIPHER_TKIP,
表示:
group 使用TKIP, 成对密钥 使用CCMP, key manager wpa_psk,
协议为RSN ,就是强健安全网络(RSN)的标准