diff --git a/lib/roles/mqtt/mqtt.c b/lib/roles/mqtt/mqtt.c index 2071903d8..baad7f73b 100644 --- a/lib/roles/mqtt/mqtt.c +++ b/lib/roles/mqtt/mqtt.c @@ -877,7 +877,7 @@ _lws_mqtt_rx_parser(struct lws *wsi, lws_mqtt_parser_t *par, par->cpkt_id = lws_ser_ru16be(buf); buf += 2; len -= 2; - wsi->mqtt->ack_pkt_id = par->cpkt_id; + wsi->mqtt->peer_ack_pkt_id = par->cpkt_id; lwsl_debug("%s: Packet ID %d\n", __func__, (int)par->cpkt_id); par->state = LMQCPP_PAYLOAD; diff --git a/lib/roles/mqtt/ops-mqtt.c b/lib/roles/mqtt/ops-mqtt.c index f4caa6ebc..ceac2f578 100644 --- a/lib/roles/mqtt/ops-mqtt.c +++ b/lib/roles/mqtt/ops-mqtt.c @@ -306,28 +306,31 @@ rops_handle_POLLOUT_mqtt(struct lws *wsi) (wsi->mqtt->send_pubrec || wsi->mqtt->send_pubrel || wsi->mqtt->send_pubcomp)) { uint8_t buf[LWS_PRE + 4]; + /* Remaining len = 2 */ + buf[LWS_PRE + 1] = 2; if (wsi->mqtt->send_pubrec) { lwsl_notice("%s: issuing PUBREC for pkt id: %d\n", - __func__, wsi->mqtt->ack_pkt_id); + __func__, wsi->mqtt->peer_ack_pkt_id); buf[LWS_PRE] = LMQCP_PUBREC << 4 | 0x2; + /* Packet ID */ + lws_ser_wu16be(&buf[LWS_PRE + 2], + wsi->mqtt->peer_ack_pkt_id); wsi->mqtt->send_pubrec = 0; } else if (wsi->mqtt->send_pubrel) { lwsl_notice("%s: issuing PUBREL for pkt id: %d\n", __func__, wsi->mqtt->ack_pkt_id); buf[LWS_PRE] = LMQCP_PUBREL << 4 | 0x2; + lws_ser_wu16be(&buf[LWS_PRE + 2], + wsi->mqtt->ack_pkt_id); wsi->mqtt->send_pubrel = 0; } else { lwsl_notice("%s: issuing PUBCOMP for pkt id: %d\n", - __func__, wsi->mqtt->ack_pkt_id); + __func__, wsi->mqtt->peer_ack_pkt_id); buf[LWS_PRE] = LMQCP_PUBCOMP << 4 | 0x2; + lws_ser_wu16be(&buf[LWS_PRE + 2], + wsi->mqtt->peer_ack_pkt_id); wsi->mqtt->send_pubcomp = 0; } - /* Remaining len = 2 */ - buf[LWS_PRE + 1] = 2; - /* Packet ID */ - lws_ser_wu16be(&buf[LWS_PRE + 2], - wsi->mqtt->ack_pkt_id); - if (lws_write(wsi, (uint8_t *)&buf[LWS_PRE], 4, LWS_WRITE_BINARY) != 4) return LWS_HP_RET_BAIL_DIE; @@ -392,7 +395,7 @@ rops_handle_POLLOUT_mqtt(struct lws *wsi) /* Remaining len = 2 */ buf[LWS_PRE + 1] = 2; /* Packet ID */ - lws_ser_wu16be(&buf[LWS_PRE + 2], wsi->mqtt->ack_pkt_id); + lws_ser_wu16be(&buf[LWS_PRE + 2], wsi->mqtt->peer_ack_pkt_id); if (lws_write(wsi, (uint8_t *)&buf[LWS_PRE], 4, LWS_WRITE_BINARY) != 4) diff --git a/lib/roles/mqtt/private-lib-roles-mqtt.h b/lib/roles/mqtt/private-lib-roles-mqtt.h index fd312b77e..4c225bb2b 100644 --- a/lib/roles/mqtt/private-lib-roles-mqtt.h +++ b/lib/roles/mqtt/private-lib-roles-mqtt.h @@ -361,6 +361,7 @@ struct _lws_mqtt_related { void *rx_cpkt_param; uint16_t pkt_id; uint16_t ack_pkt_id; + uint16_t peer_ack_pkt_id; uint16_t sub_size; #if defined(LWS_WITH_CLIENT)