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:
parent
1f14e2bf92
commit
5cc6ec0f68
2 changed files with 16 additions and 5 deletions
|
@ -57,7 +57,11 @@ 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);
|
||||||
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 {
|
} else {
|
||||||
if (!p2p->ssid_set) {
|
if (!p2p->ssid_set) {
|
||||||
p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len);
|
p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len);
|
||||||
|
|
|
@ -3546,17 +3546,24 @@ 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
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*group_iface = wpas_p2p_create_iface(wpa_s);
|
|
||||||
if (!s)
|
|
||||||
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);
|
||||||
*ssid_len = s->ssid_len;
|
*ssid_len = s->ssid_len;
|
||||||
|
|
Loading…
Reference in a new issue