|
|
@@ -129,7 +129,7 @@ func (nm *NetworkManager) tick() {
|
|
|
nm.lastOnlineTime = time.Now()
|
|
|
}
|
|
|
|
|
|
- // Priority 1: eth0
|
|
|
+ // Priority 1: eth0 (independent, always configure if carrier UP)
|
|
|
if nm.eth0Carrier {
|
|
|
if !nm.eth0HasIP {
|
|
|
// Carrier UP but no IP - configure network
|
|
|
@@ -141,57 +141,85 @@ func (nm *NetworkManager) tick() {
|
|
|
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.wlan0HasIP {
|
|
|
// Should connect
|
|
|
log.Printf("[netmgr] Connecting wlan0 client to %s...", nm.cfg.WiFi.SSID)
|
|
|
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 {
|
|
|
log.Printf("[netmgr] wlan0 client connection failed: %v", err)
|
|
|
// 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
|
|
|
+ // 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)
|
|
|
- if !online && !nm.eth0Carrier && timeSinceOnline >= apFallbackDelay {
|
|
|
+ if !online && timeSinceOnline >= apFallbackDelay {
|
|
|
if !nm.apRunning {
|
|
|
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()
|
|
|
}
|
|
|
- // 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 != "" {
|
|
|
// Try to reconnect every 30 seconds
|
|
|
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()
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|