package failover import ( "fmt" "net" "golang.org/x/net/icmp" ) func NewPinger(gateway string, size int) (*Pinger, error) { gip := net.ParseIP(gateway) isV4 := gip.To4() != nil mtuOverhead := mtuV6Overhead if isV4 { mtuOverhead = mtuV4Overhead } if size < mtuOverhead { return nil, fmt.Errorf("invalid MTU size given, MTU has to be at least: %v bytes", mtuOverhead) } var l *icmp.PacketConn var err error if isV4 { l, err = icmp.ListenPacket("ip4:icmp", "0.0.0.0") } else { l, err = icmp.ListenPacket("ip6:icmp", "::") } if err != nil { return nil, fmt.Errorf("failed creating ping with error: %w", err) } return &Pinger{ listener: l, buffer: make([]byte, size-mtuOverhead), gateway: &net.IPAddr{IP: gip}, v4: isV4, }, nil }