|
|
@ -26,12 +26,14 @@ Contributors:
|
|
|
|
#include "packet_mosq.h"
|
|
|
|
#include "packet_mosq.h"
|
|
|
|
#include "property_mosq.h"
|
|
|
|
#include "property_mosq.h"
|
|
|
|
|
|
|
|
|
|
|
|
int property__read(struct mosquitto__packet *packet, uint32_t *len)
|
|
|
|
int property__read(struct mosquitto__packet *packet, int32_t *len)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
int rc;
|
|
|
|
uint8_t byte;
|
|
|
|
uint8_t byte;
|
|
|
|
uint16_t int16;
|
|
|
|
int8_t byte_count;
|
|
|
|
uint32_t int32;
|
|
|
|
uint16_t uint16;
|
|
|
|
|
|
|
|
uint32_t uint32;
|
|
|
|
|
|
|
|
int32_t varint;
|
|
|
|
char *str;
|
|
|
|
char *str;
|
|
|
|
int slen;
|
|
|
|
int slen;
|
|
|
|
*len -= 14;
|
|
|
|
*len -= 14;
|
|
|
@ -49,72 +51,72 @@ int property__read(struct mosquitto__packet *packet, uint32_t *len)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_MESSAGE_EXPIRY_INTERVAL:
|
|
|
|
case PROP_MESSAGE_EXPIRY_INTERVAL:
|
|
|
|
rc = packet__read_uint32(packet, &int32);
|
|
|
|
rc = packet__read_uint32(packet, &uint32);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Message expiry: %d", int32);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Message expiry: %d", uint32);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_CONTENT_TYPE:
|
|
|
|
case PROP_CONTENT_TYPE:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Content type: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Content type: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_RESPONSE_TOPIC:
|
|
|
|
case PROP_RESPONSE_TOPIC:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Response topic: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Response topic: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_CORRELATION_DATA:
|
|
|
|
case PROP_CORRELATION_DATA:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Correlation data: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Correlation data: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_SUBSCRIPTION_IDENTIFIER:
|
|
|
|
case PROP_SUBSCRIPTION_IDENTIFIER:
|
|
|
|
rc = packet__read_varint(packet, &int32, &byte);
|
|
|
|
rc = packet__read_varint(packet, &varint, &byte_count);
|
|
|
|
*len -= byte;
|
|
|
|
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Subscription identifier: %d", int32);
|
|
|
|
*len -= byte_count;
|
|
|
|
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Subscription identifier: %d", varint);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_SESSION_EXPIRY_INTERVAL:
|
|
|
|
case PROP_SESSION_EXPIRY_INTERVAL:
|
|
|
|
rc = packet__read_uint32(packet, &int32);
|
|
|
|
rc = packet__read_uint32(packet, &uint32);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Session expiry: %d", int32);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Session expiry: %d", uint32);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_ASSIGNED_CLIENT_IDENTIFIER:
|
|
|
|
case PROP_ASSIGNED_CLIENT_IDENTIFIER:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Assigned client identifier: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Assigned client identifier: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_SERVER_KEEP_ALIVE:
|
|
|
|
case PROP_SERVER_KEEP_ALIVE:
|
|
|
|
rc = packet__read_uint16(packet, &int16);
|
|
|
|
rc = packet__read_uint16(packet, &uint16);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Session expiry: %d", int16);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Session expiry: %d", uint16);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_AUTHENTICATION_METHOD:
|
|
|
|
case PROP_AUTHENTICATION_METHOD:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Authentication method: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Authentication method: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_AUTHENTICATION_DATA:
|
|
|
|
case PROP_AUTHENTICATION_DATA:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Authentication data: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Authentication data: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
@ -126,10 +128,10 @@ int property__read(struct mosquitto__packet *packet, uint32_t *len)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_WILL_DELAY_INTERVAL:
|
|
|
|
case PROP_WILL_DELAY_INTERVAL:
|
|
|
|
rc = packet__read_uint32(packet, &int32);
|
|
|
|
rc = packet__read_uint32(packet, &uint32);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Will delay interval: %d", int32);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Will delay interval: %d", uint32);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_REQUEST_RESPONSE_INFO:
|
|
|
|
case PROP_REQUEST_RESPONSE_INFO:
|
|
|
@ -142,43 +144,43 @@ int property__read(struct mosquitto__packet *packet, uint32_t *len)
|
|
|
|
case PROP_RESPONSE_INFO:
|
|
|
|
case PROP_RESPONSE_INFO:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Response information: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Response information: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_SERVER_REFERENCE:
|
|
|
|
case PROP_SERVER_REFERENCE:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Server reference: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Server reference: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_REASON_STRING:
|
|
|
|
case PROP_REASON_STRING:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Reason string: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Reason string: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_RECEIVE_MAXIMUM:
|
|
|
|
case PROP_RECEIVE_MAXIMUM:
|
|
|
|
rc = packet__read_uint16(packet, &int16);
|
|
|
|
rc = packet__read_uint16(packet, &uint16);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Receive maximum: %d", int16);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Receive maximum: %d", uint16);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_TOPIC_ALIAS_MAXIMUM:
|
|
|
|
case PROP_TOPIC_ALIAS_MAXIMUM:
|
|
|
|
rc = packet__read_uint16(packet, &int16);
|
|
|
|
rc = packet__read_uint16(packet, &uint16);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Topic alias maximum: %d", int16);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Topic alias maximum: %d", uint16);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_TOPIC_ALIAS:
|
|
|
|
case PROP_TOPIC_ALIAS:
|
|
|
|
rc = packet__read_uint16(packet, &int16);
|
|
|
|
rc = packet__read_uint16(packet, &uint16);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
*len -= 2; /* uint16 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Topic alias: %d", int16);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Topic alias: %d", uint16);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_MAXIMUM_QOS:
|
|
|
|
case PROP_MAXIMUM_QOS:
|
|
|
@ -198,20 +200,20 @@ int property__read(struct mosquitto__packet *packet, uint32_t *len)
|
|
|
|
case PROP_USER_PROPERTY:
|
|
|
|
case PROP_USER_PROPERTY:
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "User property name: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "User property name: %s", str);
|
|
|
|
|
|
|
|
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
rc = packet__read_string(packet, &str, &slen);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 2 - slen; /* int16, string len */
|
|
|
|
*len -= 2 - slen; /* uint16, string len */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "User property value: %s", str);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "User property value: %s", str);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_MAXIMUM_PACKET_SIZE:
|
|
|
|
case PROP_MAXIMUM_PACKET_SIZE:
|
|
|
|
rc = packet__read_uint32(packet, &int32);
|
|
|
|
rc = packet__read_uint32(packet, &uint32);
|
|
|
|
if(rc) return rc;
|
|
|
|
if(rc) return rc;
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
*len -= 4; /* uint32 */
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Maximum packet size: %d", int32);
|
|
|
|
log__printf(NULL, MOSQ_LOG_DEBUG, "Maximum packet size: %d", uint32);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case PROP_WILDCARD_SUB_AVAILABLE:
|
|
|
|
case PROP_WILDCARD_SUB_AVAILABLE:
|
|
|
|