From 4b903b3bb8981e3e2aa86a4a6798897e275a606f Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Fri, 23 Nov 2018 11:02:45 +0530 Subject: [PATCH 1/5] handle gracefully add/delete of vethwedu dummy interface fixes #3414 --- net/bridge.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/net/bridge.go b/net/bridge.go index f35da52458..b12abbe094 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -55,6 +55,7 @@ datapath of old kernel versions (https://github.com/weaveworks/weave/issues/1577 const ( WeaveBridgeName = "weave" + WeaveDummyIfName = "vethwedu" DatapathName = "datapath" DatapathIfName = "vethwe-datapath" BridgeIfName = "vethwe-bridge" @@ -328,8 +329,8 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { // instead we create a temporary interface with the desired MTU, // attach that to the bridge, and then remove it again. dummy := &netlink.Dummy{LinkAttrs: netlink.NewLinkAttrs()} - dummy.LinkAttrs.Name = "vethwedu" - if err = netlink.LinkAdd(dummy); err != nil { + dummy.LinkAttrs.Name = WeaveDummyIfName + if err = LinkAddIfNotExist(dummy); err != nil { return errors.Wrap(err, "creating dummy interface") } if err := netlink.LinkSetMTU(dummy, config.MTU); err != nil { @@ -338,11 +339,16 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { if err := netlink.LinkSetMasterByIndex(dummy, b.bridge.Attrs().Index); err != nil { return errors.Wrap(err, "setting dummy interface master") } - if err := netlink.LinkDel(dummy); err != nil { - return errors.Wrap(err, "deleting dummy interface") - } - - return nil + defer func() { + var dummyIf netlink.Link + dummyIf, err = netlink.LinkByName(WeaveDummyIfName) + if err == nil { + if err = netlink.LinkDel(dummyIf); err != nil { + err = errors.Wrap(err, "deleting dummy interface") + } + } + }() + return err } func (b bridgeImpl) init(config *BridgeConfig) error { From cd788fc3ab71c5d46c95e0ef24c15cbc66e65876 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Fri, 4 Jan 2019 14:54:39 +0530 Subject: [PATCH 2/5] addressing review comment. use defer right after link creation. --- net/bridge.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/net/bridge.go b/net/bridge.go index b12abbe094..05a4f257b2 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -333,12 +333,6 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { if err = LinkAddIfNotExist(dummy); err != nil { return errors.Wrap(err, "creating dummy interface") } - if err := netlink.LinkSetMTU(dummy, config.MTU); err != nil { - return errors.Wrapf(err, "setting dummy interface mtu to %d", config.MTU) - } - if err := netlink.LinkSetMasterByIndex(dummy, b.bridge.Attrs().Index); err != nil { - return errors.Wrap(err, "setting dummy interface master") - } defer func() { var dummyIf netlink.Link dummyIf, err = netlink.LinkByName(WeaveDummyIfName) @@ -348,6 +342,12 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { } } }() + if err := netlink.LinkSetMTU(dummy, config.MTU); err != nil { + return errors.Wrapf(err, "setting dummy interface mtu to %d", config.MTU) + } + if err := netlink.LinkSetMasterByIndex(dummy, b.bridge.Attrs().Index); err != nil { + return errors.Wrap(err, "setting dummy interface master") + } return err } From c814651d4382d1c18ff0fdf8403ba1790ca0e1a3 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Thu, 10 Jan 2019 13:59:07 +0530 Subject: [PATCH 3/5] rename the dummy interface name --- net/bridge.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/bridge.go b/net/bridge.go index 05a4f257b2..f3ee7032e2 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -334,10 +334,10 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { return errors.Wrap(err, "creating dummy interface") } defer func() { - var dummyIf netlink.Link - dummyIf, err = netlink.LinkByName(WeaveDummyIfName) + var dummy netlink.Link + dummy, err = netlink.LinkByName(WeaveDummyIfName) if err == nil { - if err = netlink.LinkDel(dummyIf); err != nil { + if err = netlink.LinkDel(dummy); err != nil { err = errors.Wrap(err, "deleting dummy interface") } } From db47f170a0f3e8ce573990c18b1c33393319915d Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Tue, 22 Jan 2019 18:42:43 +0530 Subject: [PATCH 4/5] reuse dummy variable --- net/bridge.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/bridge.go b/net/bridge.go index f3ee7032e2..8b9a93ec2e 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -328,13 +328,13 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { // fails. Bridges take the lowest MTU of their interfaces. So // instead we create a temporary interface with the desired MTU, // attach that to the bridge, and then remove it again. - dummy := &netlink.Dummy{LinkAttrs: netlink.NewLinkAttrs()} - dummy.LinkAttrs.Name = WeaveDummyIfName + var dummy netlink.Link + dummy = &netlink.Dummy{LinkAttrs: netlink.NewLinkAttrs()} + dummy.Attrs().Name = WeaveDummyIfName if err = LinkAddIfNotExist(dummy); err != nil { return errors.Wrap(err, "creating dummy interface") } defer func() { - var dummy netlink.Link dummy, err = netlink.LinkByName(WeaveDummyIfName) if err == nil { if err = netlink.LinkDel(dummy); err != nil { From 7f85a017bbc74e24fcf089a904aac1808bea7fa1 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Tue, 12 Feb 2019 10:16:20 +0530 Subject: [PATCH 5/5] reuse dummy netlink object to delete the interface --- net/bridge.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/net/bridge.go b/net/bridge.go index 8b9a93ec2e..5857a5b320 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -335,11 +335,8 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error { return errors.Wrap(err, "creating dummy interface") } defer func() { - dummy, err = netlink.LinkByName(WeaveDummyIfName) - if err == nil { - if err = netlink.LinkDel(dummy); err != nil { - err = errors.Wrap(err, "deleting dummy interface") - } + if err = netlink.LinkDel(dummy); err != nil { + err = errors.Wrap(err, "deleting dummy interface") } }() if err := netlink.LinkSetMTU(dummy, config.MTU); err != nil {