diff --git a/libnetwork/drivers/overlay/ov_network.go b/libnetwork/drivers/overlay/ov_network.go index da7ddc6c0d..262afdb1b7 100644 --- a/libnetwork/drivers/overlay/ov_network.go +++ b/libnetwork/drivers/overlay/ov_network.go @@ -361,7 +361,11 @@ func (n *network) generateBridgeName(s *subnet) string { id = n.id[:5] } - return "ov-" + fmt.Sprintf("%06x", n.vxlanID(s)) + "-" + id + return n.getBridgeNamePrefix(s) + "-" + id +} + +func (n *network) getBridgeNamePrefix(s *subnet) string { + return "ov-" + fmt.Sprintf("%06x", n.vxlanID(s)) } func isOverlap(nw *net.IPNet) bool { @@ -388,7 +392,9 @@ func (n *network) initSubnetSandbox(s *subnet) error { if hostMode { // Try to delete stale bridge interface if it exists - deleteInterface(brName) + if err := deleteInterface(brName); err != nil { + deleteInterfaceBySubnet(n.getBridgeNamePrefix(s), s) + } // Try to delete the vxlan interface by vni if already present deleteVxlanByVNI("", n.vxlanID(s)) diff --git a/libnetwork/drivers/overlay/ov_utils.go b/libnetwork/drivers/overlay/ov_utils.go index 46e84518db..f9f32dec48 100644 --- a/libnetwork/drivers/overlay/ov_utils.go +++ b/libnetwork/drivers/overlay/ov_utils.go @@ -2,7 +2,9 @@ package overlay import ( "fmt" + "strings" + "github.com/Sirupsen/logrus" "github.com/docker/libnetwork/netutils" "github.com/docker/libnetwork/ns" "github.com/docker/libnetwork/osl" @@ -69,6 +71,37 @@ func createVxlan(name string, vni uint32) error { return nil } +func deleteInterfaceBySubnet(brPrefix string, s *subnet) error { + defer osl.InitOSContext()() + + nlh := ns.NlHandle() + links, err := nlh.LinkList() + if err != nil { + return fmt.Errorf("failed to list interfaces while deleting bridge interface by subnet: %v", err) + } + + for _, l := range links { + name := l.Attrs().Name + if _, ok := l.(*netlink.Bridge); ok && strings.HasPrefix(name, brPrefix) { + addrList, err := nlh.AddrList(l, netlink.FAMILY_V4) + if err != nil { + logrus.Errorf("error getting AddressList for bridge %s", name) + continue + } + for _, addr := range addrList { + if netutils.NetworkOverlaps(addr.IPNet, s.subnetIP) { + err = nlh.LinkDel(l) + if err != nil { + logrus.Errorf("error deleting bridge (%s) with subnet %v: %v", name, addr.IPNet, err) + } + } + } + } + } + return nil + +} + func deleteInterface(name string) error { defer osl.InitOSContext()()