|
16 | 16 | #include "azure_umqtt_c/mqtt_codec.h"
|
17 | 17 | #include <inttypes.h>
|
18 | 18 |
|
19 | | -#define KEEP_ALIVE_BUFFER_SEC 10 |
20 | 19 | #define VARIABLE_HEADER_OFFSET 2
|
21 | 20 | #define RETAIN_FLAG_MASK 0x1
|
22 | 21 | #define QOS_LEAST_ONCE_FLAG_MASK 0x2
|
|
25 | 24 | #define CONNECT_PACKET_MASK 0xf0
|
26 | 25 | #define TIME_MAX_BUFFER 16
|
27 | 26 | #define DEFAULT_MAX_PING_RESPONSE_TIME 80 // % of time to send pings
|
28 | | -#define MAX_CLOSE_RETRIES 10 |
| 27 | +#define MAX_CLOSE_RETRIES 2 |
29 | 28 |
|
30 | | -static const char* TRUE_CONST = "true"; |
31 | | -static const char* FALSE_CONST = "false"; |
| 29 | +static const char* constTRUE_CONST = "true"; |
| 30 | +static const char* constFALSE_CONST = "false"; |
32 | 31 |
|
33 | 32 | DEFINE_ENUM_STRINGS(QOS_VALUE, QOS_VALUE_VALUES);
|
34 | 33 |
|
@@ -73,17 +72,28 @@ static void on_connection_closed(void* context)
|
73 | 72 |
|
74 | 73 | static void close_connection(MQTT_CLIENT* mqtt_client)
|
75 | 74 | {
|
76 | | - (void)xio_close(mqtt_client->xioHandle, on_connection_closed, mqtt_client); |
77 | | - if (mqtt_client->disconnect_cb == NULL) |
| 75 | + if (mqtt_client->socketConnected) |
78 | 76 | {
|
79 | | - size_tcounter=0; |
80 | | - do |
| 77 | + (void)xio_close(mqtt_client->xioHandle, on_connection_closed, mqtt_client); |
| 78 | + if (mqtt_client->disconnect_cb==NULL) |
81 | 79 | {
|
82 | | - xio_dowork(mqtt_client->xioHandle); |
83 | | - counter++; |
84 | | - ThreadAPI_Sleep(2); |
85 | | - } while (mqtt_client->clientConnected && counter < MAX_CLOSE_RETRIES); |
| 80 | + size_t counter = 0; |
| 81 | + do |
| 82 | + { |
| 83 | + xio_dowork(mqtt_client->xioHandle); |
| 84 | + counter++; |
| 85 | + ThreadAPI_Sleep(2); |
| 86 | + } while (mqtt_client->clientConnected && counter < MAX_CLOSE_RETRIES); |
| 87 | + } |
| 88 | + } |
| 89 | + else |
| 90 | + { |
| 91 | + if (mqtt_client->disconnect_cb) |
| 92 | + { |
| 93 | + mqtt_client->disconnect_cb(mqtt_client->disconnect_ctx); |
| 94 | + } |
86 | 95 | }
|
| 96 | + mqtt_client->xioHandle = NULL; |
87 | 97 | }
|
88 | 98 |
|
89 | 99 | static void set_error_callback(MQTT_CLIENT* mqtt_client, MQTT_CLIENT_EVENT_ERROR error_type)
|
@@ -1153,43 +1163,56 @@ int mqtt_client_disconnect(MQTT_CLIENT_HANDLE handle, ON_MQTT_DISCONNECTED_CALLB
|
1153 | 1163 | }
|
1154 | 1164 | else
|
1155 | 1165 | {
|
1156 | | - BUFFER_HANDLE disconnectPacket = mqtt_codec_disconnect(); |
1157 | | - if (disconnectPacket == NULL) |
| 1166 | + if (mqtt_client->clientConnected) |
1158 | 1167 | {
|
1159 | | - /*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/ |
1160 | | - LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect failed"); |
1161 | | - mqtt_client->packetState = PACKET_TYPE_ERROR; |
1162 | | - result = __FAILURE__; |
1163 | | - } |
1164 | | - else |
1165 | | - { |
1166 | | - /* Codes_SRS_MQTT_CLIENT_07_037: [ if callback is not NULL callback shall be called once the mqtt connection has been disconnected ] */ |
1167 | | - mqtt_client->disconnect_cb = callback; |
1168 | | - mqtt_client->disconnect_ctx = ctx; |
1169 | | - mqtt_client->packetState = DISCONNECT_TYPE; |
1170 | | - |
1171 | | - size_t size = BUFFER_length(disconnectPacket); |
1172 | | - /*Codes_SRS_MQTT_CLIENT_07_012: [On success mqtt_client_disconnect shall send the MQTT DISCONNECT packet to the endpoint.]*/ |
1173 | | - if (sendPacketItem(mqtt_client, BUFFER_u_char(disconnectPacket), size) != 0) |
| 1168 | + BUFFER_HANDLE disconnectPacket = mqtt_codec_disconnect(); |
| 1169 | + if (disconnectPacket == NULL) |
1174 | 1170 | {
|
1175 | 1171 | /*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/
|
1176 | | - LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect send failed"); |
| 1172 | + LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect failed"); |
| 1173 | + mqtt_client->packetState = PACKET_TYPE_ERROR; |
1177 | 1174 | result = __FAILURE__;
|
1178 | 1175 | }
|
1179 | 1176 | else
|
1180 | 1177 | {
|
1181 | | - if (mqtt_client->logTrace) |
| 1178 | + /* Codes_SRS_MQTT_CLIENT_07_037: [ if callback is not NULL callback shall be called once the mqtt connection has been disconnected ] */ |
| 1179 | + mqtt_client->disconnect_cb = callback; |
| 1180 | + mqtt_client->disconnect_ctx = ctx; |
| 1181 | + mqtt_client->packetState = DISCONNECT_TYPE; |
| 1182 | + |
| 1183 | + size_t size = BUFFER_length(disconnectPacket); |
| 1184 | + /*Codes_SRS_MQTT_CLIENT_07_012: [On success mqtt_client_disconnect shall send the MQTT DISCONNECT packet to the endpoint.]*/ |
| 1185 | + if (sendPacketItem(mqtt_client, BUFFER_u_char(disconnectPacket), size) != 0) |
1182 | 1186 | {
|
1183 | | - STRING_HANDLEtrace_log=STRING_construct("DISCONNECT"); |
1184 | | - log_outgoing_trace(mqtt_client, trace_log); |
1185 | | - STRING_delete(trace_log); |
| 1187 | + /*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/ |
| 1188 | + LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect send failed"); |
| 1189 | + result=__FAILURE__; |
1186 | 1190 | }
|
1187 | | - result = 0; |
| 1191 | + else |
| 1192 | + { |
| 1193 | + if (mqtt_client->logTrace) |
| 1194 | + { |
| 1195 | + STRING_HANDLE trace_log = STRING_construct("DISCONNECT"); |
| 1196 | + log_outgoing_trace(mqtt_client, trace_log); |
| 1197 | + STRING_delete(trace_log); |
| 1198 | + } |
| 1199 | + result = 0; |
| 1200 | + } |
| 1201 | + BUFFER_delete(disconnectPacket); |
1188 | 1202 | }
|
1189 | | - BUFFER_delete(disconnectPacket); |
1190 | 1203 | clear_mqtt_options(mqtt_client);
|
1191 | 1204 | mqtt_client->xioHandle = NULL;
|
1192 | 1205 | }
|
| 1206 | + else |
| 1207 | + { |
| 1208 | + // If the client is not connected then just close the underlying socket |
| 1209 | + mqtt_client->disconnect_cb = callback; |
| 1210 | + mqtt_client->disconnect_ctx = ctx; |
| 1211 | + |
| 1212 | + close_connection(mqtt_client); |
| 1213 | + clear_mqtt_options(mqtt_client); |
| 1214 | + result = 0; |
| 1215 | + } |
1193 | 1216 | }
|
1194 | 1217 | return result;
|
1195 | 1218 | }
|
@@ -1223,7 +1246,7 @@ void mqtt_client_dowork(MQTT_CLIENT_HANDLE handle)
|
1223 | 1246 | mqtt_client->packetSendTimeMs = 0;
|
1224 | 1247 | mqtt_client->packetState = UNKNOWN_TYPE;
|
1225 | 1248 | }
|
1226 | | - else if ((((current_ms - mqtt_client->packetSendTimeMs) / 1000) +KEEP_ALIVE_BUFFER_SEC) > mqtt_client->keepAliveInterval) |
| 1249 | + else if (((current_ms - mqtt_client->packetSendTimeMs) / 1000) >= mqtt_client->keepAliveInterval) |
1227 | 1250 | {
|
1228 | 1251 | /*Codes_SRS_MQTT_CLIENT_07_026: [if keepAliveInternal is > 0 and the send time is greater than the MQTT KeepAliveInterval then it shall construct an MQTT PINGREQ packet.]*/
|
1229 | 1252 | BUFFER_HANDLE pingPacket = mqtt_codec_ping();
|
|
0 commit comments