in source/core_mqtt_serializer.c [923:1002]
static MQTTStatus_t deserializeConnack( const MQTTPacketInfo_t * pConnack,
bool * pSessionPresent )
{
MQTTStatus_t status = MQTTSuccess;
const uint8_t * pRemainingData = NULL;
assert( pConnack != NULL );
assert( pSessionPresent != NULL );
pRemainingData = pConnack->pRemainingData;
/* According to MQTT 3.1.1, the second byte of CONNACK must specify a
* "Remaining length" of 2. */
if( pConnack->remainingLength != MQTT_PACKET_CONNACK_REMAINING_LENGTH )
{
LogError( ( "CONNACK does not have remaining length of %u.",
( unsigned int ) MQTT_PACKET_CONNACK_REMAINING_LENGTH ) );
status = MQTTBadResponse;
}
/* Check the reserved bits in CONNACK. The high 7 bits of the third byte
* in CONNACK must be 0. */
else if( ( pRemainingData[ 0 ] | 0x01U ) != 0x01U )
{
LogError( ( "Reserved bits in CONNACK incorrect." ) );
status = MQTTBadResponse;
}
else
{
/* Determine if the "Session Present" bit is set. This is the lowest bit of
* the third byte in CONNACK. */
if( ( pRemainingData[ 0 ] & MQTT_PACKET_CONNACK_SESSION_PRESENT_MASK )
== MQTT_PACKET_CONNACK_SESSION_PRESENT_MASK )
{
LogDebug( ( "CONNACK session present bit set." ) );
*pSessionPresent = true;
/* MQTT 3.1.1 specifies that the fourth byte in CONNACK must be 0 if the
* "Session Present" bit is set. */
if( pRemainingData[ 1 ] != 0U )
{
LogError( ( "Session Present bit is set, but connect return code in CONNACK is %u (nonzero).",
( unsigned int ) pRemainingData[ 1 ] ) );
status = MQTTBadResponse;
}
}
else
{
LogDebug( ( "CONNACK session present bit not set." ) );
*pSessionPresent = false;
}
}
if( status == MQTTSuccess )
{
/* In MQTT 3.1.1, only values 0 through 5 are valid CONNACK response codes. */
if( pRemainingData[ 1 ] > 5U )
{
LogError( ( "CONNACK response %u is invalid.",
( unsigned int ) pRemainingData[ 1 ] ) );
status = MQTTBadResponse;
}
else
{
/* Print the appropriate message for the CONNACK response code if logs are
* enabled. */
logConnackResponse( pRemainingData[ 1 ] );
/* A nonzero CONNACK response code means the connection was refused. */
if( pRemainingData[ 1 ] > 0U )
{
status = MQTTServerRefused;
}
}
}
return status;
}