static void wpa_bss_update_pending_connect(struct wpa_supplicant *wpa_s, struct wpa_bss *old_bss, struct wpa_bss *new_bss) { struct wpa_radio_work *work; struct wpa_connect_work *cwork; work = radio_work_pending(wpa_s, "sme-connect"); if (!work) work = radio_work_pending(wpa_s, "connect"); if (!work) return; cwork = work->ctx; if (cwork->bss != old_bss) return; wpa_printf(MSG_DEBUG, "Update BSS pointer for the pending connect radio work"); cwork->bss = new_bss; if (!new_bss) cwork->bss_removed = 1; }
void sme_authenticate(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, struct wpa_ssid *ssid) { struct wpa_connect_work *cwork; if (bss == NULL || ssid == NULL) return; if (wpa_s->connect_work) { wpa_dbg(wpa_s, MSG_DEBUG, "SME: Reject sme_authenticate() call since connect_work exist"); return; } if (radio_work_pending(wpa_s, "sme-connect")) { /* * The previous sme-connect work might no longer be valid due to * the fact that the BSS list was updated. In addition, it makes * sense to adhere to the 'newer' decision. */ wpa_dbg(wpa_s, MSG_DEBUG, "SME: Remove previous pending sme-connect"); radio_remove_works(wpa_s, "sme-connect", 0, 1); } cwork = os_zalloc(sizeof(*cwork)); if (cwork == NULL) return; cwork->bss = bss; cwork->ssid = ssid; cwork->sme = 1; #ifdef CONFIG_SAE wpa_s->sme.sae.state = SAE_NOTHING; wpa_s->sme.sae.send_confirm = 0; wpa_s->sme.sae_group_index = 0; #endif /* CONFIG_SAE */ if (radio_add_work(wpa_s, bss->freq, "sme-connect", 1, sme_auth_start_cb, cwork) < 0) wpas_connect_work_free(cwork); }