diff options
author | Mikhail Burakov <mburakov@mailbox.org> | 2023-01-28 14:54:57 +0100 |
---|---|---|
committer | Mikhail Burakov <mburakov@mailbox.org> | 2023-01-28 14:54:57 +0100 |
commit | c9bc1f972e1e072a0498be8e4e7d258ac9f6c7db (patch) | |
tree | 4abe5457b0a01db1c3d03ab1b01a3aae6cd2b5b5 | |
parent | fb7a5c0e43f0fe50ae4cd7c071acb8828d31fb80 (diff) |
Implement parsing mqtt ping responses
-rw-r--r-- | mqtt_parser.c | 18 |
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; } |