tun.go 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package option
  2. import (
  3. "net/netip"
  4. "strconv"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. F "github.com/sagernet/sing/common/format"
  7. "github.com/sagernet/sing/common/json"
  8. "github.com/sagernet/sing/common/json/badoption"
  9. )
  10. type TunInboundOptions struct {
  11. InterfaceName string `json:"interface_name,omitempty"`
  12. MTU uint32 `json:"mtu,omitempty"`
  13. Address badoption.Listable[netip.Prefix] `json:"address,omitempty"`
  14. AutoRoute bool `json:"auto_route,omitempty"`
  15. IPRoute2TableIndex int `json:"iproute2_table_index,omitempty"`
  16. IPRoute2RuleIndex int `json:"iproute2_rule_index,omitempty"`
  17. AutoRedirect bool `json:"auto_redirect,omitempty"`
  18. AutoRedirectInputMark FwMark `json:"auto_redirect_input_mark,omitempty"`
  19. AutoRedirectOutputMark FwMark `json:"auto_redirect_output_mark,omitempty"`
  20. ExcludeMPTCP bool `json:"exclude_mptcp,omitempty"`
  21. LoopbackAddress badoption.Listable[netip.Addr] `json:"loopback_address,omitempty"`
  22. StrictRoute bool `json:"strict_route,omitempty"`
  23. RouteAddress badoption.Listable[netip.Prefix] `json:"route_address,omitempty"`
  24. RouteAddressSet badoption.Listable[string] `json:"route_address_set,omitempty"`
  25. RouteExcludeAddress badoption.Listable[netip.Prefix] `json:"route_exclude_address,omitempty"`
  26. RouteExcludeAddressSet badoption.Listable[string] `json:"route_exclude_address_set,omitempty"`
  27. IncludeInterface badoption.Listable[string] `json:"include_interface,omitempty"`
  28. ExcludeInterface badoption.Listable[string] `json:"exclude_interface,omitempty"`
  29. IncludeUID badoption.Listable[uint32] `json:"include_uid,omitempty"`
  30. IncludeUIDRange badoption.Listable[string] `json:"include_uid_range,omitempty"`
  31. ExcludeUID badoption.Listable[uint32] `json:"exclude_uid,omitempty"`
  32. ExcludeUIDRange badoption.Listable[string] `json:"exclude_uid_range,omitempty"`
  33. IncludeAndroidUser badoption.Listable[int] `json:"include_android_user,omitempty"`
  34. IncludePackage badoption.Listable[string] `json:"include_package,omitempty"`
  35. ExcludePackage badoption.Listable[string] `json:"exclude_package,omitempty"`
  36. UDPTimeout UDPTimeoutCompat `json:"udp_timeout,omitempty"`
  37. Stack string `json:"stack,omitempty"`
  38. Platform *TunPlatformOptions `json:"platform,omitempty"`
  39. InboundOptions
  40. // Deprecated: removed
  41. GSO bool `json:"gso,omitempty"`
  42. // Deprecated: merged to Address
  43. Inet4Address badoption.Listable[netip.Prefix] `json:"inet4_address,omitempty"`
  44. // Deprecated: merged to Address
  45. Inet6Address badoption.Listable[netip.Prefix] `json:"inet6_address,omitempty"`
  46. // Deprecated: merged to RouteAddress
  47. Inet4RouteAddress badoption.Listable[netip.Prefix] `json:"inet4_route_address,omitempty"`
  48. // Deprecated: merged to RouteAddress
  49. Inet6RouteAddress badoption.Listable[netip.Prefix] `json:"inet6_route_address,omitempty"`
  50. // Deprecated: merged to RouteExcludeAddress
  51. Inet4RouteExcludeAddress badoption.Listable[netip.Prefix] `json:"inet4_route_exclude_address,omitempty"`
  52. // Deprecated: merged to RouteExcludeAddress
  53. Inet6RouteExcludeAddress badoption.Listable[netip.Prefix] `json:"inet6_route_exclude_address,omitempty"`
  54. // Deprecated: removed
  55. EndpointIndependentNat bool `json:"endpoint_independent_nat,omitempty"`
  56. }
  57. type FwMark uint32
  58. func (f FwMark) MarshalJSON() ([]byte, error) {
  59. return json.Marshal(F.ToString("0x", strconv.FormatUint(uint64(f), 16)))
  60. }
  61. func (f *FwMark) UnmarshalJSON(bytes []byte) error {
  62. var stringValue string
  63. err := json.Unmarshal(bytes, &stringValue)
  64. if err != nil {
  65. if rawErr := json.Unmarshal(bytes, (*uint32)(f)); rawErr == nil {
  66. return nil
  67. }
  68. return E.Cause(err, "invalid number or string mark")
  69. }
  70. intValue, err := strconv.ParseUint(stringValue, 0, 32)
  71. if err != nil {
  72. return err
  73. }
  74. *f = FwMark(intValue)
  75. return nil
  76. }