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 <andrei.otcheretianski@intel.com>
Reviewed-by: Max Stepanov <Max.Stepanov@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
Andrei Otcheretianski 2015-07-02 10:45:07 +03:00 committed by Jouni Malinen
parent 1f14e2bf92
commit 5cc6ec0f68
2 changed files with 16 additions and 5 deletions

View file

@ -57,6 +57,10 @@ static void p2ps_add_new_group_info(struct p2p_data *p2p, struct wpabuf *buf)
if (found) { if (found) {
p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, p2p_buf_add_group_id(buf, p2p->cfg->dev_addr,
ssid, ssid_len); ssid, ssid_len);
if (group_iface)
p2p_buf_add_intended_addr(buf, p2p->intended_addr);
else
p2p_buf_add_intended_addr(buf, intended_addr); p2p_buf_add_intended_addr(buf, intended_addr);
} else { } else {
if (!p2p->ssid_set) { if (!p2p->ssid_set) {

View file

@ -3546,16 +3546,23 @@ static int wpas_get_go_info(void *ctx, u8 *intended_addr,
struct wpa_ssid *s; struct wpa_ssid *s;
u8 bssid[ETH_ALEN]; 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); s = wpas_p2p_group_go_ssid(wpa_s, bssid);
if (!s) { if (!s) {
s = wpas_p2p_get_persistent_go(wpa_s); s = wpas_p2p_get_persistent_go(wpa_s);
*group_iface = wpas_p2p_create_iface(wpa_s);
if (s) if (s)
os_memcpy(bssid, s->bssid, ETH_ALEN); os_memcpy(bssid, s->bssid, ETH_ALEN);
} else
*group_iface = wpas_p2p_create_iface(wpa_s);
if (!s)
return 0; return 0;
}
os_memcpy(intended_addr, bssid, ETH_ALEN); os_memcpy(intended_addr, bssid, ETH_ALEN);
os_memcpy(ssid, s->ssid, s->ssid_len); os_memcpy(ssid, s->ssid, s->ssid_len);