Fix namespacing

This commit is contained in:
Scott Yeager 2025-06-20 19:51:10 -07:00
parent 88ad00ae93
commit 9bdaf13797

103
main.go
View File

@ -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 {