func electBridgeIPv4(config *NetworkConfiguration) (*net.IPNet, error) { // Use the requested IPv4 CIDR when available. if config.AddressIPv4 != nil { return config.AddressIPv4, nil } // We don't check for an error here, because we don't really care if we // can't read /etc/resolv.conf. So instead we skip the append if resolvConf // is nil. It either doesn't exist, or we can't read it for some reason. nameservers := []string{} if resolvConf, _ := readResolvConf(); resolvConf != nil { nameservers = append(nameservers, getNameserversAsCIDR(resolvConf)...) } // Try to automatically elect appropriate bridge IPv4 settings. for _, n := range bridgeNetworks { if err := netutils.CheckNameserverOverlaps(nameservers, n); err == nil { if err := netutils.CheckRouteOverlaps(n); err == nil { return n, nil } } } return nil, IPv4AddrRangeError(config.BridgeName) }
// FindAvailableNetwork returns a network from the passed list which does not // overlap with existing interfaces in the system func FindAvailableNetwork(list []*net.IPNet) (*net.IPNet, error) { // We don't check for an error here, because we don't really care if we // can't read /etc/resolv.conf. So instead we skip the append if resolvConf // is nil. It either doesn't exist, or we can't read it for some reason. var nameservers []string if rc, err := resolvconf.Get(); err == nil { nameservers = resolvconf.GetNameserversAsCIDR(rc.Content) } for _, nw := range list { if err := netutils.CheckNameserverOverlaps(nameservers, nw); err == nil { if err := netutils.CheckRouteOverlaps(nw); err == nil { return nw, nil } } } return nil, fmt.Errorf("no available network") }
func isOverlap(nw *net.IPNet) bool { var nameservers []string if rc, err := resolvconf.Get(); err == nil { nameservers = resolvconf.GetNameserversAsCIDR(rc.Content) } if err := netutils.CheckNameserverOverlaps(nameservers, nw); err != nil { return true } if err := netutils.CheckRouteOverlaps(nw); err != nil { return true } return false }
func checkOverlap(nw *net.IPNet) error { var nameservers []string if rc, err := resolvconf.Get(); err == nil { nameservers = resolvconf.GetNameserversAsCIDR(rc.Content) } if err := netutils.CheckNameserverOverlaps(nameservers, nw); err != nil { return fmt.Errorf("overlay subnet %s failed check with nameserver: %v: %v", nw.String(), nameservers, err) } if err := netutils.CheckRouteOverlaps(nw); err != nil { return fmt.Errorf("overlay subnet %s failed check with host route table: %v", nw.String(), err) } return nil }