From 7a30e6c0721d9cf5bc9442a2f82b0c661a65c8ad Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Mon, 18 Nov 2019 17:50:38 +0800 Subject: [PATCH] feat(esp-tls): modify for esp8266 --- .../aws_iot/port/network_mbedtls_wrapper.c | 14 ++++++++++---- components/esp-tls/CMakeLists.txt | 2 +- components/esp-tls/esp_tls.c | 16 ++++++++++------ components/esp-tls/esp_tls.h | 8 ++++---- components/lwip/port/esp8266/include/lwipopts.h | 1 + .../main/https_request_example_main.c | 9 ++------- 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/components/aws_iot/port/network_mbedtls_wrapper.c b/components/aws_iot/port/network_mbedtls_wrapper.c index 515f6745..5b70ad30 100644 --- a/components/aws_iot/port/network_mbedtls_wrapper.c +++ b/components/aws_iot/port/network_mbedtls_wrapper.c @@ -69,6 +69,7 @@ IoT_Error_t iot_tls_is_connected(Network *pNetwork) { } IoT_Error_t iot_tls_connect(Network *pNetwork, TLSConnectParams *params) { + struct esp_tls *tls; int ret = SUCCESS; TLSDataParams *tlsDataParams = NULL; @@ -101,10 +102,15 @@ IoT_Error_t iot_tls_connect(Network *pNetwork, TLSConnectParams *params) { esp_set_cpu_freq(ESP_CPU_FREQ_160M); - struct esp_tls *tls = esp_tls_conn_new(pNetwork->tlsConnectParams.pDestinationURL, strlen(pNetwork->tlsConnectParams.pDestinationURL), pNetwork->tlsConnectParams.DestinationPort, &cfg); - + tls = esp_tls_init(); if (!tls) { ret = SSL_CONNECTION_ERROR; + } else { + int tls_ret = esp_tls_conn_new_sync(pNetwork->tlsConnectParams.pDestinationURL, strlen(pNetwork->tlsConnectParams.pDestinationURL), pNetwork->tlsConnectParams.DestinationPort, &cfg, tls); + if (tls_ret) { + ret = SSL_CONNECTION_ERROR; + esp_tls_conn_delete(tls); + } } tlsDataParams->timeout = pNetwork->tlsConnectParams.timeout_ms; @@ -129,7 +135,7 @@ IoT_Error_t iot_tls_write(Network *pNetwork, unsigned char *pMsg, size_t len, Ti written_so_far < len && !has_timer_expired(timer); written_so_far += ret, frags++) { while(!has_timer_expired(timer) && (ret = esp_tls_conn_write(tls, pMsg + written_so_far, len - written_so_far)) <= 0) { - if(ret != ESP_TLS_ERROR_WANT_READ && ret != ESP_TLS_ERROR_WANT_WRITE) { + if(ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) { ESP_LOGE(TAG, "failed! esp_tls_conn_write returned -0x%x", -ret); /* All other negative return values indicate connection needs to be reset. * Will be caught in ping request so ignored here */ @@ -195,7 +201,7 @@ IoT_Error_t iot_tls_read(Network *pNetwork, unsigned char *pMsg, size_t len, Tim rxLen += ret; pMsg += ret; len -= ret; - } else if (ret == 0 || (ret != ESP_TLS_ERROR_WANT_READ && ret != ESP_TLS_ERROR_WANT_WRITE)) { + } else if (ret == 0 || (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE)) { return NETWORK_SSL_READ_ERROR; } diff --git a/components/esp-tls/CMakeLists.txt b/components/esp-tls/CMakeLists.txt index bf32e96e..199c554a 100644 --- a/components/esp-tls/CMakeLists.txt +++ b/components/esp-tls/CMakeLists.txt @@ -13,7 +13,7 @@ idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "." PRIV_INCLUDE_DIRS "private_include" REQUIRES mbedtls - PRIV_REQUIRES lwip nghttp) + PRIV_REQUIRES lwip http_parser) if(CONFIG_ESP_TLS_USING_WOLFSSL) idf_component_get_property(wolfssl esp-wolfssl COMPONENT_LIB) diff --git a/components/esp-tls/esp_tls.c b/components/esp-tls/esp_tls.c index af2be302..cd45d218 100644 --- a/components/esp-tls/esp_tls.c +++ b/components/esp-tls/esp_tls.c @@ -169,12 +169,16 @@ static esp_err_t esp_tcp_connect(const char *host, int hostlen, int port, int *s struct sockaddr_in *p = (struct sockaddr_in *)addrinfo->ai_addr; p->sin_port = htons(port); addr_ptr = p; - } else if (addrinfo->ai_family == AF_INET6) { + } +#if LWIP_IPV6 + else if (addrinfo->ai_family == AF_INET6) { struct sockaddr_in6 *p = (struct sockaddr_in6 *)addrinfo->ai_addr; p->sin6_port = htons(port); p->sin6_family = AF_INET6; addr_ptr = p; - } else { + } +#endif + else { ESP_LOGE(TAG, "Unsupported protocol family %d", addrinfo->ai_family); ret = ESP_ERR_ESP_TLS_UNSUPPORTED_PROTOCOL_FAMILY; goto err_freesocket; @@ -236,8 +240,8 @@ static int esp_tls_low_level_conn(const char *hostname, int hostlen, int port, c return -1; } if (!cfg) { - tls->read = tcp_read; - tls->write = tcp_write; + tls->_read = tcp_read; + tls->_write = tcp_write; ESP_LOGD(TAG, "non-tls connection established"); return 1; } @@ -282,8 +286,8 @@ static int esp_tls_low_level_conn(const char *hostname, int hostlen, int port, c tls->conn_state = ESP_TLS_FAIL; return -1; } - tls->read = _esp_tls_read; - tls->write = _esp_tls_write; + tls->_read = _esp_tls_read; + tls->_write = _esp_tls_write; tls->conn_state = ESP_TLS_HANDSHAKE; /* falls through */ case ESP_TLS_HANDSHAKE: diff --git a/components/esp-tls/esp_tls.h b/components/esp-tls/esp_tls.h index d12f210d..bd93764e 100644 --- a/components/esp-tls/esp_tls.h +++ b/components/esp-tls/esp_tls.h @@ -284,10 +284,10 @@ typedef struct esp_tls { #endif int sockfd; /*!< Underlying socket file descriptor. */ - ssize_t (*read)(struct esp_tls *tls, char *data, size_t datalen); /*!< Callback function for reading data from TLS/SSL + ssize_t (*_read)(struct esp_tls *tls, char *data, size_t datalen); /*!< Callback function for reading data from TLS/SSL connection. */ - ssize_t (*write)(struct esp_tls *tls, const char *data, size_t datalen); /*!< Callback function for writing data to TLS/SSL + ssize_t (*_write)(struct esp_tls *tls, const char *data, size_t datalen); /*!< Callback function for writing data to TLS/SSL connection. */ esp_tls_conn_state_t conn_state; /*!< ESP-TLS Connection state */ @@ -429,7 +429,7 @@ int esp_tls_conn_http_new_async(const char *url, const esp_tls_cfg_t *cfg, esp_t */ static inline ssize_t esp_tls_conn_write(esp_tls_t *tls, const void *data, size_t datalen) { - return tls->write(tls, (char *)data, datalen); + return tls->_write(tls, (char *)data, datalen); } /** @@ -449,7 +449,7 @@ static inline ssize_t esp_tls_conn_write(esp_tls_t *tls, const void *data, size_ */ static inline ssize_t esp_tls_conn_read(esp_tls_t *tls, void *data, size_t datalen) { - return tls->read(tls, (char *)data, datalen); + return tls->_read(tls, (char *)data, datalen); } /** diff --git a/components/lwip/port/esp8266/include/lwipopts.h b/components/lwip/port/esp8266/include/lwipopts.h index 80d53752..970ac342 100644 --- a/components/lwip/port/esp8266/include/lwipopts.h +++ b/components/lwip/port/esp8266/include/lwipopts.h @@ -1444,6 +1444,7 @@ size_t memp_malloc_get_size(size_t type); */ #ifdef CONFIG_USING_ESP_VFS #define LWIP_POSIX_SOCKETS_IO_NAMES 0 +#include /* close/read/write */ #else #define LWIP_POSIX_SOCKETS_IO_NAMES 1 #endif diff --git a/examples/protocols/https_request/main/https_request_example_main.c b/examples/protocols/https_request/main/https_request_example_main.c index ae5ee19f..628410ce 100644 --- a/examples/protocols/https_request/main/https_request_example_main.c +++ b/examples/protocols/https_request/main/https_request_example_main.c @@ -146,7 +146,7 @@ static void https_get_task(void *pvParameters) .cacert_pem_bytes = server_root_cert_pem_end - server_root_cert_pem_start, }; - struct esp_tls *tls = esp_tls_conn_new(WEB_SERVER, strlen(WEB_SERVER), WEB_PORT, &cfg); + struct esp_tls *tls = esp_tls_conn_http_new(WEB_URL, &cfg); if(tls != NULL) { ESP_LOGI(TAG, "Connection established..."); @@ -163,12 +163,7 @@ static void https_get_task(void *pvParameters) if (ret >= 0) { ESP_LOGI(TAG, "%d bytes written", ret); written_bytes += ret; - } else if -#if CONFIG_SSL_USING_MBEDTLS - (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) -#else - (ret != WOLFSSL_ERROR_WANT_READ && ret != WOLFSSL_ERROR_WANT_WRITE) -#endif + } else if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) { ESP_LOGE(TAG, "esp_tls_conn_write returned 0x%x", ret); goto exit;