11package inbound
22
33import (
4- "errors "
5- "strings "
4+ "encoding "
5+ "net/netip "
66
77 C "github.com/metacubex/mihomo/constant"
88 LC "github.com/metacubex/mihomo/listener/config"
@@ -12,50 +12,55 @@ import (
1212
1313type TunOption struct {
1414 BaseOption
15- Device string `inbound:"device,omitempty"`
16- Stack string `inbound:"stack,omitempty"`
17- DNSHijack []string `inbound:"dns-hijack,omitempty"`
18- AutoRoute bool `inbound:"auto-route,omitempty"`
19- AutoDetectInterface bool `inbound:"auto-detect-interface,omitempty"`
20-
21- MTU uint32 `inbound:"mtu,omitempty"`
22- GSO bool `inbound:"gso,omitempty"`
23- GSOMaxSize uint32 `inbound:"gso-max-size,omitempty"`
24- Inet4Address []string `inbound:"inet4-address,omitempty"`
25- Inet6Address []string `inbound:"inet6-address,omitempty"`
26- IPRoute2TableIndex int `inbound:"iproute2-table-index,omitempty"`
27- IPRoute2RuleIndex int `inbound:"iproute2-rule-index,omitempty"`
28- AutoRedirect bool `inbound:"auto-redirect,omitempty"`
29- AutoRedirectInputMark uint32 `inbound:"auto-redirect-input-mark,omitempty"`
30- AutoRedirectOutputMark uint32 `inbound:"auto-redirect-output-mark,omitempty"`
31- StrictRoute bool `inbound:"strict-route,omitempty"`
32- RouteAddress []string `inbound:"route-address,omitempty"`
33- RouteAddressSet []string `inbound:"route-address-set,omitempty"`
34- RouteExcludeAddress []string `inbound:"route-exclude-address,omitempty"`
35- RouteExcludeAddressSet []string `inbound:"route-exclude-address-set,omitempty"`
36- IncludeInterface []string `inbound:"include-interface,omitempty"`
37- ExcludeInterface []string `inbound:"exclude-interface,omitempty"`
38- IncludeUID []uint32 `inbound:"include-uid,omitempty"`
39- IncludeUIDRange []string `inbound:"include-uid-range,omitempty"`
40- ExcludeUID []uint32 `inbound:"exclude-uid,omitempty"`
41- ExcludeUIDRange []string `inbound:"exclude-uid-range,omitempty"`
42- ExcludeSrcPort []uint16 `inbound:"exclude-src-port,omitempty"`
43- ExcludeSrcPortRange []string `inbound:"exclude-src-port-range,omitempty"`
44- ExcludeDstPort []uint16 `inbound:"exclude-dst-port,omitempty"`
45- ExcludeDstPortRange []string `inbound:"exclude-dst-port-range,omitempty"`
46- IncludeAndroidUser []int `inbound:"include-android-user,omitempty"`
47- IncludePackage []string `inbound:"include-package,omitempty"`
48- ExcludePackage []string `inbound:"exclude-package,omitempty"`
49- EndpointIndependentNat bool `inbound:"endpoint-independent-nat,omitempty"`
50- UDPTimeout int64 `inbound:"udp-timeout,omitempty"`
51- FileDescriptor int `inbound:"file-descriptor,omitempty"`
52-
53- Inet4RouteAddress []string `inbound:"inet4-route-address,omitempty"`
54- Inet6RouteAddress []string `inbound:"inet6-route-address,omitempty"`
55- Inet4RouteExcludeAddress []string `inbound:"inet4-route-exclude-address,omitempty"`
56- Inet6RouteExcludeAddress []string `inbound:"inet6-route-exclude-address,omitempty"`
15+ Device string `inbound:"device,omitempty"`
16+ Stack C.TUNStack `inbound:"stack,omitempty"`
17+ DNSHijack []string `inbound:"dns-hijack,omitempty"`
18+ AutoRoute bool `inbound:"auto-route,omitempty"`
19+ AutoDetectInterface bool `inbound:"auto-detect-interface,omitempty"`
20+
21+ MTU uint32 `inbound:"mtu,omitempty"`
22+ GSO bool `inbound:"gso,omitempty"`
23+ GSOMaxSize uint32 `inbound:"gso-max-size,omitempty"`
24+ Inet4Address []netip.Prefix `inbound:"inet4-address,omitempty"`
25+ Inet6Address []netip.Prefix `inbound:"inet6-address,omitempty"`
26+ IPRoute2TableIndex int `inbound:"iproute2-table-index,omitempty"`
27+ IPRoute2RuleIndex int `inbound:"iproute2-rule-index,omitempty"`
28+ AutoRedirect bool `inbound:"auto-redirect,omitempty"`
29+ AutoRedirectInputMark uint32 `inbound:"auto-redirect-input-mark,omitempty"`
30+ AutoRedirectOutputMark uint32 `inbound:"auto-redirect-output-mark,omitempty"`
31+ LoopbackAddress []netip.Addr `inbound:"loopback-address,omitempty"`
32+ StrictRoute bool `inbound:"strict-route,omitempty"`
33+ RouteAddress []netip.Prefix `inbound:"route-address,omitempty"`
34+ RouteAddressSet []string `inbound:"route-address-set,omitempty"`
35+ RouteExcludeAddress []netip.Prefix `inbound:"route-exclude-address,omitempty"`
36+ RouteExcludeAddressSet []string `inbound:"route-exclude-address-set,omitempty"`
37+ IncludeInterface []string `inbound:"include-interface,omitempty"`
38+ ExcludeInterface []string `inbound:"exclude-interface,omitempty"`
39+ IncludeUID []uint32 `inbound:"include-uid,omitempty"`
40+ IncludeUIDRange []string `inbound:"include-uid-range,omitempty"`
41+ ExcludeUID []uint32 `inbound:"exclude-uid,omitempty"`
42+ ExcludeUIDRange []string `inbound:"exclude-uid-range,omitempty"`
43+ ExcludeSrcPort []uint16 `inbound:"exclude-src-port,omitempty"`
44+ ExcludeSrcPortRange []string `inbound:"exclude-src-port-range,omitempty"`
45+ ExcludeDstPort []uint16 `inbound:"exclude-dst-port,omitempty"`
46+ ExcludeDstPortRange []string `inbound:"exclude-dst-port-range,omitempty"`
47+ IncludeAndroidUser []int `inbound:"include-android-user,omitempty"`
48+ IncludePackage []string `inbound:"include-package,omitempty"`
49+ ExcludePackage []string `inbound:"exclude-package,omitempty"`
50+ EndpointIndependentNat bool `inbound:"endpoint-independent-nat,omitempty"`
51+ UDPTimeout int64 `inbound:"udp-timeout,omitempty"`
52+ FileDescriptor int `inbound:"file-descriptor,omitempty"`
53+
54+ Inet4RouteAddress []netip.Prefix `inbound:"inet4-route-address,omitempty"`
55+ Inet6RouteAddress []netip.Prefix `inbound:"inet6-route-address,omitempty"`
56+ Inet4RouteExcludeAddress []netip.Prefix `inbound:"inet4-route-exclude-address,omitempty"`
57+ Inet6RouteExcludeAddress []netip.Prefix `inbound:"inet6-route-exclude-address,omitempty"`
5758}
5859
60+ var _ encoding.TextUnmarshaler = (* netip .Addr )(nil ) // ensure netip.Addr can decode direct by structure package
61+ var _ encoding.TextUnmarshaler = (* netip .Prefix )(nil ) // ensure netip.Prefix can decode direct by structure package
62+ var _ encoding.TextUnmarshaler = (* C .TUNStack )(nil ) // ensure C.TUNStack can decode direct by structure package
63+
5964func (o TunOption ) Equal (config C.InboundConfig ) bool {
6065 return optionToString (o ) == optionToString (config )
6166}
@@ -72,68 +77,31 @@ func NewTun(options *TunOption) (*Tun, error) {
7277 if err != nil {
7378 return nil , err
7479 }
75- stack , exist := C .StackTypeMapping [strings .ToLower (options .Stack )]
76- if ! exist {
77- return nil , errors .New ("invalid tun stack" )
78- }
79-
80- routeAddress , err := LC .StringSliceToNetipPrefixSlice (options .RouteAddress )
81- if err != nil {
82- return nil , err
83- }
84- routeExcludeAddress , err := LC .StringSliceToNetipPrefixSlice (options .RouteExcludeAddress )
85- if err != nil {
86- return nil , err
87- }
88-
89- inet4Address , err := LC .StringSliceToNetipPrefixSlice (options .Inet4Address )
90- if err != nil {
91- return nil , err
92- }
93- inet6Address , err := LC .StringSliceToNetipPrefixSlice (options .Inet6Address )
94- if err != nil {
95- return nil , err
96- }
97- inet4RouteAddress , err := LC .StringSliceToNetipPrefixSlice (options .Inet4RouteAddress )
98- if err != nil {
99- return nil , err
100- }
101- inet6RouteAddress , err := LC .StringSliceToNetipPrefixSlice (options .Inet6RouteAddress )
102- if err != nil {
103- return nil , err
104- }
105- inet4RouteExcludeAddress , err := LC .StringSliceToNetipPrefixSlice (options .Inet4RouteExcludeAddress )
106- if err != nil {
107- return nil , err
108- }
109- inet6RouteExcludeAddress , err := LC .StringSliceToNetipPrefixSlice (options .Inet6RouteExcludeAddress )
110- if err != nil {
111- return nil , err
112- }
11380 return & Tun {
11481 Base : base ,
11582 config : options ,
11683 tun : LC.Tun {
11784 Enable : true ,
11885 Device : options .Device ,
119- Stack : stack ,
86+ Stack : options . Stack ,
12087 DNSHijack : options .DNSHijack ,
12188 AutoRoute : options .AutoRoute ,
12289 AutoDetectInterface : options .AutoDetectInterface ,
12390 MTU : options .MTU ,
12491 GSO : options .GSO ,
12592 GSOMaxSize : options .GSOMaxSize ,
126- Inet4Address : inet4Address ,
127- Inet6Address : inet6Address ,
93+ Inet4Address : options . Inet4Address ,
94+ Inet6Address : options . Inet6Address ,
12895 IPRoute2TableIndex : options .IPRoute2TableIndex ,
12996 IPRoute2RuleIndex : options .IPRoute2RuleIndex ,
13097 AutoRedirect : options .AutoRedirect ,
13198 AutoRedirectInputMark : options .AutoRedirectInputMark ,
13299 AutoRedirectOutputMark : options .AutoRedirectOutputMark ,
100+ LoopbackAddress : options .LoopbackAddress ,
133101 StrictRoute : options .StrictRoute ,
134- RouteAddress : routeAddress ,
102+ RouteAddress : options . RouteAddress ,
135103 RouteAddressSet : options .RouteAddressSet ,
136- RouteExcludeAddress : routeExcludeAddress ,
104+ RouteExcludeAddress : options . RouteExcludeAddress ,
137105 RouteExcludeAddressSet : options .RouteExcludeAddressSet ,
138106 IncludeInterface : options .IncludeInterface ,
139107 ExcludeInterface : options .ExcludeInterface ,
@@ -152,10 +120,10 @@ func NewTun(options *TunOption) (*Tun, error) {
152120 UDPTimeout : options .UDPTimeout ,
153121 FileDescriptor : options .FileDescriptor ,
154122
155- Inet4RouteAddress : inet4RouteAddress ,
156- Inet6RouteAddress : inet6RouteAddress ,
157- Inet4RouteExcludeAddress : inet4RouteExcludeAddress ,
158- Inet6RouteExcludeAddress : inet6RouteExcludeAddress ,
123+ Inet4RouteAddress : options . Inet4RouteAddress ,
124+ Inet6RouteAddress : options . Inet6RouteAddress ,
125+ Inet4RouteExcludeAddress : options . Inet4RouteExcludeAddress ,
126+ Inet6RouteExcludeAddress : options . Inet6RouteExcludeAddress ,
159127 },
160128 }, nil
161129}
0 commit comments