mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-07-03 07:29:52 +08:00
fix(aws): fix AWS read timeout error
The behave that set socket timeout is error, it will lead to a socket I/O error to mbedTLS.
This commit is contained in:
@ -165,18 +165,32 @@ IoT_Error_t iot_tls_read(Network *pNetwork, unsigned char *pMsg, size_t len, Tim
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
/* Make sure we never block on read for longer than timer has left,
|
if (esp_tls_get_bytes_avail(tls) <= 0) {
|
||||||
but also that we don't block indefinitely (ie read_timeout > 0) */
|
fd_set read_fs, error_fs;
|
||||||
read_timeout = MAX(1, MIN(read_timeout, left_ms(timer)));
|
|
||||||
timeout.tv_sec = read_timeout / 1000;
|
/* Make sure we never block on read for longer than timer has left,
|
||||||
timeout.tv_usec = (read_timeout % 1000) * 1000;
|
but also that we don't block indefinitely (ie read_timeout > 0) */
|
||||||
|
read_timeout = MAX(1, MIN(read_timeout, left_ms(timer)));
|
||||||
|
timeout.tv_sec = read_timeout / 1000;
|
||||||
|
timeout.tv_usec = (read_timeout % 1000) * 1000;
|
||||||
|
|
||||||
|
FD_CLR(tls->sockfd, &read_fs);
|
||||||
|
FD_CLR(tls->sockfd, &error_fs);
|
||||||
|
|
||||||
|
FD_SET(tls->sockfd, &read_fs);
|
||||||
|
FD_SET(tls->sockfd, &error_fs);
|
||||||
|
|
||||||
|
ret = select(tls->sockfd + 1, &read_fs, NULL, &error_fs, &timeout);
|
||||||
|
if (!ret)
|
||||||
|
goto check_time;
|
||||||
|
else if (ret < 0)
|
||||||
|
return NETWORK_SSL_READ_ERROR;
|
||||||
|
|
||||||
|
if (FD_ISSET(tls->sockfd, &error_fs))
|
||||||
|
return NETWORK_SSL_READ_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
ret = setsockopt(tls->sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
|
|
||||||
ret = esp_tls_conn_read(tls, pMsg, len);
|
ret = esp_tls_conn_read(tls, pMsg, len);
|
||||||
|
|
||||||
/* Restore the old timeout */
|
|
||||||
tlsDataParams->timeout = read_timeout;
|
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
rxLen += ret;
|
rxLen += ret;
|
||||||
pMsg += ret;
|
pMsg += ret;
|
||||||
@ -185,6 +199,7 @@ IoT_Error_t iot_tls_read(Network *pNetwork, unsigned char *pMsg, size_t len, Tim
|
|||||||
return NETWORK_SSL_READ_ERROR;
|
return NETWORK_SSL_READ_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_time:
|
||||||
// Evaluate timeout after the read to make sure read is done at least once
|
// Evaluate timeout after the read to make sure read is done at least once
|
||||||
if (has_timer_expired(timer)) {
|
if (has_timer_expired(timer)) {
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user