Merge branch 'refactor/tcp_transport' into 'master'

mqtt_client: Added checks for cleanly-closed connection and timeout

See merge request espressif/esp-mqtt!118
This commit is contained in:
David Čermák
2022-06-09 15:20:24 +08:00

View File

@ -149,6 +149,23 @@ enum esp_mqtt_ssl_cert_key_api {
MQTT_SSL_DATA_API_MAX,
};
static int esp_mqtt_handle_transport_read_error(int err, esp_mqtt_client_handle_t client)
{
if (err == ERR_TCP_TRANSPORT_CONNECTION_CLOSED_BY_FIN) {
ESP_LOGD(TAG, "%s: transport_read(): EOF", __func__);
return 0;
}
if (err == ERR_TCP_TRANSPORT_CONNECTION_TIMEOUT) {
ESP_LOGD(TAG, "%s: transport_read(): call timed out before data was ready!", __func__);
return 0;
}
ESP_LOGE(TAG, "%s: transport_read() error: errno=%d", __func__, errno);
esp_mqtt_client_dispatch_transport_error(client);
return -1;
}
static esp_err_t esp_mqtt_set_cert_key_data(esp_transport_handle_t ssl, enum esp_mqtt_ssl_cert_key_api what, const char *cert_key_data, int cert_key_len)
{
char *data = (char *)cert_key_data;
@ -229,8 +246,6 @@ static esp_err_t esp_mqtt_set_ssl_transport_properties(esp_transport_list_handle
}
if (cfg->use_secure_element) {
#ifdef MQTT_SUPPORTED_FEATURE_SECURE_ELEMENT
#ifdef CONFIG_ESP_TLS_USE_SECURE_ELEMENT
@ -1062,9 +1077,9 @@ post_data_event:
msg_total_len - msg_read_len > buf_len ? buf_len : msg_total_len - msg_read_len,
client->config->network_timeout_ms);
if (ret <= 0) {
ESP_LOGE(TAG, "Read error or timeout: len_read=%d, errno=%d", ret, errno);
return ESP_FAIL;
return esp_mqtt_handle_transport_read_error(ret, client) == 0 ? ESP_OK : ESP_FAIL;
}
msg_data_len = ret;
msg_read_len += msg_data_len;
goto post_data_event;
@ -1165,13 +1180,8 @@ static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_t
* type and flags.
*/
read_len = esp_transport_read(t, (char *)buf, 1, read_poll_timeout_ms);
if (read_len < 0) {
ESP_LOGE(TAG, "%s: transport_read() error: errno=%d", __func__, errno);
goto err;
}
if (read_len == 0) {
ESP_LOGV(TAG, "%s: transport_read(): no data or EOF", __func__);
return 0;
if (read_len <= 0) {
return esp_mqtt_handle_transport_read_error(read_len, client);
}
ESP_LOGD(TAG, "%s: first byte: 0x%x", __func__, *buf);
/*
@ -1196,13 +1206,8 @@ static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_t
* size of 16386 bytes).
*/
read_len = esp_transport_read(t, (char *)buf, 1, read_poll_timeout_ms);
if (read_len < 0) {
ESP_LOGE(TAG, "%s: transport_read() error: errno=%d", __func__, errno);
goto err;
}
if (read_len == 0) {
ESP_LOGD(TAG, "%s: transport_read(): no data or EOF", __func__);
return 0;
if (read_len <= 0) {
return esp_mqtt_handle_transport_read_error(read_len, client);
}
ESP_LOGD(TAG, "%s: read \"remaining length\" byte: 0x%x", __func__, *buf);
buf++;
@ -1222,12 +1227,8 @@ static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_t
/* read next 2 bytes - topic length to get minimum portion of publish packet */
read_len = esp_transport_read(t, (char *)buf, client->mqtt_state.in_buffer_read_len - fixed_header_len + 2, read_poll_timeout_ms);
ESP_LOGD(TAG, "%s: read_len=%d", __func__, read_len);
if (read_len < 0) {
ESP_LOGE(TAG, "%s: transport_read() error: errno=%d", __func__, errno);
goto err;
} else if (read_len == 0) {
ESP_LOGD(TAG, "%s: transport_read(): no data or EOF", __func__);
return 0;
if (read_len <= 0) {
return esp_mqtt_handle_transport_read_error(read_len, client);
}
client->mqtt_state.in_buffer_read_len += read_len;
buf += read_len;
@ -1257,13 +1258,8 @@ static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_t
/* read the rest of the mqtt message */
read_len = esp_transport_read(t, (char *)buf, total_len - client->mqtt_state.in_buffer_read_len, read_poll_timeout_ms);
ESP_LOGD(TAG, "%s: read_len=%d", __func__, read_len);
if (read_len < 0) {
ESP_LOGE(TAG, "%s: transport_read() error: errno=%d", __func__, errno);
goto err;
}
if (read_len == 0) {
ESP_LOGD(TAG, "%s: transport_read(): no data or EOF", __func__);
return 0;
if (read_len <= 0) {
return esp_mqtt_handle_transport_read_error(read_len, client);
}
client->mqtt_state.in_buffer_read_len += read_len;
if (client->mqtt_state.in_buffer_read_len < total_len) {