Add support for hostname request in lwIP interface (#347)

* Add methods for setting hostname

In the same way it is done for setting MAC address, add methods for
setting hostname. The underlying network stack can then request this
to the local DNS through DHCP.

* Request hostname through DHCP

If hostname is provided, request it to local DNS through DHCP.
pull/15530/head
Guilherme Ricioli 2024-09-18 22:34:25 -03:00 committed by GitHub
parent ef8181a129
commit eca8047244
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 99 additions and 0 deletions

View File

@ -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;

View File

@ -86,6 +86,12 @@ public:
/** @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;
@ -149,6 +155,8 @@ protected:
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] {};

View File

@ -90,6 +90,24 @@ public:
*/
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 couldn't be set (e.g. for
* LwIP stack, hostname can only be set before calling
* \c EthernetInterface::connect method)
*/
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

View File

@ -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

View File

@ -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))) {

View File

@ -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;

View File

@ -21,6 +21,16 @@
// Default network-interface state
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;

View File

@ -68,6 +68,17 @@ TEST_F(TestNetworkInterface, constructor)
}
// get_default_instance is tested along with the implementations of NetworkInterface.
TEST_F(TestNetworkInterface, get_hostname)
{
char *n = 0;
EXPECT_EQ(iface->get_hostname(), n);
}
TEST_F(TestNetworkInterface, set_hostname)
{
char *hostname;
EXPECT_EQ(iface->set_hostname(hostname), NSAPI_ERROR_UNSUPPORTED);
}
TEST_F(TestNetworkInterface, get_mac_address)
{