net: mqtt: Maintain count of PINGREQ awaiting response

Maintain a simple count of how many PINGREQ have been sent for the
current connection that have not had a corresponding PINGRESP.  Nothing
is done with this information internal to the MQTT driver, but it is
exposed to the application layer to monitor as desired.

Signed-off-by: Justin Brzozoski <justin.brzozoski@signal-fire.com>
This commit is contained in:
Justin Brzozoski 2019-12-12 13:33:36 -05:00 committed by Jukka Rissanen
commit 0116729114
3 changed files with 19 additions and 0 deletions

View file

@ -499,6 +499,9 @@ struct mqtt_client {
/** MQTT protocol version. */ /** MQTT protocol version. */
u8_t protocol_version; u8_t protocol_version;
/** Unanswered PINGREQ count on this connection. */
s8_t unacked_ping;
/** Will retain flag, 1 if will message shall be retained persistently. /** Will retain flag, 1 if will message shall be retained persistently.
*/ */
u8_t will_retain : 1; u8_t will_retain : 1;

View file

@ -111,6 +111,9 @@ static int client_connect(struct mqtt_client *client)
client->internal.last_activity = mqtt_sys_tick_in_ms_get(); client->internal.last_activity = mqtt_sys_tick_in_ms_get();
/* Reset the unanswered ping count for a new connection */
client->unacked_ping = 0;
MQTT_TRC("Connect completed"); MQTT_TRC("Connect completed");
return 0; return 0;
@ -548,6 +551,12 @@ int mqtt_ping(struct mqtt_client *client)
err_code = client_write(client, packet.cur, packet.end - packet.cur); err_code = client_write(client, packet.cur, packet.end - packet.cur);
if (client->unacked_ping >= INT8_MAX) {
MQTT_TRC("PING count overflow!");
} else {
client->unacked_ping++;
}
error: error:
mqtt_mutex_unlock(client); mqtt_mutex_unlock(client);

View file

@ -120,6 +120,13 @@ static int mqtt_handle_packet(struct mqtt_client *client,
case MQTT_PKT_TYPE_PINGRSP: case MQTT_PKT_TYPE_PINGRSP:
MQTT_TRC("[CID %p]: Received MQTT_PKT_TYPE_PINGRSP!", client); MQTT_TRC("[CID %p]: Received MQTT_PKT_TYPE_PINGRSP!", client);
if (client->unacked_ping <= 0) {
MQTT_TRC("Unexpected PINGRSP");
client->unacked_ping = 0;
} else {
client->unacked_ping--;
}
/* No notification of Ping response to application. */ /* No notification of Ping response to application. */
notify_event = false; notify_event = false;
break; break;