safing-portmaster/spn/conf/networks.go

110 lines
2.1 KiB
Go

package conf
import (
"net"
"sync"
"github.com/tevino/abool"
)
var (
hubHasV4 = abool.New()
hubHasV6 = abool.New()
)
// SetHubNetworks sets the available IP networks on the Hub.
func SetHubNetworks(v4, v6 bool) {
hubHasV4.SetTo(v4)
hubHasV6.SetTo(v6)
}
// HubHasIPv4 returns whether the Hub has IPv4 support.
func HubHasIPv4() bool {
return hubHasV4.IsSet()
}
// HubHasIPv6 returns whether the Hub has IPv6 support.
func HubHasIPv6() bool {
return hubHasV6.IsSet()
}
var (
bindIPv4 net.IP
bindIPv6 net.IP
bindIPLock sync.Mutex
)
// SetBindAddr sets the preferred connect (bind) addresses.
func SetBindAddr(ip4, ip6 net.IP) {
bindIPLock.Lock()
defer bindIPLock.Unlock()
bindIPv4 = ip4
bindIPv6 = ip6
}
// BindAddrIsSet returns whether any bind address is set.
func BindAddrIsSet() bool {
bindIPLock.Lock()
defer bindIPLock.Unlock()
return bindIPv4 != nil || bindIPv6 != nil
}
// GetBindAddr returns an address with the preferred binding address for the
// given dial network.
// The dial network must have a suffix specifying the IP version.
func GetBindAddr(dialNetwork string) net.Addr {
bindIPLock.Lock()
defer bindIPLock.Unlock()
switch dialNetwork {
case "ip4":
if bindIPv4 != nil {
return &net.IPAddr{IP: bindIPv4}
}
case "ip6":
if bindIPv6 != nil {
return &net.IPAddr{IP: bindIPv6}
}
case "tcp4":
if bindIPv4 != nil {
return &net.TCPAddr{IP: bindIPv4}
}
case "tcp6":
if bindIPv6 != nil {
return &net.TCPAddr{IP: bindIPv6}
}
case "udp4":
if bindIPv4 != nil {
return &net.UDPAddr{IP: bindIPv4}
}
case "udp6":
if bindIPv6 != nil {
return &net.UDPAddr{IP: bindIPv6}
}
}
return nil
}
// GetBindIPs returns the preferred binding IPs.
// Returns a slice with a single nil IP if no preferred binding IPs are set.
func GetBindIPs() []net.IP {
bindIPLock.Lock()
defer bindIPLock.Unlock()
switch {
case bindIPv4 == nil && bindIPv6 == nil:
// Match most common case first.
return []net.IP{nil}
case bindIPv4 != nil && bindIPv6 != nil:
return []net.IP{bindIPv4, bindIPv6}
case bindIPv4 != nil:
return []net.IP{bindIPv4}
case bindIPv6 != nil:
return []net.IP{bindIPv6}
}
return []net.IP{nil}
}