From 5039d4a2804561885e32f2a93cb2a51cbaa8e847 Mon Sep 17 00:00:00 2001 From: Andrea Luzzardi Date: Wed, 20 Feb 2013 18:20:18 -0800 Subject: [PATCH] Network: Automatically figure out the gateway and netmask by inspecting the lxc bridge interface --- network.go | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/network.go b/network.go index 234086c64c..0a6d1b8598 100644 --- a/network.go +++ b/network.go @@ -1,12 +1,12 @@ package docker import ( + "fmt" "net" ) const ( - networkGateway = "10.0.3.1" - networkPrefixLen = 24 + networkBridgeIface = "lxcbr0" ) type NetworkInterface struct { @@ -19,11 +19,42 @@ func allocateIPAddress() string { return "10.0.3.2" } +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(), - IpPrefixLen: networkPrefixLen, - Gateway: net.ParseIP(networkGateway), + IpPrefixLen: ipPrefixLen, + Gateway: bridge.IP, } return iface, nil }