Skip to content

Commit 9de1408

Browse files
committed
Fixing IPv6 support to correctly support link-local and global IPv6 addresses
1 parent 75f653e commit 9de1408

File tree

3 files changed

+52
-10
lines changed

3 files changed

+52
-10
lines changed

examples/NonBlockingCaptivePortal/NonBlockingCaptivePortal.ino

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ void setup() {
4444
case Mycila::ESPConnect::State::AP_STARTED:
4545
// serve your home page here
4646
server.on("/", HTTP_GET, [&](AsyncWebServerRequest* request) {
47-
return request->send(200, "text/plain", "Hello World!");
48-
}).setFilter([](__unused AsyncWebServerRequest* request) { return espConnect.getState() != Mycila::ESPConnect::State::PORTAL_STARTED; });
47+
return request->send(200, "text/plain", "Hello World!");
48+
})
49+
.setFilter([](__unused AsyncWebServerRequest* request) { return espConnect.getState() != Mycila::ESPConnect::State::PORTAL_STARTED; });
4950
server.begin();
5051
break;
5152

@@ -58,7 +59,7 @@ void setup() {
5859
}
5960
});
6061

61-
espConnect.setConnectTimeout(20); // 20 seconds
62+
espConnect.setConnectTimeout(20); // 20 seconds
6263
espConnect.setCaptivePortalTimeout(40); // 30 seconds
6364
espConnect.setAutoRestart(true);
6465
espConnect.setBlocking(false);
@@ -70,6 +71,16 @@ void setup() {
7071
Serial.println("====> setup() completed...");
7172
}
7273

74+
uint32_t last = 0;
75+
7376
void loop() {
7477
espConnect.loop();
78+
79+
if (millis() - last > 5000) {
80+
last = millis();
81+
JsonDocument doc;
82+
espConnect.toJson(doc.to<JsonObject>());
83+
serializeJsonPretty(doc, Serial);
84+
Serial.println();
85+
}
7586
}

src/MycilaESPConnect.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,27 @@ IPAddress Mycila::ESPConnect::getIPAddress(Mycila::ESPConnect::Mode mode) const
219219
}
220220
}
221221

222-
IPAddress Mycila::ESPConnect::getIPv6Address(Mycila::ESPConnect::Mode mode) const {
222+
IPAddress Mycila::ESPConnect::getLinkLocalIPv6Address(Mycila::ESPConnect::Mode mode) const {
223+
#ifndef ESP8266
224+
const wifi_mode_t wifiMode = WiFi.getMode();
225+
switch (mode) {
226+
case Mycila::ESPConnect::Mode::AP:
227+
return IN6ADDR_ANY;
228+
case Mycila::ESPConnect::Mode::STA:
229+
return wifiMode == WIFI_MODE_STA ? WiFi.linkLocalIPv6() : IN6ADDR_ANY;
230+
#ifdef ESPCONNECT_ETH_SUPPORT
231+
case Mycila::ESPConnect::Mode::ETH:
232+
return ETH.linkUp() ? ETH.linkLocalIPv6() : IN6ADDR_ANY;
233+
#endif
234+
default:
235+
return IN6ADDR_ANY;
236+
}
237+
#else
238+
return IPAddress();
239+
#endif
240+
}
241+
242+
IPAddress Mycila::ESPConnect::getGlobalIPv6Address(Mycila::ESPConnect::Mode mode) const {
223243
#ifndef ESP8266
224244
const wifi_mode_t wifiMode = WiFi.getMode();
225245
switch (mode) {
@@ -507,8 +527,12 @@ void Mycila::ESPConnect::clearConfiguration() {
507527
void Mycila::ESPConnect::toJson(const JsonObject& root) const {
508528
root["ip_address"] = getIPAddress().toString();
509529
root["ip_address_ap"] = getIPAddress(Mycila::ESPConnect::Mode::AP).toString();
510-
root["ip_address_eth"] = getIPAddress(Mycila::ESPConnect::Mode::ETH).toString();
511-
root["ip_address_sta"] = getIPAddress(Mycila::ESPConnect::Mode::STA).toString();
530+
root["ip_address_eth_v4"] = getIPAddress(Mycila::ESPConnect::Mode::ETH).toString();
531+
root["ip_address_sta_v4"] = getIPAddress(Mycila::ESPConnect::Mode::STA).toString();
532+
root["ip_address_eth_v6_local"] = getLinkLocalIPv6Address(Mycila::ESPConnect::Mode::ETH).toString();
533+
root["ip_address_sta_v6_local"] = getLinkLocalIPv6Address(Mycila::ESPConnect::Mode::STA).toString();
534+
root["ip_address_eth_v6_global"] = getGlobalIPv6Address(Mycila::ESPConnect::Mode::ETH).toString();
535+
root["ip_address_sta_v6_global"] = getGlobalIPv6Address(Mycila::ESPConnect::Mode::STA).toString();
512536
root["hostname"] = _config.hostname.c_str();
513537
root["mac_address"] = getMACAddress();
514538
root["mac_address_ap"] = getMACAddress(Mycila::ESPConnect::Mode::AP);
@@ -875,8 +899,12 @@ void Mycila::ESPConnect::_onWiFiEvent(WiFiEvent_t event) {
875899

876900
#ifndef ESP8266
877901
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
878-
if (WiFi.globalIPv6() != IN6ADDR_ANY) {
879-
LOGD(TAG, "[%s] WiFiEvent: ARDUINO_EVENT_WIFI_STA_GOT_IP6: %s", getStateName(), WiFi.globalIPv6().toString().c_str());
902+
if (WiFi.linkLocalIPv6() != IN6ADDR_ANY) {
903+
if (WiFi.globalIPv6() == IN6ADDR_ANY) {
904+
LOGD(TAG, "[%s] WiFiEvent: ARDUINO_EVENT_WIFI_STA_GOT_IP6: Link-local: %s, global: <empty>", getStateName(), WiFi.linkLocalIPv6().toString().c_str());
905+
} else {
906+
LOGD(TAG, "[%s] WiFiEvent: ARDUINO_EVENT_WIFI_STA_GOT_IP6: Link-local: %s, global: %s", getStateName(), WiFi.linkLocalIPv6().toString().c_str(), WiFi.globalIPv6().toString().c_str());
907+
}
880908
if (_state == Mycila::ESPConnect::State::NETWORK_CONNECTING || _state == Mycila::ESPConnect::State::NETWORK_RECONNECTING) {
881909
_lastTime = -1;
882910
_setState(Mycila::ESPConnect::State::NETWORK_CONNECTED);

src/MycilaESPConnect.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,11 @@ namespace Mycila {
172172
IPAddress getIPAddress() const { return getIPAddress(getMode()); }
173173
IPAddress getIPAddress(Mode mode) const;
174174

175-
IPAddress getIPv6Address() const { return getIPv6Address(getMode()); }
176-
IPAddress getIPv6Address(Mode mode) const;
175+
IPAddress getLinkLocalIPv6Address() const { return getLinkLocalIPv6Address(getMode()); }
176+
IPAddress getLinkLocalIPv6Address(Mode mode) const;
177+
178+
IPAddress getGlobalIPv6Address() const { return getGlobalIPv6Address(getMode()); }
179+
IPAddress getGlobalIPv6Address(Mode mode) const;
177180

178181
// Returns the configured WiFi SSID or the configured SSID of the AP or captive portal, or empty if not available, depending on the current mode
179182
ESPCONNECT_STRING getWiFiSSID() const;

0 commit comments

Comments
 (0)