diff options
| author | Simon Rozman <simon@rozman.si> | 2023-03-23 10:23:18 +0100 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2023-09-25 09:43:37 +0200 |
| commit | 498b747669e97e8af414a369433c04371396f08c (patch) | |
| tree | 5829ff36ae8c46214fd651b77a98647250940575 | |
| parent | eb57e36d3c017bef80277e97db1009c38893ce2d (diff) | |
Fix connection monitoring on Windows
Linux requires su for `ip4:icmp` pings. Windows does not support `udp4`
pings.
Signed-off-by: Simon Rozman <simon@rozman.si>
| -rw-r--r-- | internal/failover/monitor.go | 6 | ||||
| -rw-r--r-- | internal/failover/ping.go | 13 | ||||
| -rw-r--r-- | internal/failover/ping_default.go | 21 | ||||
| -rw-r--r-- | internal/failover/ping_windows.go | 19 |
4 files changed, 46 insertions, 13 deletions
diff --git a/internal/failover/monitor.go b/internal/failover/monitor.go index f143f94..5dcaf5c 100644 --- a/internal/failover/monitor.go +++ b/internal/failover/monitor.go @@ -51,7 +51,7 @@ func (m *DroppedConMon) Start(gateway string, mtuSize int) (bool, error) { defer m.cancel() // Create a ping struct with our mtu size - p, err := NewPinger(mtuSize) + p, err := NewPinger(gateway, mtuSize) if err != nil { return false, err } @@ -64,7 +64,7 @@ func (m *DroppedConMon) Start(gateway string, mtuSize int) (bool, error) { // Send a ping and wait for max 2 seconds // If we have then increased Rx bytes we return early - if err = p.Send(gateway, 1); err != nil { + if err = p.Send(1); err != nil { log.Logger.Debugf("[Failover] First ping failed, exiting...") return false, err } @@ -90,7 +90,7 @@ func (m *DroppedConMon) Start(gateway string, mtuSize int) (bool, error) { for s := 2; s <= m.pDropped; s++ { log.Logger.Debugf("[Failover] Sending ping: %d, with size: %d", s, mtuSize) // Send a ping and return if an error occurs - if err := p.Send(gateway, s); err != nil { + if err := p.Send(s); err != nil { log.Logger.Debugf("[Failover] A ping failed, exiting...") return false, err } diff --git a/internal/failover/ping.go b/internal/failover/ping.go index 15d4adb..fb1df4e 100644 --- a/internal/failover/ping.go +++ b/internal/failover/ping.go @@ -18,14 +18,7 @@ var mtuOverhead = 28 type Pinger struct { listener net.PacketConn buffer []byte -} - -func NewPinger(size int) (*Pinger, error) { - l, err := icmp.ListenPacket("udp4", "0.0.0.0") - if err != nil { - return nil, errors.WrapPrefix(err, "failed creating ping", 0) - } - return &Pinger{listener: l, buffer: make([]byte, size-mtuOverhead)}, nil + gateway net.Addr } func (p Pinger) Read(deadline time.Time) error { @@ -52,7 +45,7 @@ func (p Pinger) Read(deadline time.Time) error { } } -func (p Pinger) Send(gateway string, seq int) error { +func (p Pinger) Send(seq int) error { errorMessage := fmt.Sprintf("failed sending ping, seq %d", seq) // Make a new ICMP message m := icmp.Message{ @@ -68,7 +61,7 @@ func (p Pinger) Send(gateway string, seq int) error { return errors.WrapPrefix(err, errorMessage, 0) } // And send it to the gateway IP! - _, err = p.listener.WriteTo(b, &net.UDPAddr{IP: net.ParseIP(gateway)}) + _, err = p.listener.WriteTo(b, p.gateway) if err != nil { return errors.WrapPrefix(err, errorMessage, 0) } diff --git a/internal/failover/ping_default.go b/internal/failover/ping_default.go new file mode 100644 index 0000000..961c6db --- /dev/null +++ b/internal/failover/ping_default.go @@ -0,0 +1,21 @@ +//go:build !windows + +package failover + +import ( + "net" + + "github.com/go-errors/errors" + "golang.org/x/net/icmp" +) + +func NewPinger(gateway string, size int) (*Pinger, error) { + l, err := icmp.ListenPacket("udp4", "0.0.0.0") + if err != nil { + return nil, errors.WrapPrefix(err, "failed creating ping", 0) + } + return &Pinger{ + listener: l, + buffer: make([]byte, size-mtuOverhead), + gateway: &net.UDPAddr{IP: net.ParseIP(gateway)}}, nil +} diff --git a/internal/failover/ping_windows.go b/internal/failover/ping_windows.go new file mode 100644 index 0000000..2a39003 --- /dev/null +++ b/internal/failover/ping_windows.go @@ -0,0 +1,19 @@ +package failover + +import ( + "net" + + "github.com/go-errors/errors" + "golang.org/x/net/icmp" +) + +func NewPinger(gateway string, size int) (*Pinger, error) { + l, err := icmp.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + return nil, errors.WrapPrefix(err, "failed creating ping", 0) + } + return &Pinger{ + listener: l, + buffer: make([]byte, size-mtuOverhead), + gateway: &net.IPAddr{IP: net.ParseIP(gateway)}}, nil +} |
