From: Johannes Berg There's an inconsistency in that when a scan times out, the P2P state machine will only do p2p_run_after_scan(), and not continue with a search. Since there's infrastructure for "do something after scan", use that for the case of p2p_continue_find(). Signed-off-by: Johannes Berg --- src/p2p/p2p.c | 21 ++++++++++----------- src/p2p/p2p_i.h | 3 ++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index a088826..5c0148b 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -671,6 +671,7 @@ static void p2p_search(struct p2p_data *p2p) } else { wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Running p2p_scan"); p2p->p2p_scan_running = 1; + p2p->start_after_scan = P2P_AFTER_SCAN_CONTINUE_FIND; eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL); eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout, p2p, NULL); @@ -686,7 +687,7 @@ static void p2p_find_timeout(void *eloop_ctx, void *timeout_ctx) } -static int p2p_run_after_scan(struct p2p_data *p2p) +static void p2p_run_after_scan(struct p2p_data *p2p) { struct p2p_device *dev; enum p2p_after_scan op; @@ -707,7 +708,7 @@ static int p2p_run_after_scan(struct p2p_data *p2p) p2p->after_scan_tx->wait_time); os_free(p2p->after_scan_tx); p2p->after_scan_tx = NULL; - return 1; + return; } op = p2p->start_after_scan; @@ -715,12 +716,15 @@ static int p2p_run_after_scan(struct p2p_data *p2p) switch (op) { case P2P_AFTER_SCAN_NOTHING: break; + case P2P_AFTER_SCAN_CONTINUE_FIND: + p2p_continue_find(p2p); + break; case P2P_AFTER_SCAN_LISTEN: wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Start previously " "requested Listen state"); p2p_listen(p2p, p2p->pending_listen_sec * 1000 + p2p->pending_listen_usec / 1000); - return 1; + break; case P2P_AFTER_SCAN_CONNECT: wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Start previously " "requested connect with " MACSTR, @@ -732,10 +736,8 @@ static int p2p_run_after_scan(struct p2p_data *p2p) break; } p2p_connect_send(p2p, dev); - return 1; + break; } - - return 0; } @@ -765,7 +767,7 @@ int p2p_find(struct p2p_data *p2p, unsigned int timeout, wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: p2p_scan is " "already running"); } - p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING; + p2p->start_after_scan = P2P_AFTER_SCAN_CONTINUE_FIND; p2p_clear_timeout(p2p); p2p->cfg->stop_listen(p2p->cfg->cb_ctx); p2p->find_type = type; @@ -2095,10 +2097,7 @@ void p2p_scan_res_handled(struct p2p_data *p2p) p2p->p2p_scan_running = 0; eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL); - if (p2p_run_after_scan(p2p)) - return; - if (p2p->state == P2P_SEARCH) - p2p_continue_find(p2p); + p2p_run_after_scan(p2p); } diff --git a/src/p2p/p2p_i.h b/src/p2p/p2p_i.h index c31f23a..48dedbe 100644 --- a/src/p2p/p2p_i.h +++ b/src/p2p/p2p_i.h @@ -359,7 +359,8 @@ struct p2p_data { enum p2p_after_scan { P2P_AFTER_SCAN_NOTHING, P2P_AFTER_SCAN_LISTEN, - P2P_AFTER_SCAN_CONNECT + P2P_AFTER_SCAN_CONNECT, + P2P_AFTER_SCAN_CONTINUE_FIND } start_after_scan; u8 after_scan_peer[ETH_ALEN]; struct p2p_pending_action_tx *after_scan_tx; -- 1.7.2.3