From cf5709aab10e6523be3cf76da2e114773eafc610 Mon Sep 17 00:00:00 2001 From: metacubex Date: Sat, 3 Dec 2022 00:10:50 +0800 Subject: [PATCH] fix: a temporary solution for error reporting when enabling tun for devices that do not have an ipv6 environment. --- config/config.go | 4 ++++ config/utils.go | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/config/config.go b/config/config.go index bb8c65f44..f5efc936b 100644 --- a/config/config.go +++ b/config/config.go @@ -1289,6 +1289,10 @@ func parseTun(rawTun RawTun, general *General) error { } tunAddressPrefix = netip.PrefixFrom(tunAddressPrefix.Addr(), 30) + if !general.IPv6 || !verifyIP6() { + rawTun.Inet6Address = nil + } + general.Tun = Tun{ Enable: rawTun.Enable, Device: rawTun.Device, diff --git a/config/utils.go b/config/utils.go index 1d49552fe..2c470618a 100644 --- a/config/utils.go +++ b/config/utils.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "net" "strings" "github.com/Dreamacro/clash/adapter/outboundgroup" @@ -146,3 +147,25 @@ func proxyGroupsDagSort(groupsConfig []map[string]any) error { } return fmt.Errorf("loop is detected in ProxyGroup, please check following ProxyGroups: %v", loopElements) } + +func verifyIP6() bool { + addrs, err := net.InterfaceAddrs() + if err != nil { + return false + } + for _, addr := range addrs { + ipNet, isIpNet := addr.(*net.IPNet) + if isIpNet && !ipNet.IP.IsLoopback() { + if ipNet.IP.To16() != nil { + s := ipNet.IP.String() + for i := 0; i < len(s); i++ { + switch s[i] { + case ':': + return true + } + } + } + } + } + return false +}