diff --git a/core/internal/server/network/backend_iwd_wifi.go b/core/internal/server/network/backend_iwd_wifi.go index a086445f5..f65d9f9ca 100644 --- a/core/internal/server/network/backend_iwd_wifi.go +++ b/core/internal/server/network/backend_iwd_wifi.go @@ -744,6 +744,32 @@ func (b *IWDBackend) DisconnectWiFi() error { return nil } +func (b *IWDBackend) abortInFlightConnection(ssid string) { + b.stateMutex.Lock() + if !b.state.IsConnecting || b.state.ConnectingSSID != ssid { + b.stateMutex.Unlock() + return + } + b.state.IsConnecting = false + b.state.ConnectingSSID = "" + b.state.LastError = "" + b.stateMutex.Unlock() + + b.attemptMutex.RLock() + att := b.curAttempt + b.attemptMutex.RUnlock() + + if att != nil && att.ssid == ssid { + att.mu.Lock() + att.finalized = true + att.mu.Unlock() + } + + if err := b.DisconnectWiFi(); err != nil { + log.Warnf("[abortInFlightConnection] failed to abort connection to %s: %v", ssid, err) + } +} + func (b *IWDBackend) ForgetWiFiNetwork(ssid string) error { b.stateMutex.RLock() currentSSID := b.state.WiFiSSID @@ -812,6 +838,10 @@ func (b *IWDBackend) SetWiFiAutoconnect(ssid string, autoconnect bool) error { return fmt.Errorf("failed to set autoconnect: %w", call.Err) } + if !autoconnect { + b.abortInFlightConnection(ssid) + } + b.updateState() if b.onStateChange != nil { diff --git a/core/internal/server/network/backend_networkmanager_wifi.go b/core/internal/server/network/backend_networkmanager_wifi.go index d32c45fdc..1cfe2d3ad 100644 --- a/core/internal/server/network/backend_networkmanager_wifi.go +++ b/core/internal/server/network/backend_networkmanager_wifi.go @@ -359,6 +359,24 @@ func (b *NetworkManagerBackend) DisconnectWiFi() error { return nil } +func (b *NetworkManagerBackend) abortInFlightConnection(ssid string) { + b.stateMutex.Lock() + if !b.state.IsConnecting || b.state.ConnectingSSID != ssid { + b.stateMutex.Unlock() + return + } + b.state.IsConnecting = false + b.state.ConnectingSSID = "" + b.state.LastError = "" + b.stateMutex.Unlock() + + b.clearCachedWiFiSecretBySSID(ssid) + + if err := b.DisconnectWiFi(); err != nil { + log.Warnf("[abortInFlightConnection] failed to abort connection to %s: %v", ssid, err) + } +} + func (b *NetworkManagerBackend) ForgetWiFiNetwork(ssid string) error { conn, err := b.findConnection(ssid) if err != nil { @@ -963,6 +981,10 @@ func (b *NetworkManagerBackend) SetWiFiAutoconnect(ssid string, autoconnect bool return fmt.Errorf("failed to update connection: %w", err) } + if !autoconnect { + b.abortInFlightConnection(ssid) + } + b.updateWiFiNetworks() if b.onStateChange != nil {