From c5c2d942c576d91213ac6a10fb632c92b935dc00 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Thu, 27 Feb 2014 16:36:03 +0200 Subject: [PATCH] P2P: Cancel offchannel TX wait on PD Response TX status PD Response is sent out using a 200 ms offchannel wait, but that wait was not cancelled on TX status report. This could result in offchannel operation being left waiting unnecessarily long. Fix this by making the P2P_NO_PENDING_ACTION case in Action TX callback cancel the wait if a pending wait is marked (and mark this for PD Response). Signed-off-by: Jouni Malinen --- src/p2p/p2p.c | 4 ++++ src/p2p/p2p_i.h | 1 + src/p2p/p2p_pd.c | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index 6f3cd6877..4b909898f 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -2990,6 +2990,10 @@ void p2p_send_action_cb(struct p2p_data *p2p, unsigned int freq, const u8 *dst, p2p->pending_action_state = P2P_NO_PENDING_ACTION; switch (state) { case P2P_NO_PENDING_ACTION: + if (p2p->send_action_in_progress) { + p2p->send_action_in_progress = 0; + p2p->cfg->send_action_done(p2p->cfg->cb_ctx); + } if (p2p->after_scan_tx_in_progress) { p2p->after_scan_tx_in_progress = 0; if (p2p->start_after_scan != P2P_AFTER_SCAN_NOTHING && diff --git a/src/p2p/p2p_i.h b/src/p2p/p2p_i.h index 6de346166..420c7391b 100644 --- a/src/p2p/p2p_i.h +++ b/src/p2p/p2p_i.h @@ -389,6 +389,7 @@ struct p2p_data { u8 after_scan_peer[ETH_ALEN]; struct p2p_pending_action_tx *after_scan_tx; unsigned int after_scan_tx_in_progress:1; + unsigned int send_action_in_progress:1; /* Requested device types for find/search */ unsigned int num_req_dev_types; diff --git a/src/p2p/p2p_pd.c b/src/p2p/p2p_pd.c index 409405fb2..68d79d239 100644 --- a/src/p2p/p2p_pd.c +++ b/src/p2p/p2p_pd.c @@ -224,7 +224,8 @@ out: p2p->cfg->dev_addr, wpabuf_head(resp), wpabuf_len(resp), 200) < 0) { p2p_dbg(p2p, "Failed to send Action frame"); - } + } else + p2p->send_action_in_progress = 1; wpabuf_free(resp);