diff --git a/cmd/mullvadclosest/main.go b/cmd/mullvadclosest/main.go index 7d1eee8..c656ecf 100644 --- a/cmd/mullvadclosest/main.go +++ b/cmd/mullvadclosest/main.go @@ -16,6 +16,9 @@ import ( "github.com/schollz/progressbar/v3" ) +// Package-level variable for debug flag +var debugMode bool + // RelayLatency holds a relay and its associated latency type RelayLatency struct { Relay Relay @@ -61,6 +64,8 @@ func latencyWorker(id int, jobs <-chan RelayLatency, results chan<- RelayLatency Relay: relayLatency.Relay, Latency: latency, } + } else if debugMode { + fmt.Printf("Debug: Error measuring latency for %s: %v\n", relayLatency.Relay.Hostname, err) } _ = bar.Add(1) } @@ -220,8 +225,12 @@ func CheckMullvadExitIP() (bool, error) { func main() { // Define force flag force := flag.Bool("force", false, "Force execution even when connected to VPN") + debug := flag.Bool("debug", false, "Enable debug output") flag.Parse() + // Set the global debug mode + debugMode = *debug + currentUser, err := user.Current() if err != nil { panic("Failed to get current user") diff --git a/cmd/mullvadclosest/relays.go b/cmd/mullvadclosest/relays.go index a3d02cd..56a6a9a 100644 --- a/cmd/mullvadclosest/relays.go +++ b/cmd/mullvadclosest/relays.go @@ -52,6 +52,14 @@ func (r Relay) CheckLiveness() (bool, time.Duration, error) { if stats.PacketsRecv == 0 { return false, 0, nil } + + // Validate that we don't have a zero latency for a successful ping + if stats.AvgRtt == 0 { + // Return as live but with no initial latency measurement + // The actual latency will be measured in MeasureLatency + return true, time.Duration(1), nil + } + return true, stats.AvgRtt, nil } @@ -69,6 +77,24 @@ func (r Relay) MeasureLatency() (time.Duration, error) { return 0, err } stats := pinger.Statistics() + + // Debug output + if debugMode && (stats.MinRtt == 0 || stats.AvgRtt == 0) { + fmt.Printf("Debug: %s (%s) - PacketsSent: %d, PacketsRecv: %d, MinRtt: %v, AvgRtt: %v, MaxRtt: %v\n", + r.Hostname, r.Ipv4AddrIn, stats.PacketsSent, stats.PacketsRecv, + stats.MinRtt, stats.AvgRtt, stats.MaxRtt) + } + + // Validate the statistics - if MinRtt is 0 but we received packets, something is wrong + if stats.PacketsRecv > 0 && stats.MinRtt == 0 { + // Use average RTT if available and non-zero + if stats.AvgRtt > 0 { + return stats.AvgRtt, nil + } + // If all RTT values are 0, this is likely a bug - return an error + return 0, fmt.Errorf("invalid zero latency for relay %s", r.Hostname) + } + return stats.MinRtt, nil }