Do not clear PMKSA entry or EAP session cache if config does not change
[mech_eap.git] / wpa_supplicant / ap.c
index 03c3fab..b133d03 100644 (file)
@@ -262,12 +262,12 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
        bss->force_per_enrollee_psk = wpa_s->global->p2p_per_sta_psk;
 
        if (ssid->p2p_group) {
-               os_memcpy(bss->ip_addr_go, wpa_s->parent->conf->ip_addr_go, 4);
-               os_memcpy(bss->ip_addr_mask, wpa_s->parent->conf->ip_addr_mask,
+               os_memcpy(bss->ip_addr_go, wpa_s->p2pdev->conf->ip_addr_go, 4);
+               os_memcpy(bss->ip_addr_mask, wpa_s->p2pdev->conf->ip_addr_mask,
                          4);
                os_memcpy(bss->ip_addr_start,
-                         wpa_s->parent->conf->ip_addr_start, 4);
-               os_memcpy(bss->ip_addr_end, wpa_s->parent->conf->ip_addr_end,
+                         wpa_s->p2pdev->conf->ip_addr_start, 4);
+               os_memcpy(bss->ip_addr_end, wpa_s->p2pdev->conf->ip_addr_end,
                          4);
        }
 #endif /* CONFIG_P2P */
@@ -487,14 +487,14 @@ static void ap_wps_event_cb(void *ctx, enum wps_event event,
        if (event == WPS_EV_FAIL) {
                struct wps_event_fail *fail = &data->fail;
 
-               if (wpa_s->parent && wpa_s->parent != wpa_s &&
+               if (wpa_s->p2pdev && wpa_s->p2pdev != wpa_s &&
                    wpa_s == wpa_s->global->p2p_group_formation) {
                        /*
                         * src/ap/wps_hostapd.c has already sent this on the
                         * main interface, so only send on the parent interface
                         * here if needed.
                         */
-                       wpa_msg(wpa_s->parent, MSG_INFO, WPS_EVENT_FAIL
+                       wpa_msg(wpa_s->p2pdev, MSG_INFO, WPS_EVENT_FAIL
                                "msg=%d config_error=%d",
                                fail->msg, fail->config_error);
                }
@@ -639,8 +639,8 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
                params.p2p = 1;
 #endif /* CONFIG_P2P */
 
-       if (wpa_s->parent->set_ap_uapsd)
-               params.uapsd = wpa_s->parent->ap_uapsd;
+       if (wpa_s->p2pdev->set_ap_uapsd)
+               params.uapsd = wpa_s->p2pdev->ap_uapsd;
        else if (params.p2p && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_UAPSD))
                params.uapsd = 1; /* mandatory for P2P GO */
        else
@@ -719,7 +719,7 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
                }
 
                hapd_iface->bss[i]->msg_ctx = wpa_s;
-               hapd_iface->bss[i]->msg_ctx_parent = wpa_s->parent;
+               hapd_iface->bss[i]->msg_ctx_parent = wpa_s->p2pdev;
                hapd_iface->bss[i]->public_action_cb = ap_public_action_rx;
                hapd_iface->bss[i]->public_action_cb_ctx = wpa_s;
                hapd_iface->bss[i]->vendor_action_cb = ap_vendor_action_rx;
@@ -915,7 +915,10 @@ int wpa_supplicant_ap_wps_pin(struct wpa_supplicant *wpa_s, const u8 *bssid,
                return -1;
 
        if (pin == NULL) {
-               unsigned int rpin = wps_generate_pin();
+               unsigned int rpin;
+
+               if (wps_generate_pin(&rpin) < 0)
+                       return -1;
                ret_len = os_snprintf(buf, buflen, "%08d", rpin);
                if (os_snprintf_error(buflen, ret_len))
                        return -1;
@@ -981,7 +984,8 @@ const char * wpas_wps_ap_pin_random(struct wpa_supplicant *wpa_s, int timeout)
        if (wpa_s->ap_iface == NULL)
                return NULL;
        hapd = wpa_s->ap_iface->bss[0];
-       pin = wps_generate_pin();
+       if (wps_generate_pin(&pin) < 0)
+               return NULL;
        os_snprintf(pin_txt, sizeof(pin_txt), "%08u", pin);
        os_free(hapd->conf->ap_pin);
        hapd->conf->ap_pin = os_strdup(pin_txt);
@@ -1316,8 +1320,8 @@ int wpas_ap_wps_add_nfc_pw(struct wpa_supplicant *wpa_s, u16 pw_id,
        hapd = wpa_s->ap_iface->bss[0];
        wps = hapd->wps;
 
-       if (wpa_s->parent->conf->wps_nfc_dh_pubkey == NULL ||
-           wpa_s->parent->conf->wps_nfc_dh_privkey == NULL) {
+       if (wpa_s->p2pdev->conf->wps_nfc_dh_pubkey == NULL ||
+           wpa_s->p2pdev->conf->wps_nfc_dh_privkey == NULL) {
                wpa_printf(MSG_DEBUG, "P2P: No NFC DH key known");
                return -1;
        }
@@ -1326,9 +1330,9 @@ int wpas_ap_wps_add_nfc_pw(struct wpa_supplicant *wpa_s, u16 pw_id,
        wpabuf_free(wps->dh_pubkey);
        wpabuf_free(wps->dh_privkey);
        wps->dh_privkey = wpabuf_dup(
-               wpa_s->parent->conf->wps_nfc_dh_privkey);
+               wpa_s->p2pdev->conf->wps_nfc_dh_privkey);
        wps->dh_pubkey = wpabuf_dup(
-               wpa_s->parent->conf->wps_nfc_dh_pubkey);
+               wpa_s->p2pdev->conf->wps_nfc_dh_pubkey);
        if (wps->dh_privkey == NULL || wps->dh_pubkey == NULL) {
                wps->dh_ctx = NULL;
                wpabuf_free(wps->dh_pubkey);
@@ -1362,6 +1366,58 @@ int wpas_ap_stop_ap(struct wpa_supplicant *wpa_s)
 #endif /* CONFIG_CTRL_IFACE */
 
 
+int wpas_ap_pmksa_cache_list(struct wpa_supplicant *wpa_s, char *buf,
+                            size_t len)
+{
+       size_t reply_len = 0, i;
+       char ap_delimiter[] = "---- AP ----\n";
+       char mesh_delimiter[] = "---- mesh ----\n";
+       size_t dlen;
+
+       if (wpa_s->ap_iface) {
+               dlen = os_strlen(ap_delimiter);
+               if (dlen > len - reply_len)
+                       return reply_len;
+               os_memcpy(&buf[reply_len], ap_delimiter, dlen);
+               reply_len += dlen;
+
+               for (i = 0; i < wpa_s->ap_iface->num_bss; i++) {
+                       reply_len += hostapd_ctrl_iface_pmksa_list(
+                               wpa_s->ap_iface->bss[i],
+                               &buf[reply_len], len - reply_len);
+               }
+       }
+
+       if (wpa_s->ifmsh) {
+               dlen = os_strlen(mesh_delimiter);
+               if (dlen > len - reply_len)
+                       return reply_len;
+               os_memcpy(&buf[reply_len], mesh_delimiter, dlen);
+               reply_len += dlen;
+
+               reply_len += hostapd_ctrl_iface_pmksa_list(
+                       wpa_s->ifmsh->bss[0], &buf[reply_len],
+                       len - reply_len);
+       }
+
+       return reply_len;
+}
+
+
+void wpas_ap_pmksa_cache_flush(struct wpa_supplicant *wpa_s)
+{
+       size_t i;
+
+       if (wpa_s->ap_iface) {
+               for (i = 0; i < wpa_s->ap_iface->num_bss; i++)
+                       hostapd_ctrl_iface_pmksa_flush(wpa_s->ap_iface->bss[i]);
+       }
+
+       if (wpa_s->ifmsh)
+               hostapd_ctrl_iface_pmksa_flush(wpa_s->ifmsh->bss[0]);
+}
+
+
 #ifdef NEED_AP_MLME
 void wpas_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
                                   struct dfs_event *radar)