Skip to content

Commit 707a512

Browse files
committed
updated LWMQTT
1 parent 849b7a5 commit 707a512

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ fmt:
55

66
update:
77
rm -rf ./lwmqtt
8-
git clone --branch v0.9.0 https://github.com/256dpi/lwmqtt.git ./lwmqtt
8+
git clone --branch v0.9.1 https://github.com/256dpi/lwmqtt.git ./lwmqtt
99
mkdir -p ./src/lwmqtt
1010
cp -r ./lwmqtt/src/*.c ./src/lwmqtt/
1111
cp -r ./lwmqtt/src/*.h ./src/lwmqtt/

src/lwmqtt/client.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
void lwmqtt_init(lwmqtt_client_t *client, uint8_t *write_buf, size_t write_buf_size, uint8_t *read_buf,
44
size_t read_buf_size) {
5-
client->last_packet_id = 1;
5+
client->last_packet_id = 0;
66
client->keep_alive_interval = 0;
77
client->pong_pending = false;
88

@@ -404,6 +404,8 @@ lwmqtt_err_t lwmqtt_connect(lwmqtt_client_t *client, lwmqtt_connect_options_t *o
404404
options = &def_options;
405405
}
406406

407+
// TODO: Reject password-only credentials (MQTT 3.1.1 compliance).
408+
407409
// set command timer
408410
client->timer_set(client->command_timer, timeout);
409411

@@ -483,6 +485,8 @@ lwmqtt_err_t lwmqtt_publish(lwmqtt_client_t *client, lwmqtt_publish_options_t *o
483485
}
484486
}
485487

488+
uint16_t expected_packet_id = packet_id;
489+
486490
// encode publish packet
487491
size_t len = 0;
488492
lwmqtt_err_t err = lwmqtt_encode_publish(client->write_buf, client->write_buf_size, &len, dup, packet_id, topic, msg);
@@ -502,6 +506,9 @@ lwmqtt_err_t lwmqtt_publish(lwmqtt_client_t *client, lwmqtt_publish_options_t *o
502506
if (err != LWMQTT_SUCCESS) {
503507
return err;
504508
}
509+
510+
// Refresh keep-alive after the payload has been fully transmitted.
511+
client->timer_set(client->keep_alive_timer, client->keep_alive_interval);
505512
}
506513

507514
// immediately return on qos zero
@@ -536,6 +543,9 @@ lwmqtt_err_t lwmqtt_publish(lwmqtt_client_t *client, lwmqtt_publish_options_t *o
536543
if (err != LWMQTT_SUCCESS) {
537544
return err;
538545
}
546+
if (packet_id != expected_packet_id) {
547+
return LWMQTT_MISSING_OR_WRONG_PACKET;
548+
}
539549

540550
return LWMQTT_SUCCESS;
541551
}
@@ -546,9 +556,11 @@ lwmqtt_err_t lwmqtt_subscribe(lwmqtt_client_t *client, int count, lwmqtt_string_
546556
client->timer_set(client->command_timer, timeout);
547557

548558
// encode subscribe packet
559+
uint16_t expected_packet_id = lwmqtt_get_next_packet_id(client);
560+
549561
size_t len;
550-
lwmqtt_err_t err = lwmqtt_encode_subscribe(client->write_buf, client->write_buf_size, &len,
551-
lwmqtt_get_next_packet_id(client), count, topic_filter, qos);
562+
lwmqtt_err_t err = lwmqtt_encode_subscribe(client->write_buf, client->write_buf_size, &len, expected_packet_id, count,
563+
topic_filter, qos);
552564
if (err != LWMQTT_SUCCESS) {
553565
return err;
554566
}
@@ -576,6 +588,9 @@ lwmqtt_err_t lwmqtt_subscribe(lwmqtt_client_t *client, int count, lwmqtt_string_
576588
if (err != LWMQTT_SUCCESS) {
577589
return err;
578590
}
591+
if (packet_id != expected_packet_id) {
592+
return LWMQTT_MISSING_OR_WRONG_PACKET;
593+
}
579594

580595
// check suback codes
581596
for (int i = 0; i < suback_count; i++) {
@@ -597,9 +612,11 @@ lwmqtt_err_t lwmqtt_unsubscribe(lwmqtt_client_t *client, int count, lwmqtt_strin
597612
client->timer_set(client->command_timer, timeout);
598613

599614
// encode unsubscribe packet
615+
uint16_t expected_packet_id = lwmqtt_get_next_packet_id(client);
616+
600617
size_t len;
601-
lwmqtt_err_t err = lwmqtt_encode_unsubscribe(client->write_buf, client->write_buf_size, &len,
602-
lwmqtt_get_next_packet_id(client), count, topic_filter);
618+
lwmqtt_err_t err = lwmqtt_encode_unsubscribe(client->write_buf, client->write_buf_size, &len, expected_packet_id,
619+
count, topic_filter);
603620
if (err != LWMQTT_SUCCESS) {
604621
return err;
605622
}
@@ -625,6 +642,9 @@ lwmqtt_err_t lwmqtt_unsubscribe(lwmqtt_client_t *client, int count, lwmqtt_strin
625642
if (err != LWMQTT_SUCCESS) {
626643
return err;
627644
}
645+
if (packet_id != expected_packet_id) {
646+
return LWMQTT_MISSING_OR_WRONG_PACKET;
647+
}
628648

629649
return LWMQTT_SUCCESS;
630650
}

src/lwmqtt/helpers.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,10 @@ lwmqtt_err_t lwmqtt_varnum_length(uint32_t varnum, int *len) {
157157
} else if (varnum < 16384) {
158158
*len = 2;
159159
return LWMQTT_SUCCESS;
160-
} else if (varnum < 2097151) {
160+
} else if (varnum < 2097152) {
161161
*len = 3;
162162
return LWMQTT_SUCCESS;
163-
} else if (varnum < 268435455) {
163+
} else if (varnum < 268435456) {
164164
*len = 4;
165165
return LWMQTT_SUCCESS;
166166
} else {

src/lwmqtt/packet.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ lwmqtt_err_t lwmqtt_encode_connect(uint8_t *buf, size_t buf_len, size_t *len, lw
188188
}
189189

190190
// write password if present
191-
if (options->username.len > 0 && options->password.len > 0) {
191+
if (options->password.len > 0) {
192192
err = lwmqtt_write_string(&buf_ptr, buf_end, options->password);
193193
if (err != LWMQTT_SUCCESS) {
194194
return err;
@@ -317,6 +317,12 @@ lwmqtt_err_t lwmqtt_decode_ack(uint8_t *buf, size_t buf_len, lwmqtt_packet_type_
317317
return LWMQTT_MISSING_OR_WRONG_PACKET;
318318
}
319319

320+
// check fixed header flags
321+
uint8_t flags = lwmqtt_read_bits(header, 0, 4);
322+
if ((packet_type == LWMQTT_PUBREL_PACKET && flags != 0x02u) || (packet_type != LWMQTT_PUBREL_PACKET && flags != 0)) {
323+
return LWMQTT_MISSING_OR_WRONG_PACKET;
324+
}
325+
320326
// read remaining length
321327
uint32_t rem_len;
322328
err = lwmqtt_read_varnum(&buf_ptr, buf + buf_len, &rem_len);
@@ -413,8 +419,7 @@ lwmqtt_err_t lwmqtt_decode_publish(uint8_t *buf, size_t buf_len, bool *dup, uint
413419
msg->qos = LWMQTT_QOS2;
414420
break;
415421
default:
416-
msg->qos = LWMQTT_QOS0;
417-
break;
422+
return LWMQTT_MISSING_OR_WRONG_PACKET;
418423
}
419424

420425
// read remaining length
@@ -449,6 +454,9 @@ lwmqtt_err_t lwmqtt_decode_publish(uint8_t *buf, size_t buf_len, bool *dup, uint
449454
if (err != LWMQTT_SUCCESS) {
450455
return err;
451456
}
457+
if (*packet_id == 0) {
458+
return LWMQTT_MISSING_OR_WRONG_PACKET;
459+
}
452460
} else {
453461
*packet_id = 0;
454462
}
@@ -637,7 +645,7 @@ lwmqtt_err_t lwmqtt_decode_suback(uint8_t *buf, size_t buf_len, uint16_t *packet
637645
// read all suback codes
638646
for (*count = 0; *count < (int)rem_len - 2; (*count)++) {
639647
// check max count
640-
if (*count > max_count) {
648+
if (*count >= max_count) {
641649
return LWMQTT_SUBACK_ARRAY_OVERFLOW;
642650
}
643651

src/lwmqtt/packet.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ lwmqtt_err_t lwmqtt_encode_ack(uint8_t *buf, size_t buf_len, size_t *len, lwmqtt
115115
* @param dup The dup flag.
116116
* @param packet_id The packet id.
117117
* @param topic The topic.
118-
* @parma msg The message.
118+
* @param msg The message.
119119
* @return An error value.
120120
*/
121121
lwmqtt_err_t lwmqtt_decode_publish(uint8_t *buf, size_t buf_len, bool *dup, uint16_t *packet_id, lwmqtt_string_t *topic,

0 commit comments

Comments
 (0)