fix(mdns): im eigenen AP bis zum Erfolg wiederholen, netif-Zeiger raus
I5: s_ap_mdns_done wurde VOR nl_mdns_on_ip_up() gesetzt und merkte damit den Versuch, nicht den Erfolg. Die Arbeit laeuft asynchron im tcpip-Thread; liefert pick_netif() dort NULL, weil das AP-Netif noch keine Adresse hat, protokolliert announce() nur "no usable netif yet" - und niemand versucht es je wieder, solange der AP steht. mDNS ist laut Spec Pflichtteil, die Lampe waere im eigenen AP dauerhaft nicht auffindbar. Neu meldet nl_mdns_service_up() den tatsaechlichen Zustand aus s_service_added, und der Netz-Task stoesst alle 5 s erneut an, solange die Lampe standalone ist, der AP steht und der Dienst noch nicht gemeldet ist. s_announce_pending deckt das Fenster zwischen dem Anstossen und dem Lauf von announce() ab: ohne das haette die Abfrage beim Wechsel Station -> eigener AP noch den Dienst des alten Netifs als Erfolg gewertet. Dazu der netif-Zeiger (%p) aus der mdns-Protokollzeile: waehrend der Fehlersuche war er wertvoll, in einer Release-Firmware ist er Rauschen. Namenskuerzel, Nummer und IPv4 unterscheiden Station und eigenen AP bereits eindeutig, eine Speicheradresse in einem Protokoll, das Nutzer weiterreichen, hilft niemandem - und die Abnahmeliste zitiert die Zeile ohnehin ohne ihn.
This commit is contained in:
+19
-5
@@ -45,7 +45,12 @@ static bool s_ap_live;
|
||||
* 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 */
|
||||
static bool s_ap_mdns_done; /* fuer den aktuell stehenden AP steht der mDNS-Dienst wirklich */
|
||||
/* I5: s_ap_mdns_done haengt am ERFOLG, nicht am Versuch. nl_mdns_on_ip_up() reicht die Arbeit
|
||||
* nur an den tcpip-Thread weiter; findet announce() dort noch kein Netif mit Adresse, gibt es
|
||||
* auf. Bis der Dienst steht, wird alle NL_AP_MDNS_RETRY_MS erneut angestossen. */
|
||||
#define NL_AP_MDNS_RETRY_MS 5000u
|
||||
static uint32_t s_ap_mdns_retry_at;
|
||||
/* 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
|
||||
* heissen, dass das Funkteil genau diese Daten nicht annimmt. Und 3 x 5 s hoechstens
|
||||
@@ -430,11 +435,20 @@ static void net_task(void *arg)
|
||||
/* 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)
|
||||
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();
|
||||
s_ap_mdns_retry_at = now; /* beim Eintritt sofort anstossen */
|
||||
} else if (s_ap_live && s_ap_event_seen && !s_ap_mdns_done) {
|
||||
/* I5: Erst der Erfolg beendet die Sache. Wer den blossen Versuch als erledigt
|
||||
* verbucht, laesst die Lampe fuer die ganze Standzeit des AP unauffindbar,
|
||||
* sobald announce() einmal "no usable netif yet" gemeldet hat. Deshalb immer
|
||||
* erst anstossen und dann den gemeldeten Zustand abfragen - nl_mdns_service_up()
|
||||
* ist erst wahr, wenn die Bekanntmachung im tcpip-Thread auch gelaufen ist. */
|
||||
if (due_now(now, s_ap_mdns_retry_at)) {
|
||||
s_ap_mdns_retry_at = now + NL_AP_MDNS_RETRY_MS;
|
||||
nl_mdns_on_ip_up();
|
||||
} else
|
||||
s_ap_mdns_done = nl_mdns_service_up();
|
||||
}
|
||||
|
||||
/* M3: retry a softap create that failed, as long as the SM still wants the AP up. */
|
||||
|
||||
Reference in New Issue
Block a user