From e71059d2454d3df4b1ea2ee4173448e0d7655801 Mon Sep 17 00:00:00 2001 From: Viktor Liu Date: Wed, 22 May 2024 12:32:01 +0200 Subject: [PATCH] Add dummy ipv6 to macos interface (#2025) --- client/internal/routemanager/systemops_darwin.go | 5 ----- iface/iface_test.go | 14 +++++++++++++- iface/tun_darwin.go | 11 ++++++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/client/internal/routemanager/systemops_darwin.go b/client/internal/routemanager/systemops_darwin.go index 017dc6c28..ee4196a0c 100644 --- a/client/internal/routemanager/systemops_darwin.go +++ b/client/internal/routemanager/systemops_darwin.go @@ -43,11 +43,6 @@ func routeCmd(action string, prefix netip.Prefix, nexthop netip.Addr, intf *net. } if prefix.Addr().Is6() { inet = "-inet6" - // Special case for IPv6 split default route, pointing to the wg interface fails - // TODO: Remove once we have IPv6 support on the interface - if prefix.Bits() == 1 { - intf = &net.Interface{Name: "lo0"} - } } args := []string{"-n", action, inet, network} diff --git a/iface/iface_test.go b/iface/iface_test.go index 3fc250637..f227eaf83 100644 --- a/iface/iface_test.go +++ b/iface/iface_test.go @@ -3,6 +3,7 @@ package iface import ( "fmt" "net" + "net/netip" "testing" "time" @@ -79,8 +80,19 @@ func TestWGIface_UpdateAddr(t *testing.T) { t.Error(err) } - assert.Equal(t, addr, addrs[0].String()) + var found bool + for _, a := range addrs { + prefix, err := netip.ParsePrefix(a.String()) + assert.NoError(t, err) + if prefix.Addr().Is4() { + found = true + assert.Equal(t, addr, prefix.String()) + } + } + if !found { + t.Fatal("v4 address not found") + } } func getIfaceAddrs(ifaceName string) ([]net.Addr, error) { diff --git a/iface/tun_darwin.go b/iface/tun_darwin.go index bac14986f..8dc10bd0e 100644 --- a/iface/tun_darwin.go +++ b/iface/tun_darwin.go @@ -1,5 +1,4 @@ //go:build !ios -// +build !ios package iface @@ -121,13 +120,19 @@ func (t *tunDevice) Wrapper() *DeviceWrapper { func (t *tunDevice) assignAddr() error { cmd := exec.Command("ifconfig", t.name, "inet", t.address.IP.String(), t.address.IP.String()) if out, err := cmd.CombinedOutput(); err != nil { - log.Infof(`adding address command "%v" failed with output %s and error: `, cmd.String(), out) + log.Errorf("adding address command '%v' failed with output: %s", cmd.String(), out) return err } + // dummy ipv6 so routing works + cmd = exec.Command("ifconfig", t.name, "inet6", "fe80::/64") + if out, err := cmd.CombinedOutput(); err != nil { + log.Debugf("adding address command '%v' failed with output: %s", cmd.String(), out) + } + routeCmd := exec.Command("route", "add", "-net", t.address.Network.String(), "-interface", t.name) if out, err := routeCmd.CombinedOutput(); err != nil { - log.Printf(`adding route command "%v" failed with output %s and error: `, routeCmd.String(), out) + log.Errorf("adding route command '%v' failed with output: %s", routeCmd.String(), out) return err } return nil