summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Burakov <mburakov@mailbox.org>2023-01-28 14:54:57 +0100
committerMikhail Burakov <mburakov@mailbox.org>2023-01-28 14:54:57 +0100
commitc9bc1f972e1e072a0498be8e4e7d258ac9f6c7db (patch)
tree4abe5457b0a01db1c3d03ab1b01a3aae6cd2b5b5
parentfb7a5c0e43f0fe50ae4cd7c071acb8828d31fb80 (diff)
Implement parsing mqtt ping responses
-rw-r--r--mqtt_parser.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/mqtt_parser.c b/mqtt_parser.c
index 87e79b1..60f9674 100644
--- a/mqtt_parser.c
+++ b/mqtt_parser.c
@@ -23,9 +23,15 @@ struct SubscribeAck {
uint8_t return_code;
} __attribute__((packed));
+struct PingResp {
+ uint8_t packet_type;
+ uint8_t message_length;
+} __attribute__((packed));
+
static_assert(sizeof(struct ConnectAck) == 4, "Unexpected connect ack size");
static_assert(sizeof(struct SubscribeAck) == 5,
"Unexpected subscribe ack size");
+static_assert(sizeof(struct PingResp) == 2, "Unexpected ping resp size");
static enum MqttParserResult ParseConnectAck(
const void* buffer, size_t buffer_size,
@@ -83,6 +89,16 @@ static enum MqttParserResult ParseSubscribeAck(
return kMqttParserResultFinished;
}
+static enum MqttParserResult ParsePingResp(
+ const void* buffer, size_t buffer_size,
+ const struct MqttParserCallbacks* callbacks, void* user) {
+ if (buffer_size < sizeof(struct PingResp)) return kMqttParserResultWantMore;
+ const struct PingResp* ping_resp = buffer;
+ if (ping_resp->message_length) return kMqttParserResultError;
+ callbacks->on_finished(user, sizeof(struct PingResp));
+ return kMqttParserResultFinished;
+}
+
enum MqttParserResult MqttParserParse(
const void* buffer, size_t buffer_size,
const struct MqttParserCallbacks* callbacks, void* user) {
@@ -96,6 +112,8 @@ enum MqttParserResult MqttParserParse(
return ParsePublish(buffer, buffer_size, callbacks, user);
case 0x90:
return ParseSubscribeAck(buffer, buffer_size, callbacks, user);
+ case 0xd0:
+ return ParsePingResp(buffer, buffer_size, callbacks, user);
default:
return kMqttParserResultError;
}