From d0c50632cd54554d52400e7c32db53e93f03ee98 Mon Sep 17 00:00:00 2001 From: Alexander Alashkin <alexander.alashkin@cesanta.com> Date: Wed, 9 Nov 2016 09:52:59 +0000 Subject: [PATCH] Fixes in MQTT for AWS support PUBLISHED_FROM=2b82f3793b3c6d0cf1266e4cc0e67930f43002c5 --- docs/c-api/mqtt.h/intro.md | 1 + docs/c-api/mqtt.h/struct_mg_mqtt_proto_data.md | 12 ++++++++++++ examples/examples.mk | 2 +- mongoose.c | 12 ++++++++++++ mongoose.h | 5 +++++ 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 docs/c-api/mqtt.h/struct_mg_mqtt_proto_data.md diff --git a/docs/c-api/mqtt.h/intro.md b/docs/c-api/mqtt.h/intro.md index 7c5201346..5ae849aa3 100644 --- a/docs/c-api/mqtt.h/intro.md +++ b/docs/c-api/mqtt.h/intro.md @@ -20,6 +20,7 @@ items: - { name: mg_send_mqtt_handshake.md } - { name: mg_send_mqtt_handshake_opt.md } - { name: mg_set_protocol_mqtt.md } + - { name: struct_mg_mqtt_proto_data.md } --- diff --git a/docs/c-api/mqtt.h/struct_mg_mqtt_proto_data.md b/docs/c-api/mqtt.h/struct_mg_mqtt_proto_data.md new file mode 100644 index 000000000..8ae54fcfc --- /dev/null +++ b/docs/c-api/mqtt.h/struct_mg_mqtt_proto_data.md @@ -0,0 +1,12 @@ +--- +title: "struct mg_mqtt_proto_data" +decl_name: "struct mg_mqtt_proto_data" +symbol_kind: "struct" +signature: | + struct mg_mqtt_proto_data { + uint16_t keep_alive; + }; +--- + +mg_mqtt_proto_data should be in header to allow external access to it + diff --git a/examples/examples.mk b/examples/examples.mk index 7b258f22e..1ddaa5fa1 100644 --- a/examples/examples.mk +++ b/examples/examples.mk @@ -11,7 +11,7 @@ else ifeq ($(SSL_LIB),openssl) CFLAGS += -DMG_ENABLE_SSL -lssl -lcrypto else ifeq ($(SSL_LIB), krypton) -CFLAGS += -DMG_ENABLE_SSL -DMG_DISABLE_PFS ../../../krypton/krypton.c +CFLAGS += -DMG_ENABLE_SSL -DMG_DISABLE_PFS -DSSL_KRYPTON ../../../krypton/krypton.c -I../../../krypton endif CFLAGS += -lpthread endif diff --git a/mongoose.c b/mongoose.c index fd32a5a92..f551580f3 100644 --- a/mongoose.c +++ b/mongoose.c @@ -8536,8 +8536,14 @@ static void mqtt_handler(struct mg_connection *nc, int ev, void *ev_data) { } } +static void mg_mqtt_proto_data_destructor(void *proto_data) { + MG_FREE(proto_data); +} + void mg_set_protocol_mqtt(struct mg_connection *nc) { nc->proto_handler = mqtt_handler; + nc->proto_data = MG_CALLOC(1, sizeof(struct mg_mqtt_proto_data)); + nc->proto_data_destructor = mg_mqtt_proto_data_destructor; } void mg_send_mqtt_handshake(struct mg_connection *nc, const char *client_id) { @@ -8551,6 +8557,7 @@ void mg_send_mqtt_handshake_opt(struct mg_connection *nc, const char *client_id, uint8_t rem_len; uint16_t keep_alive; uint16_t len; + struct mg_mqtt_proto_data* pd = (struct mg_mqtt_proto_data*) nc->proto_data; /* * 9: version_header(len, magic_string, version_number), 1: flags, 2: @@ -8576,6 +8583,7 @@ void mg_send_mqtt_handshake_opt(struct mg_connection *nc, const char *client_id, if (opts.keep_alive == 0) { opts.keep_alive = 60; } + keep_alive = htons(opts.keep_alive); mg_send(nc, &keep_alive, 2); @@ -8593,6 +8601,10 @@ void mg_send_mqtt_handshake_opt(struct mg_connection *nc, const char *client_id, mg_send(nc, &len, 2); mg_send(nc, opts.password, strlen(opts.password)); } + + if (pd != NULL) { + pd->keep_alive = opts.keep_alive; + } } static void mg_mqtt_prepend_header(struct mg_connection *nc, uint8_t cmd, diff --git a/mongoose.h b/mongoose.h index 71aaeddac..146a5d367 100644 --- a/mongoose.h +++ b/mongoose.h @@ -4712,6 +4712,11 @@ struct mg_send_mqtt_handshake_opts { const char *password; }; +/* mg_mqtt_proto_data should be in header to allow external access to it */ +struct mg_mqtt_proto_data { + uint16_t keep_alive; +}; + /* Message types */ #define MG_MQTT_CMD_CONNECT 1 #define MG_MQTT_CMD_CONNACK 2 -- GitLab