P2P: Use 500 ms search delay by default during concurrent operations
If the p2p_find command is used without the delay parameter, a 500 ms default search delay will now be used when any interface using the same radio is in an concurrent operation. "p2p_find delay=0" can be used to enforce the old behavior in such a case if needed. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
37448ede31
commit
05a77b3b46
3 changed files with 46 additions and 2 deletions
|
@ -2958,7 +2958,7 @@ static int p2p_ctrl_find(struct wpa_supplicant *wpa_s, char *cmd)
|
|||
enum p2p_discovery_type type = P2P_FIND_START_WITH_FULL;
|
||||
u8 dev_id[ETH_ALEN], *_dev_id = NULL;
|
||||
char *pos;
|
||||
unsigned int search_delay = 0;
|
||||
unsigned int search_delay;
|
||||
|
||||
if (os_strstr(cmd, "type=social"))
|
||||
type = P2P_FIND_ONLY_SOCIAL;
|
||||
|
@ -2977,7 +2977,8 @@ static int p2p_ctrl_find(struct wpa_supplicant *wpa_s, char *cmd)
|
|||
if (pos) {
|
||||
pos += 6;
|
||||
search_delay = atoi(pos);
|
||||
}
|
||||
} else
|
||||
search_delay = wpas_p2p_search_delay(wpa_s);
|
||||
|
||||
return wpas_p2p_find(wpa_s, timeout, type, 0, NULL, _dev_id,
|
||||
search_delay);
|
||||
|
|
|
@ -57,6 +57,10 @@
|
|||
#define P2P_MAX_INITIAL_CONN_WAIT 10
|
||||
#endif /* P2P_MAX_INITIAL_CONN_WAIT */
|
||||
|
||||
#ifndef P2P_CONCURRENT_SEARCH_DELAY
|
||||
#define P2P_CONCURRENT_SEARCH_DELAY 500
|
||||
#endif /* P2P_CONCURRENT_SEARCH_DELAY */
|
||||
|
||||
enum p2p_group_removal_reason {
|
||||
P2P_GROUP_REMOVAL_UNKNOWN,
|
||||
P2P_GROUP_REMOVAL_SILENT,
|
||||
|
@ -4982,3 +4986,41 @@ int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s)
|
|||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s)
|
||||
{
|
||||
const char *rn, *rn2;
|
||||
struct wpa_supplicant *ifs;
|
||||
|
||||
if (wpa_s->wpa_state > WPA_SCANNING) {
|
||||
wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search delay due to "
|
||||
"concurrent operation",
|
||||
P2P_CONCURRENT_SEARCH_DELAY);
|
||||
return P2P_CONCURRENT_SEARCH_DELAY;
|
||||
}
|
||||
|
||||
if (!wpa_s->driver->get_radio_name)
|
||||
return 0;
|
||||
rn = wpa_s->driver->get_radio_name(wpa_s->drv_priv);
|
||||
if (rn == NULL || rn[0] == '\0')
|
||||
return 0;
|
||||
|
||||
for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
|
||||
if (ifs == wpa_s || !ifs->driver->get_radio_name)
|
||||
continue;
|
||||
|
||||
rn2 = ifs->driver->get_radio_name(ifs->drv_priv);
|
||||
if (!rn2 || os_strcmp(rn, rn2) != 0)
|
||||
continue;
|
||||
if (ifs->wpa_state > WPA_SCANNING) {
|
||||
wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search "
|
||||
"delay due to concurrent operation on "
|
||||
"interface %s",
|
||||
P2P_CONCURRENT_SEARCH_DELAY, ifs->ifname);
|
||||
return P2P_CONCURRENT_SEARCH_DELAY;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -143,5 +143,6 @@ void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
|
|||
int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s);
|
||||
int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
|
||||
struct hostapd_hw_modes *mode, u8 channel);
|
||||
unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s);
|
||||
|
||||
#endif /* P2P_SUPPLICANT_H */
|
||||
|
|
Loading…
Reference in a new issue