diff --git a/experimental/deprecated/constants.go b/experimental/deprecated/constants.go index 7830452f..bf848ffe 100644 --- a/experimental/deprecated/constants.go +++ b/experimental/deprecated/constants.go @@ -100,15 +100,6 @@ var OptionInboundOptions = Note{ MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-legacy-special-outbounds-to-rule-actions", } -var OptionLegacyDNSRouteOptions = Note{ - Name: "legacy-dns-route-options", - Description: "legacy dns route options", - DeprecatedVersion: "1.11.0", - ScheduledVersion: "1.12.0", - EnvName: "LEGACY_DNS_ROUTE_OPTIONS", - MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-legacy-dns-route-options-to-rule-actions", -} - var Options = []Note{ OptionBadMatchSource, OptionGEOIP, @@ -116,5 +107,4 @@ var Options = []Note{ OptionTUNAddressX, OptionSpecialOutbounds, OptionInboundOptions, - OptionLegacyDNSRouteOptions, } diff --git a/option/rule_action.go b/option/rule_action.go index 3b4e8edb..9bc13039 100644 --- a/option/rule_action.go +++ b/option/rule_action.go @@ -7,8 +7,7 @@ import ( "time" C "github.com/sagernet/sing-box/constant" - "github.com/sagernet/sing-box/experimental/deprecated" - dns "github.com/sagernet/sing-dns" + "github.com/sagernet/sing-dns" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/json" "github.com/sagernet/sing/common/json/badjson" @@ -137,18 +136,10 @@ func (r *DNSRuleAction) UnmarshalJSONContext(ctx context.Context, data []byte) e return badjson.UnmarshallExcludedContext(ctx, data, (*_DNSRuleAction)(r), v) } -type _RouteActionOptions struct { - Outbound string `json:"outbound,omitempty"` -} - -type RouteActionOptions _RouteActionOptions - -func (r *RouteActionOptions) UnmarshalJSON(data []byte) error { - err := json.Unmarshal(data, (*_RouteActionOptions)(r)) - if err != nil { - return err - } - return nil +type RouteActionOptions struct { + Outbound string `json:"outbound,omitempty"` + UDPDisableDomainUnmapping bool `json:"udp_disable_domain_unmapping,omitempty"` + UDPConnect bool `json:"udp_connect,omitempty"` } type _RouteOptionsActionOptions struct { @@ -169,29 +160,13 @@ func (r *RouteOptionsActionOptions) UnmarshalJSON(data []byte) error { return nil } -type _DNSRouteActionOptions struct { - Server string `json:"server,omitempty"` - // Deprecated: Use DNSRouteOptionsActionOptions instead. - DisableCache bool `json:"disable_cache,omitempty"` - // Deprecated: Use DNSRouteOptionsActionOptions instead. - RewriteTTL *uint32 `json:"rewrite_ttl,omitempty"` - // Deprecated: Use DNSRouteOptionsActionOptions instead. +type DNSRouteActionOptions struct { + Server string `json:"server,omitempty"` + DisableCache bool `json:"disable_cache,omitempty"` + RewriteTTL *uint32 `json:"rewrite_ttl,omitempty"` ClientSubnet *badoption.Prefixable `json:"client_subnet,omitempty"` } -type DNSRouteActionOptions _DNSRouteActionOptions - -func (r *DNSRouteActionOptions) UnmarshalJSONContext(ctx context.Context, data []byte) error { - err := json.Unmarshal(data, (*_DNSRouteActionOptions)(r)) - if err != nil { - return err - } - if r.DisableCache || r.RewriteTTL != nil || r.ClientSubnet != nil { - deprecated.Report(ctx, deprecated.OptionLegacyDNSRouteOptions) - } - return nil -} - type _DNSRouteOptionsActionOptions struct { DisableCache bool `json:"disable_cache,omitempty"` RewriteTTL *uint32 `json:"rewrite_ttl,omitempty"` diff --git a/route/route.go b/route/route.go index 0e3f8916..ddf52358 100644 --- a/route/route.go +++ b/route/route.go @@ -437,6 +437,12 @@ match: } } switch action := currentRule.Action().(type) { + case *rule.RuleActionRoute: + metadata.UDPDisableDomainUnmapping = action.UDPDisableDomainUnmapping + metadata.UDPConnect = action.UDPConnect + selectedRule = currentRule + selectedRuleIndex = currentRuleIndex + break match case *rule.RuleActionRouteOptions: metadata.UDPDisableDomainUnmapping = action.UDPDisableDomainUnmapping metadata.UDPConnect = action.UDPConnect diff --git a/route/rule/rule_action.go b/route/rule/rule_action.go index 00579c18..d44e36ee 100644 --- a/route/rule/rule_action.go +++ b/route/rule/rule_action.go @@ -29,6 +29,10 @@ func NewRuleAction(ctx context.Context, logger logger.ContextLogger, action opti case C.RuleActionTypeRoute: return &RuleActionRoute{ Outbound: action.RouteOptions.Outbound, + RuleActionRouteOptions: RuleActionRouteOptions{ + UDPDisableDomainUnmapping: action.RouteOptions.UDPDisableDomainUnmapping, + UDPConnect: action.RouteOptions.UDPConnect, + }, }, nil case C.RuleActionTypeRouteOptions: return &RuleActionRouteOptions{ @@ -85,10 +89,12 @@ func NewDNSRuleAction(logger logger.ContextLogger, action option.DNSRuleAction) return nil case C.RuleActionTypeRoute: return &RuleActionDNSRoute{ - Server: action.RouteOptions.Server, - DisableCache: action.RouteOptions.DisableCache, - RewriteTTL: action.RouteOptions.RewriteTTL, - ClientSubnet: netip.Prefix(common.PtrValueOrDefault(action.RouteOptions.ClientSubnet)), + Server: action.RouteOptions.Server, + RuleActionDNSRouteOptions: RuleActionDNSRouteOptions{ + DisableCache: action.RouteOptions.DisableCache, + RewriteTTL: action.RouteOptions.RewriteTTL, + ClientSubnet: netip.Prefix(common.PtrValueOrDefault(action.RouteOptions.ClientSubnet)), + }, } case C.RuleActionTypeRouteOptions: return &RuleActionDNSRouteOptions{ @@ -109,6 +115,7 @@ func NewDNSRuleAction(logger logger.ContextLogger, action option.DNSRuleAction) type RuleActionRoute struct { Outbound string + RuleActionRouteOptions } func (r *RuleActionRoute) Type() string { @@ -116,7 +123,15 @@ func (r *RuleActionRoute) Type() string { } func (r *RuleActionRoute) String() string { - return F.ToString("route(", r.Outbound, ")") + var descriptions []string + descriptions = append(descriptions, r.Outbound) + if r.UDPDisableDomainUnmapping { + descriptions = append(descriptions, "udp-disable-domain-unmapping") + } + if r.UDPConnect { + descriptions = append(descriptions, "udp-connect") + } + return F.ToString("route(", strings.Join(descriptions, ","), ")") } type RuleActionRouteOptions struct { @@ -140,10 +155,8 @@ func (r *RuleActionRouteOptions) String() string { } type RuleActionDNSRoute struct { - Server string - DisableCache bool - RewriteTTL *uint32 - ClientSubnet netip.Prefix + Server string + RuleActionDNSRouteOptions } func (r *RuleActionDNSRoute) Type() string { @@ -151,7 +164,18 @@ func (r *RuleActionDNSRoute) Type() string { } func (r *RuleActionDNSRoute) String() string { - return F.ToString("route(", r.Server, ")") + var descriptions []string + descriptions = append(descriptions, r.Server) + if r.DisableCache { + descriptions = append(descriptions, "disable-cache") + } + if r.RewriteTTL != nil { + descriptions = append(descriptions, F.ToString("rewrite-ttl=", *r.RewriteTTL)) + } + if r.ClientSubnet.IsValid() { + descriptions = append(descriptions, F.ToString("client-subnet=", r.ClientSubnet)) + } + return F.ToString("route(", strings.Join(descriptions, ","), ")") } type RuleActionDNSRouteOptions struct { @@ -170,10 +194,10 @@ func (r *RuleActionDNSRouteOptions) String() string { descriptions = append(descriptions, "disable-cache") } if r.RewriteTTL != nil { - descriptions = append(descriptions, F.ToString("rewrite-ttl(", *r.RewriteTTL, ")")) + descriptions = append(descriptions, F.ToString("rewrite-ttl=", *r.RewriteTTL)) } if r.ClientSubnet.IsValid() { - descriptions = append(descriptions, F.ToString("client-subnet(", r.ClientSubnet, ")")) + descriptions = append(descriptions, F.ToString("client-subnet=", r.ClientSubnet)) } return F.ToString("route-options(", strings.Join(descriptions, ","), ")") }