Просмотр исходного кода

transport: fix transport ssl blocking
In SSL mode, if `esp_transport_poll_read` function is used, the cache data in mebdtls will be blocked

xutao 5 лет назад
Родитель
Сommit
bd2daccb22
1 измененных файлов с 7 добавлено и 4 удалено
  1. 7 4
      components/tcp_transport/transport_ssl.c

+ 7 - 4
components/tcp_transport/transport_ssl.c

@@ -87,6 +87,7 @@ static int ssl_poll_read(esp_transport_handle_t t, int timeout_ms)
 {
     transport_ssl_t *ssl = esp_transport_get_context_data(t);
     int ret = -1;
+    int remain = 0;
     struct timeval timeout;
     fd_set readset;
     fd_set errset;
@@ -95,6 +96,10 @@ static int ssl_poll_read(esp_transport_handle_t t, int timeout_ms)
     FD_SET(ssl->tls->sockfd, &readset);
     FD_SET(ssl->tls->sockfd, &errset);
 
+    if ((remain = esp_tls_get_bytes_avail(ssl->tls)) > 0) {
+        ESP_LOGD(TAG, "remain data in cache, need to read again");
+        return remain;
+    }
     ret = select(ssl->tls->sockfd + 1, &readset, NULL, &errset, esp_transport_utils_ms_to_timeval(timeout_ms, &timeout));
     if (ret > 0 && FD_ISSET(ssl->tls->sockfd, &errset)) {
         int sock_errno = 0;
@@ -150,10 +155,8 @@ static int ssl_read(esp_transport_handle_t t, char *buffer, int len, int timeout
     int poll, ret;
     transport_ssl_t *ssl = esp_transport_get_context_data(t);
 
-    if (esp_tls_get_bytes_avail(ssl->tls) <= 0) {
-        if ((poll = esp_transport_poll_read(t, timeout_ms)) <= 0) {
-            return poll;
-        }
+    if ((poll = esp_transport_poll_read(t, timeout_ms)) <= 0) {
+        return poll;
     }
     ret = esp_tls_conn_read(ssl->tls, (unsigned char *)buffer, len);
     if (ret < 0) {