|
@@ -6038,10 +6038,24 @@ static int p2p_ctrl_group_member(struct wpa_supplicant *wpa_s, const char *cmd,
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int wpas_find_p2p_dev_addr_bss(struct wpa_global *global,
|
|
|
+ const u8 *p2p_dev_addr)
|
|
|
+{
|
|
|
+ struct wpa_supplicant *wpa_s;
|
|
|
+
|
|
|
+ for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
|
|
|
+ if (wpa_bss_get_p2p_dev_addr(wpa_s, p2p_dev_addr))
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int p2p_ctrl_peer(struct wpa_supplicant *wpa_s, char *cmd,
|
|
|
char *buf, size_t buflen)
|
|
|
{
|
|
|
- u8 addr[ETH_ALEN], *addr_ptr;
|
|
|
+ u8 addr[ETH_ALEN], *addr_ptr, group_capab;
|
|
|
int next, res;
|
|
|
const struct p2p_peer_info *info;
|
|
|
char *pos, *end;
|
|
@@ -6070,6 +6084,16 @@ static int p2p_ctrl_peer(struct wpa_supplicant *wpa_s, char *cmd,
|
|
|
info = p2p_get_peer_info(wpa_s->global->p2p, addr_ptr, next);
|
|
|
if (info == NULL)
|
|
|
return -1;
|
|
|
+ group_capab = info->group_capab;
|
|
|
+
|
|
|
+ if (group_capab &&
|
|
|
+ !wpas_find_p2p_dev_addr_bss(wpa_s->global, info->p2p_device_addr)) {
|
|
|
+ wpa_printf(MSG_DEBUG,
|
|
|
+ "P2P: Could not find any BSS with p2p_dev_addr "
|
|
|
+ MACSTR ", hence override group_capab from 0x%x to 0",
|
|
|
+ MAC2STR(info->p2p_device_addr), group_capab);
|
|
|
+ group_capab = 0;
|
|
|
+ }
|
|
|
|
|
|
pos = buf;
|
|
|
end = buf + buflen;
|
|
@@ -6095,7 +6119,7 @@ static int p2p_ctrl_peer(struct wpa_supplicant *wpa_s, char *cmd,
|
|
|
info->serial_number,
|
|
|
info->config_methods,
|
|
|
info->dev_capab,
|
|
|
- info->group_capab,
|
|
|
+ group_capab,
|
|
|
info->level);
|
|
|
if (os_snprintf_error(end - pos, res))
|
|
|
return pos - buf;
|