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:
parent
084131c850
commit
d2ba0d719e
1 changed files with 130 additions and 117 deletions
|
@ -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(¶ms, 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(¶ms, 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, ¶ms);
|
||||||
|
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;
|
||||||
|
|
Loading…
Reference in a new issue