From 979a9425499565e434db708317a4fc0dc3792af8 Mon Sep 17 00:00:00 2001 From: Guilherme Ricioli Date: Mon, 15 Apr 2024 17:40:59 -0300 Subject: [PATCH 1/2] Add methods for setting hostname Like what is done for user MAC address, add methods for setting hostname. The underlying network stack can then request this to the local DNS through DHCP. --- .../include/netsocket/EMACInterface.h | 8 ++++++ .../include/netsocket/NetworkInterface.h | 16 ++++++++++++ .../netsocket/include/netsocket/nsapi_types.h | 10 +++++++ .../netsocket/source/EMACInterface.cpp | 26 +++++++++++++++++++ .../netsocket/source/NetworkInterface.cpp | 10 +++++++ 5 files changed, 70 insertions(+) diff --git a/connectivity/netsocket/include/netsocket/EMACInterface.h b/connectivity/netsocket/include/netsocket/EMACInterface.h index 8cf47cb7036..c06aeb850e5 100644 --- a/connectivity/netsocket/include/netsocket/EMACInterface.h +++ b/connectivity/netsocket/include/netsocket/EMACInterface.h @@ -83,6 +83,12 @@ class EMACInterface : public virtual NetworkInterface { /** @copydoc NetworkInterface::disconnect */ nsapi_error_t disconnect() override; + /** @copydoc NetworkInterface::get_hostname */ + const char *get_hostname() override; + + /** @copydoc NetworkInterface::set_hostname */ + nsapi_error_t set_hostname(const char *hostname) override; + /** @copydoc NetworkInterface::get_mac_address */ const char *get_mac_address() override; @@ -146,6 +152,8 @@ class EMACInterface : public virtual NetworkInterface { OnboardNetworkStack::Interface *_interface = nullptr; bool _dhcp = true; bool _blocking = true; + bool _hostname_set = false; + char _hostname[NSAPI_HOSTNAME_SIZE]; bool _hw_mac_addr_set = false; char _mac_address[NSAPI_MAC_SIZE]; char _ip_address[NSAPI_IPv6_SIZE] {}; diff --git a/connectivity/netsocket/include/netsocket/NetworkInterface.h b/connectivity/netsocket/include/netsocket/NetworkInterface.h index 9071a1e40bd..0e2aa64c9db 100644 --- a/connectivity/netsocket/include/netsocket/NetworkInterface.h +++ b/connectivity/netsocket/include/netsocket/NetworkInterface.h @@ -90,6 +90,22 @@ class NetworkInterface: public DNS { */ virtual void set_as_default(); + /** Get hostname. + * + * @return Hostname if configured, null otherwise + */ + virtual const char *get_hostname(); + + /** Set hostname. + * + * @param hostname Hostname string + * @retval NSAPI_ERROR_OK on success + * @retval NSAPI_ERROR_UNSUPPORTED if this feature is not supported + * @retval NSAPI_ERROR_PARAMETER if hostname is not valid + * @retval NSAPI_ERROR_BUSY if hostname can't be set + */ + virtual nsapi_error_t set_hostname(const char *hostname); + /** Get the local MAC address. * * Provided MAC address is intended for info or debug purposes and diff --git a/connectivity/netsocket/include/netsocket/nsapi_types.h b/connectivity/netsocket/include/netsocket/nsapi_types.h index 3b496d5087a..28dbcc9a38d 100644 --- a/connectivity/netsocket/include/netsocket/nsapi_types.h +++ b/connectivity/netsocket/include/netsocket/nsapi_types.h @@ -196,6 +196,16 @@ typedef enum nsapi_security { */ #define NSAPI_IP_BYTES NSAPI_IPv6_BYTES +/** Maximum size of hostname + * + * According to RFC 1034 [1], Section 3.1 "Name space specifications and + * terminology", 63 is the maximum size of a hostname. +1 for the string + * terminator. + * + * [1] https://www.rfc-editor.org/rfc/rfc1034 + */ +#define NSAPI_HOSTNAME_SIZE 64 + /** Maximum size of MAC address representation */ #define NSAPI_MAC_SIZE 18 diff --git a/connectivity/netsocket/source/EMACInterface.cpp b/connectivity/netsocket/source/EMACInterface.cpp index f48bc0a185a..26b7e298561 100644 --- a/connectivity/netsocket/source/EMACInterface.cpp +++ b/connectivity/netsocket/source/EMACInterface.cpp @@ -88,6 +88,32 @@ nsapi_error_t EMACInterface::disconnect() return NSAPI_ERROR_NO_CONNECTION; } +const char *EMACInterface::get_hostname() +{ + if (_hostname_set) { + return _hostname; + } + return nullptr; +} + +nsapi_error_t EMACInterface::set_hostname(const char *hostname) +{ + if (!hostname || strlen(hostname) > NSAPI_HOSTNAME_SIZE-1) { + return NSAPI_ERROR_PARAMETER; + } + + if (_interface) { + // can't set hostname once initialized + return NSAPI_ERROR_BUSY; + } + + memset(_hostname, 0, NSAPI_HOSTNAME_SIZE); + strncpy(_hostname, hostname, NSAPI_HOSTNAME_SIZE-1); + _hostname_set = true; + + return NSAPI_ERROR_OK; +} + const char *EMACInterface::get_mac_address() { if (_interface && _interface->get_mac_address(_mac_address, sizeof(_mac_address))) { diff --git a/connectivity/netsocket/source/NetworkInterface.cpp b/connectivity/netsocket/source/NetworkInterface.cpp index 0f237f0e190..649df0f9b30 100644 --- a/connectivity/netsocket/source/NetworkInterface.cpp +++ b/connectivity/netsocket/source/NetworkInterface.cpp @@ -29,6 +29,16 @@ void NetworkInterface::set_as_default() } +const char *NetworkInterface::get_hostname() +{ + return 0; +} + +nsapi_error_t NetworkInterface::set_hostname(const char *hostname) +{ + return NSAPI_ERROR_UNSUPPORTED; +} + const char *NetworkInterface::get_mac_address() { return 0; From a96d34923e5b70c2b3db32ce65283f93e9f7f789 Mon Sep 17 00:00:00 2001 From: Guilherme Ricioli Date: Tue, 16 Apr 2024 10:50:48 -0300 Subject: [PATCH 2/2] Request hostname through DHCP If hostname is provided, request it to local DNS through DHCP. --- connectivity/lwipstack/source/LWIPInterface.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/connectivity/lwipstack/source/LWIPInterface.cpp b/connectivity/lwipstack/source/LWIPInterface.cpp index a1cfcf31c41..3e42640dc51 100644 --- a/connectivity/lwipstack/source/LWIPInterface.cpp +++ b/connectivity/lwipstack/source/LWIPInterface.cpp @@ -433,6 +433,7 @@ LWIP::Interface::Interface() : nsapi_error_t LWIP::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, NetworkInterface *user_network_interface) { #if LWIP_ETHERNET + const char *hostname; Interface *interface = new (std::nothrow) Interface(); if (!interface) { return NSAPI_ERROR_NO_MEMORY; @@ -441,6 +442,11 @@ nsapi_error_t LWIP::add_ethernet_interface(EMAC &emac, bool default_if, OnboardN interface->memory_manager = &memory_manager; interface->ppp_enabled = false; + hostname = user_network_interface->get_hostname(); + if(hostname) { + netif_set_hostname(&interface->netif, hostname); + } + #if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE) netif->interface.hwaddr[0] = MBED_MAC_ADDR_0; netif->interface.hwaddr[1] = MBED_MAC_ADDR_1;