From: Benjamin Berg <bberg@xxxxxxxxxx> The p2p_long_listen value was set on the control wpa_s struct while in a lot of cases it operated on the p2p struct. Explicitly use the global p2p_init_wpa_s struct in cases where we might not be operating on it already. Without this, simply starting a p2p_listen operation (e.g. using wpa_cli) will not work properly. As the p2p_long_listen is set on the controlling interface and the wpas_p2p_cancel_remain_on_channel_cb works on the p2p_init_wpa_s, it would not actually work. This results in wpa_supplicant to stop listening after the maximum remain-on-channel time passes. -- I intent to look into creating a test case for this, but will likely only get around to do so next week. --- wpa_supplicant/p2p_supplicant.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index c596d5ab6..e8b6bb893 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -2288,7 +2288,7 @@ static void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res) wpas_start_wps_enrollee(group_wpa_s, res); } - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL); @@ -4507,7 +4507,7 @@ void wpas_p2p_deinit(struct wpa_supplicant *wpa_s) eloop_cancel_timeout(wpas_p2p_psk_failure_removal, wpa_s, NULL); eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL); eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL); wpas_p2p_remove_pending_group_interface(wpa_s); @@ -5389,7 +5389,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr, go_intent = wpa_s->conf->p2p_go_intent; if (!auth) - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; wpa_s->p2p_wps_method = wps_method; wpa_s->p2p_persistent_group = !!persistent_group; @@ -6690,7 +6690,7 @@ int wpas_p2p_find(struct wpa_supplicant *wpa_s, unsigned int timeout, u8 seek_cnt, const char **seek_string, int freq) { wpas_p2p_clear_pending_action_tx(wpa_s); - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL || wpa_s->p2p_in_provisioning) { @@ -6735,7 +6735,7 @@ static void wpas_p2p_scan_res_ignore_search(struct wpa_supplicant *wpa_s, static void wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s) { wpas_p2p_clear_pending_action_tx(wpa_s); - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); @@ -6761,7 +6761,7 @@ void wpas_p2p_stop_find(struct wpa_supplicant *wpa_s) static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx) { struct wpa_supplicant *wpa_s = eloop_ctx; - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; } @@ -6790,7 +6790,7 @@ int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout) timeout = 3600; } eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; /* * Stop previous find/listen operation to avoid trying to request a new @@ -6802,7 +6802,7 @@ int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout) res = wpas_p2p_listen_start(wpa_s, timeout * 1000); if (res == 0 && timeout * 1000 > wpa_s->max_remain_on_chan) { - wpa_s->p2p_long_listen = timeout * 1000; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = timeout * 1000; eloop_register_timeout(timeout, 0, wpas_p2p_long_listen_timeout, wpa_s, NULL); @@ -6909,7 +6909,7 @@ static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s) int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr) { - wpa_s->p2p_long_listen = 0; + wpa_s->global->p2p_init_wpa_s->p2p_long_listen = 0; if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) return -1; -- 2.21.0 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap