host address retrieving through assigned subnet information and broadcast message to learn host address

This commit is contained in:
Constantin Leue
2026-08-03 23:10:11 +02:00
parent 4671b34f5b
commit 4e94102861
4 changed files with 87 additions and 16 deletions
+16 -7
View File
@@ -165,15 +165,24 @@ class UdpTransport implements LinkTransport {
// Reihenfolge: explizit konfigurierter Host > vom Netz gemeldete
// Gateway-Adresse (bei der hier verwendeten lokalen, internetlosen
// WifiNetworkSpecifier-Anfrage in der Praxis meist gar nicht gesetzt,
// da solche Netze i.d.R. keine Default-Route haben) > fest hinterlegte
// Standard-IP der mLRS-Bruecke. Diese Vorbelegung wird durch das erste
// tatsaechlich empfangene Paket in [_onPacket] ueberschrieben - sie
// greift also nur, solange (noch) kein Paket gelernt wurde, z.B. wenn
// die Bruecke ihr erstes Paket nicht zuverlaessig sendet oder es durch
// die unten beschriebene Startup-Race verpasst wuerde.
// da solche Netze i.d.R. keine Default-Route haben) > Subnetz-
// Broadcast-Adresse (Bootstrap-Fallback, siehe unten) > fest
// hinterlegte Standard-IP der mLRS-Bruecke als allerletzter Rueckfall.
// Diese Vorbelegung wird durch das erste tatsaechlich empfangene Paket
// in [_onPacket] ueberschrieben - sie greift also nur, solange (noch)
// kein Paket gelernt wurde.
//
// Die Broadcast-Adresse ist der eigentlich robuste Fallback: sendet
// die App ihre erste MSP-Anfrage dorthin statt an eine geratene feste
// Unicast-IP, erreicht sie die Bruecke unabhaengig davon, welche IP
// diese tatsaechlich hat - deren (unicast) Antwort lernt dann ueber
// [_onPacket] die echte Adresse. Das schliesst genau die Luecke, die
// entsteht, wenn die Bruecke selbst nie unaufgefordert sendet UND die
// geratene Standard-IP falsch liegt (dann kaeme ohne Broadcast
// ueberhaupt kein Paket an, aus dem gelernt werden koennte).
final prefillHost = (configuredHost != null && configuredHost.isNotEmpty)
? configuredHost
: (available.gatewayAddress ?? _defaultMlrsHost);
: (available.gatewayAddress ?? available.broadcastAddress ?? _defaultMlrsHost);
final parsed = InternetAddress.tryParse(prefillHost);
if (parsed != null) {
_peerAddress = parsed;