1 当手动选择网络进行连接及自动重连时会进入wpa_supplicant_pick_network,该函数的作用是从wpa_ssid中选择wpa_bss。
struct wpa_bss * wpa_supplicant_pick_network(struct wpa_supplicant *wpa_s,
struct wpa_ssid **selected_ssid)
{
struct wpa_bss *selected = NULL;
int prio;
struct wpa_ssid *next_ssid = NULL;
while (selected == NULL) {
//conf是struct wpa_supplicant中表示wpa_supplicant.conf文件的struct wpa_config
//num_prio表示wpa_config中wpa_ssid中的优先级有几种类型,有可能一个优先级下面挂有多个wpa_ssid
for (prio = 0; prio < wpa_s->conf->num_prio; prio++) {
if (next_ssid && next_ssid->priority ==
//pssid表示wpa_config中按prio排列的wpa_ssid链表的头节点
wpa_s->conf->pssid[prio]->priority) {
//only_first_ssid = 1表示从last selected的优先级最高的排在优先级链表第一位的ssid中选择bss
selected = wpa_supplicant_select_bss(
wpa_s, next_ssid, selected_ssid, 1);
if (selected)
break;
}
//only_first_ssid = 0表示从整个优先级链表中选择bss
selected = wpa_supplicant_select_bss(
wpa_s, wpa_s->conf->pssid[prio], selected_ssid, 0);
if (selected) break;
}
}
return selected;
} 2
wpa_supplicant_select_bss具体处理如何从priority group中选择bss
static struct wpa_bss *
wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s,
struct wpa_ssid *group,
struct wpa_ssid **selected_ssid,
int only_first_ssid)
{
unsigned int i;
if (only_first_ssid)
wpa_dbg(wpa_s, MSG_DEBUG, "Try to find BSS matching pre-selected network id=%d", group->id);
else
wpa_dbg(wpa_s, MSG_DEBUG, "Selecting BSS from priority group %d", group->priority);
//last_scan_res_used表示上次扫描的bss的个数
for (i = 0; i < wpa_s->last_scan_res_used; i++) {
struct wpa_bss *bss = wpa_s->last_scan_res[i];
*selected_ssid = wpa_scan_res_match(wpa_s, i, bss, group,
only_first_ssid);
//selected_ssid不等于NULL表示调用成功,真正的返回值是wpa_bss
if (!*selected_ssid)
continue;
return bss;
}
return NULL;
} 对应的log如下
05-27 18:55:26.008 I/wpa_supplicant( 9661): Selecting BSS from priority group 35
05-27 18:55:26.008 I/wpa_supplicant( 9661): 58:1f:28:69:ec:96 enter wpa_scan_res_match
05-27 18:55:26.009 I/wpa_supplicant( 9661): selected BSS c4:14:3c:29:45:c4 ssid='PHONE-CTS' freq=2462, rssi=-59
05-27 18:55:26.009 I/wpa_supplicant( 9661): c4:14:3c:29:45:c4 enter wpa_supplicant_pick_network
05-27 18:55:29.528 I/wpa_supplicant( 9661): Selecting BSS from priority group 35
05-27 18:55:29.528 I/wpa_supplicant( 9661): 58:1f:28:69:ec:96 enter wpa_scan_res_match
05-27 18:55:29.529 I/wpa_supplicant( 9661): selected BSS c4:14:3c:29:45:c4 ssid='PHONE-CTS' freq=2462, rssi=-56
05-27 18:55:29.529 I/wpa_supplicant( 9661): c4:14:3c:29:45:c4 enter wpa_supplicant_pick_network
05-27 18:55:33.588 I/wpa_supplicant( 9661): Selecting BSS from priority group 35
05-27 18:55:33.591 I/wpa_supplicant( 9661): 58:1f:28:69:ec:96 enter wpa_scan_res_match
05-27 18:55:33.596 I/wpa_supplicant( 9661): Selecting BSS from priority group 32
05-27 18:55:33.597 I/wpa_supplicant( 9661): 58:1f:28:69:ec:96 enter wpa_scan_res_match
05-27 18:55:33.603 I/wpa_supplicant( 9661): Selecting BSS from priority group 31
05-27 18:55:33.604 I/wpa_supplicant( 9661): 58:1f:28:69:ec:96 enter wpa_scan_res_match
05-27 18:55:33.604 I/wpa_supplicant( 9661): selected BSS 58:1f:28:69:ec:96 ssid='\xe7\xa7\xbb\xe5\x8a\xa8\xe7\x83\xad\xe7\x82\xb9xuhao' freq=2462, rssi=-56
05-27 18:55:33.604 I/wpa_supplicant( 9661): 58:1f:28:69:ec:9633 enter wpa_supplicant_pick_network 3 接下来的wpa_scan_res_match用来匹配SSID,加密方式等。
static struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
int i, struct wpa_bss *bss,
struct wpa_ssid *group,
int only_first_ssid)
{
for (ssid = group; ssid; ssid = only_first_ssid ? NULL : ssid->pnext) {
if (wpas_network_disabled(wpa_s, ssid)) {
wpa_dbg(wpa_s, MSG_DEBUG, " skip - disabled");
continue;
}
char wifi_connect_threshold[10];
property_get("wifi.connect.threshold", wifi_connect_threshold, "-100");
if (bss->level > 0 && bss->level - 256 < atoi(wifi_connect_threshold)) {
wpa_printf(MSG_DEBUG, "connect threshold %d",atoi(wifi_connect_threshold));
wpa_printf(MSG_DEBUG, " skip - rssi weak %d",bss->level - 256);
//弱信号不考虑,直接返回
continue;
} else if (bss->level < 0 && bss->level < atoi(wifi_connect_threshold)) {
}
if (check_ssid &&
(bss->ssid_len != ssid->ssid_len ||
os_memcmp(bss->ssid, ssid->ssid, bss->ssid_len) != 0)) {
wpa_dbg(wpa_s, MSG_DEBUG, " skip - SSID mismatch");
continue;
}
if (!osen && !wpa &&
!(ssid->key_mgmt & WPA_KEY_MGMT_NONE) &&
!(ssid->key_mgmt & WPA_KEY_MGMT_WPS) &&
!(ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)) {
wpa_dbg(wpa_s, MSG_DEBUG, " skip - non-WPA network "
"not allowed");
continue;
}
/* Matching configuration found */
return ssid;
}
/* No matching configuration found */
return NULL;
} 未选择网络时的log
//
05-27 20:42:13.882 I/wpa_supplicant( 9661): Selecting BSS from priority group 10
05-27 20:42:13.882 I/wpa_supplicant( 9661): c4:14:3c:ca:31:d2 skip - disabled, bss->ssid = TCL-Guest
05-27 20:42:13.883 I/wpa_supplicant( 9661): c4:14:3c:ca:31:d1 skip - disabled, bss->ssid = Phone-WIFI
05-27 20:42:13.883 I/wpa_supplicant( 9661): c4:14:3c:ca:31:d0 skip - disabled, bss->ssid = TCL-lnternal
选择网络输入错误密码时的log
05-27 20:51:16.596 I/wpa_supplicant(11265): wlan0: CTRL-EVENT-SCAN-STARTED
05-27 20:51:17.332 I/wpa_supplicant(11265): Selecting BSS from priority group 40
//此行表示选择的网络
05-27 20:51:17.333 I/wpa_supplicant(11265): skip - SSID mismatch, bss->ssid = Phone-IPV6
//此行表示不匹配的网络
05-27 20:51:17.333 I/wpa_supplicant(11265): skip - SSID mismatch, bss->ssid = \xe7\xa7\xbb\xe5\x8a\xa8\xe7\x83\xad\xe7\x82\xb9xuhao
05-27 20:51:17.333 I/wpa_supplicant(11265): skip - SSID mismatch, bss->ssid = Phone-IPV6
05-27 20:51:17.333 I/wpa_supplicant(11265): skip - SSID mismatch, bss->ssid = wlan-test
05-27 20:51:17.333 I/wpa_supplicant(11265): skip - SSID mismatch, bss->ssid = Phone-IPV6
05-27 20:51:17.333 I/wpa_supplicant(11265): skip - SSID mismatch, bss->ssid = PHONE-WIFI2
05-27 20:51:17.335 D/wpa_supplicant(11265): wlan0: selected BSS c4:14:3c:29:45:cb ssid='Phone-IPV6'
05-27 20:51:17.335 I/wpa_supplicant(11265): selected BSS c4:14:3c:29:45:cb ssid='Phone-IPV6' freq=2462, rssi=-58
05-27 20:51:17.336 I/wpa_supplicant(11265): c4:14:3c:29:45:cb enter wpa_supplicant_pick_network 选择网络输入正确密码的log
05-27 20:46:29.604 I/wpa_supplicant(11265): Selecting BSS from priority group 36
05-27 20:46:29.609 I/wpa_supplicant(11265): Selecting BSS from priority group 35
05-27 20:46:29.617 I/wpa_supplicant(11265): Selecting BSS from priority group 32
05-27 20:46:29.623 I/wpa_supplicant(11265): Selecting BSS from priority group 16
05-27 20:46:29.643 I/wpa_supplicant(11265): Selecting BSS from priority group 13
05-27 20:46:38.278 I/wpa_supplicant(11265): wlan0: CTRL-EVENT-SCAN-STARTED
05-27 20:46:39.031 I/wpa_supplicant(11265): Selecting BSS from priority group 37
05-27 20:46:39.031 I/wpa_supplicant(11265): selected BSS 58:1f:28:69:ec:96 ssid='\xe7\xa7\xbb\xe5\x8a\xa8\xe7\x83\xad\xe7\x82\xb9xuhao' freq=2462, rssi=-53
05-27 20:46:39.031 I/wpa_supplicant(11265): 58:1f:28:69:ec:9633 enter wpa_supplicant_pick_network