moby--moby/network.go

64 lines
1.3 KiB
Go
Raw Normal View History

package docker
import (
"fmt"
"math/rand"
"net"
)
const (
networkBridgeIface = "lxcbr0"
)
type NetworkInterface struct {
IpAddress string
IpPrefixLen int
Gateway net.IP
}
func allocateIPAddress(network *net.IPNet) net.IP {
ip := network.IP.Mask(network.Mask)
ip[3] = byte(rand.Intn(254))
return ip
}
func getBridgeAddr(name string) (net.Addr, error) {
iface, err := net.InterfaceByName(name)
if err != nil {
return nil, err
}
addrs, err := iface.Addrs()
if err != nil {
return nil, err
}
var addrs4 []net.Addr
for _, addr := range addrs {
ip := (addr.(*net.IPNet)).IP
if ip4 := ip.To4(); len(ip4) == net.IPv4len {
addrs4 = append(addrs4, addr)
}
}
switch {
case len(addrs4) == 0:
return nil, fmt.Errorf("Bridge %v has no IP addresses", name)
case len(addrs4) > 1:
return nil, fmt.Errorf("Bridge %v has more than 1 IPv4 address", name)
}
return addrs4[0], nil
}
func allocateNetwork() (*NetworkInterface, error) {
bridgeAddr, err := getBridgeAddr(networkBridgeIface)
if err != nil {
return nil, err
}
bridge := bridgeAddr.(*net.IPNet)
ipPrefixLen, _ := bridge.Mask.Size()
iface := &NetworkInterface{
IpAddress: allocateIPAddress(bridge).String(),
IpPrefixLen: ipPrefixLen,
Gateway: bridge.IP,
}
return iface, nil
}