summaryrefslogtreecommitdiff
path: root/internal/failover
diff options
context:
space:
mode:
authorSimon Rozman <simon@rozman.si>2023-03-23 10:23:18 +0100
committerJeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com>2023-09-25 09:43:37 +0200
commit498b747669e97e8af414a369433c04371396f08c (patch)
tree5829ff36ae8c46214fd651b77a98647250940575 /internal/failover
parenteb57e36d3c017bef80277e97db1009c38893ce2d (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>
Diffstat (limited to 'internal/failover')
-rw-r--r--internal/failover/monitor.go6
-rw-r--r--internal/failover/ping.go13
-rw-r--r--internal/failover/ping_default.go21
-rw-r--r--internal/failover/ping_windows.go19
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
+}