From e52d4566ba469507ff0fa9b3d5708cae76261c7f Mon Sep 17 00:00:00 2001 From: Ricardo Guzman Date: Wed, 23 Sep 2026 12:39:07 -0300 Subject: [PATCH] WiFi loop protection --- include/network_manager.h | 3 +++ src/network_manager.cpp | 4 ++++ src/tnc_utils.cpp | 4 +++- src/web_utils.cpp | 4 +++- src/wifi_utils.cpp | 3 +++ 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/network_manager.h b/include/network_manager.h index 512fc52..06fa393 100644 --- a/include/network_manager.h +++ b/include/network_manager.h @@ -96,4 +96,7 @@ public: bool isModemConnected() const; bool isWifiAPActive() const; + + // Check if any network interface was started (lwip TCP/IP stack is initialized) + bool hasActiveInterface() const; }; diff --git a/src/network_manager.cpp b/src/network_manager.cpp index 83a4155..3872fbb 100644 --- a/src/network_manager.cpp +++ b/src/network_manager.cpp @@ -339,6 +339,10 @@ bool NetworkManager::isWifiAPActive() const { return _wifiAPmode; } +bool NetworkManager::hasActiveInterface() const { + return _wifiSTAmode || _wifiAPmode || _ethernetMode; +} + // Check if Ethernet is connected bool NetworkManager::isEthernetConnected() const { return _ethernetMode && _ethernetConnected && ETH.linkUp(); diff --git a/src/tnc_utils.cpp b/src/tnc_utils.cpp index 99f6328..48f326a 100644 --- a/src/tnc_utils.cpp +++ b/src/tnc_utils.cpp @@ -18,6 +18,7 @@ #include #include "ESPmDNS.h" +#include "network_manager.h" #include "configuration.h" #include "station_utils.h" #include "kiss_protocol.h" @@ -28,6 +29,7 @@ extern Configuration Config; +extern NetworkManager *networkManager; extern WiFiClient aprsIsClient; extern bool passcodeValid; @@ -47,7 +49,7 @@ String inputSerialBuffer = ""; namespace TNC_Utils { void setup() { - if (Config.tnc.enableServer && Config.digi.ecoMode == 0) { + if (Config.tnc.enableServer && Config.digi.ecoMode == 0 && networkManager->hasActiveInterface()) { // no WiFi STA/AP or Ethernet started = no TCP/IP stack tncServer.stop(); tncServer.begin(); String host = "igate-" + Config.callsign; diff --git a/src/web_utils.cpp b/src/web_utils.cpp index 87b4a55..4c7202c 100644 --- a/src/web_utils.cpp +++ b/src/web_utils.cpp @@ -17,6 +17,7 @@ */ #include +#include "network_manager.h" #include "configuration.h" #include "ota_utils.h" #include "web_utils.h" @@ -26,6 +27,7 @@ extern Configuration Config; +extern NetworkManager *networkManager; extern uint32_t lastBeaconTx; extern std::vector receivedPackets; @@ -435,7 +437,7 @@ namespace WEB_Utils { } void setup() { - if (Config.digi.ecoMode == 0) { + if (Config.digi.ecoMode == 0 && networkManager->hasActiveInterface()) { // no WiFi STA/AP or Ethernet started = no TCP/IP stack server.on("/", HTTP_GET, handleHome); server.on("/status", HTTP_GET, handleStatus); server.on("/received-packets.json", HTTP_GET, handleReceivedPackets); diff --git a/src/wifi_utils.cpp b/src/wifi_utils.cpp index d4d1026..a9a180c 100644 --- a/src/wifi_utils.cpp +++ b/src/wifi_utils.cpp @@ -99,6 +99,9 @@ namespace WIFI_Utils { if (Config.wifiAutoAP.enabled) { Serial.println("Starting AP fallback..."); startAutoAP(); + } else { + Serial.println("AutoAP disabled: no network, WebUI/TNC server not started (reconfigure over USB)"); + displayShow("", " No WiFi / No AP", " WebUI disabled", " loading ...", 2000); } return; }