Browse Source

Fix Network Manager priorities: WiFi client works independently of eth0

CRITICAL FIX: WiFi client now connects regardless of eth0 status

Changes:
- eth0 and wlan0 client are now INDEPENDENT (both can be online)
- WiFi client has HIGHER priority than WiFi scanner
- WiFi scanner ONLY runs if wlan0 is free (no client, no AP)
- AP fallback works correctly (120s timeout, stops when network appears)

Priority logic (corrected):
1. eth0: if carrier → DHCP (independent)
2. wlan0 client: if configured → connect (independent, ALWAYS)
3. WiFi scanner: if wlan0 free AND monitor_enabled → start
4. AP fallback: if NO network (no eth0, no wlan0) for 120s → start AP

Scanner coordination:
- WiFi scanner stops when wlan0 client connects
- WiFi scanner stops when AP starts
- WiFi scanner starts when wlan0 becomes free
root 1 month ago
parent
commit
c5815e8531
1 changed files with 63 additions and 29 deletions
  1. 63 29
      cmd/beacon-daemon/network_manager.go

+ 63 - 29
cmd/beacon-daemon/network_manager.go

@@ -129,7 +129,7 @@ func (nm *NetworkManager) tick() {
 		nm.lastOnlineTime = time.Now()
 		nm.lastOnlineTime = time.Now()
 	}
 	}
 
 
-	// Priority 1: eth0
+	// Priority 1: eth0 (independent, always configure if carrier UP)
 	if nm.eth0Carrier {
 	if nm.eth0Carrier {
 		if !nm.eth0HasIP {
 		if !nm.eth0HasIP {
 			// Carrier UP but no IP - configure network
 			// Carrier UP but no IP - configure network
@@ -141,57 +141,85 @@ func (nm *NetworkManager) tick() {
 				nm.startEth0DHCP()
 				nm.startEth0DHCP()
 			}
 			}
 		}
 		}
-
-		// eth0 has priority - disable wlan0 client and AP if running
-		if nm.currentState != StateEth0Online {
-			log.Println("[netmgr] eth0 online - stopping wlan0 client/AP")
-			nm.stopWLAN0Client()
-			nm.stopAP()
-			nm.currentState = StateEth0Online
-
-			// Start WiFi scanner if enabled (wlan0 is free)
-			if nm.cfg.WiFi.MonitorEnabled && !nm.scanners.IsWiFiRunning() {
-				log.Println("[netmgr] eth0 online - starting WiFi scanner")
-				nm.scanners.StartWiFi(nm.cfg.ZMQAddrWiFi, nm.cfg.WiFiIface)
-			}
+	} else {
+		// No eth0 carrier - stop eth0 DHCP/IP
+		if nm.eth0HasIP {
+			log.Println("[netmgr] eth0 carrier DOWN - stopping network")
+			nm.stopEth0()
 		}
 		}
-		return
 	}
 	}
 
 
