From 91f9e6078f7dd8484581d25a73c6096555409fbc Mon Sep 17 00:00:00 2001 From: Kyeyoon Park Date: Wed, 6 Nov 2013 13:20:28 -0800 Subject: [PATCH] GAS: Replenish AP station session timer to 5 seconds If remaining AP session timeout is less than 5 seconds for an existing station, replenish the timeout to 5 seconds. This allows stations to be able to recycle a dialog token value beyond 5 seconds for GAS exchange. Signed-hostap: Jouni Malinen --- src/ap/gas_serv.c | 2 ++ src/ap/sta_info.c | 12 ++++++++++++ src/ap/sta_info.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/src/ap/gas_serv.c b/src/ap/gas_serv.c index b3574ba61..8349c4dd2 100644 --- a/src/ap/gas_serv.c +++ b/src/ap/gas_serv.c @@ -46,6 +46,8 @@ gas_dialog_create(struct hostapd_data *hapd, const u8 *addr, u8 dialog_token) * it to be that long. */ ap_sta_session_timeout(hapd, sta, 5); + } else { + ap_sta_replenish_timeout(hapd, sta, 5); } if (sta->gas_dialog == NULL) { diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c index 016b9b6ac..a6775f3f9 100644 --- a/src/ap/sta_info.c +++ b/src/ap/sta_info.c @@ -490,6 +490,18 @@ static void ap_handle_session_timer(void *eloop_ctx, void *timeout_ctx) } +void ap_sta_replenish_timeout(struct hostapd_data *hapd, struct sta_info *sta, + u32 session_timeout) +{ + if (eloop_replenish_timeout(session_timeout, 0, + ap_handle_session_timer, hapd, sta)) { + hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_DEBUG, "setting session timeout " + "to %d seconds", session_timeout); + } +} + + void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta, u32 session_timeout) { diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h index 197e46bcb..dc742195b 100644 --- a/src/ap/sta_info.h +++ b/src/ap/sta_info.h @@ -162,6 +162,8 @@ void ap_sta_hash_add(struct hostapd_data *hapd, struct sta_info *sta); void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta); void hostapd_free_stas(struct hostapd_data *hapd); void ap_handle_timer(void *eloop_ctx, void *timeout_ctx); +void ap_sta_replenish_timeout(struct hostapd_data *hapd, struct sta_info *sta, + u32 session_timeout); void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta, u32 session_timeout); void ap_sta_no_session_timeout(struct hostapd_data *hapd,