diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 18686e598..9cb385fdf 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -2670,6 +2670,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr, u8 bssid[ETH_ALEN]; int ret = 0; enum wpa_driver_if_type iftype; + const u8 *if_addr; if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) return -1; @@ -2765,44 +2766,34 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr, wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s); - if (!wpa_s->create_p2p_iface) { - if (auth) { - if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method, - go_intent, wpa_s->own_addr, - force_freq, persistent_group) - < 0) - return -1; - return ret; - } - if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method, - go_intent, wpa_s->own_addr, - force_freq, persistent_group) < 0) + if (wpa_s->create_p2p_iface) { + /* Prepare to add a new interface for the group */ + iftype = WPA_IF_P2P_GROUP; + if (go_intent == 15) + iftype = WPA_IF_P2P_GO; + if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) { + wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new " + "interface for the group"); return -1; - return ret; - } + } - /* Prepare to add a new interface for the group */ - iftype = WPA_IF_P2P_GROUP; - if (go_intent == 15) - iftype = WPA_IF_P2P_GO; - if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) { - wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new " - "interface for the group"); - return -1; - } + if_addr = wpa_s->pending_interface_addr; + } else + if_addr = wpa_s->own_addr; if (auth) { if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method, - go_intent, - wpa_s->pending_interface_addr, + go_intent, if_addr, force_freq, persistent_group) < 0) return -1; return ret; } - if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method, go_intent, - wpa_s->pending_interface_addr, - force_freq, persistent_group) < 0) { - wpas_p2p_remove_pending_group_interface(wpa_s); + + if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method, + go_intent, if_addr, force_freq, + persistent_group) < 0) { + if (wpa_s->create_p2p_iface) + wpas_p2p_remove_pending_group_interface(wpa_s); return -1; } return ret;