diff --git a/main.go b/main.go index 61fc0f2..00535c6 100644 --- a/main.go +++ b/main.go @@ -14,7 +14,7 @@ import ( ) const ( - PluginName = "mycelium-cni" + PluginName = "mycelium-cni" MyceliumInterface = "mycelium" ) @@ -102,7 +102,7 @@ func cmdCheck(args *skel.CmdArgs) error { func cmdDel(args *skel.CmdArgs) error { // Clean up veth pair (host side will be automatically removed) hostVethName := fmt.Sprintf("veth-%s", args.ContainerID[:8]) - + link, err := netlink.LinkByName(hostVethName) if err != nil { // Interface might already be gone, which is fine @@ -194,52 +194,73 @@ func configureContainerInterface(containerNS netns.NsHandle, ifName string, cont if err := netns.Set(containerNS); err != nil { return err } - // Get the interface - link, err := netlink.LinkByName(ifName) - if err != nil { - return err - } + // Get the interface + link, err := netlink.LinkByName(ifName) + if err != nil { + return err + } - // Bring interface up - if err := netlink.LinkSetUp(link); err != nil { - return err - } + // Bring interface up + if err := netlink.LinkSetUp(link); err != nil { + return err + } - // Add IP address - addr := &netlink.Addr{ - IPNet: &net.IPNet{ - IP: containerIP, - Mask: net.CIDRMask(64, 128), + // Add IP address + addr := &netlink.Addr{ + IPNet: &net.IPNet{ + IP: containerIP, + Mask: net.CIDRMask(64, 128), + }, + } + if err := netlink.AddrAdd(link, addr); err != nil { + return err + } + + // Switch to main namespace to get host veth address + if err := netns.Set(originalNS); err != nil { + return err + } + + // Get host veth link-local address + hostVeth, err := netlink.LinkByName(hostVethName) + if err != nil { + return err + } + + hostAddrs, err := netlink.AddrList(hostVeth, netlink.FAMILY_V6) + if err != nil { + return err + } + + var hostLLAddr net.IP + for _, addr := range hostAddrs { + if addr.IP.IsLinkLocalUnicast() { + hostLLAddr = addr.IP + break + } + } + + // Switch back to container namespace to add route + if err := netns.Set(containerNS); err != nil { + return err + } + + if hostLLAddr != nil { + // Add route to Mycelium network via host veth + route := &netlink.Route{ + Dst: &net.IPNet{ + IP: net.ParseIP("400::"), + Mask: net.CIDRMask(7, 128), }, + Gw: hostLLAddr, + LinkIndex: link.Attrs().Index, } - if err := netlink.AddrAdd(link, addr); err != nil { + if err := netlink.RouteAdd(route); err != nil { return err } + } - // Get host veth link-local address for routing - hostVeth, err := netlink.LinkByName(hostVethName) - if err == nil { - hostAddrs, err := netlink.AddrList(hostVeth, netlink.FAMILY_V6) - if err == nil { - for _, addr := range hostAddrs { - if addr.IP.IsLinkLocalUnicast() { - // Add route to Mycelium network via host veth - route := &netlink.Route{ - Dst: &net.IPNet{ - IP: net.ParseIP("400::"), - Mask: net.CIDRMask(7, 128), - }, - Gw: addr.IP, - LinkIndex: link.Attrs().Index, - } - netlink.RouteAdd(route) - break - } - } - } - } - - return nil + return nil } func configureHostInterface(hostVeth netlink.Link, containerIP net.IP) error {