Skip to content

Commit

Permalink
Merge pull request #1 from AniruddhaKanhere/reTransmit
Browse files Browse the repository at this point in the history
Add opaque struct and functions to serialize it.
  • Loading branch information
DakshitBabbar authored Oct 22, 2024
2 parents 451e63c + d3b3c8e commit 2eda149
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 6 deletions.
39 changes: 39 additions & 0 deletions source/core_mqtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@
*/
#define CORE_MQTT_UNSUBSCRIBE_PER_TOPIC_VECTOR_LENGTH ( 2U )

struct MQTTVec
{
TransportOutVector_t pVector; /**< Pointer to transport vector. USER SHOULD NOT ACCESS THIS DIRECTLY - IT IS AN INTERNAL DETAIL AND CAN CHANGE. */
};

/*-----------------------------------------------------------*/

/**
Expand Down Expand Up @@ -3726,3 +3731,37 @@ const char * MQTT_Status_strerror( MQTTStatus_t status )
}

/*-----------------------------------------------------------*/

size_t MQTT_GetBytesInMQTTVec( MQTTVec_t * pVec,
size_t len )
{
size_t memoryRequired = 0;
size_t i;
TransportOutVector_t * pTransportVec = ( TransportOutVector_t * ) pVec;

for( i = 0; i < len; i++ )
{
memoryRequired += pTransportVec[ i ].iov_len;
}

return memoryRequired;
}

/*-----------------------------------------------------------*/

void MQTT_SerializeMQTTVec( uint8_t * pAllocatedMem,
MQTTVec_t * pVec,
size_t len )
{
TransportOutVector_t * pTransportVec = ( TransportOutVector_t * ) pVec;
size_t index = 0;
size_t i = 0;

for( i = 0; i < len; i++ )
{
memcpy( &pAllocatedMem[ index ], pTransportVec[ i ].iov_base, pTransportVec[ i ].iov_len );
index += pTransportVec[ i ].iov_len;
}
}

/*-----------------------------------------------------------*/
44 changes: 38 additions & 6 deletions source/include/core_mqtt.h
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,12 @@ typedef struct MQTTDeserializedInfo
MQTTStatus_t deserializationResult; /**< @brief Return code of deserialization. */
} MQTTDeserializedInfo_t;

/**
* @ingroup mqtt_struct_types
* @brief An opaque structure provided by the library to the #MQTTStorePacketForRetransmit function when using #MQTTStorePacketForRetransmit.
*/
typedef struct MQTTVec MQTTVec_t;

/**
* @brief Initialize an MQTT context.
*
Expand Down Expand Up @@ -649,7 +655,7 @@ MQTTStatus_t MQTT_CheckConnectStatus( MQTTContext_t * pContext );
* #MQTTNoDataAvailable if no data available to receive in transport until
* the @p timeoutMs for CONNACK;
* #MQTTStatusConnected if the connection is already established
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* before calling any other API
* MQTTPublishClearAllFailed if on a clean session connection, clearing all the
* previously copied publishes fails
Expand Down Expand Up @@ -744,7 +750,7 @@ MQTTStatus_t MQTT_Connect( MQTTContext_t * pContext,
* #MQTTBadParameter if invalid parameters are passed;
* #MQTTSendFailed if transport write failed;
* #MQTTStatusNotConnected if the connection is not established yet
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* before calling any other API
* #MQTTSuccess otherwise.
*
Expand Down Expand Up @@ -800,7 +806,7 @@ MQTTStatus_t MQTT_Subscribe( MQTTContext_t * pContext,
* #MQTTBadParameter if invalid parameters are passed;
* #MQTTSendFailed if transport write failed;
* #MQTTStatusNotConnected if the connection is not established yet
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* before calling any other API
* #MQTTPublishStoreFailed if the user provided callback to copy and store the
* outgoing publish packet fails
Expand Down Expand Up @@ -872,7 +878,7 @@ MQTTStatus_t MQTT_CancelCallback( const MQTTContext_t * pContext,
* #MQTTBadParameter if invalid parameters are passed;
* #MQTTSendFailed if transport write failed;
* #MQTTStatusNotConnected if the connection is not established yet
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* before calling any other API
* #MQTTSuccess otherwise.
*/
Expand All @@ -894,7 +900,7 @@ MQTTStatus_t MQTT_Ping( MQTTContext_t * pContext );
* #MQTTBadParameter if invalid parameters are passed;
* #MQTTSendFailed if transport write failed;
* #MQTTStatusNotConnected if the connection is not established yet
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* before calling any other API
* #MQTTSuccess otherwise.
*
Expand Down Expand Up @@ -984,7 +990,7 @@ MQTTStatus_t MQTT_Disconnect( MQTTContext_t * pContext );
* incomplete data; it should be called again (probably after a delay);
* #MQTTStatusNotConnected if the connection is not established yet and a PING
* or an ACK is being sent.
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect
* before calling any other API
* #MQTTSuccess on success.
*
Expand Down Expand Up @@ -1240,6 +1246,32 @@ MQTTStatus_t MQTT_GetSubAckStatusCodes( const MQTTPacketInfo_t * pSubackPacket,
const char * MQTT_Status_strerror( MQTTStatus_t status );
/* @[declare_mqtt_status_strerror] */

/**
* @brief Get the bytes in an array of #MQTTVec_t which can store the whole array as a an MQTT packet when calling MQTT_SerializeMQTTVec( void * pAllocatedMem, MQTTVec_t *pVec, size_t len ) function.
*
* @param[in] pVec The #MQTTVec_t array.
* @param[in] len The length of the #MQTTVec_t array.
*
* @return The bytes in the provided MQTTVec_t array which can then be used to set aside memory to be used with MQTT_SerializeMQTTVec( void * pAllocatedMem, MQTTVec_t *pVec, size_t len ) function.
*/
/* @[declare_mqtt_getbytesinmqttvec] */
size_t MQTT_GetBytesInMQTTVec( MQTTVec_t * pVec,
size_t len );
/* @[declare_mqtt_getbytesinmqttvec] */

/**
* @brief Serialize the bytes in an array of #MQTTVec_t in the provided \p pAllocatedMem
*
* @param[in] pAllocatedMem Memory in which to serialize the data in the #MQTTVec_t array. It must be of size provided by MQTT_GetBytesInMQTTVec( MQTTVec_t *pVec, size_t len ).
* @param[in] pVec The #MQTTVec_t array.
* @param[in] len The length of the #MQTTVec_t array.
*/
/* @[declare_mqtt_serializemqttvec] */
void MQTT_SerializeMQTTVec( uint8_t * pAllocatedMem,
MQTTVec_t * pVec,
size_t len );
/* @[declare_mqtt_serializemqttvec] */

/* *INDENT-OFF* */
#ifdef __cplusplus
}
Expand Down

0 comments on commit 2eda149

Please sign in to comment.