From 8a4404c51f92f3d6f38e1167adc70dffb9388bc6 Mon Sep 17 00:00:00 2001 From: Martin Ger Date: Tue, 20 Feb 2018 11:55:49 +0100 Subject: [PATCH] Add user level connection timeout --- src/mqtt/mqtt_server.h | 1 + src/mqtt_server.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/mqtt/mqtt_server.h b/src/mqtt/mqtt_server.h index 3e8e0e6..ae3523b 100644 --- a/src/mqtt/mqtt_server.h +++ b/src/mqtt/mqtt_server.h @@ -32,6 +32,7 @@ typedef struct _MQTT_ClientCon { // MqttDataCallback dataCb; ETSTimer mqttTimer; uint32_t sendTimeout; + uint32_t connectionTimeout; tConnState connState; QUEUE msgQueue; uint8_t protocolVersion; diff --git a/src/mqtt_server.c b/src/mqtt_server.c index 47d4266..007ced9 100644 --- a/src/mqtt_server.c +++ b/src/mqtt_server.c @@ -268,6 +268,13 @@ void ICACHE_FLASH_ATTR mqtt_server_timer(void *arg) { if (clientcon->sendTimeout > 0) clientcon->sendTimeout--; + + if (clientcon->connectionTimeout > 0) { + clientcon->connectionTimeout--; + } else { + MQTT_WARNING("MQTT: Connection timeout %ds\r\n", 2*clientcon->connect_info.keepalive+10); + MQTT_server_disconnectClientCon(clientcon); + } } bool ICACHE_FLASH_ATTR delete_client_by_id(const uint8_t *id) { @@ -776,6 +783,8 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_recv_cb(void *arg, char *pdata, uns break; } + clientcon->connectionTimeout = 2 * clientcon->connect_info.keepalive+10; + // More than one MQTT command in the packet? len = clientcon->mqtt_state.message_length_read; if (clientcon->mqtt_state.message_length < len) { @@ -859,6 +868,7 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_connected_cb(void *arg) { MQTT_server_initClientCon(mqttClientCon); + mqttClientCon->connectionTimeout = 40; os_timer_setfn(&mqttClientCon->mqttTimer, (os_timer_func_t *) mqtt_server_timer, mqttClientCon); os_timer_arm(&mqttClientCon->mqttTimer, 1000, 1); }