fix(mdns): Bekanntmachung am Zustand statt am Erzeugungsereignis

This commit is contained in:
Michael Sauer
2026-10-02 14:17:09 +02:00
parent ded09a3516
commit fda2552e50
+20 -4
View File
@@ -41,6 +41,11 @@ static uint8_t s_ap_channel = 6;
static char s_ap_live_ssid[NL_SSID_LEN], s_ap_live_pass[NL_PASS_LEN]; static char s_ap_live_ssid[NL_SSID_LEN], s_ap_live_pass[NL_PASS_LEN];
static uint8_t s_ap_live_channel; static uint8_t s_ap_live_channel;
static bool s_ap_live; static bool s_ap_live;
/* mDNS im eigenen AP haengt am ZUSTAND (Standalone + AP steht), nicht am Erzeugungsereignis:
* betritt die Lampe Standalone auf einem schon laufenden, unveraenderten AP, entsteht kein
* SOFTAP_SUCCESS mehr. Beides nur im Netz-Task angefasst. */
static bool s_ap_event_seen; /* zum aktuell stehenden AP kam SOFTAP_SUCCESS an */
static bool s_ap_mdns_done; /* fuer den aktuell stehenden AP wurde nl_mdns_on_ip_up() gerufen */
/* Drei Versuche, dann der Rueckfall auf Daten, die schon einmal getragen haben: einer koennte /* Drei Versuche, dann der Rueckfall auf Daten, die schon einmal getragen haben: einer koennte
* ein Zufall sein (das Funkteil raeumt gerade den alten AP ab), aber drei hintereinander * ein Zufall sein (das Funkteil raeumt gerade den alten AP ab), aber drei hintereinander
* heissen, dass das Funkteil genau diese Daten nicht annimmt. Und 3 x 5 s hoechstens * heissen, dass das Funkteil genau diese Daten nicht annimmt. Und 3 x 5 s hoechstens
@@ -127,6 +132,7 @@ static void destroy_ap(void)
tls_wifi_softap_destroy(); tls_wifi_softap_destroy();
s_ap_create_pending = false; s_ap_create_pending = false;
s_ap_live = false; s_ap_live = false;
s_ap_event_seen = s_ap_mdns_done = false;
clear_softap_param(); /* C2: every softap teardown clears the persisted SOFTAP bit */ clear_softap_param(); /* C2: every softap teardown clears the persisted SOFTAP bit */
} }
@@ -172,6 +178,8 @@ static void start_ap(void)
s_ap_create_retry_at = nl_app_now_ms() + 5000u; s_ap_create_retry_at = nl_app_now_ms() + 5000u;
s_ap_live = r == WM_SUCCESS; s_ap_live = r == WM_SUCCESS;
if (s_ap_live) { if (s_ap_live) {
/* Neuer AP: erst das Ereignis abwarten, dann bekanntmachen. */
s_ap_event_seen = s_ap_mdns_done = false;
copy(s_ap_live_ssid, ssid, sizeof s_ap_live_ssid); copy(s_ap_live_ssid, ssid, sizeof s_ap_live_ssid);
copy(s_ap_live_pass, s_ap_pass, sizeof s_ap_live_pass); copy(s_ap_live_pass, s_ap_pass, sizeof s_ap_live_pass);
s_ap_live_channel = s_ap_channel; s_ap_live_channel = s_ap_channel;
@@ -281,7 +289,7 @@ static void net_task(void *arg)
nl_wifi_actions_t ev, tick; nl_wifi_actions_t ev, tick;
uint32_t m = 0, now; uint32_t m = 0, now;
bool got_ip_event = false, connected_now, ap_wanted, unexpected_softap, bool got_ip_event = false, connected_now, ap_wanted, unexpected_softap,
standalone_ap_up; standalone_now;
bool recheck_ap = false; bool recheck_ap = false;
memset(&ev, 0, sizeof ev); memset(&ev, 0, sizeof ev);
@@ -333,8 +341,7 @@ static void net_task(void *arg)
* (which only guards s_sm and the credential buffers) is held. */ * (which only guards s_sm and the credential buffers) is held. */
unexpected_softap = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && !ap_wanted; unexpected_softap = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && !ap_wanted;
/* Nur die Lage merken; der Aufruf nach aussen folgt hinter der Entsperrung. */ /* Nur die Lage merken; der Aufruf nach aussen folgt hinter der Entsperrung. */
standalone_ap_up = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && standalone_now = s_sm.state == NL_WIFI_ST_STANDALONE;
s_sm.state == NL_WIFI_ST_STANDALONE;
unlock(); unlock();
if (unexpected_softap) { if (unexpected_softap) {
@@ -356,8 +363,17 @@ static void net_task(void *arg)
* Ohne diesen Aufruf findet die App ein Standalone-Geraet nicht - am * Ohne diesen Aufruf findet die App ein Standalone-Geraet nicht - am
* 2026-10-01 am EVK gemessen: REST auf der AP-IP lief, ninlight-681f.local * 2026-10-01 am EVK gemessen: REST auf der AP-IP lief, ninlight-681f.local
* war weder aufloesbar noch sichtbar. */ * war weder aufloesbar noch sichtbar. */
if (standalone_ap_up) if (m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS))
s_ap_event_seen = true;
/* Zustandsgebunden: auch ein Wechsel auf einen unveraendert stehenden AP loest es aus.
* Mehrfaches Rufen waere harmlos, s_ap_mdns_done spart es trotzdem. Faellt der Zustand
* weg, gilt die Bekanntmachung beim naechsten Eintritt neu. */
if (!standalone_now)
s_ap_mdns_done = false;
else if (s_ap_live && s_ap_event_seen && !s_ap_mdns_done) {
s_ap_mdns_done = true;
nl_mdns_on_ip_up(); nl_mdns_on_ip_up();
}
/* M3: retry a softap create that failed, as long as the SM still wants the AP up. */ /* M3: retry a softap create that failed, as long as the SM still wants the AP up. */
if (s_ap_create_pending && ap_wanted && due_now(now, s_ap_create_retry_at)) { if (s_ap_create_pending && ap_wanted && due_now(now, s_ap_create_retry_at)) {