diff --git a/netlink/link_darwin.go b/netlink/link_darwin.go index 5e6f635..25ce92e 100644 --- a/netlink/link_darwin.go +++ b/netlink/link_darwin.go @@ -25,20 +25,6 @@ func SetupLink(ifName, cidr string) error { return AddRoute(ifName, ipnet, nil) } -func AddRoute(ifName string, to *net.IPNet, _ net.IP) error { - if to.IP.To4() == nil { // ipv6 - return exec.Command("route", "-qn", "add", "-inet6", to.String(), "-iface", ifName).Run() - } - return exec.Command("route", "-qn", "add", "-inet", to.String(), "-iface", ifName).Run() -} - -func DelRoute(_ string, to *net.IPNet, _ net.IP) error { - if to.IP.To4() == nil { // ipv6 - return exec.Command("route", "-qn", "delete", "-inet6", to.String()).Run() - } - return exec.Command("route", "-qn", "delete", "-inet", to.String()).Run() -} - func LinkByIndex(index int) (*Link, error) { return nil, errors.ErrUnsupported } diff --git a/netlink/link_default.go b/netlink/link_default.go index 46eb43e..b9a5b76 100644 --- a/netlink/link_default.go +++ b/netlink/link_default.go @@ -4,7 +4,6 @@ package netlink import ( "errors" - "net" ) func SetupLink(string, string) error { @@ -12,16 +11,6 @@ func SetupLink(string, string) error { return nil } -func AddRoute(string, *net.IPNet, net.IP) error { - // noop - return nil -} - -func DelRoute(string, *net.IPNet, net.IP) error { - // noop - return nil -} - func LinkByIndex(index int) (*Link, error) { return nil, errors.ErrUnsupported } diff --git a/netlink/link_linux.go b/netlink/link_linux.go index 921a6d3..40d7397 100644 --- a/netlink/link_linux.go +++ b/netlink/link_linux.go @@ -4,7 +4,6 @@ package netlink import ( "errors" - "net" "github.com/vishvananda/netlink" ) @@ -35,20 +34,6 @@ func SetupLink(ifName, cidr string) error { return nil } -func AddRoute(_ string, to *net.IPNet, via net.IP) error { - return netlink.RouteAdd(&netlink.Route{ - Dst: to, - Gw: via, - }) -} - -func DelRoute(_ string, to *net.IPNet, via net.IP) error { - return netlink.RouteDel(&netlink.Route{ - Dst: to, - Gw: via, - }) -} - func LinkByIndex(index int) (*Link, error) { l, err := netlink.LinkByIndex(index) if err != nil { diff --git a/netlink/link_windows.go b/netlink/link_windows.go index b1d59a1..deb9ac3 100644 --- a/netlink/link_windows.go +++ b/netlink/link_windows.go @@ -25,22 +25,6 @@ func SetupLink(ifName, cidr string) error { return exec.Command("netsh", "interface", "ipv4", "set", "address", ifName, "static", ip.String(), addrMask).Run() } -func AddRoute(ifName string, to *net.IPNet, via net.IP) error { - if via.To4() == nil { // ipv6 - return exec.Command("netsh", "interface", "ipv6", "add", "route", to.String(), ifName, via.String()).Run() - } - // ipv4 - addrMask := fmt.Sprintf("%d.%d.%d.%d", to.Mask[0], to.Mask[1], to.Mask[2], to.Mask[3]) - return exec.Command("route", "add", to.IP.String(), "mask", addrMask, via.String()).Run() -} - -func DelRoute(ifName string, to *net.IPNet, via net.IP) error { - if via.To4() == nil { // ipv6 - return exec.Command("netsh", "interface", "ipv6", "delete", "route", to.String(), ifName, via.String()).Run() - } - return exec.Command("route", "delete", to.IP.String()).Run() -} - func LinkByIndex(index int) (*Link, error) { luid, err := winipcfg.LUIDFromIndex(uint32(index)) if err != nil { diff --git a/netlink/route_darwin.go b/netlink/route_darwin.go index 2d6fbfc..2b125a2 100644 --- a/netlink/route_darwin.go +++ b/netlink/route_darwin.go @@ -7,6 +7,7 @@ import ( "log/slog" "net" "os" + "os/exec" "slices" "syscall" @@ -88,3 +89,17 @@ func runRouteMsgReadLoop(fd int, ch chan<- RouteUpdate) error { } } } + +func AddRoute(ifName string, to *net.IPNet, _ net.IP) error { + if to.IP.To4() == nil { // ipv6 + return exec.Command("route", "-qn", "add", "-inet6", to.String(), "-iface", ifName).Run() + } + return exec.Command("route", "-qn", "add", "-inet", to.String(), "-iface", ifName).Run() +} + +func DelRoute(_ string, to *net.IPNet, _ net.IP) error { + if to.IP.To4() == nil { // ipv6 + return exec.Command("route", "-qn", "delete", "-inet6", to.String()).Run() + } + return exec.Command("route", "-qn", "delete", "-inet", to.String()).Run() +} diff --git a/netlink/route_default.go b/netlink/route_default.go index 5ebb128..9c78ac3 100644 --- a/netlink/route_default.go +++ b/netlink/route_default.go @@ -5,8 +5,18 @@ package netlink import ( "context" "errors" + "net" ) func RouteSubscribe(ctx context.Context, ch chan<- RouteUpdate) error { return errors.ErrUnsupported } +func AddRoute(string, *net.IPNet, net.IP) error { + // noop + return errors.ErrUnsupported +} + +func DelRoute(string, *net.IPNet, net.IP) error { + // noop + return errors.ErrUnsupported +} diff --git a/netlink/route_linux.go b/netlink/route_linux.go index 954653b..51693fb 100644 --- a/netlink/route_linux.go +++ b/netlink/route_linux.go @@ -3,6 +3,7 @@ package netlink import ( "context" "log/slog" + "net" "slices" "github.com/vishvananda/netlink" @@ -43,3 +44,17 @@ func RouteSubscribe(ctx context.Context, ch chan<- RouteUpdate) error { }() return nil } + +func AddRoute(_ string, to *net.IPNet, via net.IP) error { + return netlink.RouteAdd(&netlink.Route{ + Dst: to, + Gw: via, + }) +} + +func DelRoute(_ string, to *net.IPNet, via net.IP) error { + return netlink.RouteDel(&netlink.Route{ + Dst: to, + Gw: via, + }) +} diff --git a/netlink/route_windows.go b/netlink/route_windows.go index afc8652..a796d21 100644 --- a/netlink/route_windows.go +++ b/netlink/route_windows.go @@ -2,7 +2,9 @@ package netlink import ( "context" + "fmt" "net" + "os/exec" "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" ) @@ -26,3 +28,18 @@ func RouteSubscribe(ctx context.Context, ch chan<- RouteUpdate) error { }() return nil } +func AddRoute(ifName string, to *net.IPNet, via net.IP) error { + if via.To4() == nil { // ipv6 + return exec.Command("netsh", "interface", "ipv6", "add", "route", to.String(), ifName, via.String()).Run() + } + // ipv4 + addrMask := fmt.Sprintf("%d.%d.%d.%d", to.Mask[0], to.Mask[1], to.Mask[2], to.Mask[3]) + return exec.Command("route", "add", to.IP.String(), "mask", addrMask, via.String()).Run() +} + +func DelRoute(ifName string, to *net.IPNet, via net.IP) error { + if via.To4() == nil { // ipv6 + return exec.Command("netsh", "interface", "ipv6", "delete", "route", to.String(), ifName, via.String()).Run() + } + return exec.Command("route", "delete", to.IP.String()).Run() +}