From c62cbd1254ab532211eed07d6c71d9a3096fc8fa Mon Sep 17 00:00:00 2001 From: yuanjm Date: Tue, 19 Jan 2021 17:49:42 +0800 Subject: [PATCH] transport: Support bind socket to specified interface in transport and esp-tls --- components/esp-tls/esp_tls.c | 11 ++++++++++- components/esp-tls/esp_tls.h | 1 + components/tcp_transport/include/esp_transport_ssl.h | 9 +++++++++ components/tcp_transport/include/esp_transport_tcp.h | 10 ++++++++++ components/tcp_transport/transport_ssl.c | 11 +++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/components/esp-tls/esp_tls.c b/components/esp-tls/esp_tls.c index e7afd25f8e..4d41b5273e 100644 --- a/components/esp-tls/esp_tls.c +++ b/components/esp-tls/esp_tls.c @@ -231,6 +231,15 @@ static esp_err_t esp_tls_set_socket_options(int fd, const esp_tls_cfg_t *cfg) return ESP_ERR_ESP_TLS_SOCKET_SETOPT_FAILED; } } + if (cfg->if_name) { + if (cfg->if_name->ifr_name[0] != 0) { + ESP_LOGD(TAG, "Bind [sock=%d] to interface %s", fd, cfg->if_name->ifr_name); + if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, cfg->if_name, sizeof(struct ifreq)) != 0) { + ESP_LOGE(TAG, "Bind [sock=%d] to interface %s fail", fd, cfg->if_name->ifr_name); + return ESP_ERR_ESP_TLS_SOCKET_SETOPT_FAILED; + } + } + } } return ESP_OK; } @@ -266,7 +275,7 @@ static esp_err_t esp_tcp_connect(const char *host, int hostlen, int port, int *s return ret; } - // Set timeout options and keep-alive options if configured + // Set timeout options, keep-alive options and bind device options if configured ret = esp_tls_set_socket_options(fd, cfg); if (ret != ESP_OK) { goto err; diff --git a/components/esp-tls/esp_tls.h b/components/esp-tls/esp_tls.h index 981379435c..72a78c5e7d 100644 --- a/components/esp-tls/esp_tls.h +++ b/components/esp-tls/esp_tls.h @@ -172,6 +172,7 @@ typedef struct esp_tls_cfg { void *ds_data; /*!< Pointer for digital signature peripheral context */ bool is_plain_tcp; /*!< Use non-TLS connection: When set to true, the esp-tls uses plain TCP transport rather then TLS/SSL connection */ + struct ifreq *if_name; /*!< The name of interface for data to go through. Use the default interface without setting */ } esp_tls_cfg_t; #ifdef CONFIG_ESP_TLS_SERVER diff --git a/components/tcp_transport/include/esp_transport_ssl.h b/components/tcp_transport/include/esp_transport_ssl.h index 2711abf330..d23a725c23 100644 --- a/components/tcp_transport/include/esp_transport_ssl.h +++ b/components/tcp_transport/include/esp_transport_ssl.h @@ -173,6 +173,15 @@ void esp_transport_ssl_set_psk_key_hint(esp_transport_handle_t t, const psk_hint */ void esp_transport_ssl_set_keep_alive(esp_transport_handle_t t, esp_transport_keep_alive_t *keep_alive_cfg); +/** + * @brief Set name of interface that socket can be binded on + * So the data can transport on this interface + * + * @param[in] t The transport handle + * @param[in] if_name The interface name + */ +void esp_transport_ssl_set_interface_name(esp_transport_handle_t t, struct ifreq *if_name); + #ifdef __cplusplus } #endif diff --git a/components/tcp_transport/include/esp_transport_tcp.h b/components/tcp_transport/include/esp_transport_tcp.h index 92b02fa789..6941820f0e 100644 --- a/components/tcp_transport/include/esp_transport_tcp.h +++ b/components/tcp_transport/include/esp_transport_tcp.h @@ -16,6 +16,7 @@ #define _ESP_TRANSPORT_TCP_H_ #include "esp_transport.h" +#include #ifdef __cplusplus extern "C" { @@ -30,6 +31,15 @@ extern "C" { */ void esp_transport_tcp_set_keep_alive(esp_transport_handle_t t, esp_transport_keep_alive_t *keep_alive_cfg); +/** + * @brief Set name of interface that socket can be binded on + * So the data can transport on this interface + * + * @param[in] t The transport handle + * @param[in] if_name The interface name + */ +void esp_transport_tcp_set_interface_name(esp_transport_handle_t t, struct ifreq *if_name); + /** * @brief Create TCP transport, the transport handle must be release esp_transport_destroy callback * diff --git a/components/tcp_transport/transport_ssl.c b/components/tcp_transport/transport_ssl.c index fd2795a4bd..5dfd1c2cb2 100644 --- a/components/tcp_transport/transport_ssl.c +++ b/components/tcp_transport/transport_ssl.c @@ -345,6 +345,12 @@ void esp_transport_ssl_set_keep_alive(esp_transport_handle_t t, esp_transport_ke ssl->cfg.keep_alive_cfg = (tls_keep_alive_cfg_t *) keep_alive_cfg; } +void esp_transport_ssl_set_interface_name(esp_transport_handle_t t, struct ifreq *if_name) +{ + GET_SSL_FROM_TRANSPORT_OR_RETURN(ssl, t); + ssl->cfg.if_name = if_name; +} + esp_transport_handle_t esp_transport_ssl_init(void) { esp_transport_handle_t t = esp_transport_init(); @@ -378,3 +384,8 @@ void esp_transport_tcp_set_keep_alive(esp_transport_handle_t t, esp_transport_ke { return esp_transport_ssl_set_keep_alive(t, keep_alive_cfg); } + +void esp_transport_tcp_set_interface_name(esp_transport_handle_t t, struct ifreq *if_name) +{ + return esp_transport_ssl_set_interface_name(t, if_name); +}