diff --git a/net/veth.go b/net/veth.go index cba5f355..8648b755 100644 --- a/net/veth.go +++ b/net/veth.go @@ -9,7 +9,7 @@ import ( ) // create and attach local name to the Weave bridge -func CreateAndAttachVeth(localName, peerName, bridgeName string, mtu int) (*netlink.Veth, error) { +func CreateAndAttachVeth(localName, peerName, bridgeName string, mtu int, init func(local, guest netlink.Link) error) (*netlink.Veth, error) { maybeBridge, err := netlink.LinkByName(bridgeName) if err != nil { return nil, fmt.Errorf(`bridge "%s" not present; did you launch weave?`, bridgeName) @@ -54,6 +54,16 @@ func CreateAndAttachVeth(localName, peerName, bridgeName string, mtu int) (*netl return cleanup(`device "%s" is not a bridge`, bridgeName) } + if init != nil { + guest, err := netlink.LinkByName(peerName) + if err != nil { + return cleanup("unable to find guest veth %s: %s", peerName, err) + } + if err := init(local, guest); err != nil { + return cleanup("initializing veth: %s", err) + } + } + if err := netlink.LinkSetUp(local); err != nil { return cleanup("unable to bring veth up: %s", err) } diff --git a/plugin/net/cni.go b/plugin/net/cni.go index 477e553f..9a10ed18 100644 --- a/plugin/net/cni.go +++ b/plugin/net/cni.go @@ -95,39 +95,27 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { } name, peerName := vethPair(id) - local, err := weavenet.CreateAndAttachVeth(name, peerName, conf.BrName, conf.MTU) - if err != nil { - return err - } - - cleanup := func(err error) error { - netlink.LinkDel(local) - return err - } - guest, err := netlink.LinkByName(local.PeerName) - if err != nil { - return cleanup(err) - } - if err = netlink.LinkSetNsFd(guest, int(ns)); err != nil { - return cleanup(fmt.Errorf("failed to move veth to container netns: %s", err)) - } - - err = common.WithNetNS(ns, func() error { - return setupGuestIP4(local.PeerName, args.IfName, result.IP4.IP, result.IP4.Gateway, result.IP4.Routes) + _, err = weavenet.CreateAndAttachVeth(name, peerName, conf.BrName, conf.MTU, func(local, guest netlink.Link) error { + if err = netlink.LinkSetNsFd(guest, int(ns)); err != nil { + return fmt.Errorf("failed to move veth to container netns: %s", err) + } + if err = common.WithNetNS(ns, func() error { + return setupGuestIP4(guest, args.IfName, result.IP4.IP, result.IP4.Gateway, result.IP4.Routes) + }); err != nil { + return fmt.Errorf("error setting up interface: %s", err) + } + return nil }) if err != nil { - return cleanup(fmt.Errorf("error setting up interface: %s", err)) + return err } result.DNS = conf.DNS return result.Print() } -func setupGuestIP4(origName, name string, ipnet net.IPNet, gw net.IP, routes []types.Route) error { - guest, err := netlink.LinkByName(origName) - if err != nil { - return err - } +func setupGuestIP4(guest netlink.Link, name string, ipnet net.IPNet, gw net.IP, routes []types.Route) error { + var err error if err = netlink.LinkSetName(guest, name); err != nil { return err } diff --git a/plugin/net/driver.go b/plugin/net/driver.go index 3ead7411..2a257a5f 100644 --- a/plugin/net/driver.go +++ b/plugin/net/driver.go @@ -101,7 +101,7 @@ func (driver *driver) JoinEndpoint(j *api.JoinRequest) (*api.JoinResponse, error driver.logReq("JoinEndpoint", j, fmt.Sprintf("%s:%s to %s", j.NetworkID, j.EndpointID, j.SandboxKey)) name, peerName := vethPair(j.EndpointID) - if _, err := weavenet.CreateAndAttachVeth(name, peerName, WeaveBridge, 0); err != nil { + if _, err := weavenet.CreateAndAttachVeth(name, peerName, WeaveBridge, 0, nil); err != nil { return nil, driver.error("JoinEndpoint", "%s", err) }