aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant
diff options
context:
space:
mode:
authorJouni Malinen <jouni@qca.qualcomm.com>2015-02-02 12:00:00 (GMT)
committerJouni Malinen <j@w1.fi>2015-02-02 12:09:18 (GMT)
commit66eaf8a2c23915e9e3fe262e18625db251f01fcc (patch)
tree5e6da0afe7bb9b6c4503c4919e24d74a6b1bbd61 /wpa_supplicant
parentc5e154c037b2800ed51950b2ea8caa1f10590762 (diff)
downloadhostap-66eaf8a2c23915e9e3fe262e18625db251f01fcc.zip
hostap-66eaf8a2c23915e9e3fe262e18625db251f01fcc.tar.gz
hostap-66eaf8a2c23915e9e3fe262e18625db251f01fcc.tar.bz2
Fix driver-offloaded offchannel TX done processing
It was possible for a Action frame sequence completion to stop an ongoing offchannel remain-on-channel operation unexpectedly in cases where TX operation was offloaded to the driver and such an operation happened to occur during a previously started remain-on-channel (e.g., for P2P listen state). Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Diffstat (limited to 'wpa_supplicant')
-rw-r--r--wpa_supplicant/offchannel.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/wpa_supplicant/offchannel.c b/wpa_supplicant/offchannel.c
index 7a86347..63af83a 100644
--- a/wpa_supplicant/offchannel.c
+++ b/wpa_supplicant/offchannel.c
@@ -354,15 +354,18 @@ int offchannel_send_action(struct wpa_supplicant *wpa_s, unsigned int freq,
*/
void offchannel_send_action_done(struct wpa_supplicant *wpa_s)
{
- wpa_printf(MSG_DEBUG, "Off-channel: Action frame sequence done "
- "notification");
+ wpa_printf(MSG_DEBUG,
+ "Off-channel: Action frame sequence done notification: pending_action_tx=%p drv_offchan_tx=%d action_tx_wait_time=%d off_channel_freq=%d roc_waiting_drv_freq=%d",
+ wpa_s->pending_action_tx,
+ !!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX),
+ wpa_s->action_tx_wait_time, wpa_s->off_channel_freq,
+ wpa_s->roc_waiting_drv_freq);
wpabuf_free(wpa_s->pending_action_tx);
wpa_s->pending_action_tx = NULL;
if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX &&
wpa_s->action_tx_wait_time)
wpa_drv_send_action_cancel_wait(wpa_s);
-
- if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
+ else if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
wpa_drv_cancel_remain_on_channel(wpa_s);
wpa_s->off_channel_freq = 0;
wpa_s->roc_waiting_drv_freq = 0;