diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index b9c431f17..6bbc950b2 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -151,14 +151,14 @@ u16 p2p_get_provisioning_info(struct p2p_data *p2p, const u8 *addr) } -void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *iface_addr) +void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *addr) { struct p2p_device *dev = NULL; - if (!iface_addr || !p2p) + if (!addr || !p2p) return; - dev = p2p_get_device_interface(p2p, iface_addr); + dev = p2p_get_device(p2p, addr); if (dev) dev->wps_prov_info = 0; } diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h index a5192f49e..f8fa0616c 100644 --- a/src/p2p/p2p.h +++ b/src/p2p/p2p.h @@ -1061,12 +1061,12 @@ u16 p2p_get_provisioning_info(struct p2p_data *p2p, const u8 *addr); /** * p2p_clear_provisioning_info - Clear any stored provisioning info * @p2p: P2P module context from p2p_init() - * @iface_addr: Peer P2P Interface Address + * @iface_addr: Peer P2P Device Address * * This function is used to clear stored WPS provisioning info for the given * peer. */ -void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *iface_addr); +void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *addr); /* Event notifications from lower layer driver operations */ diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index f70f7900b..486a551c4 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -2446,7 +2446,7 @@ void wpas_p2p_deinit(struct wpa_supplicant *wpa_s) /* Clear any stored provisioning info */ p2p_clear_provisioning_info( wpa_s->global->p2p, - wpa_s->go_params->peer_interface_addr); + wpa_s->go_params->peer_device_addr); } os_free(wpa_s->go_params); @@ -3482,14 +3482,22 @@ struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s, void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr, int registrar) { + struct wpa_ssid *ssid = wpa_s->current_ssid; + if (!wpa_s->p2p_in_provisioning) { wpa_printf(MSG_DEBUG, "P2P: Ignore WPS success event - P2P " "provisioning not in progress"); return; } - /* Clear any stored provisioning info */ - p2p_clear_provisioning_info(wpa_s->global->p2p, peer_addr); + if (ssid && ssid->mode == WPAS_MODE_INFRA) { + u8 go_dev_addr[ETH_ALEN]; + os_memcpy(go_dev_addr, wpa_s->bssid, ETH_ALEN); + wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid, + ssid->ssid_len); + /* Clear any stored provisioning info */ + p2p_clear_provisioning_info(wpa_s->global->p2p, go_dev_addr); + } eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent, NULL); @@ -3513,7 +3521,7 @@ void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s, if (wpa_s->go_params) { p2p_clear_provisioning_info( wpa_s->global->p2p, - wpa_s->go_params->peer_interface_addr); + wpa_s->go_params->peer_device_addr); } wpas_notify_p2p_wps_failed(wpa_s, fail);