From b329fdcb7394f7a30cb81c48e04ba3d557d29396 Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Fri, 29 Sep 2023 22:49:49 +1000 Subject: [PATCH] extmod/modnetwork: Increase max hostname length to 32. This changes from the previous limit of 15 characters. Although DHCP and mDNS allow for up to 63, ESP32 and ESP8266 only allow 32, so this seems like a reasonable limit to enforce across all ports (and avoids wasting the additional memory). Also clarifies that `MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN` does not include the null terminator (which was unclear before). This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared --- docs/library/network.rst | 5 +++++ extmod/modnetwork.c | 6 +++--- extmod/modnetwork.h | 6 ++++-- extmod/network_cyw43.c | 2 +- ports/esp32/network_wlan.c | 2 +- ports/esp8266/network_wlan.c | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/library/network.rst b/docs/library/network.rst index a14d6192ea..cc50884294 100644 --- a/docs/library/network.rst +++ b/docs/library/network.rst @@ -188,6 +188,11 @@ The following are functions available in the network module. during connection. For this reason, you must set the hostname before activating/connecting your network interfaces. + The length of the hostname is limited to 32 characters. + :term:`MicroPython ports ` may choose to set a lower + limit for memory reasons. If the given name does not fit, a `ValueError` + is raised. + The default hostname is typically the name of the board. .. function:: phy_mode([mode]) diff --git a/extmod/modnetwork.c b/extmod/modnetwork.c index 7c1b91de45..378b45b9c8 100644 --- a/extmod/modnetwork.c +++ b/extmod/modnetwork.c @@ -35,7 +35,7 @@ #if MICROPY_PY_NETWORK #include "shared/netutils/netutils.h" -#include "modnetwork.h" +#include "extmod/modnetwork.h" #if MICROPY_PY_NETWORK_CYW43 // So that CYW43_LINK_xxx constants are available to MICROPY_PORT_NETWORK_INTERFACES. @@ -56,7 +56,7 @@ char mod_network_country_code[2] = "XX"; #error "MICROPY_PY_NETWORK_HOSTNAME_DEFAULT must be set in mpconfigport.h or mpconfigboard.h" #endif -char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN] = MICROPY_PY_NETWORK_HOSTNAME_DEFAULT; +char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN + 1] = MICROPY_PY_NETWORK_HOSTNAME_DEFAULT; #ifdef MICROPY_PORT_NETWORK_INTERFACES @@ -122,7 +122,7 @@ STATIC mp_obj_t network_hostname(size_t n_args, const mp_obj_t *args) { } else { size_t len; const char *str = mp_obj_str_get_data(args[0], &len); - if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + if (len > MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { mp_raise_ValueError(NULL); } strcpy(mod_network_hostname, str); diff --git a/extmod/modnetwork.h b/extmod/modnetwork.h index e775612fe7..e9769e309b 100644 --- a/extmod/modnetwork.h +++ b/extmod/modnetwork.h @@ -56,10 +56,12 @@ extern char mod_network_country_code[2]; #ifndef MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN -#define MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN (16) +// Doesn't include the null terminator. +#define MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN (32) #endif -extern char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN]; +// This is a null-terminated string. +extern char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN + 1]; #if MICROPY_PY_LWIP struct netif; diff --git a/extmod/network_cyw43.c b/extmod/network_cyw43.c index 168bd3d52b..f26a835c16 100644 --- a/extmod/network_cyw43.c +++ b/extmod/network_cyw43.c @@ -500,7 +500,7 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map // TODO: Deprecated. Use network.hostname(name) instead. size_t len; const char *str = mp_obj_str_get_data(e->value, &len); - if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + if (len > MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { mp_raise_ValueError(NULL); } strcpy(mod_network_hostname, str); diff --git a/ports/esp32/network_wlan.c b/ports/esp32/network_wlan.c index 58af9f3bc3..f06143bf76 100644 --- a/ports/esp32/network_wlan.c +++ b/ports/esp32/network_wlan.c @@ -524,7 +524,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_ // TODO: Deprecated. Use network.hostname(name) instead. size_t len; const char *str = mp_obj_str_get_data(kwargs->table[i].value, &len); - if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + if (len > MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { mp_raise_ValueError(NULL); } strcpy(mod_network_hostname, str); diff --git a/ports/esp8266/network_wlan.c b/ports/esp8266/network_wlan.c index 348d7f6355..012cc970b2 100644 --- a/ports/esp8266/network_wlan.c +++ b/ports/esp8266/network_wlan.c @@ -404,7 +404,7 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs // TODO: Deprecated. Use network.hostname(name) instead. size_t len; const char *str = mp_obj_str_get_data(kwargs->table[i].value, &len); - if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + if (len > MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { mp_raise_ValueError(NULL); } strcpy(mod_network_hostname, str);