github.com/titanous/docker@v1.4.1/daemon/networkdriver/utils.go (about) 1 package networkdriver 2 3 import ( 4 "errors" 5 "fmt" 6 "net" 7 8 "github.com/docker/libcontainer/netlink" 9 ) 10 11 var ( 12 networkGetRoutesFct = netlink.NetworkGetRoutes 13 ErrNoDefaultRoute = errors.New("no default route") 14 ) 15 16 func CheckNameserverOverlaps(nameservers []string, toCheck *net.IPNet) error { 17 if len(nameservers) > 0 { 18 for _, ns := range nameservers { 19 _, nsNetwork, err := net.ParseCIDR(ns) 20 if err != nil { 21 return err 22 } 23 if NetworkOverlaps(toCheck, nsNetwork) { 24 return ErrNetworkOverlapsWithNameservers 25 } 26 } 27 } 28 return nil 29 } 30 31 func CheckRouteOverlaps(toCheck *net.IPNet) error { 32 networks, err := networkGetRoutesFct() 33 if err != nil { 34 return err 35 } 36 37 for _, network := range networks { 38 if network.IPNet != nil && NetworkOverlaps(toCheck, network.IPNet) { 39 return ErrNetworkOverlaps 40 } 41 } 42 return nil 43 } 44 45 // Detects overlap between one IPNet and another 46 func NetworkOverlaps(netX *net.IPNet, netY *net.IPNet) bool { 47 if firstIP, _ := NetworkRange(netX); netY.Contains(firstIP) { 48 return true 49 } 50 if firstIP, _ := NetworkRange(netY); netX.Contains(firstIP) { 51 return true 52 } 53 return false 54 } 55 56 // Calculates the first and last IP addresses in an IPNet 57 func NetworkRange(network *net.IPNet) (net.IP, net.IP) { 58 var netIP net.IP 59 if network.IP.To4() != nil { 60 netIP = network.IP.To4() 61 } else if network.IP.To16() != nil { 62 netIP = network.IP.To16() 63 } else { 64 return nil, nil 65 } 66 67 lastIP := make([]byte, len(netIP), len(netIP)) 68 69 for i := 0; i < len(netIP); i++ { 70 lastIP[i] = netIP[i] | ^network.Mask[i] 71 } 72 return netIP.Mask(network.Mask), net.IP(lastIP) 73 } 74 75 // Return the IPv4 address of a network interface 76 func GetIfaceAddr(name string) (net.Addr, error) { 77 iface, err := net.InterfaceByName(name) 78 if err != nil { 79 return nil, err 80 } 81 addrs, err := iface.Addrs() 82 if err != nil { 83 return nil, err 84 } 85 var addrs4 []net.Addr 86 for _, addr := range addrs { 87 ip := (addr.(*net.IPNet)).IP 88 if ip4 := ip.To4(); ip4 != nil { 89 addrs4 = append(addrs4, addr) 90 } 91 } 92 switch { 93 case len(addrs4) == 0: 94 return nil, fmt.Errorf("Interface %v has no IP addresses", name) 95 case len(addrs4) > 1: 96 fmt.Printf("Interface %v has more than 1 IPv4 address. Defaulting to using %v\n", 97 name, (addrs4[0].(*net.IPNet)).IP) 98 } 99 return addrs4[0], nil 100 } 101 102 func GetDefaultRouteIface() (*net.Interface, error) { 103 rs, err := networkGetRoutesFct() 104 if err != nil { 105 return nil, fmt.Errorf("unable to get routes: %v", err) 106 } 107 for _, r := range rs { 108 if r.Default { 109 return r.Iface, nil 110 } 111 } 112 return nil, ErrNoDefaultRoute 113 }