in source/packets.c [206:284]
int aws_mqtt_packet_connect_encode(struct aws_byte_buf *buf, const struct aws_mqtt_packet_connect *packet) {
AWS_PRECONDITION(buf);
AWS_PRECONDITION(packet);
/* Do validation */
if (packet->has_password && !packet->has_username) {
return aws_raise_error(AWS_ERROR_MQTT_INVALID_CREDENTIALS);
}
/*************************************************************************/
/* Fixed Header */
if (aws_mqtt_fixed_header_encode(buf, &packet->fixed_header)) {
return AWS_OP_ERR;
}
/*************************************************************************/
/* Variable Header */
/* Write protocol name */
if (s_encode_buffer(buf, s_protocol_name)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
/* Write protocol level */
if (!aws_byte_buf_write_u8(buf, S_PROTOCOL_LEVEL)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
/* Write connect flags [MQTT-3.1.2.3] */
uint8_t connect_flags = (uint8_t)(
packet->clean_session << 1 | packet->has_will << 2 | packet->will_qos << 3 | packet->will_retain << 5 |
packet->has_password << 6 | packet->has_username << 7);
if (!aws_byte_buf_write_u8(buf, connect_flags)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
/* Write keep alive */
if (!aws_byte_buf_write_be16(buf, packet->keep_alive_timeout)) {
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
/*************************************************************************/
/* Payload */
/* Client identifier is required, write it */
if (s_encode_buffer(buf, packet->client_identifier)) {
return AWS_OP_ERR;
}
/* Write will */
if (packet->has_will) {
if (s_encode_buffer(buf, packet->will_topic)) {
return AWS_OP_ERR;
}
if (s_encode_buffer(buf, packet->will_message)) {
return AWS_OP_ERR;
}
}
/* Write username */
if (packet->has_username) {
if (s_encode_buffer(buf, packet->username)) {
return AWS_OP_ERR;
}
}
/* Write password */
if (packet->has_password) {
if (s_encode_buffer(buf, packet->password)) {
return AWS_OP_ERR;
}
}
return AWS_OP_SUCCESS;
}