Fix namespacing
This commit is contained in:
		
							
								
								
									
										103
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								main.go
									
									
									
									
									
								
							| @@ -14,7 +14,7 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	PluginName = "mycelium-cni" | 	PluginName        = "mycelium-cni" | ||||||
| 	MyceliumInterface = "mycelium" | 	MyceliumInterface = "mycelium" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -102,7 +102,7 @@ func cmdCheck(args *skel.CmdArgs) error { | |||||||
| func cmdDel(args *skel.CmdArgs) error { | func cmdDel(args *skel.CmdArgs) error { | ||||||
| 	// Clean up veth pair (host side will be automatically removed) | 	// Clean up veth pair (host side will be automatically removed) | ||||||
| 	hostVethName := fmt.Sprintf("veth-%s", args.ContainerID[:8]) | 	hostVethName := fmt.Sprintf("veth-%s", args.ContainerID[:8]) | ||||||
| 	 |  | ||||||
| 	link, err := netlink.LinkByName(hostVethName) | 	link, err := netlink.LinkByName(hostVethName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		// Interface might already be gone, which is fine | 		// 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 { | 	if err := netns.Set(containerNS); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 		// Get the interface | 	// Get the interface | ||||||
| 		link, err := netlink.LinkByName(ifName) | 	link, err := netlink.LinkByName(ifName) | ||||||
| 		if err != nil { | 	if err != nil { | ||||||
| 			return err | 		return err | ||||||
| 		} | 	} | ||||||
|  |  | ||||||
| 		// Bring interface up | 	// Bring interface up | ||||||
| 		if err := netlink.LinkSetUp(link); err != nil { | 	if err := netlink.LinkSetUp(link); err != nil { | ||||||
| 			return err | 		return err | ||||||
| 		} | 	} | ||||||
|  |  | ||||||
| 		// Add IP address | 	// Add IP address | ||||||
| 		addr := &netlink.Addr{ | 	addr := &netlink.Addr{ | ||||||
| 			IPNet: &net.IPNet{ | 		IPNet: &net.IPNet{ | ||||||
| 				IP:   containerIP, | 			IP:   containerIP, | ||||||
| 				Mask: net.CIDRMask(64, 128), | 			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 | 			return err | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 		// Get host veth link-local address for routing | 	return nil | ||||||
| 		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 |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func configureHostInterface(hostVeth netlink.Link, containerIP net.IP) error { | func configureHostInterface(hostVeth netlink.Link, containerIP net.IP) error { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user