Skip to content

DHCP range problematic in AP mode #3532

Open
@NdK73

Description

@NdK73

Hello.

I just noticed possible problems when calling WiFi.softAPConfig().
It assumes everybody uses a class-C network, a fixed mask of 24 bits and places the ESP at the start of the network (.1).
If the address given is over 55, the DHCP range collides with the reserved address (.255) and/or the network address (.0).
So I slightly modified the code to accept two optional arguments: dhcp_start and dhcp_end .
That makes it possible for the user to choose more freely the address range to use (I still don't check for network/broadcast collisions: with a great power...), including a whole class-A if desired (not that it's really useful with at most 4 clients, but anyway...).
If the optional arguments are not supplied, the old behaviour is retained, so it won't break existing code.

Hope it can be useful for others.

diff -u ESP8266WiFiAP.h.ori ESP8266WiFiAP.h

--- ESP8266WiFiAP.h.ori	2016-09-27 19:02:02.904865345 +0200
+++ ESP8266WiFiAP.h	2017-08-18 22:29:38.061691447 +0200
@@ -37,7 +37,7 @@
     public:
 
         bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0);
-        bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet);
+        bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet, uint32_t dhcp_start=0, uint32_t dhcp_end=0);
         bool softAPdisconnect(bool wifioff = false);
 
         uint8_t softAPgetStationNum();

diff -u ESP8266WiFiAP.cpp.ori ESP8266WiFiAP.cpp

--- ESP8266WiFiAP.cpp.ori	2016-09-27 19:02:02.900865537 +0200
+++ ESP8266WiFiAP.cpp	2017-08-18 22:38:50.736674336 +0200
@@ -175,8 +175,10 @@
  * @param local_ip      access point IP
  * @param gateway       gateway IP
  * @param subnet        subnet mask
+ * @param dhcp_start    DHCP range start
+ * @param dhcp_end      DHCP range end
  */
-bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) {
+bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet, uint32_t dhcp_start, uint32_t dhcp_end) {
     DEBUG_WIFI("[APConfig] local_ip: %s gateway: %s subnet: %s\n", local_ip.toString().c_str(), gateway.toString().c_str(), subnet.toString().c_str());
     if(!WiFi.enableAP(true)) {
         // enable AP failed
@@ -201,11 +203,19 @@
 
     struct dhcps_lease dhcp_lease;
     IPAddress ip = local_ip;
-    ip[3] += 99;
+    if(dhcp_start) {
+        ip=(dhcp_start & !info.netmask.addr) + (info.ip.addr&info.netmask.addr);
+    } else {
+        ip[3] += 99;
+    }
     dhcp_lease.start_ip.addr = static_cast<uint32_t>(ip);
     DEBUG_WIFI("[APConfig] DHCP IP start: %s\n", ip.toString().c_str());
 
-    ip[3] += 100;
+    if(dhcp_end) {
+        ip=(dhcp_end & !info.netmask.addr) + (info.ip.addr&info.netmask.addr);
+    } else {
+        ip[3] += 100;
+    }
     dhcp_lease.end_ip.addr = static_cast<uint32_t>(ip);
     DEBUG_WIFI("[APConfig] DHCP IP end: %s\n", ip.toString().c_str());

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions