From a34317b52671b37cc5e04a37d14e0e812a7caf6b Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 26 Mar 2017 12:34:06 +0300 Subject: [PATCH] GAS: Handle no-ACK TX status for GAS request frames Previously, only the success and failure (to TX) cases were handled. It is also possible for the driver to transmit the frame, but not receive an ACK from the recipient. Address that by waiting for a short period of time for a response. This fixes cases where OSU provider icon fetching could get stuck if no ACK frame is received. Signed-off-by: Jouni Malinen --- wpa_supplicant/gas_query.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/wpa_supplicant/gas_query.c b/wpa_supplicant/gas_query.c index db481a591..91cf19a20 100644 --- a/wpa_supplicant/gas_query.c +++ b/wpa_supplicant/gas_query.c @@ -243,10 +243,17 @@ static void gas_query_tx_status(struct wpa_supplicant *wpa_s, } os_get_reltime(&query->last_oper); - if (result == OFFCHANNEL_SEND_ACTION_SUCCESS) { + if (result == OFFCHANNEL_SEND_ACTION_SUCCESS || + result == OFFCHANNEL_SEND_ACTION_NO_ACK) { eloop_cancel_timeout(gas_query_timeout, gas, query); - eloop_register_timeout(GAS_QUERY_TIMEOUT_PERIOD, 0, - gas_query_timeout, gas, query); + if (result == OFFCHANNEL_SEND_ACTION_NO_ACK) { + wpa_printf(MSG_DEBUG, "GAS: No ACK to GAS request"); + eloop_register_timeout(0, 250000, + gas_query_timeout, gas, query); + } else { + eloop_register_timeout(GAS_QUERY_TIMEOUT_PERIOD, 0, + gas_query_timeout, gas, query); + } if (query->wait_comeback && !query->retry) { eloop_cancel_timeout(gas_query_rx_comeback_timeout, gas, query);