Move assoc param setting into a helper function

This is needed to be able to use the same implementation for updating
the connection parameters in the driver during an association.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Vidyullatha Kanchanapally 2017-08-17 13:56:07 +05:30 committed by Jouni Malinen
parent 084131c850
commit d2ba0d719e

View file

@ -2322,116 +2322,21 @@ static size_t wpas_add_fils_hlp_req(struct wpa_supplicant *wpa_s, u8 *ie_buf,
#endif /* CONFIG_FILS */ #endif /* CONFIG_FILS */
static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit) static u8 * wpas_populate_assoc_ies(
struct wpa_supplicant *wpa_s,
struct wpa_bss *bss, struct wpa_ssid *ssid,
struct wpa_driver_associate_params *params)
{ {
struct wpa_connect_work *cwork = work->ctx;
struct wpa_bss *bss = cwork->bss;
struct wpa_ssid *ssid = cwork->ssid;
struct wpa_supplicant *wpa_s = work->wpa_s;
u8 *wpa_ie; u8 *wpa_ie;
size_t max_wpa_ie_len = 500; size_t max_wpa_ie_len = 500;
size_t wpa_ie_len; size_t wpa_ie_len;
int use_crypt, ret, i, bssid_changed;
int algs = WPA_AUTH_ALG_OPEN; int algs = WPA_AUTH_ALG_OPEN;
unsigned int cipher_pairwise, cipher_group, cipher_group_mgmt;
struct wpa_driver_associate_params params;
int wep_keys_set = 0;
int assoc_failed = 0;
struct wpa_ssid *old_ssid;
u8 prev_bssid[ETH_ALEN];
#ifdef CONFIG_HT_OVERRIDES
struct ieee80211_ht_capabilities htcaps;
struct ieee80211_ht_capabilities htcaps_mask;
#endif /* CONFIG_HT_OVERRIDES */
#ifdef CONFIG_VHT_OVERRIDES
struct ieee80211_vht_capabilities vhtcaps;
struct ieee80211_vht_capabilities vhtcaps_mask;
#endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_FILS #ifdef CONFIG_FILS
const u8 *realm, *username, *rrk; const u8 *realm, *username, *rrk;
size_t realm_len, username_len, rrk_len; size_t realm_len, username_len, rrk_len;
u16 next_seq_num; u16 next_seq_num;
struct fils_hlp_req *req; struct fils_hlp_req *req;
#endif /* CONFIG_FILS */
if (deinit) {
if (work->started) {
wpa_s->connect_work = NULL;
/* cancel possible auth. timeout */
eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
NULL);
}
wpas_connect_work_free(cwork);
return;
}
wpa_s->connect_work = work;
if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid) ||
wpas_network_disabled(wpa_s, ssid)) {
wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
wpas_connect_work_done(wpa_s);
return;
}
os_memcpy(prev_bssid, wpa_s->bssid, ETH_ALEN);
os_memset(&params, 0, sizeof(params));
wpa_s->reassociate = 0;
wpa_s->eap_expected_failure = 0;
if (bss &&
(!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
#ifdef CONFIG_IEEE80211R
const u8 *ie, *md = NULL;
#endif /* CONFIG_IEEE80211R */
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
" (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
os_memset(wpa_s->bssid, 0, ETH_ALEN);
os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
if (bssid_changed)
wpas_notify_bssid_changed(wpa_s);
#ifdef CONFIG_IEEE80211R
ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
md = ie + 2;
wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
if (md) {
/* Prepare for the next transition */
wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
}
#endif /* CONFIG_IEEE80211R */
#ifdef CONFIG_WPS
} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
wpa_s->conf->ap_scan == 2 &&
(ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
/* Use ap_scan==1 style network selection to find the network
*/
wpas_connect_work_done(wpa_s);
wpa_s->scan_req = MANUAL_SCAN_REQ;
wpa_s->reassociate = 1;
wpa_supplicant_req_scan(wpa_s, 0, 0);
return;
#endif /* CONFIG_WPS */
} else {
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
if (bss)
os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
else
os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
}
if (!wpa_s->pno)
wpa_supplicant_cancel_sched_scan(wpa_s);
wpa_supplicant_cancel_scan(wpa_s);
/* Starting new association, so clear the possibly used WPA IE from the
* previous association. */
wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
#ifdef CONFIG_FILS
dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req, dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req,
list) { list) {
max_wpa_ie_len += 3 + 2 * ETH_ALEN + 6 + wpabuf_len(req->pkt) + max_wpa_ie_len += 3 + 2 * ETH_ALEN + 6 + wpabuf_len(req->pkt) +
@ -2444,8 +2349,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
wpa_printf(MSG_ERROR, wpa_printf(MSG_ERROR,
"Failed to allocate connect IE buffer for %lu bytes", "Failed to allocate connect IE buffer for %lu bytes",
(unsigned long) max_wpa_ie_len); (unsigned long) max_wpa_ie_len);
wpas_connect_work_done(wpa_s); return NULL;
return;
} }
if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) || if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
@ -2471,9 +2375,8 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
wpa_ie, &wpa_ie_len)) { wpa_ie, &wpa_ie_len)) {
wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA " wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
"key management and encryption suites"); "key management and encryption suites");
wpas_connect_work_done(wpa_s);
os_free(wpa_ie); os_free(wpa_ie);
return; return NULL;
} }
} else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss && } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) { wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
@ -2492,9 +2395,8 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA " wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
"key management and encryption suites (no " "key management and encryption suites (no "
"scan results)"); "scan results)");
wpas_connect_work_done(wpa_s);
os_free(wpa_ie); os_free(wpa_ie);
return; return NULL;
} }
#ifdef CONFIG_WPS #ifdef CONFIG_WPS
} else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) { } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
@ -2508,9 +2410,9 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
wpabuf_free(wps_ie); wpabuf_free(wps_ie);
wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY)) if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
params.wps = WPS_MODE_PRIVACY; params->wps = WPS_MODE_PRIVACY;
else else
params.wps = WPS_MODE_OPEN; params->wps = WPS_MODE_OPEN;
wpa_s->wpa_proto = 0; wpa_s->wpa_proto = 0;
#endif /* CONFIG_WPS */ #endif /* CONFIG_WPS */
} else { } else {
@ -2539,13 +2441,13 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
&username_len, &realm, &realm_len, &username_len, &realm, &realm_len,
&next_seq_num, &rrk, &rrk_len) == 0) { &next_seq_num, &rrk, &rrk_len) == 0) {
algs = WPA_AUTH_ALG_FILS; algs = WPA_AUTH_ALG_FILS;
params.fils_erp_username = username; params->fils_erp_username = username;
params.fils_erp_username_len = username_len; params->fils_erp_username_len = username_len;
params.fils_erp_realm = realm; params->fils_erp_realm = realm;
params.fils_erp_realm_len = realm_len; params->fils_erp_realm_len = realm_len;
params.fils_erp_next_seq_num = next_seq_num; params->fils_erp_next_seq_num = next_seq_num;
params.fils_erp_rrk = rrk; params->fils_erp_rrk = rrk;
params.fils_erp_rrk_len = rrk_len; params->fils_erp_rrk_len = rrk_len;
} }
#endif /* CONFIG_FILS */ #endif /* CONFIG_FILS */
#endif /* IEEE8021X_EAPOL */ #endif /* IEEE8021X_EAPOL */
@ -2712,6 +2614,120 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
} }
#endif /* CONFIG_OWE */ #endif /* CONFIG_OWE */
params->wpa_ie = wpa_ie;
params->wpa_ie_len = wpa_ie_len;
params->auth_alg = algs;
return wpa_ie;
}
static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
{
struct wpa_connect_work *cwork = work->ctx;
struct wpa_bss *bss = cwork->bss;
struct wpa_ssid *ssid = cwork->ssid;
struct wpa_supplicant *wpa_s = work->wpa_s;
u8 *wpa_ie;
int use_crypt, ret, i, bssid_changed;
unsigned int cipher_pairwise, cipher_group, cipher_group_mgmt;
struct wpa_driver_associate_params params;
int wep_keys_set = 0;
int assoc_failed = 0;
struct wpa_ssid *old_ssid;
u8 prev_bssid[ETH_ALEN];
#ifdef CONFIG_HT_OVERRIDES
struct ieee80211_ht_capabilities htcaps;
struct ieee80211_ht_capabilities htcaps_mask;
#endif /* CONFIG_HT_OVERRIDES */
#ifdef CONFIG_VHT_OVERRIDES
struct ieee80211_vht_capabilities vhtcaps;
struct ieee80211_vht_capabilities vhtcaps_mask;
#endif /* CONFIG_VHT_OVERRIDES */
if (deinit) {
if (work->started) {
wpa_s->connect_work = NULL;
/* cancel possible auth. timeout */
eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
NULL);
}
wpas_connect_work_free(cwork);
return;
}
wpa_s->connect_work = work;
if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid) ||
wpas_network_disabled(wpa_s, ssid)) {
wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
wpas_connect_work_done(wpa_s);
return;
}
os_memcpy(prev_bssid, wpa_s->bssid, ETH_ALEN);
os_memset(&params, 0, sizeof(params));
wpa_s->reassociate = 0;
wpa_s->eap_expected_failure = 0;
if (bss &&
(!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
#ifdef CONFIG_IEEE80211R
const u8 *ie, *md = NULL;
#endif /* CONFIG_IEEE80211R */
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
" (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
os_memset(wpa_s->bssid, 0, ETH_ALEN);
os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
if (bssid_changed)
wpas_notify_bssid_changed(wpa_s);
#ifdef CONFIG_IEEE80211R
ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
md = ie + 2;
wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
if (md) {
/* Prepare for the next transition */
wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
}
#endif /* CONFIG_IEEE80211R */
#ifdef CONFIG_WPS
} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
wpa_s->conf->ap_scan == 2 &&
(ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
/* Use ap_scan==1 style network selection to find the network
*/
wpas_connect_work_done(wpa_s);
wpa_s->scan_req = MANUAL_SCAN_REQ;
wpa_s->reassociate = 1;
wpa_supplicant_req_scan(wpa_s, 0, 0);
return;
#endif /* CONFIG_WPS */
} else {
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
if (bss)
os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
else
os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
}
if (!wpa_s->pno)
wpa_supplicant_cancel_sched_scan(wpa_s);
wpa_supplicant_cancel_scan(wpa_s);
/* Starting new association, so clear the possibly used WPA IE from the
* previous association. */
wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
wpa_ie = wpas_populate_assoc_ies(wpa_s, bss, ssid, &params);
if (!wpa_ie) {
wpas_connect_work_done(wpa_s);
return;
}
wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL); wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
use_crypt = 1; use_crypt = 1;
cipher_pairwise = wpa_s->pairwise_cipher; cipher_pairwise = wpa_s->pairwise_cipher;
@ -2796,14 +2812,11 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
params.beacon_int = wpa_s->conf->beacon_int; params.beacon_int = wpa_s->conf->beacon_int;
} }
params.wpa_ie = wpa_ie;
params.wpa_ie_len = wpa_ie_len;
params.pairwise_suite = cipher_pairwise; params.pairwise_suite = cipher_pairwise;
params.group_suite = cipher_group; params.group_suite = cipher_group;
params.mgmt_group_suite = cipher_group_mgmt; params.mgmt_group_suite = cipher_group_mgmt;
params.key_mgmt_suite = wpa_s->key_mgmt; params.key_mgmt_suite = wpa_s->key_mgmt;
params.wpa_proto = wpa_s->wpa_proto; params.wpa_proto = wpa_s->wpa_proto;
params.auth_alg = algs;
wpa_s->auth_alg = params.auth_alg; wpa_s->auth_alg = params.auth_alg;
params.mode = ssid->mode; params.mode = ssid->mode;
params.bg_scan_period = ssid->bg_scan_period; params.bg_scan_period = ssid->bg_scan_period;