Beispiel #1
0
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);
}