From: Andrei Otcheretianski Date: Thu, 2 Jul 2015 07:45:07 +0000 (+0300) Subject: P2PS: Set intended interface address correctly for new group X-Git-Tag: hostap_2_5~444 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=mech_eap.git;a=commitdiff_plain;h=5cc6ec0f6888ff662fdb2b33d500fe8579a8b09f P2PS: Set intended interface address correctly for new group If a device may be an explicit GO, it adds the GO details in the PD Request. First, we try to reuse an active GO. If it is not present, we try to reuse a non-active persistent group. In the latter case, if a dedicated P2P interface is needed, the intended address should be that of the pending interface. However, the wpas_get_go_info() provided the ssid->bssid address, which is the address of the P2P device. This might result in an incorrect intended interface attribute in the PD Request in case a separate group interface is used. Fix this by setting group_iface variable to true only if a dedicated interface should be used and set the attribute accordingly. Signed-off-by: Andrei Otcheretianski Reviewed-by: Max Stepanov Reviewed-by: Ilan Peer --- diff --git a/src/p2p/p2p_pd.c b/src/p2p/p2p_pd.c index 532c6f0..1342231 100644 --- a/src/p2p/p2p_pd.c +++ b/src/p2p/p2p_pd.c @@ -57,7 +57,11 @@ static void p2ps_add_new_group_info(struct p2p_data *p2p, struct wpabuf *buf) if (found) { p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, ssid, ssid_len); - p2p_buf_add_intended_addr(buf, intended_addr); + + if (group_iface) + p2p_buf_add_intended_addr(buf, p2p->intended_addr); + else + p2p_buf_add_intended_addr(buf, intended_addr); } else { if (!p2p->ssid_set) { p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len); diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 9e2760f..ce06e61 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -3546,17 +3546,24 @@ static int wpas_get_go_info(void *ctx, u8 *intended_addr, struct wpa_ssid *s; u8 bssid[ETH_ALEN]; + /* + * group_iface will be set to 1 only if a dedicated interface for P2P + * role is required. First, we try to reuse an active GO. However, + * if it is not present, we will try to reactivate an existing + * persistent group and set group_iface to 1, so the caller will know + * that the pending interface should be used. + */ + *group_iface = 0; s = wpas_p2p_group_go_ssid(wpa_s, bssid); if (!s) { s = wpas_p2p_get_persistent_go(wpa_s); + *group_iface = wpas_p2p_create_iface(wpa_s); if (s) os_memcpy(bssid, s->bssid, ETH_ALEN); + else + return 0; } - *group_iface = wpas_p2p_create_iface(wpa_s); - if (!s) - return 0; - os_memcpy(intended_addr, bssid, ETH_ALEN); os_memcpy(ssid, s->ssid, s->ssid_len); *ssid_len = s->ssid_len;