38 lines
929 B
Go
38 lines
929 B
Go
package routing
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
)
|
|
|
|
func IPIsPrivate(ip net.IP) bool {
|
|
return ip.IsPrivate() || ip.IsLoopback() ||
|
|
ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast()
|
|
}
|
|
|
|
var (
|
|
errInterfaceIPNotFound = errors.New("IP address not found for interface")
|
|
)
|
|
|
|
func (r *Routing) assignedIP(interfaceName string) (ip net.IP, err error) {
|
|
iface, err := net.InterfaceByName(interfaceName)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("network interface %s not found: %w", interfaceName, err)
|
|
}
|
|
addresses, err := iface.Addrs()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot list interface %s addresses: %w", interfaceName, err)
|
|
}
|
|
for _, address := range addresses {
|
|
switch value := address.(type) {
|
|
case *net.IPAddr:
|
|
return value.IP, nil
|
|
case *net.IPNet:
|
|
return value.IP, nil
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("%w: interface %s in %d addresses",
|
|
errInterfaceIPNotFound, interfaceName, len(addresses))
|
|
}
|