-	// No eth0 carrier - stop eth0 DHCP/IP
-	if nm.eth0HasIP {
-		log.Println("[netmgr] eth0 carrier DOWN - stopping network")
-		nm.stopEth0()
-	}
-
-	// Priority 2: wlan0 client (if configured and eth0 is down)
+	// Priority 2: wlan0 client (INDEPENDENT of eth0, always connect if configured)
 	if nm.cfg.WiFi.ClientEnabled && nm.cfg.WiFi.SSID != "" {
 	if nm.cfg.WiFi.ClientEnabled && nm.cfg.WiFi.SSID != "" {
 		if !nm.wlan0HasIP {
 		if !nm.wlan0HasIP {
 			// Should connect
 			// Should connect
 			log.Printf("[netmgr] Connecting wlan0 client to %s...", nm.cfg.WiFi.SSID)
 			log.Printf("[netmgr] Connecting wlan0 client to %s...", nm.cfg.WiFi.SSID)
 			nm.stopAP() // Stop AP before connecting client
 			nm.stopAP() // Stop AP before connecting client
+			if nm.scanners.IsWiFiRunning() {
+				log.Println("[netmgr] Stopping WiFi scanner before connecting client")
+				nm.scanners.StopWiFi()
+			}
 			if err := nm.connectWLAN0Client(); err != nil {
 			if err := nm.connectWLAN0Client(); err != nil {
 				log.Printf("[netmgr] wlan0 client connection failed: %v", err)
 				log.Printf("[netmgr] wlan0 client connection failed: %v", err)
 				// Will fallback to AP after 120s
 				// Will fallback to AP after 120s
 			}
 			}
 		}
 		}
 
 
-		if nm.wlan0HasIP && nm.currentState != StateWLAN0ClientOnline {
-			log.Println("[netmgr] wlan0 client online")
-			nm.currentState = StateWLAN0ClientOnline
+		if nm.wlan0HasIP {
+			if nm.currentState != StateWLAN0ClientOnline {
+				log.Println("[netmgr] wlan0 client online")
+				nm.currentState = StateWLAN0ClientOnline
+			}
 			nm.stopAP() // Ensure AP is stopped
 			nm.stopAP() // Ensure AP is stopped
+			// Stop WiFi scanner (can't run with client)
+			if nm.scanners.IsWiFiRunning() {
+				log.Println("[netmgr] Stopping WiFi scanner (wlan0 client active)")
+				nm.scanners.StopWiFi()
+			}
+		}
+		return // wlan0 client configured - don't start scanner or AP
+	} else {
+		// wlan0 client not configured - stop it if running
+		if nm.wlan0HasIP {
+			log.Println("[netmgr] wlan0 client disabled - disconnecting")
+			nm.stopWLAN0Client()
+		}
+	}
+
+	// WiFi Scanner: ONLY if wlan0 is free (no client, no AP) AND monitor enabled
+	if nm.cfg.WiFi.MonitorEnabled && !nm.apRunning {
+		if !nm.scanners.IsWiFiRunning() {
+			log.Println("[netmgr] Starting WiFi scanner (wlan0 free)")
+			nm.scanners.StartWiFi(nm.cfg.ZMQAddrWiFi, nm.cfg.WiFiIface)
+		}
+	} else {
+		if nm.scanners.IsWiFiRunning() {
+			log.Println("[netmgr] Stopping WiFi scanner (wlan0 busy or monitor disabled)")
+			nm.scanners.StopWiFi()
 		}
 		}
-		return
 	}
 	}
 
 
-	// Fallback: wlan0 AP (if offline for 120 seconds and no eth0 carrier)
+	// Determine current state
+	if nm.eth0HasIP {
+		nm.currentState = StateEth0Online
+	} else if nm.wlan0HasIP {
+		nm.currentState = StateWLAN0ClientOnline
+	} else {
+		nm.currentState = StateNoNetwork
+	}
+
+	// Fallback: wlan0 AP (if offline for 120 seconds)
 	timeSinceOnline := time.Since(nm.lastOnlineTime)
 	timeSinceOnline := time.Since(nm.lastOnlineTime)
-	if !online && !nm.eth0Carrier && timeSinceOnline >= apFallbackDelay {
+	if !online && timeSinceOnline >= apFallbackDelay {
 		if !nm.apRunning {
 		if !nm.apRunning {
 			log.Printf("[netmgr] No network for %v - starting AP fallback", timeSinceOnline)
 			log.Printf("[netmgr] No network for %v - starting AP fallback", timeSinceOnline)
+			// Stop scanner before starting AP
+			if nm.scanners.IsWiFiRunning() {
+				nm.scanners.StopWiFi()
+			}
 			nm.startAP()
 			nm.startAP()
 		}
 		}
-		// Keep trying wlan0 client even with AP running
+		// Keep trying wlan0 client even with AP running (if configured)
 		if nm.cfg.WiFi.ClientEnabled && nm.cfg.WiFi.SSID != "" {
 		if nm.cfg.WiFi.ClientEnabled && nm.cfg.WiFi.SSID != "" {
 			// Try to reconnect every 30 seconds
 			// Try to reconnect every 30 seconds
 			if int(timeSinceOnline.Seconds())%30 == 0 {
 			if int(timeSinceOnline.Seconds())%30 == 0 {
@@ -207,6 +235,12 @@ func (nm *NetworkManager) tick() {
 				}
 				}
 			}
 			}
 		}
 		}
+	} else {
+		// Online - stop AP if running
+		if nm.apRunning {
+			log.Println("[netmgr] Network online - stopping AP fallback")
+			nm.stopAP()
+		}
 	}
 	}
 }
 }