From b057aeed9e6e139305b5978782c0ade8460c56e2 Mon Sep 17 00:00:00 2001 From: a7md0 Date: Sun, 28 Jul 2019 18:48:32 +0300 Subject: [PATCH 1/9] Add generic IP calculations Add: calculateNetworkID(IPAddress ip, IPAddress subnet) => Calculate the network id using the ip and subnet (e.g. 192.168.0.0) calculateBroadcast(IPAddress ip, IPAddress subnet) => Calculate the broadcast ip using the ip and subnet (e.g. 192.168.0.255) calculateSubnetCIDR(IPAddress subnetMask) => Calculate the subnet CIDR using the subnet (e.g. 24) --- libraries/WiFi/src/WiFiGeneric.cpp | 42 ++++++++++++++++++++++++++++++ libraries/WiFi/src/WiFiGeneric.h | 4 +++ 2 files changed, 46 insertions(+) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 3fc99c97159..2218b89c936 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -656,3 +656,45 @@ int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult) return (uint32_t)aResult != 0; } +IPAddress WiFiGenericClass::calculateNetworkID(IPAddress ip, IPAddress subnet) { + IPAddress networkID; + + for (size_t i = 0; i < 4; i++) + networkID[i] = subnet[i] & ip[i]; + + return networkID; +} + +IPAddress WiFiGenericClass::calculateBroadcast(IPAddress ip, IPAddress subnet) { + IPAddress broadcastIp; + + for (int i = 0; i < 4; i++) + broadcastIp[i] = ~subnet[i] | ip[i]; + + return broadcastIp; +} + +uint8_t WiFiGenericClass::calculateSubnetCIDR(IPAddress subnetMask) { + uint8_t CIDR = 0; + + for (uint8_t i = 0; i < 4; i++) { + if (subnetMask[i] == 0x80) // 128 + CIDR += 1; + else if (subnetMask[i] == 0xC0) // 192 + CIDR += 2; + else if (subnetMask[i] == 0xE0) // 224 + CIDR += 3; + else if (subnetMask[i] == 0xF0) // 242 + CIDR += 4; + else if (subnetMask[i] == 0xF8) // 248 + CIDR += 5; + else if (subnetMask[i] == 0xFC) // 252 + CIDR += 6; + else if (subnetMask[i] == 0xFE) // 254 + CIDR += 7; + else if (subnetMask[i] == 0xFF) // 255 + CIDR += 8; + } + + return CIDR; +} diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index de79ca16a5f..ad0cd260767 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -108,6 +108,10 @@ class WiFiGenericClass public: static int hostByName(const char *aHostname, IPAddress &aResult); + static IPAddress calculateNetworkID(IPAddress ip, IPAddress subnet); + static IPAddress calculateBroadcast(IPAddress ip, IPAddress subnet); + static uint8_t calculateSubnetCIDR(IPAddress subnetMask); + protected: friend class WiFiSTAClass; friend class WiFiScanClass; From d1ad5ec31501a18aa164b859f838ad83a7b793b6 Mon Sep 17 00:00:00 2001 From: a7md0 Date: Sun, 28 Jul 2019 18:51:09 +0300 Subject: [PATCH 2/9] Add generic IP utilities Add: broadcastIP() => Retrieve the network id (e.g. 192.168.0.0) networkID() => Retrieve the broadcast IP (e.g. 192.168.0.255) subnetCIDR() => Retrieve the subnet CIDR (e.g. 24) --- libraries/WiFi/src/ETH.cpp | 27 +++++++++++++++++++++++++++ libraries/WiFi/src/ETH.h | 4 ++++ 2 files changed, 31 insertions(+) diff --git a/libraries/WiFi/src/ETH.cpp b/libraries/WiFi/src/ETH.cpp index b9caddb1130..2ffea758ded 100644 --- a/libraries/WiFi/src/ETH.cpp +++ b/libraries/WiFi/src/ETH.cpp @@ -197,6 +197,33 @@ IPAddress ETHClass::dnsIP(uint8_t dns_no) return IPAddress(dns_ip.u_addr.ip4.addr); } +IPAddress ETHClass::broadcastIP() +{ + tcpip_adapter_ip_info_t ip; + if(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)){ + return IPAddress(); + } + return WiFiGenericClass::calculateBroadcast(IPAddress(ip.gw.addr), IPAddress(ip.netmask.addr)); +} + +IPAddress ETHClass::networkID() +{ + tcpip_adapter_ip_info_t ip; + if(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)){ + return IPAddress(); + } + return WiFiGenericClass::calculateNetworkID(IPAddress(ip.gw.addr), IPAddress(ip.netmask.addr)); +} + +uint8_t ETHClass::subnetCIDR() +{ + tcpip_adapter_ip_info_t ip; + if(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)){ + return (uint8_t)0; + } + return WiFiGenericClass::calculateSubnetCIDR(IPAddress(ip.netmask.addr)); +} + const char * ETHClass::getHostname() { const char * hostname; diff --git a/libraries/WiFi/src/ETH.h b/libraries/WiFi/src/ETH.h index 8dcd85b9cbd..f5441a9d0ed 100644 --- a/libraries/WiFi/src/ETH.h +++ b/libraries/WiFi/src/ETH.h @@ -79,6 +79,10 @@ class ETHClass { IPAddress gatewayIP(); IPAddress dnsIP(uint8_t dns_no = 0); + IPAddress broadcastIP(); + IPAddress networkID(); + uint8_t subnetCIDR(); + uint8_t * macAddress(uint8_t* mac); String macAddress(); From 52cd613645886b177c974d2d68fc5a7b408bc9d6 Mon Sep 17 00:00:00 2001 From: a7md0 Date: Sun, 28 Jul 2019 18:52:17 +0300 Subject: [PATCH 3/9] Add generic IP utilities Add: broadcastIP() => Retrieve the network id (e.g. 192.168.0.0) networkID() => Retrieve the broadcast IP (e.g. 192.168.0.255) subnetCIDR() => Retrieve the subnet CIDR (e.g. 24) --- libraries/WiFi/src/WiFiSTA.cpp | 42 ++++++++++++++++++++++++++++++++++ libraries/WiFi/src/WiFiSTA.h | 4 ++++ 2 files changed, 46 insertions(+) diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index a9f6d649e7a..8c778584fbd 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -492,6 +492,48 @@ IPAddress WiFiSTAClass::dnsIP(uint8_t dns_no) return IPAddress(dns_ip.u_addr.ip4.addr); } +/** + * Get the broadcast ip address. + * @return IPAddress broadcastIP + */ +IPAddress WiFiSTAClass::broadcastIP() +{ + if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ + return IPAddress(); + } + tcpip_adapter_ip_info_t ip; + tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip); + return WiFiGenericClass::calculateBroadcast(IPAddress(ip.gw.addr), IPAddress(ip.netmask.addr)); +} + +/** + * Get the network id. + * @return IPAddress netwrokID + */ +IPAddress WiFiSTAClass::netwrokID() +{ + if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ + return IPAddress(); + } + tcpip_adapter_ip_info_t ip; + tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip); + return WiFiGenericClass::calculateNetworkID(IPAddress(ip.gw.addr), IPAddress(ip.netmask.addr)); +} + +/** + * Get the network id. + * @return uint8_t netwrokID + */ +uint8_t WiFiSTAClass::subnetCIDR() +{ + if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ + return (uint8_t)0; + } + tcpip_adapter_ip_info_t ip; + tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip); + return WiFiGenericClass::calculateSubnetCIDR(IPAddress(ip.netmask.addr)); +} + /** * Return the current SSID associated with the network * @return SSID diff --git a/libraries/WiFi/src/WiFiSTA.h b/libraries/WiFi/src/WiFiSTA.h index b383a7b1be1..e05dd41fa4a 100644 --- a/libraries/WiFi/src/WiFiSTA.h +++ b/libraries/WiFi/src/WiFiSTA.h @@ -64,6 +64,10 @@ class WiFiSTAClass IPAddress subnetMask(); IPAddress gatewayIP(); IPAddress dnsIP(uint8_t dns_no = 0); + + IPAddress broadcastIP(); + IPAddress netwrokID(); + uint8_t subnetCIDR(); bool enableIpV6(); IPv6Address localIPv6(); From a5b84cf9fe200e5447d497d40b1ca811abe7a8f8 Mon Sep 17 00:00:00 2001 From: a7md0 Date: Sun, 28 Jul 2019 18:55:04 +0300 Subject: [PATCH 4/9] Add generic IP utilities Add: softAPBroadcastIP() => Retrieve the network id (e.g. 192.168.0.0) softAPNetwrokID() => Retrieve the broadcast IP (e.g. 192.168.0.255) softAPSubnetCIDR() => Retrieve the subnet CIDR (e.g. 24) --- libraries/WiFi/src/WiFiAP.cpp | 41 +++++++++++++++++++++++++++++++++++ libraries/WiFi/src/WiFiAP.h | 4 ++++ 2 files changed, 45 insertions(+) diff --git a/libraries/WiFi/src/WiFiAP.cpp b/libraries/WiFi/src/WiFiAP.cpp index 8b7bbf15701..2d3669aec00 100644 --- a/libraries/WiFi/src/WiFiAP.cpp +++ b/libraries/WiFi/src/WiFiAP.cpp @@ -235,6 +235,47 @@ IPAddress WiFiAPClass::softAPIP() return IPAddress(ip.ip.addr); } +/** + * Get the softAP broadcast IP address. + * @return IPAddress softAP broadcastIP + */ +IPAddress WiFiAPClass::softAPBroadcastIP() +{ + tcpip_adapter_ip_info_t ip; + if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ + return IPAddress(); + } + tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ip); + return WiFiGenericClass::calculateBroadcast(IPAddress(ip.gw.addr), IPAddress(ip.netmask.addr)); +} + +/** + * Get the softAP network ID. + * @return IPAddress softAP networkID + */ +IPAddress WiFiAPClass::softAPNetwrokID() +{ + tcpip_adapter_ip_info_t ip; + if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ + return IPAddress(); + } + tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ip); + return WiFiGenericClass::calculateNetworkID(IPAddress(ip.gw.addr), IPAddress(ip.netmask.addr)); +} + +/** + * Get the softAP subnet CIDR. + * @return uint8_t softAP subnetCIDR + */ +uint8_t WiFiAPClass::softAPSubnetCIDR() +{ + tcpip_adapter_ip_info_t ip; + if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ + return (uint8_t)0; + } + tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ip); + return WiFiGenericClass::calculateSubnetCIDR(IPAddress(ip.netmask.addr)); +} /** * Get the softAP interface MAC address. diff --git a/libraries/WiFi/src/WiFiAP.h b/libraries/WiFi/src/WiFiAP.h index 12792741af4..da32874a3b0 100644 --- a/libraries/WiFi/src/WiFiAP.h +++ b/libraries/WiFi/src/WiFiAP.h @@ -45,6 +45,10 @@ class WiFiAPClass IPAddress softAPIP(); + IPAddress softAPBroadcastIP(); + IPAddress softAPNetwrokID(); + uint8_t softAPSubnetCIDR(); + bool softAPenableIpV6(); IPv6Address softAPIPv6(); From 3fcdc0e58f2f67d47094ae9d30b92ca96d5bf6a8 Mon Sep 17 00:00:00 2001 From: a7md0 <10885603+a7md0@users.noreply.github.com> Date: Sun, 28 Jul 2019 22:10:44 +0300 Subject: [PATCH 5/9] Add generic IP utilities | typo correction --- libraries/WiFi/src/WiFiSTA.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index 8c778584fbd..b3d19f0ed07 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -508,9 +508,9 @@ IPAddress WiFiSTAClass::broadcastIP() /** * Get the network id. - * @return IPAddress netwrokID + * @return IPAddress networkID */ -IPAddress WiFiSTAClass::netwrokID() +IPAddress WiFiSTAClass::networkID() { if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ return IPAddress(); @@ -522,7 +522,7 @@ IPAddress WiFiSTAClass::netwrokID() /** * Get the network id. - * @return uint8_t netwrokID + * @return uint8_t subnetCIDR */ uint8_t WiFiSTAClass::subnetCIDR() { From ac36d8c13885ddfc8eac40bea6346f06ede8be86 Mon Sep 17 00:00:00 2001 From: a7md0 <10885603+a7md0@users.noreply.github.com> Date: Sun, 28 Jul 2019 22:11:17 +0300 Subject: [PATCH 6/9] Add generic IP utilities | typo correction --- libraries/WiFi/src/WiFiSTA.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiSTA.h b/libraries/WiFi/src/WiFiSTA.h index e05dd41fa4a..d9140101593 100644 --- a/libraries/WiFi/src/WiFiSTA.h +++ b/libraries/WiFi/src/WiFiSTA.h @@ -66,7 +66,7 @@ class WiFiSTAClass IPAddress dnsIP(uint8_t dns_no = 0); IPAddress broadcastIP(); - IPAddress netwrokID(); + IPAddress networkID(); uint8_t subnetCIDR(); bool enableIpV6(); From b00789e6963a34ba4466c1304c7406c5cde6914b Mon Sep 17 00:00:00 2001 From: a7md0 <10885603+a7md0@users.noreply.github.com> Date: Sun, 28 Jul 2019 22:12:23 +0300 Subject: [PATCH 7/9] Add generic IP utilities | typo correction --- libraries/WiFi/src/WiFiAP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiAP.cpp b/libraries/WiFi/src/WiFiAP.cpp index 2d3669aec00..1f8af5852ee 100644 --- a/libraries/WiFi/src/WiFiAP.cpp +++ b/libraries/WiFi/src/WiFiAP.cpp @@ -253,7 +253,7 @@ IPAddress WiFiAPClass::softAPBroadcastIP() * Get the softAP network ID. * @return IPAddress softAP networkID */ -IPAddress WiFiAPClass::softAPNetwrokID() +IPAddress WiFiAPClass::softAPNetworkID() { tcpip_adapter_ip_info_t ip; if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ From d99e4939927b2b2c059e016df629ecd7d71fc442 Mon Sep 17 00:00:00 2001 From: a7md0 <10885603+a7md0@users.noreply.github.com> Date: Sun, 28 Jul 2019 22:12:48 +0300 Subject: [PATCH 8/9] Add generic IP utilities | typo correction --- libraries/WiFi/src/WiFiAP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiAP.h b/libraries/WiFi/src/WiFiAP.h index da32874a3b0..f1533cc3611 100644 --- a/libraries/WiFi/src/WiFiAP.h +++ b/libraries/WiFi/src/WiFiAP.h @@ -46,7 +46,7 @@ class WiFiAPClass IPAddress softAPIP(); IPAddress softAPBroadcastIP(); - IPAddress softAPNetwrokID(); + IPAddress softAPNetworkID(); uint8_t softAPSubnetCIDR(); bool softAPenableIpV6(); From 691d2844ecb711f62b9b4481a98c24dd7d80156f Mon Sep 17 00:00:00 2001 From: a7md0 <10885603+a7md0@users.noreply.github.com> Date: Sun, 28 Jul 2019 22:18:43 +0300 Subject: [PATCH 9/9] Add generic IP utilities | typo correction --- libraries/WiFi/src/WiFiSTA.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index b3d19f0ed07..db5e019af31 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -521,7 +521,7 @@ IPAddress WiFiSTAClass::networkID() } /** - * Get the network id. + * Get the subnet CIDR. * @return uint8_t subnetCIDR */ uint8_t WiFiSTAClass::subnetCIDR()