diff --git a/adapter/outbound/anytls.go b/adapter/outbound/anytls.go index 5ba7c6d2..a6dbd6c8 100644 --- a/adapter/outbound/anytls.go +++ b/adapter/outbound/anytls.go @@ -95,7 +95,7 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, } diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index a3408f70..f0b9d846 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -160,12 +160,12 @@ func (b *Base) Close() error { } type BasicOption struct { - TFO bool `proxy:"tfo,omitempty"` - MPTCP bool `proxy:"mptcp,omitempty"` - Interface string `proxy:"interface-name,omitempty"` - RoutingMark int `proxy:"routing-mark,omitempty"` - IPVersion string `proxy:"ip-version,omitempty"` - DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy + TFO bool `proxy:"tfo,omitempty"` + MPTCP bool `proxy:"mptcp,omitempty"` + Interface string `proxy:"interface-name,omitempty"` + RoutingMark int `proxy:"routing-mark,omitempty"` + IPVersion C.DNSPrefer `proxy:"ip-version,omitempty"` + DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy DialerForAPI C.Dialer `proxy:"-"` // the dialer used for API usage has higher priority than all the above configurations. } diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go index be8367ba..5f2a80dc 100644 --- a/adapter/outbound/direct.go +++ b/adapter/outbound/direct.go @@ -74,7 +74,7 @@ func NewDirectWithOption(option DirectOption) *Direct { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, loopBack: loopback.NewDetector(), } diff --git a/adapter/outbound/dns.go b/adapter/outbound/dns.go index 25228502..2ce8a3cb 100644 --- a/adapter/outbound/dns.go +++ b/adapter/outbound/dns.go @@ -163,7 +163,7 @@ func NewDnsWithOption(option DnsOption) *Dns { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, } } diff --git a/adapter/outbound/http.go b/adapter/outbound/http.go index 61b8596a..09169ad2 100644 --- a/adapter/outbound/http.go +++ b/adapter/outbound/http.go @@ -174,7 +174,7 @@ func NewHttp(option HttpOption) (*Http, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, user: option.UserName, pass: option.Password, diff --git a/adapter/outbound/hysteria.go b/adapter/outbound/hysteria.go index 46737798..2d2a5e74 100644 --- a/adapter/outbound/hysteria.go +++ b/adapter/outbound/hysteria.go @@ -247,7 +247,7 @@ func NewHysteria(option HysteriaOption) (*Hysteria, error) { tfo: option.FastOpen, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, client: client, diff --git a/adapter/outbound/hysteria2.go b/adapter/outbound/hysteria2.go index 78d2b9ff..522d79a1 100644 --- a/adapter/outbound/hysteria2.go +++ b/adapter/outbound/hysteria2.go @@ -113,7 +113,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { udp: true, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, } @@ -189,7 +189,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { CWND: option.CWND, UdpMTU: option.UdpMTU, ServerAddress: func(ctx context.Context) (*net.UDPAddr, error) { - udpAddr, err := resolveUDPAddr(ctx, "udp", addr, C.NewDNSPrefer(option.IPVersion)) + udpAddr, err := resolveUDPAddr(ctx, "udp", addr, option.IPVersion) if err != nil { return nil, err } diff --git a/adapter/outbound/mieru.go b/adapter/outbound/mieru.go index 5a2db630..05986e39 100644 --- a/adapter/outbound/mieru.go +++ b/adapter/outbound/mieru.go @@ -172,7 +172,7 @@ func NewMieru(option MieruOption) (*Mieru, error) { udp: option.UDP, xudp: false, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, client: c, diff --git a/adapter/outbound/shadowsocks.go b/adapter/outbound/shadowsocks.go index 0ece8151..176f486c 100644 --- a/adapter/outbound/shadowsocks.go +++ b/adapter/outbound/shadowsocks.go @@ -463,7 +463,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, method: method, diff --git a/adapter/outbound/shadowsocksr.go b/adapter/outbound/shadowsocksr.go index 8eecf677..38be1780 100644 --- a/adapter/outbound/shadowsocksr.go +++ b/adapter/outbound/shadowsocksr.go @@ -167,7 +167,7 @@ func NewShadowSocksR(option ShadowSocksROption) (*ShadowSocksR, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, cipher: coreCiph, diff --git a/adapter/outbound/snell.go b/adapter/outbound/snell.go index 0c7d8876..8890729d 100644 --- a/adapter/outbound/snell.go +++ b/adapter/outbound/snell.go @@ -170,7 +170,7 @@ func NewSnell(option SnellOption) (*Snell, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, psk: psk, diff --git a/adapter/outbound/socks5.go b/adapter/outbound/socks5.go index 3bc48d86..1a47417d 100644 --- a/adapter/outbound/socks5.go +++ b/adapter/outbound/socks5.go @@ -195,7 +195,7 @@ func NewSocks5(option Socks5Option) (*Socks5, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, user: option.UserName, diff --git a/adapter/outbound/ssh.go b/adapter/outbound/ssh.go index ec9068dd..be185a83 100644 --- a/adapter/outbound/ssh.go +++ b/adapter/outbound/ssh.go @@ -189,7 +189,7 @@ func NewSsh(option SshOption) (*Ssh, error) { udp: false, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, config: &config, diff --git a/adapter/outbound/sudoku.go b/adapter/outbound/sudoku.go index 0e6c3bba..ed045b53 100644 --- a/adapter/outbound/sudoku.go +++ b/adapter/outbound/sudoku.go @@ -243,7 +243,7 @@ func NewSudoku(option SudokuOption) (*Sudoku, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, table: table, diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go index d2f7f38a..51ed4dd1 100644 --- a/adapter/outbound/trojan.go +++ b/adapter/outbound/trojan.go @@ -293,7 +293,7 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, hexPassword: trojan.Key(option.Password), diff --git a/adapter/outbound/tuic.go b/adapter/outbound/tuic.go index 8070359e..886c8684 100644 --- a/adapter/outbound/tuic.go +++ b/adapter/outbound/tuic.go @@ -256,7 +256,7 @@ func NewTuic(option TuicOption) (*Tuic, error) { tfo: option.FastOpen, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, option: &option, tlsConfig: tlsClientConfig, diff --git a/adapter/outbound/vless.go b/adapter/outbound/vless.go index d6301076..5dbb1424 100644 --- a/adapter/outbound/vless.go +++ b/adapter/outbound/vless.go @@ -423,7 +423,7 @@ func NewVless(option VlessOption) (*Vless, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, client: client, option: &option, diff --git a/adapter/outbound/vmess.go b/adapter/outbound/vmess.go index 7af32c6d..90cb2902 100644 --- a/adapter/outbound/vmess.go +++ b/adapter/outbound/vmess.go @@ -433,7 +433,7 @@ func NewVmess(option VmessOption) (*Vmess, error) { mpTcp: option.MPTCP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, client: client, option: &option, diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go index 66d46b02..68d69d33 100644 --- a/adapter/outbound/wireguard.go +++ b/adapter/outbound/wireguard.go @@ -173,7 +173,7 @@ func NewWireGuard(option WireGuardOption) (*WireGuard, error) { udp: option.UDP, iface: option.Interface, rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), + prefer: option.IPVersion, }, } outbound.dialer = option.NewDialer(outbound.DialOptions()) diff --git a/constant/dns.go b/constant/dns.go index 13a2ed36..79dafd2b 100644 --- a/constant/dns.go +++ b/constant/dns.go @@ -86,12 +86,17 @@ func (d DNSPrefer) String() string { } } -func NewDNSPrefer(prefer string) DNSPrefer { - if p, ok := dnsPreferMap[prefer]; ok { - return p - } else { - return DualStack +func (d DNSPrefer) MarshalText() ([]byte, error) { + return []byte(d.String()), nil +} + +func (d *DNSPrefer) UnmarshalText(data []byte) error { + p, exist := dnsPreferMap[strings.ToLower(string(data))] + if !exist { + p = DualStack } + *d = p + return nil } // FilterModeMapping is a mapping for FilterMode enum