in source/packets.c [286:382]
int aws_mqtt_packet_connect_decode(struct aws_byte_cursor *cur, struct aws_mqtt_packet_connect *packet) {
AWS_PRECONDITION(cur);
AWS_PRECONDITION(packet);
/*************************************************************************/
/* Fixed Header */
if (aws_mqtt_fixed_header_decode(cur, &packet->fixed_header)) {
return AWS_OP_ERR;
}
/*************************************************************************/
/* Variable Header */
/* Check protocol name */
struct aws_byte_cursor protocol_name = {
.ptr = NULL,
.len = 0,
};
if (s_decode_buffer(cur, &protocol_name)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
AWS_ASSERT(protocol_name.ptr && protocol_name.len);
if (protocol_name.len != s_protocol_name.len) {
return aws_raise_error(AWS_ERROR_MQTT_UNSUPPORTED_PROTOCOL_NAME);
}
if (memcmp(protocol_name.ptr, s_protocol_name.ptr, s_protocol_name.len) != 0) {
return aws_raise_error(AWS_ERROR_MQTT_UNSUPPORTED_PROTOCOL_NAME);
}
/* Check protocol level */
struct aws_byte_cursor protocol_level = aws_byte_cursor_advance(cur, 1);
if (protocol_level.len == 0) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
if (*protocol_level.ptr != S_PROTOCOL_LEVEL) {
return aws_raise_error(AWS_ERROR_MQTT_UNSUPPORTED_PROTOCOL_LEVEL);
}
/* Read connect flags [MQTT-3.1.2.3] */
uint8_t connect_flags = 0;
if (!aws_byte_cursor_read_u8(cur, &connect_flags)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
packet->clean_session = (connect_flags >> 1) & 0x1;
packet->has_will = (connect_flags >> 2) & 0x1;
packet->will_qos = (connect_flags >> 3) & 0x3;
packet->will_retain = (connect_flags >> 5) & 0x1;
packet->has_password = (connect_flags >> 6) & 0x1;
packet->has_username = (connect_flags >> 7) & 0x1;
/* Read keep alive */
if (!aws_byte_cursor_read_be16(cur, &packet->keep_alive_timeout)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
/*************************************************************************/
/* Payload */
/* Client identifier is required, Read it */
if (s_decode_buffer(cur, &packet->client_identifier)) {
return AWS_OP_ERR;
}
/* Read will */
if (packet->has_will) {
if (s_decode_buffer(cur, &packet->will_topic)) {
return AWS_OP_ERR;
}
if (s_decode_buffer(cur, &packet->will_message)) {
return AWS_OP_ERR;
}
}
/* Read username */
if (packet->has_username) {
if (s_decode_buffer(cur, &packet->username)) {
return AWS_OP_ERR;
}
}
/* Read password */
if (packet->has_password) {
if (s_decode_buffer(cur, &packet->password)) {
return AWS_OP_ERR;
}
}
/* Do validation */
if (packet->has_password && !packet->has_username) {
return aws_raise_error(AWS_ERROR_MQTT_INVALID_CREDENTIALS);
}
return AWS_OP_SUCCESS;
}