diff --git a/libnetwork/driverapi/driverapi.go b/libnetwork/driverapi/driverapi.go index dd13a37b1d..5ae2dcbcd0 100644 --- a/libnetwork/driverapi/driverapi.go +++ b/libnetwork/driverapi/driverapi.go @@ -1,6 +1,9 @@ package driverapi -import "errors" +import ( + "errors" + "net" +) var ( // ErrEndpointExists is returned if more than one endpoint is added to the network @@ -50,10 +53,10 @@ type Interface struct { DstName string // IPv4 address for the interface. - Address string + Address net.IPNet // IPv6 address for the interface. - AddressIPv6 string + AddressIPv6 net.IPNet } // SandboxInfo represents all possible information that @@ -63,10 +66,10 @@ type SandboxInfo struct { Interfaces []*Interface // IPv4 gateway for the sandbox. - Gateway string + Gateway net.IP // IPv6 gateway for the sandbox. - GatewayIPv6 string + GatewayIPv6 net.IP // TODO: Add routes and ip tables etc. } diff --git a/libnetwork/drivers/bridge/bridge.go b/libnetwork/drivers/bridge/bridge.go index d1b64c0357..1255da4133 100644 --- a/libnetwork/drivers/bridge/bridge.go +++ b/libnetwork/drivers/bridge/bridge.go @@ -293,11 +293,11 @@ func (d *driver) CreateEndpoint(nid, eid driverapi.UUID, sboxKey string, config intf := &driverapi.Interface{} intf.SrcName = name2 intf.DstName = "eth0" - intf.Address = ipv4Addr.String() - sinfo.Gateway = n.bridge.bridgeIPv4.IP.String() + intf.Address = ipv4Addr + sinfo.Gateway = n.bridge.bridgeIPv4.IP if n.bridge.Config.EnableIPv6 { - intf.AddressIPv6 = ipv6Addr.String() - sinfo.GatewayIPv6 = n.bridge.bridgeIPv6.IP.String() + intf.AddressIPv6 = ipv6Addr + sinfo.GatewayIPv6 = n.bridge.bridgeIPv6.IP } n.endpoint.addressIPv4 = ip4 diff --git a/libnetwork/drivers/bridge/network_test.go b/libnetwork/drivers/bridge/network_test.go index ef41bfff07..7a413f00cf 100644 --- a/libnetwork/drivers/bridge/network_test.go +++ b/libnetwork/drivers/bridge/network_test.go @@ -1,7 +1,6 @@ package bridge import ( - "net" "testing" "github.com/docker/libnetwork/driverapi" @@ -41,33 +40,25 @@ func TestLinkCreate(t *testing.T) { t.Fatalf("Could not find source link %s: %v", interfaces[0].SrcName, err) } - ip, _, err := net.ParseCIDR(interfaces[0].Address) - if err != nil { - t.Fatalf("Invalid IPv4 address returned, ip = %s: %v", interfaces[0].Address, err) - } - n := dr.network + ip := interfaces[0].Address.IP if !n.bridge.bridgeIPv4.Contains(ip) { t.Fatalf("IP %s is not a valid ip in the subnet %s", ip.String(), n.bridge.bridgeIPv4.String()) } - ip6, _, err := net.ParseCIDR(interfaces[0].AddressIPv6) - if err != nil { - t.Fatalf("Invalid IPv6 address returned, ip = %s: %v", interfaces[0].AddressIPv6, err) - } - + ip6 := interfaces[0].AddressIPv6.IP if !n.bridge.bridgeIPv6.Contains(ip6) { t.Fatalf("IP %s is not a valid ip in the subnet %s", ip6.String(), bridgeIPv6.String()) } - if sinfo.Gateway != n.bridge.bridgeIPv4.IP.String() { + if sinfo.Gateway.String() != n.bridge.bridgeIPv4.IP.String() { t.Fatalf("Invalid default gateway. Expected %s. Got %s", n.bridge.bridgeIPv4.IP.String(), - sinfo.Gateway) + sinfo.Gateway.String()) } - if sinfo.GatewayIPv6 != n.bridge.bridgeIPv6.IP.String() { + if sinfo.GatewayIPv6.String() != n.bridge.bridgeIPv6.IP.String() { t.Fatalf("Invalid default gateway for IPv6. Expected %s. Got %s", n.bridge.bridgeIPv6.IP.String(), - sinfo.GatewayIPv6) + sinfo.GatewayIPv6.String()) } } @@ -115,9 +106,11 @@ func TestLinkCreateNoEnableIPv6(t *testing.T) { } interfaces := sinfo.Interfaces - if interfaces[0].AddressIPv6 != "" || - sinfo.GatewayIPv6 != "" { - t.Fatalf("Expected IPv6 address and GatewayIPv6 to be empty when IPv6 enabled. Instead got IPv6 = %s and GatewayIPv6 = %s", - interfaces[0].AddressIPv6, sinfo.GatewayIPv6) + if len(interfaces[0].AddressIPv6.IP) != 0 { + t.Fatalf("Expectd IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", interfaces[0].AddressIPv6.String()) + } + + if sinfo.GatewayIPv6 != nil { + t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", sinfo.GatewayIPv6.String()) } } diff --git a/libnetwork/sandbox/configure_linux.go b/libnetwork/sandbox/configure_linux.go index 44f642b8a3..cec2662586 100644 --- a/libnetwork/sandbox/configure_linux.go +++ b/libnetwork/sandbox/configure_linux.go @@ -17,8 +17,6 @@ func configureInterface(iface netlink.Link, settings *driverapi.Interface) error {setInterfaceName, fmt.Sprintf("error renaming interface %q to %q", ifaceName, settings.DstName)}, {setInterfaceIP, fmt.Sprintf("error setting interface %q IP to %q", ifaceName, settings.Address)}, {setInterfaceIPv6, fmt.Sprintf("error setting interface %q IPv6 to %q", ifaceName, settings.AddressIPv6)}, - /* {setInterfaceGateway, fmt.Sprintf("error setting interface %q gateway to %q", ifaceName, settings.Gateway)}, - {setInterfaceGatewayIPv6, fmt.Sprintf("error setting interface %q IPv6 gateway to %q", ifaceName, settings.GatewayIPv6)}, */ } for _, config := range ifaceConfigurators { @@ -29,36 +27,21 @@ func configureInterface(iface netlink.Link, settings *driverapi.Interface) error return nil } -func setGatewayIP(gw string) error { - ip := net.ParseIP(gw) - if ip == nil { - return fmt.Errorf("bad address format %q", gw) - } - +func setGatewayIP(gw net.IP) error { return netlink.RouteAdd(&netlink.Route{ Scope: netlink.SCOPE_UNIVERSE, - Gw: ip, + Gw: gw, }) } func setInterfaceIP(iface netlink.Link, settings *driverapi.Interface) error { - ipAddr, err := netlink.ParseAddr(settings.Address) - if err == nil { - err = netlink.AddrAdd(iface, ipAddr) - } - return err + ipAddr := &netlink.Addr{IPNet: &settings.Address, Label: ""} + return netlink.AddrAdd(iface, ipAddr) } func setInterfaceIPv6(iface netlink.Link, settings *driverapi.Interface) error { - if settings.AddressIPv6 == "" { - return nil - } - - ipAddr, err := netlink.ParseAddr(settings.AddressIPv6) - if err == nil { - err = netlink.AddrAdd(iface, ipAddr) - } - return err + ipAddr := &netlink.Addr{IPNet: &settings.Address, Label: ""} + return netlink.AddrAdd(iface, ipAddr) } func setInterfaceName(iface netlink.Link, settings *driverapi.Interface) error { diff --git a/libnetwork/sandbox/namespace_linux.go b/libnetwork/sandbox/namespace_linux.go index f39d50be45..47972d0856 100644 --- a/libnetwork/sandbox/namespace_linux.go +++ b/libnetwork/sandbox/namespace_linux.go @@ -2,6 +2,7 @@ package sandbox import ( "fmt" + "net" "os" "runtime" "syscall" @@ -120,7 +121,7 @@ func (n *networkNamespace) AddInterface(i *driverapi.Interface) error { return nil } -func (n *networkNamespace) SetGateway(gw string) error { +func (n *networkNamespace) SetGateway(gw net.IP) error { err := setGatewayIP(gw) if err == nil { n.sinfo.Gateway = gw @@ -129,7 +130,7 @@ func (n *networkNamespace) SetGateway(gw string) error { return err } -func (n *networkNamespace) SetGatewayIPv6(gw string) error { +func (n *networkNamespace) SetGatewayIPv6(gw net.IP) error { err := setGatewayIP(gw) if err == nil { n.sinfo.GatewayIPv6 = gw diff --git a/libnetwork/sandbox/sandbox.go b/libnetwork/sandbox/sandbox.go index 554f91ad2a..6c9c93af4c 100644 --- a/libnetwork/sandbox/sandbox.go +++ b/libnetwork/sandbox/sandbox.go @@ -1,6 +1,10 @@ package sandbox -import "github.com/docker/libnetwork/driverapi" +import ( + "net" + + "github.com/docker/libnetwork/driverapi" +) // Sandbox represents a network sandbox, identified by a specific key. It // holds a list of Interfaces, routes etc, and more can be added dynamically. @@ -19,7 +23,9 @@ type Sandbox interface { // interface according to the specified settings. AddInterface(*driverapi.Interface) error - SetGateway(gw string) error + // Set default IPv4 gateway for the sandbox + SetGateway(gw net.IP) error - SetGatewayIPv6(gw string) error + // Set default IPv6 gateway for the sandbox + SetGatewayIPv6(gw net.IP) error }