func validateRemoteAddr(ip net.IP) bool { if ip == nil { return false } if ip.IsInterfaceLocalMulticast() { return false } if ip.IsLinkLocalMulticast() { return false } if ip.IsLinkLocalUnicast() { return false } if ip.IsLoopback() { return false } if ip.IsMulticast() { return false } if ip.IsUnspecified() { return false } if isBroadcasty(ip) { return false } return true }
func InterfaceIPs() ([]*net.IPAddr, error) { var ( addrs []*net.IPAddr ) ifaces, err := net.Interfaces() if err != nil { return nil, err } for _, iface := range ifaces { iaddrs, err := iface.Addrs() if err != nil { return nil, err } for _, iaddr := range iaddrs { var ( ip net.IP zone string ) switch x := iaddr.(type) { case *net.IPAddr: ip = x.IP zone = x.Zone case *net.IPNet: ip = x.IP zone = "" } if ip.IsMulticast() || ip.IsUnspecified() || ip.IsInterfaceLocalMulticast() || ip.IsLinkLocalMulticast() || ip.IsLinkLocalUnicast() { continue } if ipv4 := ip.To4(); ipv4 != nil { ip = ipv4 } addrs = append(addrs, &net.IPAddr{ IP: ip, Zone: zone, }) } } return addrs, nil }
func isLoopbackIP(ip net.IP) bool { // ignore loopback ips if ip.IsLoopback() { return true } // ignore local ips if ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() { return true } return false }
func chooseHostInterfaceNativeGo() (net.IP, error) { intfs, err := net.Interfaces() if err != nil { return nil, err } i := 0 var ip net.IP for i = range intfs { if flagsSet(intfs[i].Flags, net.FlagUp) && flagsClear(intfs[i].Flags, net.FlagLoopback|net.FlagPointToPoint) { addrs, err := intfs[i].Addrs() if err != nil { return nil, err } if len(addrs) > 0 { for _, addr := range addrs { if addrIP, _, err := net.ParseCIDR(addr.String()); err == nil { if addrIP.To4() != nil { ip = addrIP.To4() if !ip.IsLinkLocalMulticast() && !ip.IsLinkLocalUnicast() { break } } } } if ip != nil { // This interface should suffice. break } } } } if ip == nil { return nil, fmt.Errorf("no acceptable interface from host") } glog.V(4).Infof("Choosing interface %s (IP %v) as default", intfs[i].Name, ip) return ip, nil }