// AddHostRoute adds a host-scoped route to a device. func AddHostRoute(ipn *net.IPNet, gw net.IP, dev netlink.Link) error { return netlink.RouteAdd(&netlink.Route{ LinkIndex: dev.Attrs().Index, Scope: netlink.SCOPE_HOST, Dst: ipn, Gw: gw, }) }
func addRoute(link netlink.Link, podIP net.IP) error { route := netlink.Route{ LinkIndex: link.Attrs().Index, Scope: netlink.SCOPE_LINK, Dst: &net.IPNet{ IP: podIP, Mask: net.IPv4Mask(0xff, 0xff, 0xff, 0xff), }, } return netlink.RouteAdd(&route) }
func newDHCPClient(link netlink.Link) (*dhcp4client.Client, error) { pktsock, err := dhcp4client.NewPacketSock(link.Attrs().Index) if err != nil { return nil, err } return dhcp4client.New( dhcp4client.HardwareAddr(link.Attrs().HardwareAddr), dhcp4client.Timeout(5*time.Second), dhcp4client.Broadcast(false), dhcp4client.Connection(pktsock), ) }
func removeAllRoutesOnLink(link netlink.Link) error { routes, err := netlink.RouteList(link, netlink.FAMILY_V4) if err != nil { return fmt.Errorf("cannot list routes on link %q: %v", link.Attrs().Name, err) } for _, route := range routes { if err := netlink.RouteDel(&route); err != nil { return fmt.Errorf("error in time of route removal for route %q: %v", route, err) } } return nil }
func ensureHasAddr(link netlink.Link, ipn *net.IPNet) error { addrs, err := netlink.AddrList(link, syscall.AF_INET) if err != nil && err != syscall.ENOENT { return fmt.Errorf("could not get list of IP addresses: %v", err) } // if there're no addresses on the interface, it's ok -- we'll add one if len(addrs) > 0 { ipnStr := ipn.String() for _, a := range addrs { // string comp is actually easiest for doing IPNet comps if a.IPNet.String() == ipnStr { return nil } } return fmt.Errorf("%q already has an IP address different from %v", link.Attrs().Name, ipn.String()) } addr := &netlink.Addr{IPNet: ipn, Label: link.Attrs().Name} if err := netlink.AddrAdd(link, addr); err != nil { return fmt.Errorf("could not add IP address to %q: %v", link.Attrs().Name, err) } return nil }