From 5705c689549dd550c994cd9ec7ad91453432484c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 5 Aug 2023 13:51:54 +1000 Subject: [PATCH] AP_Networking: cleanup parameter handling and fixed lwip config --- libraries/AP_Networking/AP_Networking.cpp | 179 +++++------------- libraries/AP_Networking/AP_Networking.h | 82 ++++---- .../AP_Networking/AP_Networking_Config.h | 51 +---- .../AP_Networking/AP_Networking_address.cpp | 152 +++++++++++++++ .../AP_Networking/AP_Networking_address.h | 36 ++++ 5 files changed, 286 insertions(+), 214 deletions(-) create mode 100644 libraries/AP_Networking/AP_Networking_address.cpp create mode 100644 libraries/AP_Networking/AP_Networking_address.h diff --git a/libraries/AP_Networking/AP_Networking.cpp b/libraries/AP_Networking/AP_Networking.cpp index 092f581d78..66ed92809e 100644 --- a/libraries/AP_Networking/AP_Networking.cpp +++ b/libraries/AP_Networking/AP_Networking.cpp @@ -18,6 +18,7 @@ extern const AP_HAL::HAL& hal; + const AP_Param::GroupInfo AP_Networking::var_info[] = { // @Param: ENABLED @@ -28,37 +29,9 @@ const AP_Param::GroupInfo AP_Networking::var_info[] = { // @User: Advanced AP_GROUPINFO_FLAGS("ENABLED", 0, AP_Networking, _param.enabled, 0, AP_PARAM_FLAG_ENABLE), - // @Param: IPADDR0 - // @DisplayName: IPv4 Address MSB - // @Description: Allows setting static IP address. Example: 192.xxx.xxx.xxx - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("IPADDR0", 1, AP_Networking, _param.ipaddr[0], AP_NETWORKING_DEFAULT_STATIC_IP_ADDR0), - - // @Param: IPADDR1 - // @DisplayName: IPv4 Address 2nd byte - // @Description: Allows setting static IP address. Example: xxx.168.xxx.xxx - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("IPADDR1", 2, AP_Networking, _param.ipaddr[1], AP_NETWORKING_DEFAULT_STATIC_IP_ADDR1), - - // @Param: IPADDR2 - // @DisplayName: IPv4 Address 3rd byte - // @Description: Allows setting static IP address. Example: xxx.xxx.13.xxx - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("IPADDR2", 3, AP_Networking, _param.ipaddr[2], AP_NETWORKING_DEFAULT_STATIC_IP_ADDR2), - - // @Param: IPADDR3 - // @DisplayName: IPv4 Address LSB - // @Description: Allows setting static IP address. Example: xxx.xxx.xxx.14 - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("IPADDR3", 4, AP_Networking, _param.ipaddr[3], AP_NETWORKING_DEFAULT_STATIC_IP_ADDR3), + // @Group: IPADDR + // @Path: AP_Networking_address.cpp + AP_SUBGROUPINFO(_param.ipaddr, "IPADDR", 1, AP_Networking, AP_Networking_IPV4), // @Param: NETMASK // @DisplayName: IP Subnet mask @@ -66,7 +39,7 @@ const AP_Param::GroupInfo AP_Networking::var_info[] = { // @Range: 0 32 // @RebootRequired: True // @User: Advanced - AP_GROUPINFO("NETMASK", 5, AP_Networking, _param.netmask, AP_NETWORKING_DEFAULT_NETMASK), + AP_GROUPINFO("NETMASK", 2, AP_Networking, _param.netmask, AP_NETWORKING_DEFAULT_NETMASK), // @Param: DHCP // @DisplayName: DHCP client @@ -74,87 +47,15 @@ const AP_Param::GroupInfo AP_Networking::var_info[] = { // @Values: 0:Disable, 1:Enable // @RebootRequired: True // @User: Advanced - AP_GROUPINFO("DHCP", 6, AP_Networking, _param.dhcp, AP_NETWORKING_DEFAULT_DHCP_ENABLE), + AP_GROUPINFO("DHCP", 3, AP_Networking, _param.dhcp, AP_NETWORKING_DEFAULT_DHCP_ENABLE), - // @Param: GWADDR0 - // @DisplayName: Gateway IP Address MSB - // @Description: Allows setting static GW address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("GWADDR0", 7, AP_Networking, _param.gwaddr[0], AP_NETWORKING_DEFAULT_STATIC_GW_ADDR0), + // @Group: GWADDR + // @Path: AP_Networking_address.cpp + AP_SUBGROUPINFO(_param.gwaddr, "GWADDR", 4, AP_Networking, AP_Networking_IPV4), - // @Param: GWADDR1 - // @DisplayName: Gateway IP Address 2nd byte - // @Description: Allows setting static GW address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("GWADDR1", 8, AP_Networking, _param.gwaddr[1], AP_NETWORKING_DEFAULT_STATIC_GW_ADDR1), - - // @Param: GWADDR2 - // @DisplayName: Gateway IP Address 3rd byte - // @Description: Allows setting static GW address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("GWADDR2", 9, AP_Networking, _param.gwaddr[2], AP_NETWORKING_DEFAULT_STATIC_GW_ADDR2), - - // @Param: GWADDR3 - // @DisplayName: Gateway IP Address LSB - // @Description: Allows setting static GW address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("GWADDR3", 10, AP_Networking, _param.gwaddr[3], AP_NETWORKING_DEFAULT_STATIC_GW_ADDR3), - - // @Param: MACADDR0 - // @DisplayName: MAC Address MSbyte - // @Description: Allows setting MAC address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("MACADDR0", 11, AP_Networking, _param.macaddr[0], AP_NETWORKING_DEFAULT_MAC_ADDR0), - - // @Param: MACADDR1 - // @DisplayName: MAC Address 2nd byte - // @Description: Allows setting MAC address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("MACADDR1", 12, AP_Networking, _param.macaddr[1], AP_NETWORKING_DEFAULT_MAC_ADDR1), - - // @Param: MACADDR2 - // @DisplayName: MAC Address 3rd byte - // @Description: Allows setting MAC address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("MACADDR2", 13, AP_Networking, _param.macaddr[2], AP_NETWORKING_DEFAULT_MAC_ADDR2), - - // @Param: MACADDR3 - // @DisplayName: MAC Address 4th byte - // @Description: Allows setting MAC address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("MACADDR3", 14, AP_Networking, _param.macaddr[3], AP_NETWORKING_DEFAULT_MAC_ADDR3), - - // @Param: MACADDR4 - // @DisplayName: MAC Address 5th byte - // @Description: Allows setting MAC address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("MACADDR4", 15, AP_Networking, _param.macaddr[4], AP_NETWORKING_DEFAULT_MAC_ADDR4), - - // @Param: MACADDR5 - // @DisplayName: MAC Address LSb - // @Description: Allows setting MAC address - // @Range: 0 255 - // @RebootRequired: True - // @User: Advanced - AP_GROUPINFO("MACADDR5", 16, AP_Networking, _param.macaddr[5], AP_NETWORKING_DEFAULT_MAC_ADDR5), + // @Group: MACADDR + // @Path: AP_Networking_address.cpp + AP_SUBGROUPINFO(_param.macaddr, "MACADDR", 5, AP_Networking, AP_Networking_MAC), AP_GROUPEND }; @@ -249,9 +150,9 @@ void AP_Networking::init() uint8_t uuid_len = sizeof(uuid); const bool udid_is_ok = hal.util->get_system_id_unformatted(uuid, uuid_len) && uuid_len >= 3; if (udid_is_ok) { - _param.macaddr[3].set_default(uuid[uuid_len-2]); - _param.macaddr[4].set_default(uuid[uuid_len-1]); - _param.macaddr[5].set_default(uuid[uuid_len-0]); + for (uint8_t i=0; i<3; i++) { + _param.macaddr.set_default_address_byte(i, uuid[uuid_len-3+i]); + } } #if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS @@ -266,13 +167,7 @@ void AP_Networking::init() return; } - const uint8_t localMACAddress[6] = {(uint8_t)_param.macaddr[0].get(), - (uint8_t)_param.macaddr[1].get(), - (uint8_t)_param.macaddr[2].get(), - (uint8_t)_param.macaddr[3].get(), - (uint8_t)_param.macaddr[4].get(), - (uint8_t)_param.macaddr[5].get() - }; + _param.macaddr.get_address(_activeSettings.macaddr); #if !AP_NETWORKING_DHCP_AVAILABLE set_dhcp_enable(false); @@ -292,14 +187,13 @@ void AP_Networking::init() addrMode = NET_ADDRESS_STATIC; } - struct lwipthread_opts netOptions = { (uint8_t *) localMACAddress, - _activeSettings.ip, - _activeSettings.nm, - _activeSettings.gw, - addrMode - }; + lwip_options.macaddress = _activeSettings.macaddr; + lwip_options.address = _activeSettings.ip; + lwip_options.netmask = _activeSettings.nm; + lwip_options.gateway = _activeSettings.gw; + lwip_options.addrMode = addrMode; - lwipInit(&netOptions); + lwipInit(&lwip_options); #endif #if AP_NETWORKING_DHCP_AVAILABLE @@ -390,7 +284,7 @@ uint8_t AP_Networking::convert_netmask_ip_to_bitcount(const uint32_t netmask_ip) return netmask_bitcount; } -uint32_t AP_Networking::convert_str_to_ip(char* ip_str) +uint32_t AP_Networking::convert_str_to_ip(const char* ip_str) { uint32_t ip = 0; inet_pton(AF_INET, ip_str, &ip); @@ -416,6 +310,33 @@ const char* AP_Networking::convert_ip_to_str(const uint32_t ip) return convert_ip_to_str(ip_array); } +/* + convert a string to an ethernet MAC address + */ +bool AP_Networking::convert_str_to_macaddr(const char *mac_str, uint8_t addr[6]) +{ + if (strlen(mac_str) != 17) { + return false; + } + char s2[18]; + strncpy(s2, mac_str, sizeof(s2)-1); + s2[17] = 0; + char *ptr = nullptr; + const char *s = strtok_r(s2, ":", &ptr); + for (uint8_t i=0; i<6; i++) { + if (s == nullptr) { + return false; + } + auto v = strtoul(s, nullptr, 16); + if (v > 255) { + return false; + } + addr[i] = v; + s = strtok_r(nullptr, ":", &ptr); + } + return true; +} + #if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS int32_t AP_Networking::send_udp(struct udp_pcb *pcb, const ip4_addr_t &ip4_addr, const uint16_t port, const uint8_t* data, uint16_t data_len) { diff --git a/libraries/AP_Networking/AP_Networking.h b/libraries/AP_Networking/AP_Networking.h index 5291dd7e66..6b16bc49a4 100644 --- a/libraries/AP_Networking/AP_Networking.h +++ b/libraries/AP_Networking/AP_Networking.h @@ -17,9 +17,11 @@ #define IP4_ADDR_VALUE(a,b,c,d) be32toh(UINT32_VALUE(a,b,c,d)) #endif -#define IP4_ADDR_VALUE_FROM_ARRAY(array) IP4_ADDR_VALUE(array[0],array[1],array[2],array[3]) -#define IP4_ADDR_FROM_ARRAY(dest_ip, array) IP4_ADDR(dest_ip, array[0],array[1],array[2],array[3]) -#define IP_ADDR_FROM_ARRAY(dest_ip, array) IP4_ADDR_FROM_ARRAY(dest_ip, array) +#include "AP_Networking_address.h" + +/* + Note! all uint32_t IPv4 addresses are in network byte order (big-endian) +*/ class AP_Networking { @@ -67,35 +69,22 @@ public: // returns the 32bit value of the user-parameter static IP address uint32_t get_ip_param() const { - return IP4_ADDR_VALUE_FROM_ARRAY(_param.ipaddr); + return _param.ipaddr.get_uint32(); } - // returns a null terminated string of the active IP address. Example: "192.168.12.13" - const char* get_ip_active_str() const + /* + returns a null terminated string of the active IP address. Example: "192.168.12.13" + Note that the returned + */ + const char *get_ip_active_str() const { return convert_ip_to_str(get_ip_active()); } - // returns a null terminated string of the user-parameter static IP address. Example: "192.168.12.13" - const char* get_ip_param_str() const - { - return convert_ip_to_str(get_ip_param()); - } - - // sets the user-parameter static IP address from a null terminated string. - void set_ip_param_str(const char* ip_str) - { - set_ip_param(convert_str_to_ip((char*)ip_str)); - } - // sets the user-parameter static IP address from a 32bit value - void set_ip_param(const uint32_t ip) + void set_ip_param(const uint32_t ip) { - //put_le32_ptr(_param.ipaddr->get(), ip); - _param.ipaddr[3].set_and_save((ip >> 24) & 0xff); - _param.ipaddr[2].set_and_save((ip >> 16) & 0xff); - _param.ipaddr[1].set_and_save((ip >> 8) & 0xff); - _param.ipaddr[0].set_and_save(ip & 0xff); + _param.ipaddr.set_uint32(ip); } // returns the 32bit value of the active Netmask that is currently in use @@ -111,19 +100,22 @@ public: } // returns a null terminated string of the active Netmask address. Example: "192.168.12.13" - const char* get_netmask_active_str() + const char *get_netmask_active_str() { return convert_ip_to_str(get_netmask_active()); } - const char* get_netmask_param_str() + + const char *get_netmask_param_str() { return convert_ip_to_str(get_netmask_param()); } - void set_netmask_param_str(const char* nm_str) + + void set_netmask_param_str(const char* nm_str) { set_netmask_param(convert_str_to_ip((char*)nm_str)); } - void set_netmask_param(const uint32_t nm) + + void set_netmask_param(const uint32_t nm) { _param.netmask.set(convert_netmask_ip_to_bitcount(nm)); } @@ -132,37 +124,41 @@ public: { return _activeSettings.gw; } + uint32_t get_gateway_param() const { - return IP4_ADDR_VALUE_FROM_ARRAY(_param.gwaddr); + return _param.gwaddr.get_uint32(); } - const char* get_gateway_active_str() + + const char *get_gateway_active_str() { return convert_ip_to_str(get_gateway_active()); } - const char* get_gateway_param_str() + + const char *get_gateway_param_str() { return convert_ip_to_str(get_gateway_param()); } - void set_gateway_param_str(const char* gw_str) + + void set_gateway_param_str(const char* gw_str) { set_gateway_param(convert_str_to_ip((char*)gw_str)); } - void set_gateway_param(const uint32_t gw) + + void set_gateway_param(const uint32_t gw) { - //put_le32_ptr(_param.gwaddr->get(), gw); - _param.gwaddr[3].set_and_save((gw >> 24) & 0xff); - _param.gwaddr[2].set_and_save((gw >> 16) & 0xff); - _param.gwaddr[1].set_and_save((gw >> 8) & 0xff); - _param.gwaddr[0].set_and_save(gw & 0xff); + _param.gwaddr.set_uint32(gw); } // helper functions to convert between 32bit IP addresses and null terminated strings and back - static uint32_t convert_str_to_ip(char* ip_str); + static uint32_t convert_str_to_ip(const char* ip_str); static const char* convert_ip_to_str(const uint8_t ip[4]); static const char* convert_ip_to_str(const uint32_t ip); + // convert string to ethernet mac address + static bool convert_str_to_macaddr(const char *mac_str, uint8_t addr[6]); + // helper functions to convert between 32bit Netmask and counting consecutive bits and back static uint32_t convert_netmask_bitcount_to_ip(const uint32_t netmask_bitcount); static uint8_t convert_netmask_ip_to_bitcount(const uint32_t netmask_ip); @@ -186,12 +182,12 @@ private: } _init; struct { - AP_Int16 ipaddr[4]; + AP_Networking_IPV4 ipaddr{AP_NETWORKING_DEFAULT_STATIC_IP_ADDR}; AP_Int8 netmask; // bits to mask. example: (16 == 255.255.0.0) and (24 == 255.255.255.0) - AP_Int16 gwaddr[4]; + AP_Networking_IPV4 gwaddr{AP_NETWORKING_DEFAULT_STATIC_GW_ADDR}; AP_Int8 dhcp; - AP_Int16 macaddr[6]; + AP_Networking_MAC macaddr{AP_NETWORKING_DEFAULT_MAC_ADDR}; AP_Int8 enabled; AP_Int32 options; } _param; @@ -201,8 +197,10 @@ private: uint32_t nm; uint32_t gw; uint32_t announce_ms; + uint8_t macaddr[6]; bool announce_at_boot_done; } _activeSettings; + struct lwipthread_opts lwip_options; HAL_Semaphore _sem; }; diff --git a/libraries/AP_Networking/AP_Networking_Config.h b/libraries/AP_Networking/AP_Networking_Config.h index 1ff3007a9b..54926c6d22 100644 --- a/libraries/AP_Networking/AP_Networking_Config.h +++ b/libraries/AP_Networking/AP_Networking_Config.h @@ -20,18 +20,9 @@ #define AP_NETWORKING_DEFAULT_DHCP_ENABLE 1 #endif -// Default Static IP Address: 192.168.13.13 -#ifndef AP_NETWORKING_DEFAULT_STATIC_IP_ADDR0 -#define AP_NETWORKING_DEFAULT_STATIC_IP_ADDR0 192 -#endif -#ifndef AP_NETWORKING_DEFAULT_STATIC_IP_ADDR1 -#define AP_NETWORKING_DEFAULT_STATIC_IP_ADDR1 168 -#endif -#ifndef AP_NETWORKING_DEFAULT_STATIC_IP_ADDR2 -#define AP_NETWORKING_DEFAULT_STATIC_IP_ADDR2 13 -#endif -#ifndef AP_NETWORKING_DEFAULT_STATIC_IP_ADDR3 -#define AP_NETWORKING_DEFAULT_STATIC_IP_ADDR3 14 +// Default Static IP Address: 192.168.13.14 +#ifndef AP_NETWORKING_DEFAULT_STATIC_IP_ADDR +#define AP_NETWORKING_DEFAULT_STATIC_IP_ADDR "192.168.13.14" #endif // Default Netmask: 24 @@ -43,38 +34,12 @@ // Default Static IP Address: 192.168.13.1 -#ifndef AP_NETWORKING_DEFAULT_STATIC_GW_ADDR0 -#define AP_NETWORKING_DEFAULT_STATIC_GW_ADDR0 192 -#endif -#ifndef AP_NETWORKING_DEFAULT_STATIC_GW_ADDR1 -#define AP_NETWORKING_DEFAULT_STATIC_GW_ADDR1 168 -#endif -#ifndef AP_NETWORKING_DEFAULT_STATIC_GW_ADDR2 -#define AP_NETWORKING_DEFAULT_STATIC_GW_ADDR2 13 -#endif -#ifndef AP_NETWORKING_DEFAULT_STATIC_GW_ADDR3 -#define AP_NETWORKING_DEFAULT_STATIC_GW_ADDR3 1 +#ifndef AP_NETWORKING_DEFAULT_STATIC_GW_ADDR +#define AP_NETWORKING_DEFAULT_STATIC_GW_ADDR "192.168.13.1" #endif - -// Default MAC Address: 2C:AF:51:03:CF:46 +// Default MAC Address: C2:AF:51:03:CF:46 // Note, lower 3 bytes (ADDR3,4,5) will be replaced with the platform UUID -#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR0 -#define AP_NETWORKING_DEFAULT_MAC_ADDR0 0xC2 //LWIP_ETHADDR_0 +#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR +#define AP_NETWORKING_DEFAULT_MAC_ADDR "C2:AF:51:03:CF:46" #endif -#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR1 -#define AP_NETWORKING_DEFAULT_MAC_ADDR1 0xAF //LWIP_ETHADDR_1 -#endif -#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR2 -#define AP_NETWORKING_DEFAULT_MAC_ADDR2 0x51 //LWIP_ETHADDR_2 -#endif -#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR3 -#define AP_NETWORKING_DEFAULT_MAC_ADDR3 0x03 //LWIP_ETHADDR_3 -#endif -#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR4 -#define AP_NETWORKING_DEFAULT_MAC_ADDR4 0xCF //LWIP_ETHADDR_4 -#endif -#ifndef AP_NETWORKING_DEFAULT_MAC_ADDR5 -#define AP_NETWORKING_DEFAULT_MAC_ADDR5 0x46 //LWIP_ETHADDR_5 -#endif - diff --git a/libraries/AP_Networking/AP_Networking_address.cpp b/libraries/AP_Networking/AP_Networking_address.cpp new file mode 100644 index 0000000000..386dac004c --- /dev/null +++ b/libraries/AP_Networking/AP_Networking_address.cpp @@ -0,0 +1,152 @@ +/* + classes for holding IPv4 and ethernet MAC address parameters + */ + +#include "AP_Networking_Config.h" + +#if AP_NETWORKING_ENABLED + +#include "AP_Networking.h" + +const AP_Param::GroupInfo AP_Networking_IPV4::var_info[] = { + // @Param: 0 + // @DisplayName: IPv4 Address 1st byte + // @Description: IPv4 address. Example: 192.xxx.xxx.xxx + // @Range: 0 255 + // @RebootRequired: True + AP_GROUPINFO("0", 1, AP_Networking_IPV4, addr[0], 0), + + // @Param: 1 + // @DisplayName: IPv4 Address MSB + // @Description: IPv4 address. Example: xxx.168.xxx.xxx + // @Range: 0 255 + // @RebootRequired: True + AP_GROUPINFO("1", 2, AP_Networking_IPV4, addr[1], 0), + + // @Param: 2 + // @DisplayName: IPv4 Address MSB + // @Description: IPv4 address. Example: xxx.xxx.13.xxx + // @Range: 0 255 + // @RebootRequired: True + AP_GROUPINFO("2", 3, AP_Networking_IPV4, addr[2], 0), + + // @Param: 3 + // @DisplayName: IPv4 Address MSB + // @Description: IPv4 address. Example: xxx.xxx.xxx.14 + // @Range: 0 255 + // @RebootRequired: True + AP_GROUPINFO("3", 4, AP_Networking_IPV4, addr[3], 0), + + AP_GROUPEND +}; + +const AP_Param::GroupInfo AP_Networking_MAC::var_info[] = { + // @Param: 0 + // @DisplayName: MAC Address 1st byte + // @Description: MAC address 1st byte + // @Range: 0 255 + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("0", 1, AP_Networking_MAC, addr[0], 0), + + // @Param: 1 + // @DisplayName: MAC Address 2nd byte + // @Description: MAC address 2nd byte + // @Range: 0 255 + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("1", 2, AP_Networking_MAC, addr[1], 0), + + // @Param: 2 + // @DisplayName: MAC Address 3rd byte + // @Description: MAC address 3rd byte + // @Range: 0 255 + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("2", 3, AP_Networking_MAC, addr[2], 0), + + // @Param: 3 + // @DisplayName: MAC Address 4th byte + // @Description: MAC address 4th byte + // @Range: 0 255 + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("3", 4, AP_Networking_MAC, addr[3], 0), + + // @Param: 4 + // @DisplayName: MAC Address 5th byte + // @Description: MAC address 5th byte + // @Range: 0 255 + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("4", 5, AP_Networking_MAC, addr[4], 0), + + // @Param: 5 + // @DisplayName: MAC Address 6th byte + // @Description: MAC address 6th byte + // @Range: 0 255 + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("5", 6, AP_Networking_MAC, addr[5], 0), + + AP_GROUPEND +}; + + + +/* + IPV4 address parameter class + */ +AP_Networking_IPV4::AP_Networking_IPV4(const char *default_addr) +{ + AP_Param::setup_object_defaults(this, var_info); + set_default_uint32(AP_Networking::convert_str_to_ip(default_addr)); +} + +uint32_t AP_Networking_IPV4::get_uint32(void) const +{ + uint32_t v = 0; + uint8_t *b = (uint8_t*)&v; + for (uint8_t i=0; i