diff --git a/include/net/mqtt.h b/include/net/mqtt.h index f8782e7310c..f9eb92fb97e 100644 --- a/include/net/mqtt.h +++ b/include/net/mqtt.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #ifdef __cplusplus @@ -349,11 +350,6 @@ enum mqtt_transport_type { MQTT_TRANSPORT_SECURE, #endif /* CONFIG_MQTT_LIB_TLS */ -#if defined(CONFIG_MQTT_LIB_SOCKS) - /** Use SOCKS5 proxy for MQTT connection. */ - MQTT_TRANSPORT_SOCKS, -#endif /* CONFIG_MQTT_LIB_SOCKS */ - /** Shall not be used as a transport type. * Indicator of maximum transport types possible. */ @@ -387,19 +383,14 @@ struct mqtt_transport { struct mqtt_sec_config config; } tls; #endif /* CONFIG_MQTT_LIB_TLS */ - -#if defined(CONFIG_MQTT_LIB_SOCKS) - /* SOCKS5 proxy transport for MQTT */ - struct { - /** Socket descriptor. */ - int sock; - - /** SOCKS5 proxy address. */ - struct sockaddr_storage *proxy; - } socks5; -#endif /* CONFIG_MQTT_LIB_SOCKS */ - }; + +#if defined(CONFIG_SOCKS) + struct { + struct sockaddr addr; + socklen_t addrlen; + } proxy; +#endif }; /** @brief MQTT internal state. */ @@ -505,6 +496,24 @@ struct mqtt_client { */ void mqtt_client_init(struct mqtt_client *client); +#if defined(CONFIG_SOCKS) +/* + * @brief Set proxy server details + * + * @param[in] client Client instance for which the procedure is requested, + * Shall not be NULL. + * @param[in] proxy_addr Proxy server address. + * @param[in] addrlen Proxy server address length. + * + * @return 0 or a negative error code (errno.h) indicating reason of failure. + * + * @note Must be called before calling mqtt_connect(). + */ +int mqtt_client_set_proxy(struct mqtt_client *client, + struct sockaddr *proxy_addr, + socklen_t addrlen); +#endif + /** * @brief API to request new MQTT client connection. * diff --git a/subsys/net/lib/mqtt/CMakeLists.txt b/subsys/net/lib/mqtt/CMakeLists.txt index 376e0407a5e..9042be0950c 100644 --- a/subsys/net/lib/mqtt/CMakeLists.txt +++ b/subsys/net/lib/mqtt/CMakeLists.txt @@ -14,7 +14,3 @@ zephyr_library_sources( zephyr_library_sources_ifdef(CONFIG_MQTT_LIB_TLS mqtt_transport_socket_tls.c ) - -zephyr_library_sources_ifdef(CONFIG_MQTT_LIB_SOCKS - mqtt_transport_socks.c - ) diff --git a/subsys/net/lib/mqtt/Kconfig b/subsys/net/lib/mqtt/Kconfig index 1c511f27fc3..b53e00dadcc 100644 --- a/subsys/net/lib/mqtt/Kconfig +++ b/subsys/net/lib/mqtt/Kconfig @@ -32,10 +32,4 @@ config MQTT_LIB_TLS help Enable TLS support for socket MQTT Library -config MQTT_LIB_SOCKS - bool "SOCKS proxy support for socket MQTT Library" - select SOCKS - help - Enable SOCKS proxy support for socket MQTT Library - endif # MQTT_LIB diff --git a/subsys/net/lib/mqtt/mqtt.c b/subsys/net/lib/mqtt/mqtt.c index 5bfd7d26d8b..02bdc384ddf 100644 --- a/subsys/net/lib/mqtt/mqtt.c +++ b/subsys/net/lib/mqtt/mqtt.c @@ -171,6 +171,26 @@ void mqtt_client_init(struct mqtt_client *client) client->keepalive = MQTT_KEEPALIVE; } +#if defined(CONFIG_SOCKS) +int mqtt_client_set_proxy(struct mqtt_client *client, + struct sockaddr *proxy_addr, + socklen_t addrlen) +{ + if (IS_ENABLED(CONFIG_SOCKS)) { + if (!client || !proxy_addr) { + return -EINVAL; + } + + client->transport.proxy.addrlen = addrlen; + memcpy(&client->transport.proxy.addr, proxy_addr, addrlen); + + return 0; + } + + return -ENOTSUP; +} +#endif + int mqtt_connect(struct mqtt_client *client) { int err_code; diff --git a/subsys/net/lib/mqtt/mqtt_transport.c b/subsys/net/lib/mqtt/mqtt_transport.c index c7b31ce39fa..21db1697032 100644 --- a/subsys/net/lib/mqtt/mqtt_transport.c +++ b/subsys/net/lib/mqtt/mqtt_transport.c @@ -29,11 +29,6 @@ extern int mqtt_client_tls_read(struct mqtt_client *client, u8_t *data, extern int mqtt_client_tls_disconnect(struct mqtt_client *client); #endif /* CONFIG_MQTT_LIB_TLS */ -#if defined(CONFIG_MQTT_LIB_SOCKS) -/* Transport handler functions for SOCKS5 proxy socket transport. */ -extern int mqtt_client_socks5_connect(struct mqtt_client *client); -#endif /* CONFIG_MQTT_LIB_SOCKS */ - /**@brief Function pointer array for TCP/TLS transport handlers. */ const struct transport_procedure transport_fn[MQTT_TRANSPORT_NUM] = { { @@ -50,14 +45,6 @@ const struct transport_procedure transport_fn[MQTT_TRANSPORT_NUM] = { mqtt_client_tls_disconnect, }, #endif /* CONFIG_MQTT_LIB_TLS */ -#if defined(CONFIG_MQTT_LIB_SOCKS) - { - mqtt_client_socks5_connect, - mqtt_client_tcp_write, - mqtt_client_tcp_read, - mqtt_client_tcp_disconnect, - }, -#endif /* CONFIG_MQTT_LIB_SOCKS */ }; int mqtt_transport_connect(struct mqtt_client *client) diff --git a/subsys/net/lib/mqtt/mqtt_transport_socket_tcp.c b/subsys/net/lib/mqtt/mqtt_transport_socket_tcp.c index 6aa9c7c992d..43c3d4c1baf 100644 --- a/subsys/net/lib/mqtt/mqtt_transport_socket_tcp.c +++ b/subsys/net/lib/mqtt/mqtt_transport_socket_tcp.c @@ -35,6 +35,18 @@ int mqtt_client_tcp_connect(struct mqtt_client *client) return -errno; } +#if defined(CONFIG_SOCKS) + if (client->transport.proxy.addrlen != 0) { + ret = setsockopt(client->transport.tcp.sock, + SOL_SOCKET, SO_SOCKS5, + &client->transport.proxy.addr, + client->transport.proxy.addrlen); + if (ret < 0) { + return -errno; + } + } +#endif + MQTT_TRC("Created socket %d", client->transport.tcp.sock); size_t peer_addr_size = sizeof(struct sockaddr_in6); diff --git a/subsys/net/lib/mqtt/mqtt_transport_socket_tls.c b/subsys/net/lib/mqtt/mqtt_transport_socket_tls.c index e3fc5bb097b..3ca62657605 100644 --- a/subsys/net/lib/mqtt/mqtt_transport_socket_tls.c +++ b/subsys/net/lib/mqtt/mqtt_transport_socket_tls.c @@ -38,6 +38,17 @@ int mqtt_client_tls_connect(struct mqtt_client *client) MQTT_TRC("Created socket %d", client->transport.tls.sock); +#if defined(CONFIG_SOCKS) + if (client->transport.proxy.addrlen != 0) { + ret = setsockopt(client->transport.tls.sock, + SOL_SOCKET, SO_SOCKS5, + &client->transport.proxy.addr, + client->transport.proxy.addrlen); + if (ret < 0) { + return -errno; + } + } +#endif /* Set secure socket options. */ ret = setsockopt(client->transport.tls.sock, SOL_TLS, TLS_PEER_VERIFY, &tls_config->peer_verify, diff --git a/subsys/net/lib/mqtt/mqtt_transport_socks.c b/subsys/net/lib/mqtt/mqtt_transport_socks.c deleted file mode 100644 index 0e44844362b..00000000000 --- a/subsys/net/lib/mqtt/mqtt_transport_socks.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2019 Antmicro Ltd - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** @file mqtt_transport_socks.c - * - * @brief Internal functions to handle transport over SOCKS5 proxy. - */ - -#include -LOG_MODULE_REGISTER(net_mqtt_socks, CONFIG_MQTT_LOG_LEVEL); - -#include -#include -#include -#include - -#include "mqtt_os.h" - -/**@brief Handles connect request for TCP socket transport. - * - * @param[in] client Identifies the client on which the procedure is requested. - * - * @retval 0 or an error code indicating reason for failure. - */ -int mqtt_client_socks5_connect(struct mqtt_client *client) -{ - const struct sockaddr *broker = client->broker; - const struct sockaddr *proxy = - (struct sockaddr *)client->transport.socks5.proxy; - - if (proxy == NULL || broker == NULL) { - return -EINVAL; - } - - client->transport.socks5.sock = - socks5_client_tcp_connect(proxy, broker); - - if (client->transport.socks5.sock < 0) { - return client->transport.socks5.sock; - } - - MQTT_TRC("Connect completed"); - return 0; -}