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  }