Support core status check and force restart Optimize proxies page and access page Update flutter and pub dependencies
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
//go:build android && cgo
|
|
|
|
package tun
|
|
|
|
import "C"
|
|
import (
|
|
"github.com/metacubex/mihomo/constant"
|
|
LC "github.com/metacubex/mihomo/listener/config"
|
|
"github.com/metacubex/mihomo/listener/sing_tun"
|
|
"github.com/metacubex/mihomo/log"
|
|
"github.com/metacubex/mihomo/tunnel"
|
|
"net"
|
|
"net/netip"
|
|
"strings"
|
|
)
|
|
|
|
func Start(fd int, stack string, address, dns string) *sing_tun.Listener {
|
|
var prefix4 []netip.Prefix
|
|
var prefix6 []netip.Prefix
|
|
tunStack, ok := constant.StackTypeMapping[strings.ToLower(stack)]
|
|
if !ok {
|
|
tunStack = constant.TunSystem
|
|
}
|
|
for _, a := range strings.Split(address, ",") {
|
|
a = strings.TrimSpace(a)
|
|
if len(a) == 0 {
|
|
continue
|
|
}
|
|
prefix, err := netip.ParsePrefix(a)
|
|
if err != nil {
|
|
log.Errorln("TUN:", err)
|
|
return nil
|
|
}
|
|
if prefix.Addr().Is4() {
|
|
prefix4 = append(prefix4, prefix)
|
|
} else {
|
|
prefix6 = append(prefix6, prefix)
|
|
}
|
|
}
|
|
|
|
var dnsHijack []string
|
|
for _, d := range strings.Split(dns, ",") {
|
|
d = strings.TrimSpace(d)
|
|
if len(d) == 0 {
|
|
continue
|
|
}
|
|
dnsHijack = append(dnsHijack, net.JoinHostPort(d, "53"))
|
|
}
|
|
|
|
options := LC.Tun{
|
|
Enable: true,
|
|
Device: "FlClash",
|
|
Stack: tunStack,
|
|
DNSHijack: dnsHijack,
|
|
AutoRoute: false,
|
|
AutoDetectInterface: false,
|
|
Inet4Address: prefix4,
|
|
Inet6Address: prefix6,
|
|
MTU: 9000,
|
|
FileDescriptor: fd,
|
|
}
|
|
|
|
listener, err := sing_tun.New(options, tunnel.Tunnel)
|
|
|
|
if err != nil {
|
|
log.Errorln("TUN:", err)
|
|
return nil
|
|
}
|
|
|
|
return listener
|
|
}
|