Browse Source

regenerate pb data

Shelikhoo 5 years ago
parent
commit
09b81b78c3
53 changed files with 13176 additions and 6577 deletions
  1. 133 60
      app/commander/config.pb.go
  2. 169 77
      app/dispatcher/config.pb.go
  3. 437 231
      app/dns/config.pb.go
  4. 223 100
      app/log/command/config.pb.go
  5. 203 98
      app/log/config.pb.go
  6. 580 323
      app/policy/config.pb.go
  7. 887 445
      app/proxyman/command/command.pb.go
  8. 821 438
      app/proxyman/config.pb.go
  9. 340 173
      app/reverse/config.pb.go
  10. 915 528
      app/router/config.pb.go
  11. 569 317
      app/stats/command/command.pb.go
  12. 111 45
      app/stats/config.pb.go
  13. 110 44
      common/log/log.pb.go
  14. 140 74
      common/net/address.pb.go
  15. 147 66
      common/net/destination.pb.go
  16. 168 73
      common/net/network.pb.go
  17. 176 85
      common/net/port.pb.go
  18. 176 80
      common/protocol/headers.pb.go
  19. 147 67
      common/protocol/server_spec.pb.go
  20. 138 63
      common/protocol/user.pb.go
  21. 126 57
      common/serial/typed_message.pb.go
  22. 312 156
      config.pb.go
  23. 4 4
      go.mod
  24. 50 0
      go.sum
  25. 216 104
      proxy/blackhole/config.pb.go
  26. 126 55
      proxy/dns/config.pb.go
  27. 182 92
      proxy/dokodemo/config.pb.go
  28. 253 123
      proxy/freedom/config.pb.go
  29. 266 142
      proxy/http/config.pb.go
  30. 218 105
      proxy/mtproto/config.pb.go
  31. 374 187
      proxy/shadowsocks/config.pb.go
  32. 324 168
      proxy/socks/config.pb.go
  33. 149 65
      proxy/vmess/account.pb.go
  34. 259 134
      proxy/vmess/inbound/config.pb.go
  35. 131 56
      proxy/vmess/outbound/config.pb.go
  36. 6 2
      testing/scenarios/common.go
  37. 129 54
      transport/config.pb.go
  38. 501 250
      transport/internet/config.pb.go
  39. 130 58
      transport/internet/domainsocket/config.pb.go
  40. 498 261
      transport/internet/headers/http/config.pb.go
  41. 160 71
      transport/internet/headers/noop/config.pb.go
  42. 160 86
      transport/internet/headers/srtp/config.pb.go
  43. 117 48
      transport/internet/headers/tls/config.pb.go
  44. 125 55
      transport/internet/headers/utp/config.pb.go
  45. 118 48
      transport/internet/headers/wechat/config.pb.go
  46. 119 48
      transport/internet/headers/wireguard/config.pb.go
  47. 128 58
      transport/internet/http/config.pb.go
  48. 548 296
      transport/internet/kcp/config.pb.go
  49. 149 68
      transport/internet/quic/config.pb.go
  50. 132 57
      transport/internet/tcp/config.pb.go
  51. 270 139
      transport/internet/tls/config.pb.go
  52. 114 46
      transport/internet/udp/config.pb.go
  53. 192 97
      transport/internet/websocket/config.pb.go

+ 133 - 60
app/commander/config.pb.go

@@ -1,95 +1,168 @@
 package commander
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Config is the settings for Commander.
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Tag of the outbound handler that handles grpc connections.
 	Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
 	// Services that supported by this server. All services must implement Service interface.
-	Service              []*serial.TypedMessage `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	Service []*serial.TypedMessage `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_4af9cfd3f0e2019e, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_commander_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_commander_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_commander_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *Config) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *Config) GetService() []*serial.TypedMessage {
-	if m != nil {
-		return m.Service
+func (x *Config) GetService() []*serial.TypedMessage {
+	if x != nil {
+		return x.Service
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.commander.Config")
+var File_v2ray_com_core_app_commander_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_commander_config_proto_rawDesc = []byte{
+	0x0a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x65, 0x72, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72,
+	0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x74, 0x61, 0x67, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e,
+	0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x46, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+	0x65, 0x72, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e,
+	0x41, 0x70, 0x70, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_app_commander_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_commander_config_proto_rawDescData = file_v2ray_com_core_app_commander_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_commander_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_commander_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_commander_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_commander_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_commander_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/commander/config.proto", fileDescriptor_4af9cfd3f0e2019e)
+var file_v2ray_com_core_app_commander_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_app_commander_config_proto_goTypes = []interface{}{
+	(*Config)(nil),              // 0: v2ray.core.app.commander.Config
+	(*serial.TypedMessage)(nil), // 1: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_app_commander_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.app.commander.Config.service:type_name -> v2ray.core.common.serial.TypedMessage
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_4af9cfd3f0e2019e = []byte{
-	// 212 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0x2c, 0x28, 0xd0, 0x4f,
-	0xce, 0xcf, 0xcd, 0x4d, 0xcc, 0x4b, 0x49, 0x2d, 0xd2, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7,
-	0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0x29, 0x2d, 0x4a, 0xd5, 0x4b, 0x2c, 0x28, 0xd0,
-	0x83, 0x2b, 0x93, 0x32, 0x40, 0x33, 0x04, 0x24, 0x93, 0x9f, 0xa7, 0x5f, 0x9c, 0x5a, 0x94, 0x99,
-	0x98, 0xa3, 0x5f, 0x52, 0x59, 0x90, 0x9a, 0x12, 0x9f, 0x9b, 0x5a, 0x5c, 0x9c, 0x98, 0x9e, 0x0a,
-	0x31, 0x4b, 0x29, 0x86, 0x8b, 0xcd, 0x19, 0x6c, 0xb6, 0x90, 0x00, 0x17, 0x73, 0x49, 0x62, 0xba,
-	0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x88, 0x29, 0xe4, 0xc0, 0xc5, 0x5e, 0x9c, 0x5a, 0x54,
-	0x96, 0x99, 0x9c, 0x2a, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, 0x6d, 0xa4, 0xa6, 0x87, 0x64, 0x33, 0xc4,
-	0x6c, 0x3d, 0x88, 0xd9, 0x7a, 0x21, 0x20, 0xb3, 0x7d, 0x21, 0x46, 0x07, 0xc1, 0xb4, 0x39, 0xb9,
-	0x71, 0xc9, 0x24, 0xe7, 0xe7, 0xea, 0xe1, 0x72, 0x6f, 0x00, 0x63, 0x14, 0x27, 0x9c, 0xb3, 0x8a,
-	0x49, 0x22, 0xcc, 0x28, 0x28, 0xb1, 0x52, 0xcf, 0x19, 0xa4, 0xce, 0xb1, 0xa0, 0x40, 0xcf, 0x19,
-	0x26, 0x95, 0xc4, 0x06, 0x76, 0xac, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x29, 0x02, 0xa6, 0x19,
-	0x25, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_app_commander_config_proto_init() }
+func file_v2ray_com_core_app_commander_config_proto_init() {
+	if File_v2ray_com_core_app_commander_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_commander_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_commander_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_commander_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_commander_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_app_commander_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_commander_config_proto = out.File
+	file_v2ray_com_core_app_commander_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_commander_config_proto_goTypes = nil
+	file_v2ray_com_core_app_commander_config_proto_depIdxs = nil
 }

+ 169 - 77
app/dispatcher/config.pb.go

@@ -1,112 +1,204 @@
 package dispatcher
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type SessionConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *SessionConfig) Reset()         { *m = SessionConfig{} }
-func (m *SessionConfig) String() string { return proto.CompactTextString(m) }
-func (*SessionConfig) ProtoMessage()    {}
-func (*SessionConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_90b7c41cce355532, []int{0}
+func (x *SessionConfig) Reset() {
+	*x = SessionConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_dispatcher_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *SessionConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SessionConfig.Unmarshal(m, b)
-}
-func (m *SessionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SessionConfig.Marshal(b, m, deterministic)
-}
-func (m *SessionConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SessionConfig.Merge(m, src)
-}
-func (m *SessionConfig) XXX_Size() int {
-	return xxx_messageInfo_SessionConfig.Size(m)
-}
-func (m *SessionConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SessionConfig.DiscardUnknown(m)
+func (x *SessionConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_SessionConfig proto.InternalMessageInfo
+func (*SessionConfig) ProtoMessage() {}
 
-type Config struct {
-	Settings             *SessionConfig `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
+func (x *SessionConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_dispatcher_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_90b7c41cce355532, []int{1}
+// Deprecated: Use SessionConfig.ProtoReflect.Descriptor instead.
+func (*SessionConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dispatcher_config_proto_rawDescGZIP(), []int{0}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Settings *SessionConfig `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"`
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_dispatcher_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_dispatcher_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dispatcher_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Config) GetSettings() *SessionConfig {
-	if m != nil {
-		return m.Settings
+func (x *Config) GetSettings() *SessionConfig {
+	if x != nil {
+		return x.Settings
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*SessionConfig)(nil), "v2ray.core.app.dispatcher.SessionConfig")
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.dispatcher.Config")
+var File_v2ray_com_core_app_dispatcher_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_dispatcher_config_proto_rawDesc = []byte{
+	0x0a, 0x2a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x69, 0x73,
+	0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x22, 0x15, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69,
+	0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x4e,
+	0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x69, 0x73, 0x70,
+	0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x49,
+	0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x50,
+	0x01, 0x5a, 0x0a, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0xaa, 0x02, 0x19,
+	0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x44,
+	0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/dispatcher/config.proto", fileDescriptor_90b7c41cce355532)
+var (
+	file_v2ray_com_core_app_dispatcher_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_dispatcher_config_proto_rawDescData = file_v2ray_com_core_app_dispatcher_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_dispatcher_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_dispatcher_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_dispatcher_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_dispatcher_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_dispatcher_config_proto_rawDescData
 }
 
-var fileDescriptor_90b7c41cce355532 = []byte{
-	// 176 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2a, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0x2c, 0x28, 0xd0, 0x4f,
-	0xc9, 0x2c, 0x2e, 0x48, 0x2c, 0x49, 0xce, 0x48, 0x2d, 0xd2, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c,
-	0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x84, 0xa9, 0x2d, 0x4a, 0xd5, 0x4b, 0x2c, 0x28,
-	0xd0, 0x43, 0xa8, 0x53, 0x12, 0xe5, 0xe2, 0x0d, 0x4e, 0x2d, 0x2e, 0xce, 0xcc, 0xcf, 0x73, 0x06,
-	0xeb, 0xf0, 0x62, 0xe1, 0x60, 0x14, 0x60, 0x52, 0xf2, 0xe3, 0x62, 0x83, 0xf0, 0x85, 0x5c, 0xb8,
-	0x38, 0x8a, 0x53, 0x4b, 0x4a, 0x32, 0xf3, 0xd2, 0x8b, 0x25, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d,
-	0x34, 0xf4, 0x70, 0x1a, 0xa7, 0x87, 0x62, 0x56, 0x10, 0x5c, 0xa7, 0x93, 0x27, 0x97, 0x6c, 0x72,
-	0x7e, 0x2e, 0x6e, 0x8d, 0x01, 0x8c, 0x51, 0x5c, 0x08, 0xde, 0x2a, 0x26, 0xc9, 0x30, 0xa3, 0xa0,
-	0xc4, 0x4a, 0x3d, 0x67, 0x90, 0x4a, 0xc7, 0x82, 0x02, 0x3d, 0x17, 0xb8, 0x5c, 0x12, 0x1b, 0xd8,
-	0x4f, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x47, 0xc5, 0xd6, 0x01, 0x01, 0x00, 0x00,
+var file_v2ray_com_core_app_dispatcher_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_v2ray_com_core_app_dispatcher_config_proto_goTypes = []interface{}{
+	(*SessionConfig)(nil), // 0: v2ray.core.app.dispatcher.SessionConfig
+	(*Config)(nil),        // 1: v2ray.core.app.dispatcher.Config
+}
+var file_v2ray_com_core_app_dispatcher_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.app.dispatcher.Config.settings:type_name -> v2ray.core.app.dispatcher.SessionConfig
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_dispatcher_config_proto_init() }
+func file_v2ray_com_core_app_dispatcher_config_proto_init() {
+	if File_v2ray_com_core_app_dispatcher_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_dispatcher_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SessionConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_dispatcher_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_dispatcher_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_dispatcher_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_dispatcher_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_app_dispatcher_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_dispatcher_config_proto = out.File
+	file_v2ray_com_core_app_dispatcher_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_dispatcher_config_proto_goTypes = nil
+	file_v2ray_com_core_app_dispatcher_config_proto_depIdxs = nil
 }

+ 437 - 231
app/dns/config.pb.go

@@ -1,23 +1,25 @@
 package dns
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	router "v2ray.com/core/app/router"
 	net "v2ray.com/core/common/net"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type DomainMatchingType int32
 
@@ -28,333 +30,537 @@ const (
 	DomainMatchingType_Regex     DomainMatchingType = 3
 )
 
-var DomainMatchingType_name = map[int32]string{
-	0: "Full",
-	1: "Subdomain",
-	2: "Keyword",
-	3: "Regex",
-}
+// Enum value maps for DomainMatchingType.
+var (
+	DomainMatchingType_name = map[int32]string{
+		0: "Full",
+		1: "Subdomain",
+		2: "Keyword",
+		3: "Regex",
+	}
+	DomainMatchingType_value = map[string]int32{
+		"Full":      0,
+		"Subdomain": 1,
+		"Keyword":   2,
+		"Regex":     3,
+	}
+)
 
-var DomainMatchingType_value = map[string]int32{
-	"Full":      0,
-	"Subdomain": 1,
-	"Keyword":   2,
-	"Regex":     3,
+func (x DomainMatchingType) Enum() *DomainMatchingType {
+	p := new(DomainMatchingType)
+	*p = x
+	return p
 }
 
 func (x DomainMatchingType) String() string {
-	return proto.EnumName(DomainMatchingType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (DomainMatchingType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_ed5695198e3def8f, []int{0}
+func (DomainMatchingType) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_dns_config_proto_enumTypes[0].Descriptor()
 }
 
-type NameServer struct {
-	Address              *net.Endpoint                `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
-	PrioritizedDomain    []*NameServer_PriorityDomain `protobuf:"bytes,2,rep,name=prioritized_domain,json=prioritizedDomain,proto3" json:"prioritized_domain,omitempty"`
-	Geoip                []*router.GeoIP              `protobuf:"bytes,3,rep,name=geoip,proto3" json:"geoip,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
-	XXX_unrecognized     []byte                       `json:"-"`
-	XXX_sizecache        int32                        `json:"-"`
+func (DomainMatchingType) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_dns_config_proto_enumTypes[0]
 }
 
-func (m *NameServer) Reset()         { *m = NameServer{} }
-func (m *NameServer) String() string { return proto.CompactTextString(m) }
-func (*NameServer) ProtoMessage()    {}
-func (*NameServer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ed5695198e3def8f, []int{0}
+func (x DomainMatchingType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *NameServer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NameServer.Unmarshal(m, b)
-}
-func (m *NameServer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NameServer.Marshal(b, m, deterministic)
-}
-func (m *NameServer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NameServer.Merge(m, src)
-}
-func (m *NameServer) XXX_Size() int {
-	return xxx_messageInfo_NameServer.Size(m)
-}
-func (m *NameServer) XXX_DiscardUnknown() {
-	xxx_messageInfo_NameServer.DiscardUnknown(m)
+// Deprecated: Use DomainMatchingType.Descriptor instead.
+func (DomainMatchingType) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dns_config_proto_rawDescGZIP(), []int{0}
 }
 
-var xxx_messageInfo_NameServer proto.InternalMessageInfo
+type NameServer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *NameServer) GetAddress() *net.Endpoint {
-	if m != nil {
-		return m.Address
-	}
-	return nil
+	Address           *net.Endpoint                `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	PrioritizedDomain []*NameServer_PriorityDomain `protobuf:"bytes,2,rep,name=prioritized_domain,json=prioritizedDomain,proto3" json:"prioritized_domain,omitempty"`
+	Geoip             []*router.GeoIP              `protobuf:"bytes,3,rep,name=geoip,proto3" json:"geoip,omitempty"`
 }
 
-func (m *NameServer) GetPrioritizedDomain() []*NameServer_PriorityDomain {
-	if m != nil {
-		return m.PrioritizedDomain
+func (x *NameServer) Reset() {
+	*x = NameServer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
 	}
-	return nil
 }
 
-func (m *NameServer) GetGeoip() []*router.GeoIP {
-	if m != nil {
-		return m.Geoip
-	}
-	return nil
+func (x *NameServer) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-type NameServer_PriorityDomain struct {
-	Type                 DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"`
-	Domain               string             `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
-}
+func (*NameServer) ProtoMessage() {}
 
-func (m *NameServer_PriorityDomain) Reset()         { *m = NameServer_PriorityDomain{} }
-func (m *NameServer_PriorityDomain) String() string { return proto.CompactTextString(m) }
-func (*NameServer_PriorityDomain) ProtoMessage()    {}
-func (*NameServer_PriorityDomain) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ed5695198e3def8f, []int{0, 0}
+func (x *NameServer) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *NameServer_PriorityDomain) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NameServer_PriorityDomain.Unmarshal(m, b)
-}
-func (m *NameServer_PriorityDomain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NameServer_PriorityDomain.Marshal(b, m, deterministic)
-}
-func (m *NameServer_PriorityDomain) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NameServer_PriorityDomain.Merge(m, src)
-}
-func (m *NameServer_PriorityDomain) XXX_Size() int {
-	return xxx_messageInfo_NameServer_PriorityDomain.Size(m)
-}
-func (m *NameServer_PriorityDomain) XXX_DiscardUnknown() {
-	xxx_messageInfo_NameServer_PriorityDomain.DiscardUnknown(m)
+// Deprecated: Use NameServer.ProtoReflect.Descriptor instead.
+func (*NameServer) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dns_config_proto_rawDescGZIP(), []int{0}
 }
 
-var xxx_messageInfo_NameServer_PriorityDomain proto.InternalMessageInfo
+func (x *NameServer) GetAddress() *net.Endpoint {
+	if x != nil {
+		return x.Address
+	}
+	return nil
+}
 
-func (m *NameServer_PriorityDomain) GetType() DomainMatchingType {
-	if m != nil {
-		return m.Type
+func (x *NameServer) GetPrioritizedDomain() []*NameServer_PriorityDomain {
+	if x != nil {
+		return x.PrioritizedDomain
 	}
-	return DomainMatchingType_Full
+	return nil
 }
 
-func (m *NameServer_PriorityDomain) GetDomain() string {
-	if m != nil {
-		return m.Domain
+func (x *NameServer) GetGeoip() []*router.GeoIP {
+	if x != nil {
+		return x.Geoip
 	}
-	return ""
+	return nil
 }
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Nameservers used by this DNS. Only traditional UDP servers are support at the moment.
 	// A special value 'localhost' as a domain address can be set to use DNS on local system.
-	NameServers []*net.Endpoint `protobuf:"bytes,1,rep,name=NameServers,proto3" json:"NameServers,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	NameServers []*net.Endpoint `protobuf:"bytes,1,rep,name=NameServers,proto3" json:"NameServers,omitempty"`
 	// NameServer list used by this DNS client.
 	NameServer []*NameServer `protobuf:"bytes,5,rep,name=name_server,json=nameServer,proto3" json:"name_server,omitempty"`
 	// Static hosts. Domain to IP.
 	// Deprecated. Use static_hosts.
-	Hosts map[string]*net.IPOrDomain `protobuf:"bytes,2,rep,name=Hosts,proto3" json:"Hosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	Hosts map[string]*net.IPOrDomain `protobuf:"bytes,2,rep,name=Hosts,proto3" json:"Hosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	// Client IP for EDNS client subnet. Must be 4 bytes (IPv4) or 16 bytes (IPv6).
 	ClientIp    []byte                `protobuf:"bytes,3,opt,name=client_ip,json=clientIp,proto3" json:"client_ip,omitempty"`
 	StaticHosts []*Config_HostMapping `protobuf:"bytes,4,rep,name=static_hosts,json=staticHosts,proto3" json:"static_hosts,omitempty"`
 	// Tag is the inbound tag of DNS client.
-	Tag                  string   `protobuf:"bytes,6,opt,name=tag,proto3" json:"tag,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Tag string `protobuf:"bytes,6,opt,name=tag,proto3" json:"tag,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ed5695198e3def8f, []int{1}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dns_config_proto_rawDescGZIP(), []int{1}
+}
 
 // Deprecated: Do not use.
-func (m *Config) GetNameServers() []*net.Endpoint {
-	if m != nil {
-		return m.NameServers
+func (x *Config) GetNameServers() []*net.Endpoint {
+	if x != nil {
+		return x.NameServers
 	}
 	return nil
 }
 
-func (m *Config) GetNameServer() []*NameServer {
-	if m != nil {
-		return m.NameServer
+func (x *Config) GetNameServer() []*NameServer {
+	if x != nil {
+		return x.NameServer
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *Config) GetHosts() map[string]*net.IPOrDomain {
-	if m != nil {
-		return m.Hosts
+func (x *Config) GetHosts() map[string]*net.IPOrDomain {
+	if x != nil {
+		return x.Hosts
 	}
 	return nil
 }
 
-func (m *Config) GetClientIp() []byte {
-	if m != nil {
-		return m.ClientIp
+func (x *Config) GetClientIp() []byte {
+	if x != nil {
+		return x.ClientIp
 	}
 	return nil
 }
 
-func (m *Config) GetStaticHosts() []*Config_HostMapping {
-	if m != nil {
-		return m.StaticHosts
+func (x *Config) GetStaticHosts() []*Config_HostMapping {
+	if x != nil {
+		return x.StaticHosts
 	}
 	return nil
 }
 
-func (m *Config) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *Config) GetTag() string {
+	if x != nil {
+		return x.Tag
+	}
+	return ""
+}
+
+type NameServer_PriorityDomain struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Type   DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"`
+	Domain string             `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
+}
+
+func (x *NameServer_PriorityDomain) Reset() {
+	*x = NameServer_PriorityDomain{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NameServer_PriorityDomain) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NameServer_PriorityDomain) ProtoMessage() {}
+
+func (x *NameServer_PriorityDomain) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use NameServer_PriorityDomain.ProtoReflect.Descriptor instead.
+func (*NameServer_PriorityDomain) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dns_config_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *NameServer_PriorityDomain) GetType() DomainMatchingType {
+	if x != nil {
+		return x.Type
+	}
+	return DomainMatchingType_Full
+}
+
+func (x *NameServer_PriorityDomain) GetDomain() string {
+	if x != nil {
+		return x.Domain
 	}
 	return ""
 }
 
 type Config_HostMapping struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	Type   DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"`
 	Domain string             `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
 	Ip     [][]byte           `protobuf:"bytes,3,rep,name=ip,proto3" json:"ip,omitempty"`
 	// ProxiedDomain indicates the mapped domain has the same IP address on this domain. V2Ray will use this domain for IP queries.
 	// This field is only effective if ip is empty.
-	ProxiedDomain        string   `protobuf:"bytes,4,opt,name=proxied_domain,json=proxiedDomain,proto3" json:"proxied_domain,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	ProxiedDomain string `protobuf:"bytes,4,opt,name=proxied_domain,json=proxiedDomain,proto3" json:"proxied_domain,omitempty"`
 }
 
-func (m *Config_HostMapping) Reset()         { *m = Config_HostMapping{} }
-func (m *Config_HostMapping) String() string { return proto.CompactTextString(m) }
-func (*Config_HostMapping) ProtoMessage()    {}
-func (*Config_HostMapping) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ed5695198e3def8f, []int{1, 1}
+func (x *Config_HostMapping) Reset() {
+	*x = Config_HostMapping{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config_HostMapping) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config_HostMapping.Unmarshal(m, b)
-}
-func (m *Config_HostMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config_HostMapping.Marshal(b, m, deterministic)
+func (x *Config_HostMapping) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config_HostMapping) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config_HostMapping.Merge(m, src)
-}
-func (m *Config_HostMapping) XXX_Size() int {
-	return xxx_messageInfo_Config_HostMapping.Size(m)
-}
-func (m *Config_HostMapping) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config_HostMapping.DiscardUnknown(m)
+
+func (*Config_HostMapping) ProtoMessage() {}
+
+func (x *Config_HostMapping) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_dns_config_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config_HostMapping proto.InternalMessageInfo
+// Deprecated: Use Config_HostMapping.ProtoReflect.Descriptor instead.
+func (*Config_HostMapping) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_dns_config_proto_rawDescGZIP(), []int{1, 1}
+}
 
-func (m *Config_HostMapping) GetType() DomainMatchingType {
-	if m != nil {
-		return m.Type
+func (x *Config_HostMapping) GetType() DomainMatchingType {
+	if x != nil {
+		return x.Type
 	}
 	return DomainMatchingType_Full
 }
 
-func (m *Config_HostMapping) GetDomain() string {
-	if m != nil {
-		return m.Domain
+func (x *Config_HostMapping) GetDomain() string {
+	if x != nil {
+		return x.Domain
 	}
 	return ""
 }
 
-func (m *Config_HostMapping) GetIp() [][]byte {
-	if m != nil {
-		return m.Ip
+func (x *Config_HostMapping) GetIp() [][]byte {
+	if x != nil {
+		return x.Ip
 	}
 	return nil
 }
 
-func (m *Config_HostMapping) GetProxiedDomain() string {
-	if m != nil {
-		return m.ProxiedDomain
+func (x *Config_HostMapping) GetProxiedDomain() string {
+	if x != nil {
+		return x.ProxiedDomain
 	}
 	return ""
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.app.dns.DomainMatchingType", DomainMatchingType_name, DomainMatchingType_value)
-	proto.RegisterType((*NameServer)(nil), "v2ray.core.app.dns.NameServer")
-	proto.RegisterType((*NameServer_PriorityDomain)(nil), "v2ray.core.app.dns.NameServer.PriorityDomain")
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.dns.Config")
-	proto.RegisterMapType((map[string]*net.IPOrDomain)(nil), "v2ray.core.app.dns.Config.HostsEntry")
-	proto.RegisterType((*Config_HostMapping)(nil), "v2ray.core.app.dns.Config.HostMapping")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/dns/config.proto", fileDescriptor_ed5695198e3def8f)
-}
-
-var fileDescriptor_ed5695198e3def8f = []byte{
-	// 583 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x54, 0xdf, 0x6e, 0xd3, 0x3e,
-	0x18, 0xfd, 0x25, 0xfd, 0xb3, 0xf5, 0xcb, 0x56, 0xf5, 0xe7, 0x8b, 0x29, 0x2a, 0x08, 0xc6, 0xd0,
-	0x46, 0x05, 0xc2, 0x91, 0x02, 0x12, 0xb0, 0x9b, 0x89, 0x6d, 0x05, 0x2a, 0x34, 0xa8, 0x3c, 0xc4,
-	0x05, 0x20, 0x55, 0x5e, 0x62, 0x32, 0x8b, 0xc6, 0xb6, 0x1c, 0x77, 0x2c, 0x3c, 0x09, 0xcf, 0xc0,
-	0x4b, 0x70, 0xc1, 0x8b, 0xa1, 0xda, 0x19, 0xed, 0xb6, 0x0e, 0xb8, 0xe1, 0xce, 0x7f, 0xce, 0xf9,
-	0xce, 0xf9, 0x8e, 0xbf, 0x04, 0x6e, 0x9f, 0xc4, 0x9a, 0x96, 0x38, 0x91, 0x79, 0x94, 0x48, 0xcd,
-	0x22, 0xaa, 0x54, 0x94, 0x8a, 0x22, 0x4a, 0xa4, 0xf8, 0xc8, 0x33, 0xac, 0xb4, 0x34, 0x12, 0xa1,
-	0x33, 0x90, 0x66, 0x98, 0x2a, 0x85, 0x53, 0x51, 0x74, 0xef, 0x5c, 0x20, 0x26, 0x32, 0xcf, 0xa5,
-	0x88, 0x04, 0x33, 0x11, 0x4d, 0x53, 0xcd, 0x8a, 0xc2, 0x91, 0xbb, 0xf7, 0xae, 0x06, 0xa6, 0xac,
-	0x30, 0x5c, 0x50, 0xc3, 0xa5, 0xa8, 0xc0, 0x5b, 0x0b, 0xec, 0x68, 0x39, 0x31, 0x4c, 0x9f, 0x73,
-	0xb4, 0xf1, 0xdd, 0x07, 0x78, 0x45, 0x73, 0x76, 0xc8, 0xf4, 0x09, 0xd3, 0xe8, 0x09, 0x2c, 0x55,
-	0xa2, 0xa1, 0xb7, 0xee, 0xf5, 0x82, 0xf8, 0x26, 0x9e, 0xb3, 0xec, 0x14, 0xb1, 0x60, 0x06, 0xf7,
-	0x45, 0xaa, 0x24, 0x17, 0x86, 0x9c, 0xe1, 0xd1, 0x07, 0x40, 0x4a, 0x73, 0xa9, 0xb9, 0xe1, 0x5f,
-	0x58, 0x3a, 0x4a, 0x65, 0x4e, 0xb9, 0x08, 0xfd, 0xf5, 0x5a, 0x2f, 0x88, 0xef, 0xe3, 0xcb, 0x8d,
-	0xe3, 0x99, 0x2c, 0x1e, 0x3a, 0x62, 0xb9, 0x6f, 0x49, 0xe4, 0xff, 0xb9, 0x42, 0xee, 0x08, 0xc5,
-	0xd0, 0xc8, 0x98, 0xe4, 0x2a, 0xac, 0xd9, 0x82, 0xd7, 0x2f, 0x16, 0x74, 0xbd, 0xe1, 0xe7, 0x4c,
-	0x0e, 0x86, 0xc4, 0x41, 0xbb, 0x29, 0xb4, 0xcf, 0x17, 0x46, 0xdb, 0x50, 0x37, 0xa5, 0x62, 0xb6,
-	0xb7, 0x76, 0xbc, 0xb5, 0xc8, 0x95, 0x43, 0x1e, 0x50, 0x93, 0x1c, 0x73, 0x91, 0xbd, 0x29, 0x15,
-	0x23, 0x96, 0x83, 0xd6, 0xa0, 0xf9, 0xab, 0x27, 0xaf, 0xd7, 0x22, 0xd5, 0x6e, 0xe3, 0x47, 0x1d,
-	0x9a, 0x7b, 0x36, 0x52, 0xd4, 0x87, 0x60, 0xd6, 0xd4, 0x34, 0xc1, 0xda, 0x5f, 0x24, 0xb8, 0xeb,
-	0x87, 0x1e, 0x99, 0xe7, 0xa1, 0x1d, 0x08, 0x04, 0xcd, 0xd9, 0xa8, 0xb0, 0xfb, 0xb0, 0x61, 0xcb,
-	0xdc, 0xf8, 0x7d, 0x84, 0x04, 0xc4, 0xec, 0x15, 0x77, 0xa0, 0xf1, 0x42, 0x16, 0xa6, 0xa8, 0xd2,
-	0xdf, 0x5c, 0x44, 0x75, 0x96, 0xb1, 0xc5, 0xf5, 0x85, 0xd1, 0xa5, 0xf5, 0xe1, 0x78, 0xe8, 0x1a,
-	0xb4, 0x92, 0x31, 0x67, 0xc2, 0x8c, 0x6c, 0xe2, 0x5e, 0x6f, 0x85, 0x2c, 0xbb, 0x83, 0x81, 0x42,
-	0x03, 0x58, 0x29, 0x0c, 0x35, 0x3c, 0x19, 0x1d, 0x5b, 0x91, 0xba, 0x15, 0xd9, 0xfa, 0x83, 0xc8,
-	0x01, 0x55, 0x8a, 0x8b, 0x8c, 0x04, 0x8e, 0xeb, 0x74, 0x3a, 0x50, 0x33, 0x34, 0x0b, 0x9b, 0x36,
-	0xd0, 0xe9, 0xb2, 0xfb, 0x1e, 0x60, 0x66, 0x69, 0x7a, 0xff, 0x89, 0x95, 0xf6, 0xb9, 0x5a, 0x64,
-	0xba, 0x44, 0x8f, 0xa0, 0x71, 0x42, 0xc7, 0x13, 0x66, 0x1f, 0x21, 0x88, 0x6f, 0x5d, 0x11, 0xee,
-	0x60, 0xf8, 0x5a, 0x57, 0xc3, 0xe4, 0xf0, 0xdb, 0xfe, 0x63, 0xaf, 0xfb, 0xd5, 0x83, 0x60, 0xce,
-	0xcb, 0xbf, 0x18, 0x07, 0xd4, 0x06, 0xbf, 0x9a, 0xd2, 0x15, 0xe2, 0x73, 0x85, 0x36, 0xa1, 0xad,
-	0xb4, 0x3c, 0xe5, 0xb3, 0x4f, 0xa2, 0x6e, 0xf1, 0xab, 0xd5, 0xa9, 0x13, 0xb8, 0xdb, 0x07, 0x74,
-	0x59, 0x0a, 0x2d, 0x43, 0xfd, 0xd9, 0x64, 0x3c, 0xee, 0xfc, 0x87, 0x56, 0xa1, 0x75, 0x38, 0x39,
-	0x72, 0x15, 0x3a, 0x1e, 0x0a, 0x60, 0xe9, 0x25, 0x2b, 0x3f, 0x4b, 0x9d, 0x76, 0x7c, 0xd4, 0x82,
-	0x06, 0x61, 0x19, 0x3b, 0xed, 0xd4, 0x76, 0x1f, 0xc2, 0x5a, 0x22, 0xf3, 0x05, 0x8d, 0x0c, 0xbd,
-	0x77, 0xb5, 0x54, 0x14, 0xdf, 0x7c, 0xf4, 0x36, 0x26, 0xb4, 0xc4, 0x7b, 0xd3, 0xbb, 0xa7, 0x4a,
-	0xe1, 0x7d, 0x51, 0x1c, 0x35, 0xed, 0xbf, 0xe0, 0xc1, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c,
-	0x2a, 0x66, 0x8a, 0xc4, 0x04, 0x00, 0x00,
+var File_v2ray_com_core_app_dns_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_dns_config_proto_rawDesc = []byte{
+	0x0a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x1a, 0x2b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f,
+	0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65,
+	0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+	0x26, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f,
+	0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x02, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65,
+	0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e,
+	0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x12, 0x5c, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x64,
+	0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64,
+	0x6e, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72,
+	0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x11, 0x70, 0x72,
+	0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12,
+	0x32, 0x0a, 0x05, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e,
+	0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x05, 0x67, 0x65,
+	0x6f, 0x69, 0x70, 0x1a, 0x64, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x44,
+	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d,
+	0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xc3, 0x04, 0x0a, 0x06, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65,
+	0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b,
+	0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x6e,
+	0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70,
+	0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x05,
+	0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73,
+	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1b, 0x0a,
+	0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x49, 0x0a, 0x0c, 0x73, 0x74,
+	0x61, 0x74, 0x69, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70,
+	0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x6f, 0x73,
+	0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63,
+	0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x1a, 0x5b, 0x0a, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49,
+	0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x3a, 0x02, 0x38, 0x01, 0x1a, 0x98, 0x01, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x61, 0x70,
+	0x70, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x61,
+	0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,
+	0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x03,
+	0x20, 0x03, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78,
+	0x69, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2a,
+	0x45, 0x0a, 0x12, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e,
+	0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x00, 0x12,
+	0x0d, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x10, 0x01, 0x12, 0x0b,
+	0x0a, 0x07, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x52,
+	0x65, 0x67, 0x65, 0x78, 0x10, 0x03, 0x42, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73,
+	0x50, 0x01, 0x5a, 0x03, 0x64, 0x6e, 0x73, 0xaa, 0x02, 0x12, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e,
+	0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_app_dns_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_dns_config_proto_rawDescData = file_v2ray_com_core_app_dns_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_dns_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_dns_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_dns_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_dns_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_dns_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_app_dns_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_app_dns_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_v2ray_com_core_app_dns_config_proto_goTypes = []interface{}{
+	(DomainMatchingType)(0),           // 0: v2ray.core.app.dns.DomainMatchingType
+	(*NameServer)(nil),                // 1: v2ray.core.app.dns.NameServer
+	(*Config)(nil),                    // 2: v2ray.core.app.dns.Config
+	(*NameServer_PriorityDomain)(nil), // 3: v2ray.core.app.dns.NameServer.PriorityDomain
+	nil,                               // 4: v2ray.core.app.dns.Config.HostsEntry
+	(*Config_HostMapping)(nil),        // 5: v2ray.core.app.dns.Config.HostMapping
+	(*net.Endpoint)(nil),              // 6: v2ray.core.common.net.Endpoint
+	(*router.GeoIP)(nil),              // 7: v2ray.core.app.router.GeoIP
+	(*net.IPOrDomain)(nil),            // 8: v2ray.core.common.net.IPOrDomain
+}
+var file_v2ray_com_core_app_dns_config_proto_depIdxs = []int32{
+	6,  // 0: v2ray.core.app.dns.NameServer.address:type_name -> v2ray.core.common.net.Endpoint
+	3,  // 1: v2ray.core.app.dns.NameServer.prioritized_domain:type_name -> v2ray.core.app.dns.NameServer.PriorityDomain
+	7,  // 2: v2ray.core.app.dns.NameServer.geoip:type_name -> v2ray.core.app.router.GeoIP
+	6,  // 3: v2ray.core.app.dns.Config.NameServers:type_name -> v2ray.core.common.net.Endpoint
+	1,  // 4: v2ray.core.app.dns.Config.name_server:type_name -> v2ray.core.app.dns.NameServer
+	4,  // 5: v2ray.core.app.dns.Config.Hosts:type_name -> v2ray.core.app.dns.Config.HostsEntry
+	5,  // 6: v2ray.core.app.dns.Config.static_hosts:type_name -> v2ray.core.app.dns.Config.HostMapping
+	0,  // 7: v2ray.core.app.dns.NameServer.PriorityDomain.type:type_name -> v2ray.core.app.dns.DomainMatchingType
+	8,  // 8: v2ray.core.app.dns.Config.HostsEntry.value:type_name -> v2ray.core.common.net.IPOrDomain
+	0,  // 9: v2ray.core.app.dns.Config.HostMapping.type:type_name -> v2ray.core.app.dns.DomainMatchingType
+	10, // [10:10] is the sub-list for method output_type
+	10, // [10:10] is the sub-list for method input_type
+	10, // [10:10] is the sub-list for extension type_name
+	10, // [10:10] is the sub-list for extension extendee
+	0,  // [0:10] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_dns_config_proto_init() }
+func file_v2ray_com_core_app_dns_config_proto_init() {
+	if File_v2ray_com_core_app_dns_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_dns_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NameServer); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_dns_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_dns_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NameServer_PriorityDomain); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_dns_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config_HostMapping); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_dns_config_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   5,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_dns_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_dns_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_app_dns_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_app_dns_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_dns_config_proto = out.File
+	file_v2ray_com_core_app_dns_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_dns_config_proto_goTypes = nil
+	file_v2ray_com_core_app_dns_config_proto_depIdxs = nil
 }

+ 223 - 100
app/log/command/config.pb.go

@@ -2,151 +2,266 @@ package command
 
 import (
 	context "context"
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
 	grpc "google.golang.org/grpc"
-	math "math"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_46d95b63a682e4a6, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_log_command_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_log_command_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_log_command_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+type RestartLoggerRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *RestartLoggerRequest) Reset() {
+	*x = RestartLoggerRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_log_command_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (x *RestartLoggerRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+func (*RestartLoggerRequest) ProtoMessage() {}
 
-type RestartLoggerRequest struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (x *RestartLoggerRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_log_command_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *RestartLoggerRequest) Reset()         { *m = RestartLoggerRequest{} }
-func (m *RestartLoggerRequest) String() string { return proto.CompactTextString(m) }
-func (*RestartLoggerRequest) ProtoMessage()    {}
+// Deprecated: Use RestartLoggerRequest.ProtoReflect.Descriptor instead.
 func (*RestartLoggerRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_46d95b63a682e4a6, []int{1}
+	return file_v2ray_com_core_app_log_command_config_proto_rawDescGZIP(), []int{1}
 }
 
-func (m *RestartLoggerRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RestartLoggerRequest.Unmarshal(m, b)
-}
-func (m *RestartLoggerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RestartLoggerRequest.Marshal(b, m, deterministic)
-}
-func (m *RestartLoggerRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RestartLoggerRequest.Merge(m, src)
+type RestartLoggerResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
-func (m *RestartLoggerRequest) XXX_Size() int {
-	return xxx_messageInfo_RestartLoggerRequest.Size(m)
+
+func (x *RestartLoggerResponse) Reset() {
+	*x = RestartLoggerResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_log_command_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *RestartLoggerRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_RestartLoggerRequest.DiscardUnknown(m)
+
+func (x *RestartLoggerResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_RestartLoggerRequest proto.InternalMessageInfo
+func (*RestartLoggerResponse) ProtoMessage() {}
 
-type RestartLoggerResponse struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (x *RestartLoggerResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_log_command_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *RestartLoggerResponse) Reset()         { *m = RestartLoggerResponse{} }
-func (m *RestartLoggerResponse) String() string { return proto.CompactTextString(m) }
-func (*RestartLoggerResponse) ProtoMessage()    {}
+// Deprecated: Use RestartLoggerResponse.ProtoReflect.Descriptor instead.
 func (*RestartLoggerResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_46d95b63a682e4a6, []int{2}
+	return file_v2ray_com_core_app_log_command_config_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *RestartLoggerResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RestartLoggerResponse.Unmarshal(m, b)
-}
-func (m *RestartLoggerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RestartLoggerResponse.Marshal(b, m, deterministic)
-}
-func (m *RestartLoggerResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RestartLoggerResponse.Merge(m, src)
-}
-func (m *RestartLoggerResponse) XXX_Size() int {
-	return xxx_messageInfo_RestartLoggerResponse.Size(m)
-}
-func (m *RestartLoggerResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_RestartLoggerResponse.DiscardUnknown(m)
+var File_v2ray_com_core_app_log_command_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_log_command_config_proto_rawDesc = []byte{
+	0x0a, 0x2b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f,
+	0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f,
+	0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x52,
+	0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x32, 0x87, 0x01, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72,
+	0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d,
+	0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f,
+	0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x48,
+	0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+	0x50, 0x01, 0x5a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1a, 0x56, 0x32,
+	0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x4c, 0x6f, 0x67,
+	0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_RestartLoggerResponse proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_app_log_command_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_log_command_config_proto_rawDescData = file_v2ray_com_core_app_log_command_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.log.command.Config")
-	proto.RegisterType((*RestartLoggerRequest)(nil), "v2ray.core.app.log.command.RestartLoggerRequest")
-	proto.RegisterType((*RestartLoggerResponse)(nil), "v2ray.core.app.log.command.RestartLoggerResponse")
+func file_v2ray_com_core_app_log_command_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_log_command_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_log_command_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_log_command_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_log_command_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/log/command/config.proto", fileDescriptor_46d95b63a682e4a6)
+var file_v2ray_com_core_app_log_command_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_v2ray_com_core_app_log_command_config_proto_goTypes = []interface{}{
+	(*Config)(nil),                // 0: v2ray.core.app.log.command.Config
+	(*RestartLoggerRequest)(nil),  // 1: v2ray.core.app.log.command.RestartLoggerRequest
+	(*RestartLoggerResponse)(nil), // 2: v2ray.core.app.log.command.RestartLoggerResponse
+}
+var file_v2ray_com_core_app_log_command_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.app.log.command.LoggerService.RestartLogger:input_type -> v2ray.core.app.log.command.RestartLoggerRequest
+	2, // 1: v2ray.core.app.log.command.LoggerService.RestartLogger:output_type -> v2ray.core.app.log.command.RestartLoggerResponse
+	1, // [1:2] is the sub-list for method output_type
+	0, // [0:1] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_46d95b63a682e4a6 = []byte{
-	// 210 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2e, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0x2c, 0x28, 0xd0, 0xcf,
-	0xc9, 0x4f, 0xd7, 0x4f, 0xce, 0xcf, 0xcd, 0x4d, 0xcc, 0x4b, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb,
-	0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x82, 0x29, 0x2e, 0x4a, 0xd5, 0x4b, 0x2c,
-	0x28, 0xd0, 0xcb, 0xc9, 0x4f, 0xd7, 0x83, 0x2a, 0x54, 0xe2, 0xe0, 0x62, 0x73, 0x06, 0xab, 0x55,
-	0x12, 0xe3, 0x12, 0x09, 0x4a, 0x2d, 0x2e, 0x49, 0x2c, 0x2a, 0xf1, 0xc9, 0x4f, 0x4f, 0x4f, 0x2d,
-	0x0a, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x51, 0x12, 0xe7, 0x12, 0x45, 0x13, 0x2f, 0x2e, 0xc8,
-	0xcf, 0x2b, 0x4e, 0x35, 0x6a, 0x67, 0xe4, 0xe2, 0x85, 0x08, 0x05, 0xa7, 0x16, 0x95, 0x65, 0x26,
-	0xa7, 0x0a, 0x95, 0x71, 0xf1, 0xa2, 0x28, 0x15, 0x32, 0xd0, 0xc3, 0x6d, 0xb5, 0x1e, 0x36, 0xdb,
-	0xa4, 0x0c, 0x49, 0xd0, 0x01, 0x71, 0x87, 0x12, 0x83, 0x93, 0x07, 0x97, 0x5c, 0x72, 0x7e, 0x2e,
-	0x1e, 0x9d, 0x01, 0x8c, 0x51, 0xec, 0x50, 0xe6, 0x2a, 0x26, 0xa9, 0x30, 0xa3, 0xa0, 0xc4, 0x4a,
-	0x3d, 0x67, 0x90, 0x3a, 0xc7, 0x82, 0x02, 0x3d, 0x9f, 0xfc, 0x74, 0x3d, 0x67, 0x88, 0x64, 0x12,
-	0x1b, 0x38, 0xc4, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x37, 0xc7, 0xfc, 0xda, 0x60, 0x01,
-	0x00, 0x00,
+func init() { file_v2ray_com_core_app_log_command_config_proto_init() }
+func file_v2ray_com_core_app_log_command_config_proto_init() {
+	if File_v2ray_com_core_app_log_command_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_log_command_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_log_command_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestartLoggerRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_log_command_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestartLoggerResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_log_command_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_v2ray_com_core_app_log_command_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_log_command_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_app_log_command_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_log_command_config_proto = out.File
+	file_v2ray_com_core_app_log_command_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_log_command_config_proto_goTypes = nil
+	file_v2ray_com_core_app_log_command_config_proto_depIdxs = nil
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ context.Context
-var _ grpc.ClientConn
+var _ grpc.ClientConnInterface
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
+const _ = grpc.SupportPackageIsVersion6
 
 // LoggerServiceClient is the client API for LoggerService service.
 //
@@ -156,10 +271,10 @@ type LoggerServiceClient interface {
 }
 
 type loggerServiceClient struct {
-	cc *grpc.ClientConn
+	cc grpc.ClientConnInterface
 }
 
-func NewLoggerServiceClient(cc *grpc.ClientConn) LoggerServiceClient {
+func NewLoggerServiceClient(cc grpc.ClientConnInterface) LoggerServiceClient {
 	return &loggerServiceClient{cc}
 }
 
@@ -177,6 +292,14 @@ type LoggerServiceServer interface {
 	RestartLogger(context.Context, *RestartLoggerRequest) (*RestartLoggerResponse, error)
 }
 
+// UnimplementedLoggerServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLoggerServiceServer struct {
+}
+
+func (*UnimplementedLoggerServiceServer) RestartLogger(context.Context, *RestartLoggerRequest) (*RestartLoggerResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RestartLogger not implemented")
+}
+
 func RegisterLoggerServiceServer(s *grpc.Server, srv LoggerServiceServer) {
 	s.RegisterService(&_LoggerService_serviceDesc, srv)
 }

+ 203 - 98
app/log/config.pb.go

@@ -1,22 +1,24 @@
 package log
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	log "v2ray.com/core/common/log"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type LogType int32
 
@@ -27,128 +29,231 @@ const (
 	LogType_Event   LogType = 3
 )
 
-var LogType_name = map[int32]string{
-	0: "None",
-	1: "Console",
-	2: "File",
-	3: "Event",
-}
+// Enum value maps for LogType.
+var (
+	LogType_name = map[int32]string{
+		0: "None",
+		1: "Console",
+		2: "File",
+		3: "Event",
+	}
+	LogType_value = map[string]int32{
+		"None":    0,
+		"Console": 1,
+		"File":    2,
+		"Event":   3,
+	}
+)
 
-var LogType_value = map[string]int32{
-	"None":    0,
-	"Console": 1,
-	"File":    2,
-	"Event":   3,
+func (x LogType) Enum() *LogType {
+	p := new(LogType)
+	*p = x
+	return p
 }
 
 func (x LogType) String() string {
-	return proto.EnumName(LogType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (LogType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_92dfeade43d9e989, []int{0}
+func (LogType) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_log_config_proto_enumTypes[0].Descriptor()
 }
 
-type Config struct {
-	ErrorLogType         LogType      `protobuf:"varint,1,opt,name=error_log_type,json=errorLogType,proto3,enum=v2ray.core.app.log.LogType" json:"error_log_type,omitempty"`
-	ErrorLogLevel        log.Severity `protobuf:"varint,2,opt,name=error_log_level,json=errorLogLevel,proto3,enum=v2ray.core.common.log.Severity" json:"error_log_level,omitempty"`
-	ErrorLogPath         string       `protobuf:"bytes,3,opt,name=error_log_path,json=errorLogPath,proto3" json:"error_log_path,omitempty"`
-	AccessLogType        LogType      `protobuf:"varint,4,opt,name=access_log_type,json=accessLogType,proto3,enum=v2ray.core.app.log.LogType" json:"access_log_type,omitempty"`
-	AccessLogPath        string       `protobuf:"bytes,5,opt,name=access_log_path,json=accessLogPath,proto3" json:"access_log_path,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_92dfeade43d9e989, []int{0}
+func (LogType) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_log_config_proto_enumTypes[0]
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+func (x LogType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+
+// Deprecated: Use LogType.Descriptor instead.
+func (LogType) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_log_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorLogType  LogType      `protobuf:"varint,1,opt,name=error_log_type,json=errorLogType,proto3,enum=v2ray.core.app.log.LogType" json:"error_log_type,omitempty"`
+	ErrorLogLevel log.Severity `protobuf:"varint,2,opt,name=error_log_level,json=errorLogLevel,proto3,enum=v2ray.core.common.log.Severity" json:"error_log_level,omitempty"`
+	ErrorLogPath  string       `protobuf:"bytes,3,opt,name=error_log_path,json=errorLogPath,proto3" json:"error_log_path,omitempty"`
+	AccessLogType LogType      `protobuf:"varint,4,opt,name=access_log_type,json=accessLogType,proto3,enum=v2ray.core.app.log.LogType" json:"access_log_type,omitempty"`
+	AccessLogPath string       `protobuf:"bytes,5,opt,name=access_log_path,json=accessLogPath,proto3" json:"access_log_path,omitempty"`
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_log_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+func (*Config) ProtoMessage() {}
 
-func (m *Config) GetErrorLogType() LogType {
-	if m != nil {
-		return m.ErrorLogType
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_log_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_log_config_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Config) GetErrorLogType() LogType {
+	if x != nil {
+		return x.ErrorLogType
 	}
 	return LogType_None
 }
 
-func (m *Config) GetErrorLogLevel() log.Severity {
-	if m != nil {
-		return m.ErrorLogLevel
+func (x *Config) GetErrorLogLevel() log.Severity {
+	if x != nil {
+		return x.ErrorLogLevel
 	}
 	return log.Severity_Unknown
 }
 
-func (m *Config) GetErrorLogPath() string {
-	if m != nil {
-		return m.ErrorLogPath
+func (x *Config) GetErrorLogPath() string {
+	if x != nil {
+		return x.ErrorLogPath
 	}
 	return ""
 }
 
-func (m *Config) GetAccessLogType() LogType {
-	if m != nil {
-		return m.AccessLogType
+func (x *Config) GetAccessLogType() LogType {
+	if x != nil {
+		return x.AccessLogType
 	}
 	return LogType_None
 }
 
-func (m *Config) GetAccessLogPath() string {
-	if m != nil {
-		return m.AccessLogPath
+func (x *Config) GetAccessLogPath() string {
+	if x != nil {
+		return x.AccessLogPath
 	}
 	return ""
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.app.log.LogType", LogType_name, LogType_value)
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.log.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/log/config.proto", fileDescriptor_92dfeade43d9e989)
-}
-
-var fileDescriptor_92dfeade43d9e989 = []byte{
-	// 306 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcd, 0x4a, 0xfb, 0x40,
-	0x14, 0x47, 0xff, 0x49, 0xbf, 0xfe, 0x1d, 0x6d, 0x1b, 0x66, 0x21, 0x45, 0x17, 0x16, 0x15, 0x29,
-	0x2e, 0x26, 0x50, 0xf5, 0x01, 0x6a, 0x50, 0x37, 0x45, 0x4a, 0x14, 0x17, 0x6e, 0xca, 0x38, 0x5c,
-	0xa7, 0x81, 0x49, 0xee, 0x30, 0x19, 0x02, 0x79, 0x22, 0xc1, 0xa7, 0x94, 0x4c, 0x1b, 0x52, 0x3f,
-	0xc0, 0x65, 0x92, 0x7b, 0xce, 0xef, 0x40, 0xc8, 0x69, 0x31, 0x33, 0xbc, 0x64, 0x02, 0xd3, 0x50,
-	0xa0, 0x81, 0x90, 0x6b, 0x1d, 0x2a, 0x94, 0xa1, 0xc0, 0xec, 0x2d, 0x91, 0x4c, 0x1b, 0xb4, 0x48,
-	0x69, 0x7d, 0x64, 0x80, 0x71, 0xad, 0x99, 0x42, 0x79, 0xf8, 0x1d, 0x14, 0x98, 0xa6, 0x98, 0x39,
-	0x56, 0xe1, 0x16, 0x3c, 0x79, 0xf7, 0x49, 0x37, 0x72, 0x26, 0x3a, 0x27, 0x43, 0x30, 0x06, 0xcd,
-	0x4a, 0xa1, 0x5c, 0xd9, 0x52, 0xc3, 0xd8, 0x9b, 0x78, 0xd3, 0xe1, 0xec, 0x88, 0xfd, 0x94, 0xb3,
-	0x05, 0xca, 0xa7, 0x52, 0x43, 0xbc, 0xef, 0x90, 0xed, 0x13, 0xbd, 0x27, 0xa3, 0x46, 0xa1, 0xa0,
-	0x00, 0x35, 0xf6, 0x9d, 0xe3, 0x78, 0xd7, 0xb1, 0x09, 0x71, 0x9a, 0x47, 0x28, 0xc0, 0x24, 0xb6,
-	0x8c, 0x07, 0xb5, 0x67, 0x51, 0x51, 0xf4, 0x6c, 0xb7, 0x45, 0x73, 0xbb, 0x1e, 0xb7, 0x26, 0xde,
-	0xb4, 0xdf, 0xcc, 0x2d, 0xb9, 0x5d, 0xd3, 0x88, 0x8c, 0xb8, 0x10, 0x90, 0xe7, 0x4d, 0x72, 0xfb,
-	0xef, 0xe4, 0xc1, 0x86, 0xa9, 0x9b, 0xcf, 0xbf, 0x48, 0xdc, 0x56, 0xc7, 0x6d, 0x35, 0x77, 0xd5,
-	0xd8, 0xc5, 0x35, 0xe9, 0xd5, 0xc8, 0x7f, 0xd2, 0x7e, 0xc0, 0x0c, 0x82, 0x7f, 0x74, 0x8f, 0xf4,
-	0x22, 0xcc, 0x72, 0x54, 0x10, 0x78, 0xd5, 0xeb, 0xbb, 0x44, 0x41, 0xe0, 0xd3, 0x3e, 0xe9, 0xdc,
-	0x16, 0x90, 0xd9, 0xa0, 0x75, 0x73, 0x45, 0x0e, 0x04, 0xa6, 0xbf, 0xf4, 0x2c, 0xbd, 0x97, 0x96,
-	0x42, 0xf9, 0xe1, 0xd3, 0xe7, 0x59, 0xcc, 0x4b, 0x16, 0x55, 0xdf, 0xe6, 0x5a, 0x57, 0x9d, 0xaf,
-	0x5d, 0xf7, 0x77, 0x2e, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x33, 0xd5, 0x99, 0x3f, 0xfd, 0x01,
-	0x00, 0x00,
+var File_v2ray_com_core_app_log_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_log_config_proto_rawDesc = []byte{
+	0x0a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x1a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7,
+	0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x47, 0x0a, 0x0f,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x53, 0x65,
+	0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67,
+	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c,
+	0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65,
+	0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x43, 0x0a, 0x0f, 0x61,
+	0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70,
+	0x65, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65,
+	0x12, 0x26, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70,
+	0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73,
+	0x73, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x2a, 0x35, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54,
+	0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a,
+	0x07, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x69,
+	0x6c, 0x65, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x10, 0x03, 0x42,
+	0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x50, 0x01, 0x5a, 0x03, 0x6c, 0x6f, 0x67,
+	0xaa, 0x02, 0x12, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70,
+	0x70, 0x2e, 0x4c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_app_log_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_log_config_proto_rawDescData = file_v2ray_com_core_app_log_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_log_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_log_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_log_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_log_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_log_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_app_log_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_app_log_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_app_log_config_proto_goTypes = []interface{}{
+	(LogType)(0),      // 0: v2ray.core.app.log.LogType
+	(*Config)(nil),    // 1: v2ray.core.app.log.Config
+	(log.Severity)(0), // 2: v2ray.core.common.log.Severity
+}
+var file_v2ray_com_core_app_log_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.app.log.Config.error_log_type:type_name -> v2ray.core.app.log.LogType
+	2, // 1: v2ray.core.app.log.Config.error_log_level:type_name -> v2ray.core.common.log.Severity
+	0, // 2: v2ray.core.app.log.Config.access_log_type:type_name -> v2ray.core.app.log.LogType
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_log_config_proto_init() }
+func file_v2ray_com_core_app_log_config_proto_init() {
+	if File_v2ray_com_core_app_log_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_log_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_log_config_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_log_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_log_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_app_log_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_app_log_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_log_config_proto = out.File
+	file_v2ray_com_core_app_log_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_log_config_proto_goTypes = nil
+	file_v2ray_com_core_app_log_config_proto_depIdxs = nil
 }

+ 580 - 323
app/policy/config.pb.go

@@ -1,449 +1,706 @@
 package policy
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Second struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Second) Reset()         { *m = Second{} }
-func (m *Second) String() string { return proto.CompactTextString(m) }
-func (*Second) ProtoMessage()    {}
-func (*Second) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{0}
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *Second) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Second.Unmarshal(m, b)
-}
-func (m *Second) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Second.Marshal(b, m, deterministic)
-}
-func (m *Second) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Second.Merge(m, src)
+func (x *Second) Reset() {
+	*x = Second{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Second) XXX_Size() int {
-	return xxx_messageInfo_Second.Size(m)
+
+func (x *Second) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Second) XXX_DiscardUnknown() {
-	xxx_messageInfo_Second.DiscardUnknown(m)
+
+func (*Second) ProtoMessage() {}
+
+func (x *Second) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Second proto.InternalMessageInfo
+// Deprecated: Use Second.ProtoReflect.Descriptor instead.
+func (*Second) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Second) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *Second) GetValue() uint32 {
+	if x != nil {
+		return x.Value
 	}
 	return 0
 }
 
 type Policy struct {
-	Timeout              *Policy_Timeout `protobuf:"bytes,1,opt,name=timeout,proto3" json:"timeout,omitempty"`
-	Stats                *Policy_Stats   `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"`
-	Buffer               *Policy_Buffer  `protobuf:"bytes,3,opt,name=buffer,proto3" json:"buffer,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Policy) Reset()         { *m = Policy{} }
-func (m *Policy) String() string { return proto.CompactTextString(m) }
-func (*Policy) ProtoMessage()    {}
-func (*Policy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{1}
+	Timeout *Policy_Timeout `protobuf:"bytes,1,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	Stats   *Policy_Stats   `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"`
+	Buffer  *Policy_Buffer  `protobuf:"bytes,3,opt,name=buffer,proto3" json:"buffer,omitempty"`
 }
 
-func (m *Policy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Policy.Unmarshal(m, b)
-}
-func (m *Policy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Policy.Marshal(b, m, deterministic)
-}
-func (m *Policy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Policy.Merge(m, src)
+func (x *Policy) Reset() {
+	*x = Policy{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Policy) XXX_Size() int {
-	return xxx_messageInfo_Policy.Size(m)
+
+func (x *Policy) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Policy) XXX_DiscardUnknown() {
-	xxx_messageInfo_Policy.DiscardUnknown(m)
+
+func (*Policy) ProtoMessage() {}
+
+func (x *Policy) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Policy proto.InternalMessageInfo
+// Deprecated: Use Policy.ProtoReflect.Descriptor instead.
+func (*Policy) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Policy) GetTimeout() *Policy_Timeout {
-	if m != nil {
-		return m.Timeout
+func (x *Policy) GetTimeout() *Policy_Timeout {
+	if x != nil {
+		return x.Timeout
 	}
 	return nil
 }
 
-func (m *Policy) GetStats() *Policy_Stats {
-	if m != nil {
-		return m.Stats
+func (x *Policy) GetStats() *Policy_Stats {
+	if x != nil {
+		return x.Stats
 	}
 	return nil
 }
 
-func (m *Policy) GetBuffer() *Policy_Buffer {
-	if m != nil {
-		return m.Buffer
+func (x *Policy) GetBuffer() *Policy_Buffer {
+	if x != nil {
+		return x.Buffer
 	}
 	return nil
 }
 
-// Timeout is a message for timeout settings in various stages, in seconds.
-type Policy_Timeout struct {
-	Handshake            *Second  `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"`
-	ConnectionIdle       *Second  `protobuf:"bytes,2,opt,name=connection_idle,json=connectionIdle,proto3" json:"connection_idle,omitempty"`
-	UplinkOnly           *Second  `protobuf:"bytes,3,opt,name=uplink_only,json=uplinkOnly,proto3" json:"uplink_only,omitempty"`
-	DownlinkOnly         *Second  `protobuf:"bytes,4,opt,name=downlink_only,json=downlinkOnly,proto3" json:"downlink_only,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Policy_Timeout) Reset()         { *m = Policy_Timeout{} }
-func (m *Policy_Timeout) String() string { return proto.CompactTextString(m) }
-func (*Policy_Timeout) ProtoMessage()    {}
-func (*Policy_Timeout) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{1, 0}
-}
+type SystemPolicy struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Policy_Timeout) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Policy_Timeout.Unmarshal(m, b)
-}
-func (m *Policy_Timeout) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Policy_Timeout.Marshal(b, m, deterministic)
+	Stats *SystemPolicy_Stats `protobuf:"bytes,1,opt,name=stats,proto3" json:"stats,omitempty"`
 }
-func (m *Policy_Timeout) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Policy_Timeout.Merge(m, src)
-}
-func (m *Policy_Timeout) XXX_Size() int {
-	return xxx_messageInfo_Policy_Timeout.Size(m)
+
+func (x *SystemPolicy) Reset() {
+	*x = SystemPolicy{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Policy_Timeout) XXX_DiscardUnknown() {
-	xxx_messageInfo_Policy_Timeout.DiscardUnknown(m)
+
+func (x *SystemPolicy) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_Policy_Timeout proto.InternalMessageInfo
+func (*SystemPolicy) ProtoMessage() {}
 
-func (m *Policy_Timeout) GetHandshake() *Second {
-	if m != nil {
-		return m.Handshake
+func (x *SystemPolicy) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return nil
+	return mi.MessageOf(x)
 }
 
-func (m *Policy_Timeout) GetConnectionIdle() *Second {
-	if m != nil {
-		return m.ConnectionIdle
-	}
-	return nil
+// Deprecated: Use SystemPolicy.ProtoReflect.Descriptor instead.
+func (*SystemPolicy) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *Policy_Timeout) GetUplinkOnly() *Second {
-	if m != nil {
-		return m.UplinkOnly
+func (x *SystemPolicy) GetStats() *SystemPolicy_Stats {
+	if x != nil {
+		return x.Stats
 	}
 	return nil
 }
 
-func (m *Policy_Timeout) GetDownlinkOnly() *Second {
-	if m != nil {
-		return m.DownlinkOnly
-	}
-	return nil
-}
+type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-type Policy_Stats struct {
-	UserUplink           bool     `protobuf:"varint,1,opt,name=user_uplink,json=userUplink,proto3" json:"user_uplink,omitempty"`
-	UserDownlink         bool     `protobuf:"varint,2,opt,name=user_downlink,json=userDownlink,proto3" json:"user_downlink,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Level  map[uint32]*Policy `protobuf:"bytes,1,rep,name=level,proto3" json:"level,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	System *SystemPolicy      `protobuf:"bytes,2,opt,name=system,proto3" json:"system,omitempty"`
 }
 
-func (m *Policy_Stats) Reset()         { *m = Policy_Stats{} }
-func (m *Policy_Stats) String() string { return proto.CompactTextString(m) }
-func (*Policy_Stats) ProtoMessage()    {}
-func (*Policy_Stats) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{1, 1}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Policy_Stats) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Policy_Stats.Unmarshal(m, b)
-}
-func (m *Policy_Stats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Policy_Stats.Marshal(b, m, deterministic)
-}
-func (m *Policy_Stats) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Policy_Stats.Merge(m, src)
-}
-func (m *Policy_Stats) XXX_Size() int {
-	return xxx_messageInfo_Policy_Stats.Size(m)
-}
-func (m *Policy_Stats) XXX_DiscardUnknown() {
-	xxx_messageInfo_Policy_Stats.DiscardUnknown(m)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_Policy_Stats proto.InternalMessageInfo
+func (*Config) ProtoMessage() {}
 
-func (m *Policy_Stats) GetUserUplink() bool {
-	if m != nil {
-		return m.UserUplink
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return false
+	return mi.MessageOf(x)
 }
 
-func (m *Policy_Stats) GetUserDownlink() bool {
-	if m != nil {
-		return m.UserDownlink
-	}
-	return false
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{3}
 }
 
-type Policy_Buffer struct {
-	// Buffer size per connection, in bytes. -1 for unlimited buffer.
-	Connection           int32    `protobuf:"varint,1,opt,name=connection,proto3" json:"connection,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (x *Config) GetLevel() map[uint32]*Policy {
+	if x != nil {
+		return x.Level
+	}
+	return nil
 }
 
-func (m *Policy_Buffer) Reset()         { *m = Policy_Buffer{} }
-func (m *Policy_Buffer) String() string { return proto.CompactTextString(m) }
-func (*Policy_Buffer) ProtoMessage()    {}
-func (*Policy_Buffer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{1, 2}
+func (x *Config) GetSystem() *SystemPolicy {
+	if x != nil {
+		return x.System
+	}
+	return nil
 }
 
-func (m *Policy_Buffer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Policy_Buffer.Unmarshal(m, b)
-}
-func (m *Policy_Buffer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Policy_Buffer.Marshal(b, m, deterministic)
-}
-func (m *Policy_Buffer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Policy_Buffer.Merge(m, src)
-}
-func (m *Policy_Buffer) XXX_Size() int {
-	return xxx_messageInfo_Policy_Buffer.Size(m)
+// Timeout is a message for timeout settings in various stages, in seconds.
+type Policy_Timeout struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Handshake      *Second `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"`
+	ConnectionIdle *Second `protobuf:"bytes,2,opt,name=connection_idle,json=connectionIdle,proto3" json:"connection_idle,omitempty"`
+	UplinkOnly     *Second `protobuf:"bytes,3,opt,name=uplink_only,json=uplinkOnly,proto3" json:"uplink_only,omitempty"`
+	DownlinkOnly   *Second `protobuf:"bytes,4,opt,name=downlink_only,json=downlinkOnly,proto3" json:"downlink_only,omitempty"`
+}
+
+func (x *Policy_Timeout) Reset() {
+	*x = Policy_Timeout{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Policy_Buffer) XXX_DiscardUnknown() {
-	xxx_messageInfo_Policy_Buffer.DiscardUnknown(m)
+
+func (x *Policy_Timeout) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_Policy_Buffer proto.InternalMessageInfo
+func (*Policy_Timeout) ProtoMessage() {}
 
-func (m *Policy_Buffer) GetConnection() int32 {
-	if m != nil {
-		return m.Connection
+func (x *Policy_Timeout) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return 0
+	return mi.MessageOf(x)
 }
 
-type SystemPolicy struct {
-	Stats                *SystemPolicy_Stats `protobuf:"bytes,1,opt,name=stats,proto3" json:"stats,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
+// Deprecated: Use Policy_Timeout.ProtoReflect.Descriptor instead.
+func (*Policy_Timeout) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{1, 0}
 }
 
-func (m *SystemPolicy) Reset()         { *m = SystemPolicy{} }
-func (m *SystemPolicy) String() string { return proto.CompactTextString(m) }
-func (*SystemPolicy) ProtoMessage()    {}
-func (*SystemPolicy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{2}
+func (x *Policy_Timeout) GetHandshake() *Second {
+	if x != nil {
+		return x.Handshake
+	}
+	return nil
 }
 
-func (m *SystemPolicy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SystemPolicy.Unmarshal(m, b)
-}
-func (m *SystemPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SystemPolicy.Marshal(b, m, deterministic)
-}
-func (m *SystemPolicy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SystemPolicy.Merge(m, src)
-}
-func (m *SystemPolicy) XXX_Size() int {
-	return xxx_messageInfo_SystemPolicy.Size(m)
-}
-func (m *SystemPolicy) XXX_DiscardUnknown() {
-	xxx_messageInfo_SystemPolicy.DiscardUnknown(m)
+func (x *Policy_Timeout) GetConnectionIdle() *Second {
+	if x != nil {
+		return x.ConnectionIdle
+	}
+	return nil
 }
 
-var xxx_messageInfo_SystemPolicy proto.InternalMessageInfo
-
-func (m *SystemPolicy) GetStats() *SystemPolicy_Stats {
-	if m != nil {
-		return m.Stats
+func (x *Policy_Timeout) GetUplinkOnly() *Second {
+	if x != nil {
+		return x.UplinkOnly
 	}
 	return nil
 }
 
-type SystemPolicy_Stats struct {
-	InboundUplink        bool     `protobuf:"varint,1,opt,name=inbound_uplink,json=inboundUplink,proto3" json:"inbound_uplink,omitempty"`
-	InboundDownlink      bool     `protobuf:"varint,2,opt,name=inbound_downlink,json=inboundDownlink,proto3" json:"inbound_downlink,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (x *Policy_Timeout) GetDownlinkOnly() *Second {
+	if x != nil {
+		return x.DownlinkOnly
+	}
+	return nil
 }
 
-func (m *SystemPolicy_Stats) Reset()         { *m = SystemPolicy_Stats{} }
-func (m *SystemPolicy_Stats) String() string { return proto.CompactTextString(m) }
-func (*SystemPolicy_Stats) ProtoMessage()    {}
-func (*SystemPolicy_Stats) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{2, 0}
-}
+type Policy_Stats struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *SystemPolicy_Stats) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SystemPolicy_Stats.Unmarshal(m, b)
-}
-func (m *SystemPolicy_Stats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SystemPolicy_Stats.Marshal(b, m, deterministic)
+	UserUplink   bool `protobuf:"varint,1,opt,name=user_uplink,json=userUplink,proto3" json:"user_uplink,omitempty"`
+	UserDownlink bool `protobuf:"varint,2,opt,name=user_downlink,json=userDownlink,proto3" json:"user_downlink,omitempty"`
 }
-func (m *SystemPolicy_Stats) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SystemPolicy_Stats.Merge(m, src)
+
+func (x *Policy_Stats) Reset() {
+	*x = Policy_Stats{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *SystemPolicy_Stats) XXX_Size() int {
-	return xxx_messageInfo_SystemPolicy_Stats.Size(m)
+
+func (x *Policy_Stats) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *SystemPolicy_Stats) XXX_DiscardUnknown() {
-	xxx_messageInfo_SystemPolicy_Stats.DiscardUnknown(m)
+
+func (*Policy_Stats) ProtoMessage() {}
+
+func (x *Policy_Stats) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_SystemPolicy_Stats proto.InternalMessageInfo
+// Deprecated: Use Policy_Stats.ProtoReflect.Descriptor instead.
+func (*Policy_Stats) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{1, 1}
+}
 
-func (m *SystemPolicy_Stats) GetInboundUplink() bool {
-	if m != nil {
-		return m.InboundUplink
+func (x *Policy_Stats) GetUserUplink() bool {
+	if x != nil {
+		return x.UserUplink
 	}
 	return false
 }
 
-func (m *SystemPolicy_Stats) GetInboundDownlink() bool {
-	if m != nil {
-		return m.InboundDownlink
+func (x *Policy_Stats) GetUserDownlink() bool {
+	if x != nil {
+		return x.UserDownlink
 	}
 	return false
 }
 
-type Config struct {
-	Level                map[uint32]*Policy `protobuf:"bytes,1,rep,name=level,proto3" json:"level,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	System               *SystemPolicy      `protobuf:"bytes,2,opt,name=system,proto3" json:"system,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
+type Policy_Buffer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Buffer size per connection, in bytes. -1 for unlimited buffer.
+	Connection int32 `protobuf:"varint,1,opt,name=connection,proto3" json:"connection,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48f54a345c1316d1, []int{3}
+func (x *Policy_Buffer) Reset() {
+	*x = Policy_Buffer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Policy_Buffer) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Policy_Buffer) ProtoMessage() {}
+
+func (x *Policy_Buffer) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+// Deprecated: Use Policy_Buffer.ProtoReflect.Descriptor instead.
+func (*Policy_Buffer) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{1, 2}
+}
+
+func (x *Policy_Buffer) GetConnection() int32 {
+	if x != nil {
+		return x.Connection
+	}
+	return 0
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+
+type SystemPolicy_Stats struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	InboundUplink   bool `protobuf:"varint,1,opt,name=inbound_uplink,json=inboundUplink,proto3" json:"inbound_uplink,omitempty"`
+	InboundDownlink bool `protobuf:"varint,2,opt,name=inbound_downlink,json=inboundDownlink,proto3" json:"inbound_downlink,omitempty"`
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+func (x *SystemPolicy_Stats) Reset() {
+	*x = SystemPolicy_Stats{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *SystemPolicy_Stats) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*SystemPolicy_Stats) ProtoMessage() {}
+
+func (x *SystemPolicy_Stats) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_policy_config_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use SystemPolicy_Stats.ProtoReflect.Descriptor instead.
+func (*SystemPolicy_Stats) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_policy_config_proto_rawDescGZIP(), []int{2, 0}
+}
 
-func (m *Config) GetLevel() map[uint32]*Policy {
-	if m != nil {
-		return m.Level
+func (x *SystemPolicy_Stats) GetInboundUplink() bool {
+	if x != nil {
+		return x.InboundUplink
 	}
-	return nil
+	return false
 }
 
-func (m *Config) GetSystem() *SystemPolicy {
-	if m != nil {
-		return m.System
+func (x *SystemPolicy_Stats) GetInboundDownlink() bool {
+	if x != nil {
+		return x.InboundDownlink
 	}
-	return nil
+	return false
 }
 
-func init() {
-	proto.RegisterType((*Second)(nil), "v2ray.core.app.policy.Second")
-	proto.RegisterType((*Policy)(nil), "v2ray.core.app.policy.Policy")
-	proto.RegisterType((*Policy_Timeout)(nil), "v2ray.core.app.policy.Policy.Timeout")
-	proto.RegisterType((*Policy_Stats)(nil), "v2ray.core.app.policy.Policy.Stats")
-	proto.RegisterType((*Policy_Buffer)(nil), "v2ray.core.app.policy.Policy.Buffer")
-	proto.RegisterType((*SystemPolicy)(nil), "v2ray.core.app.policy.SystemPolicy")
-	proto.RegisterType((*SystemPolicy_Stats)(nil), "v2ray.core.app.policy.SystemPolicy.Stats")
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.policy.Config")
-	proto.RegisterMapType((map[uint32]*Policy)(nil), "v2ray.core.app.policy.Config.LevelEntry")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/policy/config.proto", fileDescriptor_48f54a345c1316d1)
-}
-
-var fileDescriptor_48f54a345c1316d1 = []byte{
-	// 513 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xdb, 0x6a, 0x13, 0x41,
-	0x1c, 0xc6, 0xd9, 0xa4, 0xbb, 0xad, 0xff, 0x24, 0x6d, 0x19, 0x2c, 0xc4, 0x05, 0x6b, 0x49, 0xad,
-	0xa4, 0x37, 0x13, 0x48, 0x6f, 0xd4, 0x6a, 0xc5, 0x78, 0x00, 0x41, 0xb1, 0x4c, 0x3c, 0xa0, 0x37,
-	0x61, 0xb3, 0x3b, 0xb1, 0x4b, 0x26, 0x33, 0xc3, 0x1e, 0x22, 0xfb, 0x1a, 0x3e, 0x46, 0x9f, 0xc6,
-	0x27, 0xf0, 0x59, 0x64, 0xe7, 0xe0, 0xa6, 0x92, 0x43, 0xef, 0x26, 0x1f, 0xbf, 0xef, 0x63, 0xbe,
-	0x7f, 0xfe, 0xb3, 0xf0, 0x68, 0xde, 0x4f, 0x82, 0x02, 0x87, 0x62, 0xd6, 0x0b, 0x45, 0x42, 0x7b,
-	0x81, 0x94, 0x3d, 0x29, 0x58, 0x1c, 0x16, 0xbd, 0x50, 0xf0, 0x49, 0xfc, 0x03, 0xcb, 0x44, 0x64,
-	0x02, 0x1d, 0x58, 0x2e, 0xa1, 0x38, 0x90, 0x12, 0x6b, 0xa6, 0x73, 0x08, 0xde, 0x90, 0x86, 0x82,
-	0x47, 0xe8, 0x2e, 0xb8, 0xf3, 0x80, 0xe5, 0xb4, 0xed, 0x1c, 0x39, 0xdd, 0x16, 0xd1, 0x3f, 0x3a,
-	0xbf, 0xb7, 0xc0, 0xbb, 0x54, 0x28, 0x7a, 0x01, 0xdb, 0x59, 0x3c, 0xa3, 0x22, 0xcf, 0x14, 0xd2,
-	0xe8, 0x9f, 0xe0, 0xa5, 0x99, 0x58, 0xf3, 0xf8, 0x93, 0x86, 0x89, 0x75, 0xa1, 0x27, 0xe0, 0xa6,
-	0x59, 0x90, 0xa5, 0xed, 0x9a, 0xb2, 0x1f, 0xaf, 0xb7, 0x0f, 0x4b, 0x94, 0x68, 0x07, 0x7a, 0x06,
-	0xde, 0x38, 0x9f, 0x4c, 0x68, 0xd2, 0xae, 0x2b, 0xef, 0xc3, 0xf5, 0xde, 0x81, 0x62, 0x89, 0xf1,
-	0xf8, 0xbf, 0x6a, 0xb0, 0x6d, 0x6e, 0x83, 0xce, 0xe1, 0xce, 0x55, 0xc0, 0xa3, 0xf4, 0x2a, 0x98,
-	0x52, 0xd3, 0xe3, 0xfe, 0x8a, 0x30, 0x3d, 0x18, 0x52, 0xf1, 0xe8, 0x2d, 0xec, 0x85, 0x82, 0x73,
-	0x1a, 0x66, 0xb1, 0xe0, 0xa3, 0x38, 0x62, 0xd4, 0x74, 0xd9, 0x10, 0xb1, 0x5b, 0xb9, 0xde, 0x45,
-	0x8c, 0xa2, 0x0b, 0x68, 0xe4, 0x92, 0xc5, 0x7c, 0x3a, 0x12, 0x9c, 0x15, 0xa6, 0xd3, 0x86, 0x0c,
-	0xd0, 0x8e, 0x8f, 0x9c, 0x15, 0x68, 0x00, 0xad, 0x48, 0xfc, 0xe4, 0x55, 0xc2, 0xd6, 0x6d, 0x12,
-	0x9a, 0xd6, 0x53, 0x66, 0xf8, 0x1f, 0xc0, 0x55, 0x23, 0x46, 0x0f, 0xa0, 0x91, 0xa7, 0x34, 0x19,
-	0xe9, 0x7c, 0x35, 0x93, 0x1d, 0x02, 0xa5, 0xf4, 0x59, 0x29, 0xe8, 0x18, 0x5a, 0x0a, 0xb0, 0x76,
-	0xd5, 0x79, 0x87, 0x34, 0x4b, 0xf1, 0xb5, 0xd1, 0xfc, 0x2e, 0x78, 0x7a, 0xea, 0xe8, 0x10, 0xa0,
-	0xaa, 0xab, 0xe2, 0x5c, 0xb2, 0xa0, 0x74, 0xae, 0x1d, 0x68, 0x0e, 0x8b, 0x34, 0xa3, 0xb3, 0x7f,
-	0x8b, 0x65, 0xf6, 0x42, 0xff, 0x1d, 0xa7, 0xab, 0x5a, 0x2c, 0x78, 0x6e, 0x6c, 0x87, 0xff, 0xcd,
-	0x56, 0x39, 0x81, 0xdd, 0x98, 0x8f, 0x45, 0xce, 0xa3, 0x9b, 0x6d, 0x5a, 0x46, 0x35, 0x85, 0x4e,
-	0x61, 0xdf, 0x62, 0xff, 0x75, 0xda, 0x33, 0xba, 0xad, 0xd5, 0xf9, 0xe3, 0x80, 0xf7, 0x4a, 0xbd,
-	0x23, 0x74, 0x01, 0x2e, 0xa3, 0x73, 0xca, 0xda, 0xce, 0x51, 0xbd, 0xdb, 0xe8, 0x77, 0x57, 0x5c,
-	0x53, 0xd3, 0xf8, 0x7d, 0x89, 0xbe, 0xe1, 0x59, 0x52, 0x10, 0x6d, 0x43, 0xe7, 0xe0, 0xa5, 0xaa,
-	0xc2, 0x86, 0xfd, 0x5f, 0xec, 0x49, 0x8c, 0xc5, 0xff, 0x0a, 0x50, 0x25, 0xa2, 0x7d, 0xa8, 0x4f,
-	0x69, 0x61, 0x5e, 0x6a, 0x79, 0x44, 0x67, 0xf6, 0xf5, 0xae, 0xdf, 0x47, 0x93, 0xaa, 0xd9, 0xa7,
-	0xb5, 0xc7, 0xce, 0xe0, 0x39, 0xdc, 0x0b, 0xc5, 0x6c, 0x39, 0x7e, 0xe9, 0x7c, 0xf7, 0xf4, 0xe9,
-	0xba, 0x76, 0xf0, 0xa5, 0x4f, 0x82, 0xb2, 0x5d, 0x42, 0xf1, 0x4b, 0x29, 0x4d, 0xd2, 0xd8, 0x53,
-	0x5f, 0x97, 0xb3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe9, 0xde, 0xee, 0x20, 0x87, 0x04, 0x00,
-	0x00,
+var File_v2ray_com_core_app_policy_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_policy_config_proto_rawDesc = []byte{
+	0x0a, 0x26, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22,
+	0x1e, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,
+	0xd0, 0x04, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x07, 0x74, 0x69,
+	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c,
+	0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69,
+	0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50,
+	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x62, 0x75,
+	0x66, 0x66, 0x65, 0x72, 0x1a, 0x92, 0x02, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
+	0x12, 0x3b, 0x0a, 0x09, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f,
+	0x6e, 0x64, 0x52, 0x09, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x46, 0x0a,
+	0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x6c, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53,
+	0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x64, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f,
+	0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69,
+	0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x69, 0x6e,
+	0x6b, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x42, 0x0a, 0x0d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e,
+	0x6b, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f,
+	0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x0c, 0x64, 0x6f, 0x77,
+	0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4f, 0x6e, 0x6c, 0x79, 0x1a, 0x4d, 0x0a, 0x05, 0x53, 0x74, 0x61,
+	0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e,
+	0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x55, 0x70, 0x6c,
+	0x69, 0x6e, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x6f, 0x77, 0x6e,
+	0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72,
+	0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x1a, 0x28, 0x0a, 0x06, 0x42, 0x75, 0x66, 0x66,
+	0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x0c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x6c,
+	0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65,
+	0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x73, 0x1a, 0x59, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a,
+	0x0e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x70,
+	0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f,
+	0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f,
+	0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x22,
+	0xde, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, 0x05, 0x6c, 0x65,
+	0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+	0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x79,
+	0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69,
+	0x63, 0x79, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52,
+	0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x1a, 0x57, 0x0a, 0x0a, 0x4c, 0x65, 0x76, 0x65, 0x6c,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50,
+	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
+	0x42, 0x3d, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x01, 0x5a,
+	0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e,
+	0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_app_policy_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_policy_config_proto_rawDescData = file_v2ray_com_core_app_policy_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_policy_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_policy_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_policy_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_policy_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_policy_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_app_policy_config_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_v2ray_com_core_app_policy_config_proto_goTypes = []interface{}{
+	(*Second)(nil),             // 0: v2ray.core.app.policy.Second
+	(*Policy)(nil),             // 1: v2ray.core.app.policy.Policy
+	(*SystemPolicy)(nil),       // 2: v2ray.core.app.policy.SystemPolicy
+	(*Config)(nil),             // 3: v2ray.core.app.policy.Config
+	(*Policy_Timeout)(nil),     // 4: v2ray.core.app.policy.Policy.Timeout
+	(*Policy_Stats)(nil),       // 5: v2ray.core.app.policy.Policy.Stats
+	(*Policy_Buffer)(nil),      // 6: v2ray.core.app.policy.Policy.Buffer
+	(*SystemPolicy_Stats)(nil), // 7: v2ray.core.app.policy.SystemPolicy.Stats
+	nil,                        // 8: v2ray.core.app.policy.Config.LevelEntry
+}
+var file_v2ray_com_core_app_policy_config_proto_depIdxs = []int32{
+	4,  // 0: v2ray.core.app.policy.Policy.timeout:type_name -> v2ray.core.app.policy.Policy.Timeout
+	5,  // 1: v2ray.core.app.policy.Policy.stats:type_name -> v2ray.core.app.policy.Policy.Stats
+	6,  // 2: v2ray.core.app.policy.Policy.buffer:type_name -> v2ray.core.app.policy.Policy.Buffer
+	7,  // 3: v2ray.core.app.policy.SystemPolicy.stats:type_name -> v2ray.core.app.policy.SystemPolicy.Stats
+	8,  // 4: v2ray.core.app.policy.Config.level:type_name -> v2ray.core.app.policy.Config.LevelEntry
+	2,  // 5: v2ray.core.app.policy.Config.system:type_name -> v2ray.core.app.policy.SystemPolicy
+	0,  // 6: v2ray.core.app.policy.Policy.Timeout.handshake:type_name -> v2ray.core.app.policy.Second
+	0,  // 7: v2ray.core.app.policy.Policy.Timeout.connection_idle:type_name -> v2ray.core.app.policy.Second
+	0,  // 8: v2ray.core.app.policy.Policy.Timeout.uplink_only:type_name -> v2ray.core.app.policy.Second
+	0,  // 9: v2ray.core.app.policy.Policy.Timeout.downlink_only:type_name -> v2ray.core.app.policy.Second
+	1,  // 10: v2ray.core.app.policy.Config.LevelEntry.value:type_name -> v2ray.core.app.policy.Policy
+	11, // [11:11] is the sub-list for method output_type
+	11, // [11:11] is the sub-list for method input_type
+	11, // [11:11] is the sub-list for extension type_name
+	11, // [11:11] is the sub-list for extension extendee
+	0,  // [0:11] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_policy_config_proto_init() }
+func file_v2ray_com_core_app_policy_config_proto_init() {
+	if File_v2ray_com_core_app_policy_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Second); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Policy); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SystemPolicy); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Policy_Timeout); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Policy_Stats); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Policy_Buffer); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_policy_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SystemPolicy_Stats); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_policy_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_policy_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_policy_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_app_policy_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_policy_config_proto = out.File
+	file_v2ray_com_core_app_policy_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_policy_config_proto_goTypes = nil
+	file_v2ray_com_core_app_policy_config_proto_depIdxs = nil
 }

File diff suppressed because it is too large
+ 887 - 445
app/proxyman/command/command.pb.go


+ 821 - 438
app/proxyman/config.pb.go

@@ -1,24 +1,26 @@
 package proxyman
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 	serial "v2ray.com/core/common/serial"
 	internet "v2ray.com/core/transport/internet"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type KnownProtocols int32
 
@@ -27,22 +29,43 @@ const (
 	KnownProtocols_TLS  KnownProtocols = 1
 )
 
-var KnownProtocols_name = map[int32]string{
-	0: "HTTP",
-	1: "TLS",
-}
+// Enum value maps for KnownProtocols.
+var (
+	KnownProtocols_name = map[int32]string{
+		0: "HTTP",
+		1: "TLS",
+	}
+	KnownProtocols_value = map[string]int32{
+		"HTTP": 0,
+		"TLS":  1,
+	}
+)
 
-var KnownProtocols_value = map[string]int32{
-	"HTTP": 0,
-	"TLS":  1,
+func (x KnownProtocols) Enum() *KnownProtocols {
+	p := new(KnownProtocols)
+	*p = x
+	return p
 }
 
 func (x KnownProtocols) String() string {
-	return proto.EnumName(KnownProtocols_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (KnownProtocols) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_proxyman_config_proto_enumTypes[0].Descriptor()
+}
+
+func (KnownProtocols) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_proxyman_config_proto_enumTypes[0]
+}
+
+func (x KnownProtocols) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
+// Deprecated: Use KnownProtocols.Descriptor instead.
 func (KnownProtocols) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{0}
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{0}
 }
 
 type AllocationStrategy_Type int32
@@ -56,253 +79,215 @@ const (
 	AllocationStrategy_External AllocationStrategy_Type = 2
 )
 
-var AllocationStrategy_Type_name = map[int32]string{
-	0: "Always",
-	1: "Random",
-	2: "External",
-}
+// Enum value maps for AllocationStrategy_Type.
+var (
+	AllocationStrategy_Type_name = map[int32]string{
+		0: "Always",
+		1: "Random",
+		2: "External",
+	}
+	AllocationStrategy_Type_value = map[string]int32{
+		"Always":   0,
+		"Random":   1,
+		"External": 2,
+	}
+)
 
-var AllocationStrategy_Type_value = map[string]int32{
-	"Always":   0,
-	"Random":   1,
-	"External": 2,
+func (x AllocationStrategy_Type) Enum() *AllocationStrategy_Type {
+	p := new(AllocationStrategy_Type)
+	*p = x
+	return p
 }
 
 func (x AllocationStrategy_Type) String() string {
-	return proto.EnumName(AllocationStrategy_Type_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (AllocationStrategy_Type) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{1, 0}
+func (AllocationStrategy_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_proxyman_config_proto_enumTypes[1].Descriptor()
 }
 
-type InboundConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (AllocationStrategy_Type) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_proxyman_config_proto_enumTypes[1]
 }
 
-func (m *InboundConfig) Reset()         { *m = InboundConfig{} }
-func (m *InboundConfig) String() string { return proto.CompactTextString(m) }
-func (*InboundConfig) ProtoMessage()    {}
-func (*InboundConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{0}
+func (x AllocationStrategy_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *InboundConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_InboundConfig.Unmarshal(m, b)
+// Deprecated: Use AllocationStrategy_Type.Descriptor instead.
+func (AllocationStrategy_Type) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{1, 0}
 }
-func (m *InboundConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_InboundConfig.Marshal(b, m, deterministic)
+
+type InboundConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
-func (m *InboundConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_InboundConfig.Merge(m, src)
+
+func (x *InboundConfig) Reset() {
+	*x = InboundConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *InboundConfig) XXX_Size() int {
-	return xxx_messageInfo_InboundConfig.Size(m)
+
+func (x *InboundConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *InboundConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_InboundConfig.DiscardUnknown(m)
+
+func (*InboundConfig) ProtoMessage() {}
+
+func (x *InboundConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_InboundConfig proto.InternalMessageInfo
+// Deprecated: Use InboundConfig.ProtoReflect.Descriptor instead.
+func (*InboundConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{0}
+}
 
 type AllocationStrategy struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	Type AllocationStrategy_Type `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.proxyman.AllocationStrategy_Type" json:"type,omitempty"`
 	// Number of handlers (ports) running in parallel.
 	// Default value is 3 if unset.
 	Concurrency *AllocationStrategy_AllocationStrategyConcurrency `protobuf:"bytes,2,opt,name=concurrency,proto3" json:"concurrency,omitempty"`
 	// Number of minutes before a handler is regenerated.
 	// Default value is 5 if unset.
-	Refresh              *AllocationStrategy_AllocationStrategyRefresh `protobuf:"bytes,3,opt,name=refresh,proto3" json:"refresh,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
-	XXX_unrecognized     []byte                                        `json:"-"`
-	XXX_sizecache        int32                                         `json:"-"`
+	Refresh *AllocationStrategy_AllocationStrategyRefresh `protobuf:"bytes,3,opt,name=refresh,proto3" json:"refresh,omitempty"`
 }
 
-func (m *AllocationStrategy) Reset()         { *m = AllocationStrategy{} }
-func (m *AllocationStrategy) String() string { return proto.CompactTextString(m) }
-func (*AllocationStrategy) ProtoMessage()    {}
-func (*AllocationStrategy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{1}
+func (x *AllocationStrategy) Reset() {
+	*x = AllocationStrategy{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *AllocationStrategy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AllocationStrategy.Unmarshal(m, b)
-}
-func (m *AllocationStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AllocationStrategy.Marshal(b, m, deterministic)
-}
-func (m *AllocationStrategy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AllocationStrategy.Merge(m, src)
+func (x *AllocationStrategy) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *AllocationStrategy) XXX_Size() int {
-	return xxx_messageInfo_AllocationStrategy.Size(m)
-}
-func (m *AllocationStrategy) XXX_DiscardUnknown() {
-	xxx_messageInfo_AllocationStrategy.DiscardUnknown(m)
+
+func (*AllocationStrategy) ProtoMessage() {}
+
+func (x *AllocationStrategy) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_AllocationStrategy proto.InternalMessageInfo
+// Deprecated: Use AllocationStrategy.ProtoReflect.Descriptor instead.
+func (*AllocationStrategy) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *AllocationStrategy) GetType() AllocationStrategy_Type {
-	if m != nil {
-		return m.Type
+func (x *AllocationStrategy) GetType() AllocationStrategy_Type {
+	if x != nil {
+		return x.Type
 	}
 	return AllocationStrategy_Always
 }
 
-func (m *AllocationStrategy) GetConcurrency() *AllocationStrategy_AllocationStrategyConcurrency {
-	if m != nil {
-		return m.Concurrency
+func (x *AllocationStrategy) GetConcurrency() *AllocationStrategy_AllocationStrategyConcurrency {
+	if x != nil {
+		return x.Concurrency
 	}
 	return nil
 }
 
-func (m *AllocationStrategy) GetRefresh() *AllocationStrategy_AllocationStrategyRefresh {
-	if m != nil {
-		return m.Refresh
+func (x *AllocationStrategy) GetRefresh() *AllocationStrategy_AllocationStrategyRefresh {
+	if x != nil {
+		return x.Refresh
 	}
 	return nil
 }
 
-type AllocationStrategy_AllocationStrategyConcurrency struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *AllocationStrategy_AllocationStrategyConcurrency) Reset() {
-	*m = AllocationStrategy_AllocationStrategyConcurrency{}
-}
-func (m *AllocationStrategy_AllocationStrategyConcurrency) String() string {
-	return proto.CompactTextString(m)
-}
-func (*AllocationStrategy_AllocationStrategyConcurrency) ProtoMessage() {}
-func (*AllocationStrategy_AllocationStrategyConcurrency) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{1, 0}
-}
+type SniffingConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *AllocationStrategy_AllocationStrategyConcurrency) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AllocationStrategy_AllocationStrategyConcurrency.Unmarshal(m, b)
-}
-func (m *AllocationStrategy_AllocationStrategyConcurrency) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AllocationStrategy_AllocationStrategyConcurrency.Marshal(b, m, deterministic)
-}
-func (m *AllocationStrategy_AllocationStrategyConcurrency) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AllocationStrategy_AllocationStrategyConcurrency.Merge(m, src)
-}
-func (m *AllocationStrategy_AllocationStrategyConcurrency) XXX_Size() int {
-	return xxx_messageInfo_AllocationStrategy_AllocationStrategyConcurrency.Size(m)
-}
-func (m *AllocationStrategy_AllocationStrategyConcurrency) XXX_DiscardUnknown() {
-	xxx_messageInfo_AllocationStrategy_AllocationStrategyConcurrency.DiscardUnknown(m)
+	// Whether or not to enable content sniffing on an inbound connection.
+	Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	// Override target destination if sniff'ed protocol is in the given list.
+	// Supported values are "http", "tls".
+	DestinationOverride []string `protobuf:"bytes,2,rep,name=destination_override,json=destinationOverride,proto3" json:"destination_override,omitempty"`
 }
 
-var xxx_messageInfo_AllocationStrategy_AllocationStrategyConcurrency proto.InternalMessageInfo
-
-func (m *AllocationStrategy_AllocationStrategyConcurrency) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *SniffingConfig) Reset() {
+	*x = SniffingConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
 	}
-	return 0
 }
 
-type AllocationStrategy_AllocationStrategyRefresh struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (x *SniffingConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-func (m *AllocationStrategy_AllocationStrategyRefresh) Reset() {
-	*m = AllocationStrategy_AllocationStrategyRefresh{}
-}
-func (m *AllocationStrategy_AllocationStrategyRefresh) String() string {
-	return proto.CompactTextString(m)
-}
-func (*AllocationStrategy_AllocationStrategyRefresh) ProtoMessage() {}
-func (*AllocationStrategy_AllocationStrategyRefresh) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{1, 1}
-}
+func (*SniffingConfig) ProtoMessage() {}
 
-func (m *AllocationStrategy_AllocationStrategyRefresh) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AllocationStrategy_AllocationStrategyRefresh.Unmarshal(m, b)
-}
-func (m *AllocationStrategy_AllocationStrategyRefresh) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AllocationStrategy_AllocationStrategyRefresh.Marshal(b, m, deterministic)
-}
-func (m *AllocationStrategy_AllocationStrategyRefresh) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AllocationStrategy_AllocationStrategyRefresh.Merge(m, src)
-}
-func (m *AllocationStrategy_AllocationStrategyRefresh) XXX_Size() int {
-	return xxx_messageInfo_AllocationStrategy_AllocationStrategyRefresh.Size(m)
-}
-func (m *AllocationStrategy_AllocationStrategyRefresh) XXX_DiscardUnknown() {
-	xxx_messageInfo_AllocationStrategy_AllocationStrategyRefresh.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AllocationStrategy_AllocationStrategyRefresh proto.InternalMessageInfo
-
-func (m *AllocationStrategy_AllocationStrategyRefresh) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *SniffingConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return 0
-}
-
-type SniffingConfig struct {
-	// Whether or not to enable content sniffing on an inbound connection.
-	Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
-	// Override target destination if sniff'ed protocol is in the given list.
-	// Supported values are "http", "tls".
-	DestinationOverride  []string `protobuf:"bytes,2,rep,name=destination_override,json=destinationOverride,proto3" json:"destination_override,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	return mi.MessageOf(x)
 }
 
-func (m *SniffingConfig) Reset()         { *m = SniffingConfig{} }
-func (m *SniffingConfig) String() string { return proto.CompactTextString(m) }
-func (*SniffingConfig) ProtoMessage()    {}
+// Deprecated: Use SniffingConfig.ProtoReflect.Descriptor instead.
 func (*SniffingConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{2}
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *SniffingConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SniffingConfig.Unmarshal(m, b)
-}
-func (m *SniffingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SniffingConfig.Marshal(b, m, deterministic)
-}
-func (m *SniffingConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SniffingConfig.Merge(m, src)
-}
-func (m *SniffingConfig) XXX_Size() int {
-	return xxx_messageInfo_SniffingConfig.Size(m)
-}
-func (m *SniffingConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SniffingConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SniffingConfig proto.InternalMessageInfo
-
-func (m *SniffingConfig) GetEnabled() bool {
-	if m != nil {
-		return m.Enabled
+func (x *SniffingConfig) GetEnabled() bool {
+	if x != nil {
+		return x.Enabled
 	}
 	return false
 }
 
-func (m *SniffingConfig) GetDestinationOverride() []string {
-	if m != nil {
-		return m.DestinationOverride
+func (x *SniffingConfig) GetDestinationOverride() []string {
+	if x != nil {
+		return x.DestinationOverride
 	}
 	return nil
 }
 
 type ReceiverConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// PortRange specifies the ports which the Receiver should listen on.
 	PortRange *net.PortRange `protobuf:"bytes,1,opt,name=port_range,json=portRange,proto3" json:"port_range,omitempty"`
 	// Listen specifies the IP address that the Receiver should listen on.
@@ -312,358 +297,756 @@ type ReceiverConfig struct {
 	ReceiveOriginalDestination bool                   `protobuf:"varint,5,opt,name=receive_original_destination,json=receiveOriginalDestination,proto3" json:"receive_original_destination,omitempty"`
 	// Override domains for the given protocol.
 	// Deprecated. Use sniffing_settings.
-	DomainOverride       []KnownProtocols `protobuf:"varint,7,rep,packed,name=domain_override,json=domainOverride,proto3,enum=v2ray.core.app.proxyman.KnownProtocols" json:"domain_override,omitempty"` // Deprecated: Do not use.
-	SniffingSettings     *SniffingConfig  `protobuf:"bytes,8,opt,name=sniffing_settings,json=sniffingSettings,proto3" json:"sniffing_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
+	//
+	// Deprecated: Do not use.
+	DomainOverride   []KnownProtocols `protobuf:"varint,7,rep,packed,name=domain_override,json=domainOverride,proto3,enum=v2ray.core.app.proxyman.KnownProtocols" json:"domain_override,omitempty"`
+	SniffingSettings *SniffingConfig  `protobuf:"bytes,8,opt,name=sniffing_settings,json=sniffingSettings,proto3" json:"sniffing_settings,omitempty"`
+}
+
+func (x *ReceiverConfig) Reset() {
+	*x = ReceiverConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ReceiverConfig) Reset()         { *m = ReceiverConfig{} }
-func (m *ReceiverConfig) String() string { return proto.CompactTextString(m) }
-func (*ReceiverConfig) ProtoMessage()    {}
-func (*ReceiverConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{3}
+func (x *ReceiverConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-func (m *ReceiverConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ReceiverConfig.Unmarshal(m, b)
-}
-func (m *ReceiverConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ReceiverConfig.Marshal(b, m, deterministic)
-}
-func (m *ReceiverConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ReceiverConfig.Merge(m, src)
-}
-func (m *ReceiverConfig) XXX_Size() int {
-	return xxx_messageInfo_ReceiverConfig.Size(m)
-}
-func (m *ReceiverConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ReceiverConfig.DiscardUnknown(m)
+func (*ReceiverConfig) ProtoMessage() {}
+
+func (x *ReceiverConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ReceiverConfig proto.InternalMessageInfo
+// Deprecated: Use ReceiverConfig.ProtoReflect.Descriptor instead.
+func (*ReceiverConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *ReceiverConfig) GetPortRange() *net.PortRange {
-	if m != nil {
-		return m.PortRange
+func (x *ReceiverConfig) GetPortRange() *net.PortRange {
+	if x != nil {
+		return x.PortRange
 	}
 	return nil
 }
 
-func (m *ReceiverConfig) GetListen() *net.IPOrDomain {
-	if m != nil {
-		return m.Listen
+func (x *ReceiverConfig) GetListen() *net.IPOrDomain {
+	if x != nil {
+		return x.Listen
 	}
 	return nil
 }
 
-func (m *ReceiverConfig) GetAllocationStrategy() *AllocationStrategy {
-	if m != nil {
-		return m.AllocationStrategy
+func (x *ReceiverConfig) GetAllocationStrategy() *AllocationStrategy {
+	if x != nil {
+		return x.AllocationStrategy
 	}
 	return nil
 }
 
-func (m *ReceiverConfig) GetStreamSettings() *internet.StreamConfig {
-	if m != nil {
-		return m.StreamSettings
+func (x *ReceiverConfig) GetStreamSettings() *internet.StreamConfig {
+	if x != nil {
+		return x.StreamSettings
 	}
 	return nil
 }
 
-func (m *ReceiverConfig) GetReceiveOriginalDestination() bool {
-	if m != nil {
-		return m.ReceiveOriginalDestination
+func (x *ReceiverConfig) GetReceiveOriginalDestination() bool {
+	if x != nil {
+		return x.ReceiveOriginalDestination
 	}
 	return false
 }
 
 // Deprecated: Do not use.
-func (m *ReceiverConfig) GetDomainOverride() []KnownProtocols {
-	if m != nil {
-		return m.DomainOverride
+func (x *ReceiverConfig) GetDomainOverride() []KnownProtocols {
+	if x != nil {
+		return x.DomainOverride
 	}
 	return nil
 }
 
-func (m *ReceiverConfig) GetSniffingSettings() *SniffingConfig {
-	if m != nil {
-		return m.SniffingSettings
+func (x *ReceiverConfig) GetSniffingSettings() *SniffingConfig {
+	if x != nil {
+		return x.SniffingSettings
 	}
 	return nil
 }
 
 type InboundHandlerConfig struct {
-	Tag                  string               `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
-	ReceiverSettings     *serial.TypedMessage `protobuf:"bytes,2,opt,name=receiver_settings,json=receiverSettings,proto3" json:"receiver_settings,omitempty"`
-	ProxySettings        *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *InboundHandlerConfig) Reset()         { *m = InboundHandlerConfig{} }
-func (m *InboundHandlerConfig) String() string { return proto.CompactTextString(m) }
-func (*InboundHandlerConfig) ProtoMessage()    {}
-func (*InboundHandlerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{4}
+	Tag              string               `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
+	ReceiverSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=receiver_settings,json=receiverSettings,proto3" json:"receiver_settings,omitempty"`
+	ProxySettings    *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"`
 }
 
-func (m *InboundHandlerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_InboundHandlerConfig.Unmarshal(m, b)
-}
-func (m *InboundHandlerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_InboundHandlerConfig.Marshal(b, m, deterministic)
-}
-func (m *InboundHandlerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_InboundHandlerConfig.Merge(m, src)
+func (x *InboundHandlerConfig) Reset() {
+	*x = InboundHandlerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *InboundHandlerConfig) XXX_Size() int {
-	return xxx_messageInfo_InboundHandlerConfig.Size(m)
+
+func (x *InboundHandlerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *InboundHandlerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_InboundHandlerConfig.DiscardUnknown(m)
+
+func (*InboundHandlerConfig) ProtoMessage() {}
+
+func (x *InboundHandlerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_InboundHandlerConfig proto.InternalMessageInfo
+// Deprecated: Use InboundHandlerConfig.ProtoReflect.Descriptor instead.
+func (*InboundHandlerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *InboundHandlerConfig) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *InboundHandlerConfig) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage {
-	if m != nil {
-		return m.ReceiverSettings
+func (x *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage {
+	if x != nil {
+		return x.ReceiverSettings
 	}
 	return nil
 }
 
-func (m *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage {
-	if m != nil {
-		return m.ProxySettings
+func (x *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage {
+	if x != nil {
+		return x.ProxySettings
 	}
 	return nil
 }
 
 type OutboundConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *OutboundConfig) Reset()         { *m = OutboundConfig{} }
-func (m *OutboundConfig) String() string { return proto.CompactTextString(m) }
-func (*OutboundConfig) ProtoMessage()    {}
-func (*OutboundConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{5}
+func (x *OutboundConfig) Reset() {
+	*x = OutboundConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *OutboundConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutboundConfig.Unmarshal(m, b)
-}
-func (m *OutboundConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutboundConfig.Marshal(b, m, deterministic)
-}
-func (m *OutboundConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutboundConfig.Merge(m, src)
+func (x *OutboundConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *OutboundConfig) XXX_Size() int {
-	return xxx_messageInfo_OutboundConfig.Size(m)
-}
-func (m *OutboundConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutboundConfig.DiscardUnknown(m)
+
+func (*OutboundConfig) ProtoMessage() {}
+
+func (x *OutboundConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_OutboundConfig proto.InternalMessageInfo
+// Deprecated: Use OutboundConfig.ProtoReflect.Descriptor instead.
+func (*OutboundConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{5}
+}
 
 type SenderConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Send traffic through the given IP. Only IP is allowed.
-	Via                  *net.IPOrDomain        `protobuf:"bytes,1,opt,name=via,proto3" json:"via,omitempty"`
-	StreamSettings       *internet.StreamConfig `protobuf:"bytes,2,opt,name=stream_settings,json=streamSettings,proto3" json:"stream_settings,omitempty"`
-	ProxySettings        *internet.ProxyConfig  `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"`
-	MultiplexSettings    *MultiplexingConfig    `protobuf:"bytes,4,opt,name=multiplex_settings,json=multiplexSettings,proto3" json:"multiplex_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
-}
-
-func (m *SenderConfig) Reset()         { *m = SenderConfig{} }
-func (m *SenderConfig) String() string { return proto.CompactTextString(m) }
-func (*SenderConfig) ProtoMessage()    {}
-func (*SenderConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{6}
+	Via               *net.IPOrDomain        `protobuf:"bytes,1,opt,name=via,proto3" json:"via,omitempty"`
+	StreamSettings    *internet.StreamConfig `protobuf:"bytes,2,opt,name=stream_settings,json=streamSettings,proto3" json:"stream_settings,omitempty"`
+	ProxySettings     *internet.ProxyConfig  `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"`
+	MultiplexSettings *MultiplexingConfig    `protobuf:"bytes,4,opt,name=multiplex_settings,json=multiplexSettings,proto3" json:"multiplex_settings,omitempty"`
+}
+
+func (x *SenderConfig) Reset() {
+	*x = SenderConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *SenderConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SenderConfig.Unmarshal(m, b)
-}
-func (m *SenderConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SenderConfig.Marshal(b, m, deterministic)
-}
-func (m *SenderConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SenderConfig.Merge(m, src)
-}
-func (m *SenderConfig) XXX_Size() int {
-	return xxx_messageInfo_SenderConfig.Size(m)
+func (x *SenderConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *SenderConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SenderConfig.DiscardUnknown(m)
+
+func (*SenderConfig) ProtoMessage() {}
+
+func (x *SenderConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_SenderConfig proto.InternalMessageInfo
+// Deprecated: Use SenderConfig.ProtoReflect.Descriptor instead.
+func (*SenderConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{6}
+}
 
-func (m *SenderConfig) GetVia() *net.IPOrDomain {
-	if m != nil {
-		return m.Via
+func (x *SenderConfig) GetVia() *net.IPOrDomain {
+	if x != nil {
+		return x.Via
 	}
 	return nil
 }
 
-func (m *SenderConfig) GetStreamSettings() *internet.StreamConfig {
-	if m != nil {
-		return m.StreamSettings
+func (x *SenderConfig) GetStreamSettings() *internet.StreamConfig {
+	if x != nil {
+		return x.StreamSettings
 	}
 	return nil
 }
 
-func (m *SenderConfig) GetProxySettings() *internet.ProxyConfig {
-	if m != nil {
-		return m.ProxySettings
+func (x *SenderConfig) GetProxySettings() *internet.ProxyConfig {
+	if x != nil {
+		return x.ProxySettings
 	}
 	return nil
 }
 
-func (m *SenderConfig) GetMultiplexSettings() *MultiplexingConfig {
-	if m != nil {
-		return m.MultiplexSettings
+func (x *SenderConfig) GetMultiplexSettings() *MultiplexingConfig {
+	if x != nil {
+		return x.MultiplexSettings
 	}
 	return nil
 }
 
 type MultiplexingConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Whether or not Mux is enabled.
 	Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
 	// Max number of concurrent connections that one Mux connection can handle.
-	Concurrency          uint32   `protobuf:"varint,2,opt,name=concurrency,proto3" json:"concurrency,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Concurrency uint32 `protobuf:"varint,2,opt,name=concurrency,proto3" json:"concurrency,omitempty"`
+}
+
+func (x *MultiplexingConfig) Reset() {
+	*x = MultiplexingConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MultiplexingConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-func (m *MultiplexingConfig) Reset()         { *m = MultiplexingConfig{} }
-func (m *MultiplexingConfig) String() string { return proto.CompactTextString(m) }
-func (*MultiplexingConfig) ProtoMessage()    {}
+func (*MultiplexingConfig) ProtoMessage() {}
+
+func (x *MultiplexingConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MultiplexingConfig.ProtoReflect.Descriptor instead.
 func (*MultiplexingConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b07f45dd938bc1b0, []int{7}
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{7}
 }
 
-func (m *MultiplexingConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MultiplexingConfig.Unmarshal(m, b)
+func (x *MultiplexingConfig) GetEnabled() bool {
+	if x != nil {
+		return x.Enabled
+	}
+	return false
 }
-func (m *MultiplexingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MultiplexingConfig.Marshal(b, m, deterministic)
+
+func (x *MultiplexingConfig) GetConcurrency() uint32 {
+	if x != nil {
+		return x.Concurrency
+	}
+	return 0
 }
-func (m *MultiplexingConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MultiplexingConfig.Merge(m, src)
+
+type AllocationStrategy_AllocationStrategyConcurrency struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 }
-func (m *MultiplexingConfig) XXX_Size() int {
-	return xxx_messageInfo_MultiplexingConfig.Size(m)
+
+func (x *AllocationStrategy_AllocationStrategyConcurrency) Reset() {
+	*x = AllocationStrategy_AllocationStrategyConcurrency{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *MultiplexingConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_MultiplexingConfig.DiscardUnknown(m)
+
+func (x *AllocationStrategy_AllocationStrategyConcurrency) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_MultiplexingConfig proto.InternalMessageInfo
+func (*AllocationStrategy_AllocationStrategyConcurrency) ProtoMessage() {}
 
-func (m *MultiplexingConfig) GetEnabled() bool {
-	if m != nil {
-		return m.Enabled
+func (x *AllocationStrategy_AllocationStrategyConcurrency) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return false
+	return mi.MessageOf(x)
 }
 
-func (m *MultiplexingConfig) GetConcurrency() uint32 {
-	if m != nil {
-		return m.Concurrency
+// Deprecated: Use AllocationStrategy_AllocationStrategyConcurrency.ProtoReflect.Descriptor instead.
+func (*AllocationStrategy_AllocationStrategyConcurrency) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *AllocationStrategy_AllocationStrategyConcurrency) GetValue() uint32 {
+	if x != nil {
+		return x.Value
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.app.proxyman.KnownProtocols", KnownProtocols_name, KnownProtocols_value)
-	proto.RegisterEnum("v2ray.core.app.proxyman.AllocationStrategy_Type", AllocationStrategy_Type_name, AllocationStrategy_Type_value)
-	proto.RegisterType((*InboundConfig)(nil), "v2ray.core.app.proxyman.InboundConfig")
-	proto.RegisterType((*AllocationStrategy)(nil), "v2ray.core.app.proxyman.AllocationStrategy")
-	proto.RegisterType((*AllocationStrategy_AllocationStrategyConcurrency)(nil), "v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency")
-	proto.RegisterType((*AllocationStrategy_AllocationStrategyRefresh)(nil), "v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyRefresh")
-	proto.RegisterType((*SniffingConfig)(nil), "v2ray.core.app.proxyman.SniffingConfig")
-	proto.RegisterType((*ReceiverConfig)(nil), "v2ray.core.app.proxyman.ReceiverConfig")
-	proto.RegisterType((*InboundHandlerConfig)(nil), "v2ray.core.app.proxyman.InboundHandlerConfig")
-	proto.RegisterType((*OutboundConfig)(nil), "v2ray.core.app.proxyman.OutboundConfig")
-	proto.RegisterType((*SenderConfig)(nil), "v2ray.core.app.proxyman.SenderConfig")
-	proto.RegisterType((*MultiplexingConfig)(nil), "v2ray.core.app.proxyman.MultiplexingConfig")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/proxyman/config.proto", fileDescriptor_b07f45dd938bc1b0)
-}
-
-var fileDescriptor_b07f45dd938bc1b0 = []byte{
-	// 825 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x4f, 0x6f, 0xdb, 0x36,
-	0x18, 0xc6, 0x6b, 0xcb, 0x8d, 0x9d, 0x37, 0x8d, 0xaa, 0xb0, 0x01, 0xaa, 0x79, 0x1b, 0xe0, 0x79,
-	0xc3, 0x6a, 0x74, 0x83, 0xd4, 0xba, 0xd8, 0x61, 0xa7, 0x2d, 0x4d, 0x0a, 0x34, 0xdb, 0x82, 0x78,
-	0xb4, 0xb1, 0x43, 0xb1, 0x41, 0x60, 0x24, 0x46, 0x23, 0x26, 0x91, 0x02, 0x49, 0xbb, 0xd1, 0x57,
-	0xda, 0x79, 0x1f, 0x60, 0xc7, 0x1d, 0xf6, 0xa1, 0x06, 0x89, 0x92, 0xff, 0xd4, 0x56, 0xd6, 0xa0,
-	0x37, 0xda, 0x7a, 0xde, 0x9f, 0xde, 0xf7, 0xe1, 0x43, 0x0a, 0x46, 0x8b, 0xb1, 0x24, 0xb9, 0x17,
-	0x8a, 0xd4, 0x0f, 0x85, 0xa4, 0x3e, 0xc9, 0x32, 0x3f, 0x93, 0xe2, 0x26, 0x4f, 0x09, 0xf7, 0x43,
-	0xc1, 0xaf, 0x59, 0xec, 0x65, 0x52, 0x68, 0x81, 0x1e, 0xd7, 0x4a, 0x49, 0x3d, 0x92, 0x65, 0x5e,
-	0xad, 0xea, 0x3f, 0x79, 0x07, 0x11, 0x8a, 0x34, 0x15, 0xdc, 0xe7, 0x54, 0xfb, 0x24, 0x8a, 0x24,
-	0x55, 0xca, 0x10, 0xfa, 0x5f, 0x34, 0x0b, 0x33, 0x21, 0x75, 0xa5, 0xf2, 0xde, 0x51, 0x69, 0x49,
-	0xb8, 0x2a, 0x9e, 0xfb, 0x8c, 0x6b, 0x2a, 0x0b, 0xf5, 0x7a, 0x5f, 0xfd, 0x67, 0xbb, 0xa9, 0x8a,
-	0x4a, 0x46, 0x12, 0x5f, 0xe7, 0x19, 0x8d, 0x82, 0x94, 0x2a, 0x45, 0x62, 0x6a, 0x2a, 0x86, 0x0f,
-	0xe1, 0xf0, 0x9c, 0x5f, 0x89, 0x39, 0x8f, 0x4e, 0x4b, 0xd0, 0xf0, 0x6f, 0x0b, 0xd0, 0x49, 0x92,
-	0x88, 0x90, 0x68, 0x26, 0xf8, 0x54, 0x4b, 0xa2, 0x69, 0x9c, 0xa3, 0x33, 0xe8, 0x14, 0xe5, 0x6e,
-	0x6b, 0xd0, 0x1a, 0xd9, 0xe3, 0x67, 0x5e, 0x83, 0x01, 0xde, 0x76, 0xa9, 0x37, 0xcb, 0x33, 0x8a,
-	0xcb, 0x6a, 0xf4, 0x07, 0x1c, 0x84, 0x82, 0x87, 0x73, 0x29, 0x29, 0x0f, 0x73, 0xb7, 0x3d, 0x68,
-	0x8d, 0x0e, 0xc6, 0xe7, 0x77, 0x81, 0x6d, 0xff, 0x75, 0xba, 0x02, 0xe2, 0x75, 0x3a, 0x0a, 0xa0,
-	0x2b, 0xe9, 0xb5, 0xa4, 0xea, 0x77, 0xd7, 0x2a, 0x5f, 0xf4, 0xea, 0xc3, 0x5e, 0x84, 0x0d, 0x0c,
-	0xd7, 0xd4, 0xfe, 0x37, 0xf0, 0xe9, 0xad, 0xed, 0xa0, 0x63, 0xb8, 0xbf, 0x20, 0xc9, 0xdc, 0xb8,
-	0x76, 0x88, 0xcd, 0x8f, 0xfe, 0x73, 0xf8, 0xa8, 0x11, 0xbe, 0xbb, 0x64, 0xf8, 0x35, 0x74, 0x0a,
-	0x17, 0x11, 0xc0, 0xde, 0x49, 0xf2, 0x96, 0xe4, 0xca, 0xb9, 0x57, 0xac, 0x31, 0xe1, 0x91, 0x48,
-	0x9d, 0x16, 0x7a, 0x00, 0xbd, 0x57, 0x37, 0x45, 0x20, 0x48, 0xe2, 0xb4, 0x87, 0xbf, 0x81, 0x3d,
-	0xe5, 0xec, 0xfa, 0x9a, 0xf1, 0xd8, 0x6c, 0x2a, 0x72, 0xa1, 0x4b, 0x39, 0xb9, 0x4a, 0x68, 0x54,
-	0x72, 0x7b, 0xb8, 0xfe, 0x89, 0x9e, 0xc3, 0x71, 0x44, 0x95, 0x66, 0xbc, 0xec, 0x26, 0x10, 0x0b,
-	0x2a, 0x25, 0x8b, 0xa8, 0xdb, 0x1e, 0x58, 0xa3, 0x7d, 0xfc, 0x68, 0xed, 0xd9, 0x65, 0xf5, 0x68,
-	0xf8, 0x57, 0x07, 0x6c, 0x4c, 0x43, 0xca, 0x16, 0x54, 0x56, 0xfc, 0xef, 0x00, 0x8a, 0x54, 0x06,
-	0x92, 0xf0, 0xd8, 0xb4, 0x7e, 0x30, 0x1e, 0xac, 0xbb, 0x6d, 0x82, 0xe8, 0x71, 0xaa, 0xbd, 0x89,
-	0x90, 0x1a, 0x17, 0x3a, 0xbc, 0x9f, 0xd5, 0x4b, 0xf4, 0x2d, 0xec, 0x25, 0x4c, 0x69, 0xca, 0xab,
-	0x4c, 0x7c, 0xd6, 0x50, 0x7c, 0x3e, 0xb9, 0x94, 0x67, 0x22, 0x25, 0x8c, 0xe3, 0xaa, 0x00, 0xfd,
-	0x0a, 0x8f, 0xc8, 0xd2, 0xce, 0x40, 0x55, 0x7e, 0x56, 0x5b, 0xfe, 0xd5, 0x1d, 0xb6, 0x1c, 0x23,
-	0xb2, 0x9d, 0xfb, 0x19, 0x3c, 0x54, 0x5a, 0x52, 0x92, 0x06, 0x8a, 0x6a, 0xcd, 0x78, 0xac, 0xdc,
-	0xce, 0x36, 0x79, 0x79, 0x2e, 0xbd, 0xfa, 0x5c, 0x7a, 0xd3, 0xb2, 0xca, 0xf8, 0x83, 0x6d, 0xc3,
-	0x98, 0x56, 0x08, 0xf4, 0x3d, 0x7c, 0x22, 0x8d, 0x83, 0x81, 0x90, 0x2c, 0x66, 0x9c, 0x24, 0xc1,
-	0x9a, 0xd5, 0xee, 0xfd, 0x72, 0x93, 0xfa, 0x95, 0xe6, 0xb2, 0x92, 0x9c, 0xad, 0x14, 0x45, 0x5f,
-	0x51, 0xe9, 0xc3, 0x6a, 0xcb, 0xba, 0x03, 0x6b, 0x64, 0x8f, 0x9f, 0x34, 0x4e, 0xfc, 0x23, 0x17,
-	0x6f, 0xf9, 0xa4, 0x38, 0xf5, 0xa1, 0x48, 0xd4, 0xcb, 0xb6, 0xdb, 0xc2, 0xb6, 0x61, 0xd4, 0x5b,
-	0x8b, 0x66, 0x70, 0xa4, 0xaa, 0xe4, 0xac, 0xe6, 0xed, 0x95, 0xf3, 0x36, 0x73, 0x37, 0xb3, 0x86,
-	0x9d, 0x9a, 0x50, 0x4f, 0xfb, 0x43, 0xa7, 0xb7, 0xe7, 0x74, 0x87, 0xff, 0xb6, 0xe0, 0xb8, 0xba,
-	0x6a, 0x5e, 0x13, 0x1e, 0x25, 0xcb, 0xf0, 0x38, 0x60, 0x69, 0x12, 0x97, 0xa9, 0xd9, 0xc7, 0xc5,
-	0x12, 0x4d, 0xe1, 0xa8, 0x1a, 0x5d, 0xae, 0xda, 0x30, 0xc1, 0xf8, 0x72, 0x47, 0x30, 0xcc, 0xf5,
-	0x56, 0xde, 0x33, 0xd1, 0x85, 0xb9, 0xdd, 0xb0, 0x53, 0x03, 0x96, 0x9e, 0x5f, 0x80, 0x5d, 0xb6,
-	0xbc, 0x22, 0x5a, 0x77, 0x22, 0x1e, 0x96, 0xd5, 0x35, 0x6e, 0xe8, 0x80, 0x7d, 0x39, 0xd7, 0xeb,
-	0x37, 0xe7, 0x3f, 0x6d, 0x78, 0x30, 0xa5, 0x3c, 0x5a, 0x0e, 0xf6, 0x02, 0xac, 0x05, 0x23, 0xd5,
-	0x71, 0x78, 0x8f, 0x44, 0x17, 0xea, 0x5d, 0x81, 0x6b, 0x7f, 0x78, 0xe0, 0x7e, 0x6e, 0x18, 0xfe,
-	0xe9, 0xff, 0x40, 0x27, 0x45, 0x51, 0xc5, 0xdc, 0x34, 0x00, 0xbd, 0x01, 0x94, 0xce, 0x13, 0xcd,
-	0xb2, 0x84, 0xde, 0xdc, 0x7a, 0x38, 0x36, 0xc2, 0x72, 0x51, 0x97, 0xac, 0x02, 0x73, 0xb4, 0xc4,
-	0x2c, 0xcd, 0x9d, 0x00, 0xda, 0x16, 0xde, 0x72, 0x8b, 0x0d, 0xb6, 0xbf, 0x2b, 0x87, 0x1b, 0x1f,
-	0x83, 0xa7, 0x9f, 0x83, 0xbd, 0x99, 0x7f, 0xd4, 0x83, 0xce, 0xeb, 0xd9, 0x6c, 0xe2, 0xdc, 0x43,
-	0x5d, 0xb0, 0x66, 0x3f, 0x4d, 0x9d, 0xd6, 0xcb, 0x53, 0xf8, 0x38, 0x14, 0x69, 0x53, 0xef, 0x93,
-	0xd6, 0x9b, 0x5e, 0xbd, 0xfe, 0xb3, 0xfd, 0xf8, 0x97, 0x31, 0x26, 0xb9, 0x77, 0x5a, 0xa8, 0x4e,
-	0xb2, 0xcc, 0x38, 0x95, 0x12, 0x7e, 0xb5, 0x57, 0x7e, 0x58, 0x5f, 0xfc, 0x17, 0x00, 0x00, 0xff,
-	0xff, 0x4d, 0xe1, 0x89, 0x0d, 0x4e, 0x08, 0x00, 0x00,
+type AllocationStrategy_AllocationStrategyRefresh struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *AllocationStrategy_AllocationStrategyRefresh) Reset() {
+	*x = AllocationStrategy_AllocationStrategyRefresh{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AllocationStrategy_AllocationStrategyRefresh) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AllocationStrategy_AllocationStrategyRefresh) ProtoMessage() {}
+
+func (x *AllocationStrategy_AllocationStrategyRefresh) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_proxyman_config_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AllocationStrategy_AllocationStrategyRefresh.ProtoReflect.Descriptor instead.
+func (*AllocationStrategy_AllocationStrategyRefresh) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP(), []int{1, 1}
+}
+
+func (x *AllocationStrategy_AllocationStrategyRefresh) GetValue() uint32 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+var File_v2ray_com_core_app_proxyman_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_proxyman_config_proto_rawDesc = []byte{
+	0x0a, 0x28, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2f, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79,
+	0x6d, 0x61, 0x6e, 0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,
+	0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61,
+	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d,
+	0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x1a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f,
+	0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f,
+	0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c,
+	0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0f, 0x0a, 0x0d, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xc0, 0x03, 0x0a, 0x12, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x44, 0x0a, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+	0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,
+	0x70, 0x65, 0x12, 0x6b, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63,
+	0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61,
+	0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61,
+	0x74, 0x65, 0x67, 0x79, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+	0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+	0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12,
+	0x5f, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x45, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70,
+	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x41, 0x6c,
+	0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,
+	0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
+	0x1a, 0x35, 0x0a, 0x1d, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
+	0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63,
+	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x31, 0x0a, 0x19, 0x41, 0x6c, 0x6c, 0x6f, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x65, 0x66,
+	0x72, 0x65, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x04, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0a,
+	0x0a, 0x06, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x78,
+	0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x10, 0x02, 0x22, 0x5d, 0x0a, 0x0e, 0x53, 0x6e, 0x69, 0x66,
+	0x66, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e,
+	0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61,
+	0x62, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f,
+	0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0xb4, 0x04, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x65,
+	0x69, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0a, 0x70, 0x6f,
+	0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65,
+	0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6c,
+	0x69, 0x73, 0x74, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x06,
+	0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c,
+	0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,
+	0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61,
+	0x74, 0x65, 0x67, 0x79, 0x12, 0x54, 0x0a, 0x0f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73,
+	0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65,
+	0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64,
+	0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61,
+	0x6c, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f,
+	0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18,
+	0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e,
+	0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x02,
+	0x18, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
+	0x64, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x5f, 0x73,
+	0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70,
+	0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67,
+	0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xcc,
+	0x01, 0x0a, 0x14, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
+	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x53, 0x0a, 0x11, 0x72, 0x65, 0x63,
+	0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e,
+	0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x72, 0x65,
+	0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d,
+	0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61,
+	0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x10, 0x0a,
+	0x0e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22,
+	0xc8, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x33, 0x0a, 0x03, 0x76, 0x69, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+	0x52, 0x03, 0x76, 0x69, 0x61, 0x12, 0x54, 0x0a, 0x0f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f,
+	0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x0e, 0x70,
+	0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
+	0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5a,
+	0x0a, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x73, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x6e,
+	0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c,
+	0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x50, 0x0a, 0x12, 0x4d, 0x75,
+	0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f,
+	0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x2a, 0x23, 0x0a, 0x0e,
+	0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x08,
+	0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x10,
+	0x01, 0x42, 0x43, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e,
+	0x50, 0x01, 0x5a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0xaa, 0x02, 0x17, 0x56,
+	0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x50, 0x72,
+	0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_app_proxyman_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_proxyman_config_proto_rawDescData = file_v2ray_com_core_app_proxyman_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_proxyman_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_proxyman_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_proxyman_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_proxyman_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_proxyman_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_app_proxyman_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_v2ray_com_core_app_proxyman_config_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_v2ray_com_core_app_proxyman_config_proto_goTypes = []interface{}{
+	(KnownProtocols)(0),                                      // 0: v2ray.core.app.proxyman.KnownProtocols
+	(AllocationStrategy_Type)(0),                             // 1: v2ray.core.app.proxyman.AllocationStrategy.Type
+	(*InboundConfig)(nil),                                    // 2: v2ray.core.app.proxyman.InboundConfig
+	(*AllocationStrategy)(nil),                               // 3: v2ray.core.app.proxyman.AllocationStrategy
+	(*SniffingConfig)(nil),                                   // 4: v2ray.core.app.proxyman.SniffingConfig
+	(*ReceiverConfig)(nil),                                   // 5: v2ray.core.app.proxyman.ReceiverConfig
+	(*InboundHandlerConfig)(nil),                             // 6: v2ray.core.app.proxyman.InboundHandlerConfig
+	(*OutboundConfig)(nil),                                   // 7: v2ray.core.app.proxyman.OutboundConfig
+	(*SenderConfig)(nil),                                     // 8: v2ray.core.app.proxyman.SenderConfig
+	(*MultiplexingConfig)(nil),                               // 9: v2ray.core.app.proxyman.MultiplexingConfig
+	(*AllocationStrategy_AllocationStrategyConcurrency)(nil), // 10: v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency
+	(*AllocationStrategy_AllocationStrategyRefresh)(nil),     // 11: v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyRefresh
+	(*net.PortRange)(nil),                                    // 12: v2ray.core.common.net.PortRange
+	(*net.IPOrDomain)(nil),                                   // 13: v2ray.core.common.net.IPOrDomain
+	(*internet.StreamConfig)(nil),                            // 14: v2ray.core.transport.internet.StreamConfig
+	(*serial.TypedMessage)(nil),                              // 15: v2ray.core.common.serial.TypedMessage
+	(*internet.ProxyConfig)(nil),                             // 16: v2ray.core.transport.internet.ProxyConfig
+}
+var file_v2ray_com_core_app_proxyman_config_proto_depIdxs = []int32{
+	1,  // 0: v2ray.core.app.proxyman.AllocationStrategy.type:type_name -> v2ray.core.app.proxyman.AllocationStrategy.Type
+	10, // 1: v2ray.core.app.proxyman.AllocationStrategy.concurrency:type_name -> v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency
+	11, // 2: v2ray.core.app.proxyman.AllocationStrategy.refresh:type_name -> v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyRefresh
+	12, // 3: v2ray.core.app.proxyman.ReceiverConfig.port_range:type_name -> v2ray.core.common.net.PortRange
+	13, // 4: v2ray.core.app.proxyman.ReceiverConfig.listen:type_name -> v2ray.core.common.net.IPOrDomain
+	3,  // 5: v2ray.core.app.proxyman.ReceiverConfig.allocation_strategy:type_name -> v2ray.core.app.proxyman.AllocationStrategy
+	14, // 6: v2ray.core.app.proxyman.ReceiverConfig.stream_settings:type_name -> v2ray.core.transport.internet.StreamConfig
+	0,  // 7: v2ray.core.app.proxyman.ReceiverConfig.domain_override:type_name -> v2ray.core.app.proxyman.KnownProtocols
+	4,  // 8: v2ray.core.app.proxyman.ReceiverConfig.sniffing_settings:type_name -> v2ray.core.app.proxyman.SniffingConfig
+	15, // 9: v2ray.core.app.proxyman.InboundHandlerConfig.receiver_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	15, // 10: v2ray.core.app.proxyman.InboundHandlerConfig.proxy_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	13, // 11: v2ray.core.app.proxyman.SenderConfig.via:type_name -> v2ray.core.common.net.IPOrDomain
+	14, // 12: v2ray.core.app.proxyman.SenderConfig.stream_settings:type_name -> v2ray.core.transport.internet.StreamConfig
+	16, // 13: v2ray.core.app.proxyman.SenderConfig.proxy_settings:type_name -> v2ray.core.transport.internet.ProxyConfig
+	9,  // 14: v2ray.core.app.proxyman.SenderConfig.multiplex_settings:type_name -> v2ray.core.app.proxyman.MultiplexingConfig
+	15, // [15:15] is the sub-list for method output_type
+	15, // [15:15] is the sub-list for method input_type
+	15, // [15:15] is the sub-list for extension type_name
+	15, // [15:15] is the sub-list for extension extendee
+	0,  // [0:15] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_proxyman_config_proto_init() }
+func file_v2ray_com_core_app_proxyman_config_proto_init() {
+	if File_v2ray_com_core_app_proxyman_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InboundConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AllocationStrategy); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SniffingConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReceiverConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InboundHandlerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OutboundConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SenderConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MultiplexingConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AllocationStrategy_AllocationStrategyConcurrency); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_proxyman_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AllocationStrategy_AllocationStrategyRefresh); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_proxyman_config_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   10,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_proxyman_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_proxyman_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_app_proxyman_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_app_proxyman_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_proxyman_config_proto = out.File
+	file_v2ray_com_core_app_proxyman_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_proxyman_config_proto_goTypes = nil
+	file_v2ray_com_core_app_proxyman_config_proto_depIdxs = nil
 }

+ 340 - 173
app/reverse/config.pb.go

@@ -1,21 +1,23 @@
 package reverse
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Control_State int32
 
@@ -24,244 +26,409 @@ const (
 	Control_DRAIN  Control_State = 1
 )
 
-var Control_State_name = map[int32]string{
-	0: "ACTIVE",
-	1: "DRAIN",
-}
+// Enum value maps for Control_State.
+var (
+	Control_State_name = map[int32]string{
+		0: "ACTIVE",
+		1: "DRAIN",
+	}
+	Control_State_value = map[string]int32{
+		"ACTIVE": 0,
+		"DRAIN":  1,
+	}
+)
 
-var Control_State_value = map[string]int32{
-	"ACTIVE": 0,
-	"DRAIN":  1,
+func (x Control_State) Enum() *Control_State {
+	p := new(Control_State)
+	*p = x
+	return p
 }
 
 func (x Control_State) String() string {
-	return proto.EnumName(Control_State_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (Control_State) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_829a0eeb60380cbc, []int{0, 0}
+func (Control_State) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_reverse_config_proto_enumTypes[0].Descriptor()
 }
 
-type Control struct {
-	State                Control_State `protobuf:"varint,1,opt,name=state,proto3,enum=v2ray.core.app.reverse.Control_State" json:"state,omitempty"`
-	Random               []byte        `protobuf:"bytes,99,opt,name=random,proto3" json:"random,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
-	XXX_unrecognized     []byte        `json:"-"`
-	XXX_sizecache        int32         `json:"-"`
+func (Control_State) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_reverse_config_proto_enumTypes[0]
 }
 
-func (m *Control) Reset()         { *m = Control{} }
-func (m *Control) String() string { return proto.CompactTextString(m) }
-func (*Control) ProtoMessage()    {}
-func (*Control) Descriptor() ([]byte, []int) {
-	return fileDescriptor_829a0eeb60380cbc, []int{0}
+func (x Control_State) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *Control) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Control.Unmarshal(m, b)
+// Deprecated: Use Control_State.Descriptor instead.
+func (Control_State) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_reverse_config_proto_rawDescGZIP(), []int{0, 0}
 }
-func (m *Control) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Control.Marshal(b, m, deterministic)
+
+type Control struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State  Control_State `protobuf:"varint,1,opt,name=state,proto3,enum=v2ray.core.app.reverse.Control_State" json:"state,omitempty"`
+	Random []byte        `protobuf:"bytes,99,opt,name=random,proto3" json:"random,omitempty"`
 }
-func (m *Control) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Control.Merge(m, src)
+
+func (x *Control) Reset() {
+	*x = Control{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Control) XXX_Size() int {
-	return xxx_messageInfo_Control.Size(m)
+
+func (x *Control) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Control) XXX_DiscardUnknown() {
-	xxx_messageInfo_Control.DiscardUnknown(m)
+
+func (*Control) ProtoMessage() {}
+
+func (x *Control) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Control proto.InternalMessageInfo
+// Deprecated: Use Control.ProtoReflect.Descriptor instead.
+func (*Control) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_reverse_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Control) GetState() Control_State {
-	if m != nil {
-		return m.State
+func (x *Control) GetState() Control_State {
+	if x != nil {
+		return x.State
 	}
 	return Control_ACTIVE
 }
 
-func (m *Control) GetRandom() []byte {
-	if m != nil {
-		return m.Random
+func (x *Control) GetRandom() []byte {
+	if x != nil {
+		return x.Random
 	}
 	return nil
 }
 
 type BridgeConfig struct {
-	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
-	Domain               string   `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *BridgeConfig) Reset()         { *m = BridgeConfig{} }
-func (m *BridgeConfig) String() string { return proto.CompactTextString(m) }
-func (*BridgeConfig) ProtoMessage()    {}
-func (*BridgeConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_829a0eeb60380cbc, []int{1}
+	Tag    string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
+	Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
 }
 
-func (m *BridgeConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BridgeConfig.Unmarshal(m, b)
-}
-func (m *BridgeConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BridgeConfig.Marshal(b, m, deterministic)
-}
-func (m *BridgeConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BridgeConfig.Merge(m, src)
+func (x *BridgeConfig) Reset() {
+	*x = BridgeConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *BridgeConfig) XXX_Size() int {
-	return xxx_messageInfo_BridgeConfig.Size(m)
+
+func (x *BridgeConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *BridgeConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_BridgeConfig.DiscardUnknown(m)
+
+func (*BridgeConfig) ProtoMessage() {}
+
+func (x *BridgeConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_BridgeConfig proto.InternalMessageInfo
+// Deprecated: Use BridgeConfig.ProtoReflect.Descriptor instead.
+func (*BridgeConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_reverse_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *BridgeConfig) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *BridgeConfig) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *BridgeConfig) GetDomain() string {
-	if m != nil {
-		return m.Domain
+func (x *BridgeConfig) GetDomain() string {
+	if x != nil {
+		return x.Domain
 	}
 	return ""
 }
 
 type PortalConfig struct {
-	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
-	Domain               string   `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *PortalConfig) Reset()         { *m = PortalConfig{} }
-func (m *PortalConfig) String() string { return proto.CompactTextString(m) }
-func (*PortalConfig) ProtoMessage()    {}
-func (*PortalConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_829a0eeb60380cbc, []int{2}
+	Tag    string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
+	Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
 }
 
-func (m *PortalConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PortalConfig.Unmarshal(m, b)
-}
-func (m *PortalConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PortalConfig.Marshal(b, m, deterministic)
-}
-func (m *PortalConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PortalConfig.Merge(m, src)
+func (x *PortalConfig) Reset() {
+	*x = PortalConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *PortalConfig) XXX_Size() int {
-	return xxx_messageInfo_PortalConfig.Size(m)
+
+func (x *PortalConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *PortalConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_PortalConfig.DiscardUnknown(m)
+
+func (*PortalConfig) ProtoMessage() {}
+
+func (x *PortalConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_PortalConfig proto.InternalMessageInfo
+// Deprecated: Use PortalConfig.ProtoReflect.Descriptor instead.
+func (*PortalConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_reverse_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *PortalConfig) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *PortalConfig) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *PortalConfig) GetDomain() string {
-	if m != nil {
-		return m.Domain
+func (x *PortalConfig) GetDomain() string {
+	if x != nil {
+		return x.Domain
 	}
 	return ""
 }
 
 type Config struct {
-	BridgeConfig         []*BridgeConfig `protobuf:"bytes,1,rep,name=bridge_config,json=bridgeConfig,proto3" json:"bridge_config,omitempty"`
-	PortalConfig         []*PortalConfig `protobuf:"bytes,2,rep,name=portal_config,json=portalConfig,proto3" json:"portal_config,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_829a0eeb60380cbc, []int{3}
+	BridgeConfig []*BridgeConfig `protobuf:"bytes,1,rep,name=bridge_config,json=bridgeConfig,proto3" json:"bridge_config,omitempty"`
+	PortalConfig []*PortalConfig `protobuf:"bytes,2,rep,name=portal_config,json=portalConfig,proto3" json:"portal_config,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_reverse_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_reverse_config_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *Config) GetBridgeConfig() []*BridgeConfig {
-	if m != nil {
-		return m.BridgeConfig
+func (x *Config) GetBridgeConfig() []*BridgeConfig {
+	if x != nil {
+		return x.BridgeConfig
 	}
 	return nil
 }
 
-func (m *Config) GetPortalConfig() []*PortalConfig {
-	if m != nil {
-		return m.PortalConfig
+func (x *Config) GetPortalConfig() []*PortalConfig {
+	if x != nil {
+		return x.PortalConfig
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.app.reverse.Control_State", Control_State_name, Control_State_value)
-	proto.RegisterType((*Control)(nil), "v2ray.core.app.reverse.Control")
-	proto.RegisterType((*BridgeConfig)(nil), "v2ray.core.app.reverse.BridgeConfig")
-	proto.RegisterType((*PortalConfig)(nil), "v2ray.core.app.reverse.PortalConfig")
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.reverse.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/reverse/config.proto", fileDescriptor_829a0eeb60380cbc)
-}
-
-var fileDescriptor_829a0eeb60380cbc = []byte{
-	// 310 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0xc1, 0x4b, 0xfb, 0x30,
-	0x14, 0xc7, 0x7f, 0xd9, 0x58, 0xc7, 0xde, 0xaf, 0x93, 0x91, 0xc3, 0xe8, 0x41, 0x64, 0x0c, 0xc5,
-	0x9d, 0x52, 0xa8, 0x17, 0xc1, 0xd3, 0xd6, 0x79, 0xe8, 0x45, 0x46, 0x94, 0x1d, 0xbc, 0x48, 0xd6,
-	0xc5, 0x52, 0x58, 0xfb, 0x42, 0x16, 0x86, 0xbd, 0xf8, 0xa7, 0xf8, 0x07, 0xf8, 0x57, 0x4a, 0xd3,
-	0x14, 0x7a, 0x50, 0xc1, 0xdb, 0x7b, 0xc9, 0xe7, 0xf3, 0xf2, 0x4d, 0x02, 0xd7, 0xa7, 0x48, 0x8b,
-	0x8a, 0xa5, 0x58, 0x84, 0x29, 0x6a, 0x19, 0x0a, 0xa5, 0x42, 0x2d, 0x4f, 0x52, 0x1f, 0x65, 0x98,
-	0x62, 0xf9, 0x9a, 0x67, 0x4c, 0x69, 0x34, 0x48, 0xa7, 0x2d, 0xa8, 0x25, 0x13, 0x4a, 0x31, 0x07,
-	0xcd, 0xdf, 0x61, 0x18, 0x63, 0x69, 0x34, 0x1e, 0xe8, 0x1d, 0x0c, 0x8e, 0x46, 0x18, 0x19, 0x90,
-	0x19, 0x59, 0x9c, 0x45, 0x57, 0xec, 0x7b, 0x85, 0x39, 0x9e, 0x3d, 0xd6, 0x30, 0x6f, 0x1c, 0x3a,
-	0x05, 0x4f, 0x8b, 0x72, 0x8f, 0x45, 0x90, 0xce, 0xc8, 0xc2, 0xe7, 0xae, 0x9b, 0x5f, 0xc0, 0xc0,
-	0x72, 0x14, 0xc0, 0x5b, 0xc6, 0x4f, 0xc9, 0xf6, 0x7e, 0xf2, 0x8f, 0x8e, 0x60, 0xb0, 0xe6, 0xcb,
-	0xe4, 0x61, 0x42, 0xe6, 0xb7, 0xe0, 0xaf, 0x74, 0xbe, 0xcf, 0x64, 0x6c, 0xd3, 0xd2, 0x09, 0xf4,
-	0x8d, 0xc8, 0x6c, 0x84, 0x11, 0xaf, 0xcb, 0x7a, 0xf2, 0x1e, 0x0b, 0x91, 0x97, 0x41, 0xcf, 0x2e,
-	0xba, 0xae, 0x36, 0x37, 0xa8, 0x8d, 0x38, 0xfc, 0xd9, 0xfc, 0x20, 0xe0, 0x39, 0x29, 0x81, 0xf1,
-	0xce, 0x1e, 0xff, 0xd2, 0xbc, 0x56, 0x40, 0x66, 0xfd, 0xc5, 0xff, 0xe8, 0xf2, 0xa7, 0xbb, 0x77,
-	0xb3, 0x72, 0x7f, 0xd7, 0x4d, 0x9e, 0xc0, 0x58, 0xd9, 0x3c, 0xed, 0xa8, 0xde, 0xef, 0xa3, 0xba,
-	0xe1, 0xb9, 0xaf, 0x3a, 0xdd, 0x6a, 0x0d, 0xe7, 0x29, 0x16, 0x5d, 0x51, 0x69, 0x7c, 0xab, 0x5a,
-	0x75, 0x43, 0x9e, 0x87, 0xae, 0xfc, 0xec, 0x05, 0xdb, 0x88, 0x8b, 0x8a, 0xc5, 0x35, 0xb5, 0xb1,
-	0x14, 0x6f, 0xb6, 0x76, 0x9e, 0xfd, 0xf9, 0x9b, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x83,
-	0x30, 0xdb, 0x24, 0x02, 0x00, 0x00,
+var File_v2ray_com_core_app_reverse_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_reverse_config_proto_rawDesc = []byte{
+	0x0a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73,
+	0x65, 0x22, 0x7e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x3b, 0x0a, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76,
+	0x65, 0x72, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61,
+	0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x6e,
+	0x64, 0x6f, 0x6d, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f,
+	0x6d, 0x22, 0x1e, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43,
+	0x54, 0x49, 0x56, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x52, 0x41, 0x49, 0x4e, 0x10,
+	0x01, 0x22, 0x38, 0x0a, 0x0c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x38, 0x0a, 0x0c, 0x50,
+	0x6f, 0x72, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74,
+	0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a,
+	0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
+	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x49, 0x0a, 0x0d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65,
+	0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x62,
+	0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x0d, 0x70,
+	0x6f, 0x72, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x72, 0x74,
+	0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x44, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x72,
+	0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x50, 0x01, 0x5a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73,
+	0x65, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_app_reverse_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_reverse_config_proto_rawDescData = file_v2ray_com_core_app_reverse_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_reverse_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_reverse_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_reverse_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_reverse_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_reverse_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_app_reverse_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_app_reverse_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_v2ray_com_core_app_reverse_config_proto_goTypes = []interface{}{
+	(Control_State)(0),   // 0: v2ray.core.app.reverse.Control.State
+	(*Control)(nil),      // 1: v2ray.core.app.reverse.Control
+	(*BridgeConfig)(nil), // 2: v2ray.core.app.reverse.BridgeConfig
+	(*PortalConfig)(nil), // 3: v2ray.core.app.reverse.PortalConfig
+	(*Config)(nil),       // 4: v2ray.core.app.reverse.Config
+}
+var file_v2ray_com_core_app_reverse_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.app.reverse.Control.state:type_name -> v2ray.core.app.reverse.Control.State
+	2, // 1: v2ray.core.app.reverse.Config.bridge_config:type_name -> v2ray.core.app.reverse.BridgeConfig
+	3, // 2: v2ray.core.app.reverse.Config.portal_config:type_name -> v2ray.core.app.reverse.PortalConfig
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_reverse_config_proto_init() }
+func file_v2ray_com_core_app_reverse_config_proto_init() {
+	if File_v2ray_com_core_app_reverse_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_reverse_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Control); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_reverse_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BridgeConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_reverse_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PortalConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_reverse_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_reverse_config_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_reverse_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_reverse_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_app_reverse_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_app_reverse_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_reverse_config_proto = out.File
+	file_v2ray_com_core_app_reverse_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_reverse_config_proto_goTypes = nil
+	file_v2ray_com_core_app_reverse_config_proto_depIdxs = nil
 }

+ 915 - 528
app/router/config.pb.go

@@ -1,22 +1,24 @@
 package router
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Type of domain value.
 type Domain_Type int32
@@ -32,26 +34,47 @@ const (
 	Domain_Full Domain_Type = 3
 )
 
-var Domain_Type_name = map[int32]string{
-	0: "Plain",
-	1: "Regex",
-	2: "Domain",
-	3: "Full",
-}
+// Enum value maps for Domain_Type.
+var (
+	Domain_Type_name = map[int32]string{
+		0: "Plain",
+		1: "Regex",
+		2: "Domain",
+		3: "Full",
+	}
+	Domain_Type_value = map[string]int32{
+		"Plain":  0,
+		"Regex":  1,
+		"Domain": 2,
+		"Full":   3,
+	}
+)
 
-var Domain_Type_value = map[string]int32{
-	"Plain":  0,
-	"Regex":  1,
-	"Domain": 2,
-	"Full":   3,
+func (x Domain_Type) Enum() *Domain_Type {
+	p := new(Domain_Type)
+	*p = x
+	return p
 }
 
 func (x Domain_Type) String() string {
-	return proto.EnumName(Domain_Type_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Domain_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_router_config_proto_enumTypes[0].Descriptor()
+}
+
+func (Domain_Type) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_router_config_proto_enumTypes[0]
+}
+
+func (x Domain_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
+// Deprecated: Use Domain_Type.Descriptor instead.
 func (Domain_Type) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{0, 0}
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{0, 0}
 }
 
 type Config_DomainStrategy int32
@@ -67,399 +90,384 @@ const (
 	Config_IpOnDemand Config_DomainStrategy = 3
 )
 
-var Config_DomainStrategy_name = map[int32]string{
-	0: "AsIs",
-	1: "UseIp",
-	2: "IpIfNonMatch",
-	3: "IpOnDemand",
-}
+// Enum value maps for Config_DomainStrategy.
+var (
+	Config_DomainStrategy_name = map[int32]string{
+		0: "AsIs",
+		1: "UseIp",
+		2: "IpIfNonMatch",
+		3: "IpOnDemand",
+	}
+	Config_DomainStrategy_value = map[string]int32{
+		"AsIs":         0,
+		"UseIp":        1,
+		"IpIfNonMatch": 2,
+		"IpOnDemand":   3,
+	}
+)
 
-var Config_DomainStrategy_value = map[string]int32{
-	"AsIs":         0,
-	"UseIp":        1,
-	"IpIfNonMatch": 2,
-	"IpOnDemand":   3,
+func (x Config_DomainStrategy) Enum() *Config_DomainStrategy {
+	p := new(Config_DomainStrategy)
+	*p = x
+	return p
 }
 
 func (x Config_DomainStrategy) String() string {
-	return proto.EnumName(Config_DomainStrategy_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Config_DomainStrategy) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_app_router_config_proto_enumTypes[1].Descriptor()
 }
 
+func (Config_DomainStrategy) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_app_router_config_proto_enumTypes[1]
+}
+
+func (x Config_DomainStrategy) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Config_DomainStrategy.Descriptor instead.
 func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{8, 0}
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{8, 0}
 }
 
 // Domain for routing decision.
 type Domain struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Domain matching type.
 	Type Domain_Type `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.router.Domain_Type" json:"type,omitempty"`
 	// Domain value.
 	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 	// Attributes of this domain. May be used for filtering.
-	Attribute            []*Domain_Attribute `protobuf:"bytes,3,rep,name=attribute,proto3" json:"attribute,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
+	Attribute []*Domain_Attribute `protobuf:"bytes,3,rep,name=attribute,proto3" json:"attribute,omitempty"`
 }
 
-func (m *Domain) Reset()         { *m = Domain{} }
-func (m *Domain) String() string { return proto.CompactTextString(m) }
-func (*Domain) ProtoMessage()    {}
-func (*Domain) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{0}
+func (x *Domain) Reset() {
+	*x = Domain{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Domain) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Domain.Unmarshal(m, b)
-}
-func (m *Domain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Domain.Marshal(b, m, deterministic)
-}
-func (m *Domain) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Domain.Merge(m, src)
+func (x *Domain) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Domain) XXX_Size() int {
-	return xxx_messageInfo_Domain.Size(m)
-}
-func (m *Domain) XXX_DiscardUnknown() {
-	xxx_messageInfo_Domain.DiscardUnknown(m)
+
+func (*Domain) ProtoMessage() {}
+
+func (x *Domain) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Domain proto.InternalMessageInfo
+// Deprecated: Use Domain.ProtoReflect.Descriptor instead.
+func (*Domain) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Domain) GetType() Domain_Type {
-	if m != nil {
-		return m.Type
+func (x *Domain) GetType() Domain_Type {
+	if x != nil {
+		return x.Type
 	}
 	return Domain_Plain
 }
 
-func (m *Domain) GetValue() string {
-	if m != nil {
-		return m.Value
+func (x *Domain) GetValue() string {
+	if x != nil {
+		return x.Value
 	}
 	return ""
 }
 
-func (m *Domain) GetAttribute() []*Domain_Attribute {
-	if m != nil {
-		return m.Attribute
+func (x *Domain) GetAttribute() []*Domain_Attribute {
+	if x != nil {
+		return x.Attribute
 	}
 	return nil
 }
 
-type Domain_Attribute struct {
-	Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	// Types that are valid to be assigned to TypedValue:
-	//	*Domain_Attribute_BoolValue
-	//	*Domain_Attribute_IntValue
-	TypedValue           isDomain_Attribute_TypedValue `protobuf_oneof:"typed_value"`
-	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
-	XXX_unrecognized     []byte                        `json:"-"`
-	XXX_sizecache        int32                         `json:"-"`
-}
-
-func (m *Domain_Attribute) Reset()         { *m = Domain_Attribute{} }
-func (m *Domain_Attribute) String() string { return proto.CompactTextString(m) }
-func (*Domain_Attribute) ProtoMessage()    {}
-func (*Domain_Attribute) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{0, 0}
-}
+// IP for routing decision, in CIDR form.
+type CIDR struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Domain_Attribute) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Domain_Attribute.Unmarshal(m, b)
-}
-func (m *Domain_Attribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Domain_Attribute.Marshal(b, m, deterministic)
-}
-func (m *Domain_Attribute) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Domain_Attribute.Merge(m, src)
-}
-func (m *Domain_Attribute) XXX_Size() int {
-	return xxx_messageInfo_Domain_Attribute.Size(m)
-}
-func (m *Domain_Attribute) XXX_DiscardUnknown() {
-	xxx_messageInfo_Domain_Attribute.DiscardUnknown(m)
+	// IP address, should be either 4 or 16 bytes.
+	Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"`
+	// Number of leading ones in the network mask.
+	Prefix uint32 `protobuf:"varint,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
 }
 
-var xxx_messageInfo_Domain_Attribute proto.InternalMessageInfo
-
-func (m *Domain_Attribute) GetKey() string {
-	if m != nil {
-		return m.Key
+func (x *CIDR) Reset() {
+	*x = CIDR{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
 	}
-	return ""
 }
 
-type isDomain_Attribute_TypedValue interface {
-	isDomain_Attribute_TypedValue()
+func (x *CIDR) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-type Domain_Attribute_BoolValue struct {
-	BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"`
-}
+func (*CIDR) ProtoMessage() {}
 
-type Domain_Attribute_IntValue struct {
-	IntValue int64 `protobuf:"varint,3,opt,name=int_value,json=intValue,proto3,oneof"`
+func (x *CIDR) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (*Domain_Attribute_BoolValue) isDomain_Attribute_TypedValue() {}
-
-func (*Domain_Attribute_IntValue) isDomain_Attribute_TypedValue() {}
-
-func (m *Domain_Attribute) GetTypedValue() isDomain_Attribute_TypedValue {
-	if m != nil {
-		return m.TypedValue
-	}
-	return nil
+// Deprecated: Use CIDR.ProtoReflect.Descriptor instead.
+func (*CIDR) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{1}
 }
 
-func (m *Domain_Attribute) GetBoolValue() bool {
-	if x, ok := m.GetTypedValue().(*Domain_Attribute_BoolValue); ok {
-		return x.BoolValue
+func (x *CIDR) GetIp() []byte {
+	if x != nil {
+		return x.Ip
 	}
-	return false
+	return nil
 }
 
-func (m *Domain_Attribute) GetIntValue() int64 {
-	if x, ok := m.GetTypedValue().(*Domain_Attribute_IntValue); ok {
-		return x.IntValue
+func (x *CIDR) GetPrefix() uint32 {
+	if x != nil {
+		return x.Prefix
 	}
 	return 0
 }
 
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*Domain_Attribute) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*Domain_Attribute_BoolValue)(nil),
-		(*Domain_Attribute_IntValue)(nil),
-	}
-}
+type GeoIP struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-// IP for routing decision, in CIDR form.
-type CIDR struct {
-	// IP address, should be either 4 or 16 bytes.
-	Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"`
-	// Number of leading ones in the network mask.
-	Prefix               uint32   `protobuf:"varint,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	CountryCode string  `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	Cidr        []*CIDR `protobuf:"bytes,2,rep,name=cidr,proto3" json:"cidr,omitempty"`
 }
 
-func (m *CIDR) Reset()         { *m = CIDR{} }
-func (m *CIDR) String() string { return proto.CompactTextString(m) }
-func (*CIDR) ProtoMessage()    {}
-func (*CIDR) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{1}
+func (x *GeoIP) Reset() {
+	*x = GeoIP{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *CIDR) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CIDR.Unmarshal(m, b)
+func (x *GeoIP) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *CIDR) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CIDR.Marshal(b, m, deterministic)
-}
-func (m *CIDR) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CIDR.Merge(m, src)
-}
-func (m *CIDR) XXX_Size() int {
-	return xxx_messageInfo_CIDR.Size(m)
-}
-func (m *CIDR) XXX_DiscardUnknown() {
-	xxx_messageInfo_CIDR.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CIDR proto.InternalMessageInfo
 
-func (m *CIDR) GetIp() []byte {
-	if m != nil {
-		return m.Ip
-	}
-	return nil
-}
+func (*GeoIP) ProtoMessage() {}
 
-func (m *CIDR) GetPrefix() uint32 {
-	if m != nil {
-		return m.Prefix
+func (x *GeoIP) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return 0
-}
-
-type GeoIP struct {
-	CountryCode          string   `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
-	Cidr                 []*CIDR  `protobuf:"bytes,2,rep,name=cidr,proto3" json:"cidr,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	return mi.MessageOf(x)
 }
 
-func (m *GeoIP) Reset()         { *m = GeoIP{} }
-func (m *GeoIP) String() string { return proto.CompactTextString(m) }
-func (*GeoIP) ProtoMessage()    {}
+// Deprecated: Use GeoIP.ProtoReflect.Descriptor instead.
 func (*GeoIP) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{2}
-}
-
-func (m *GeoIP) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GeoIP.Unmarshal(m, b)
-}
-func (m *GeoIP) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GeoIP.Marshal(b, m, deterministic)
-}
-func (m *GeoIP) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GeoIP.Merge(m, src)
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{2}
 }
-func (m *GeoIP) XXX_Size() int {
-	return xxx_messageInfo_GeoIP.Size(m)
-}
-func (m *GeoIP) XXX_DiscardUnknown() {
-	xxx_messageInfo_GeoIP.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GeoIP proto.InternalMessageInfo
 
-func (m *GeoIP) GetCountryCode() string {
-	if m != nil {
-		return m.CountryCode
+func (x *GeoIP) GetCountryCode() string {
+	if x != nil {
+		return x.CountryCode
 	}
 	return ""
 }
 
-func (m *GeoIP) GetCidr() []*CIDR {
-	if m != nil {
-		return m.Cidr
+func (x *GeoIP) GetCidr() []*CIDR {
+	if x != nil {
+		return x.Cidr
 	}
 	return nil
 }
 
 type GeoIPList struct {
-	Entry                []*GeoIP `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *GeoIPList) Reset()         { *m = GeoIPList{} }
-func (m *GeoIPList) String() string { return proto.CompactTextString(m) }
-func (*GeoIPList) ProtoMessage()    {}
-func (*GeoIPList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{3}
+	Entry []*GeoIP `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"`
 }
 
-func (m *GeoIPList) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GeoIPList.Unmarshal(m, b)
-}
-func (m *GeoIPList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GeoIPList.Marshal(b, m, deterministic)
-}
-func (m *GeoIPList) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GeoIPList.Merge(m, src)
+func (x *GeoIPList) Reset() {
+	*x = GeoIPList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *GeoIPList) XXX_Size() int {
-	return xxx_messageInfo_GeoIPList.Size(m)
+
+func (x *GeoIPList) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *GeoIPList) XXX_DiscardUnknown() {
-	xxx_messageInfo_GeoIPList.DiscardUnknown(m)
+
+func (*GeoIPList) ProtoMessage() {}
+
+func (x *GeoIPList) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_GeoIPList proto.InternalMessageInfo
+// Deprecated: Use GeoIPList.ProtoReflect.Descriptor instead.
+func (*GeoIPList) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *GeoIPList) GetEntry() []*GeoIP {
-	if m != nil {
-		return m.Entry
+func (x *GeoIPList) GetEntry() []*GeoIP {
+	if x != nil {
+		return x.Entry
 	}
 	return nil
 }
 
 type GeoSite struct {
-	CountryCode          string    `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
-	Domain               []*Domain `protobuf:"bytes,2,rep,name=domain,proto3" json:"domain,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *GeoSite) Reset()         { *m = GeoSite{} }
-func (m *GeoSite) String() string { return proto.CompactTextString(m) }
-func (*GeoSite) ProtoMessage()    {}
-func (*GeoSite) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{4}
+	CountryCode string    `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	Domain      []*Domain `protobuf:"bytes,2,rep,name=domain,proto3" json:"domain,omitempty"`
 }
 
-func (m *GeoSite) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GeoSite.Unmarshal(m, b)
-}
-func (m *GeoSite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GeoSite.Marshal(b, m, deterministic)
-}
-func (m *GeoSite) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GeoSite.Merge(m, src)
+func (x *GeoSite) Reset() {
+	*x = GeoSite{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *GeoSite) XXX_Size() int {
-	return xxx_messageInfo_GeoSite.Size(m)
+
+func (x *GeoSite) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *GeoSite) XXX_DiscardUnknown() {
-	xxx_messageInfo_GeoSite.DiscardUnknown(m)
+
+func (*GeoSite) ProtoMessage() {}
+
+func (x *GeoSite) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_GeoSite proto.InternalMessageInfo
+// Deprecated: Use GeoSite.ProtoReflect.Descriptor instead.
+func (*GeoSite) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *GeoSite) GetCountryCode() string {
-	if m != nil {
-		return m.CountryCode
+func (x *GeoSite) GetCountryCode() string {
+	if x != nil {
+		return x.CountryCode
 	}
 	return ""
 }
 
-func (m *GeoSite) GetDomain() []*Domain {
-	if m != nil {
-		return m.Domain
+func (x *GeoSite) GetDomain() []*Domain {
+	if x != nil {
+		return x.Domain
 	}
 	return nil
 }
 
 type GeoSiteList struct {
-	Entry                []*GeoSite `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *GeoSiteList) Reset()         { *m = GeoSiteList{} }
-func (m *GeoSiteList) String() string { return proto.CompactTextString(m) }
-func (*GeoSiteList) ProtoMessage()    {}
-func (*GeoSiteList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{5}
+	Entry []*GeoSite `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"`
 }
 
-func (m *GeoSiteList) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GeoSiteList.Unmarshal(m, b)
-}
-func (m *GeoSiteList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GeoSiteList.Marshal(b, m, deterministic)
-}
-func (m *GeoSiteList) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GeoSiteList.Merge(m, src)
+func (x *GeoSiteList) Reset() {
+	*x = GeoSiteList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *GeoSiteList) XXX_Size() int {
-	return xxx_messageInfo_GeoSiteList.Size(m)
+
+func (x *GeoSiteList) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *GeoSiteList) XXX_DiscardUnknown() {
-	xxx_messageInfo_GeoSiteList.DiscardUnknown(m)
+
+func (*GeoSiteList) ProtoMessage() {}
+
+func (x *GeoSiteList) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_GeoSiteList proto.InternalMessageInfo
+// Deprecated: Use GeoSiteList.ProtoReflect.Descriptor instead.
+func (*GeoSiteList) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{5}
+}
 
-func (m *GeoSiteList) GetEntry() []*GeoSite {
-	if m != nil {
-		return m.Entry
+func (x *GeoSiteList) GetEntry() []*GeoSite {
+	if x != nil {
+		return x.Entry
 	}
 	return nil
 }
 
 type RoutingRule struct {
-	// Types that are valid to be assigned to TargetTag:
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to TargetTag:
 	//	*RoutingRule_Tag
 	//	*RoutingRule_BalancingTag
 	TargetTag isRoutingRule_TargetTag `protobuf_oneof:"target_tag"`
@@ -467,74 +475,70 @@ type RoutingRule struct {
 	Domain []*Domain `protobuf:"bytes,2,rep,name=domain,proto3" json:"domain,omitempty"`
 	// List of CIDRs for target IP address matching.
 	// Deprecated. Use geoip below.
-	Cidr []*CIDR `protobuf:"bytes,3,rep,name=cidr,proto3" json:"cidr,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	Cidr []*CIDR `protobuf:"bytes,3,rep,name=cidr,proto3" json:"cidr,omitempty"`
 	// List of GeoIPs for target IP address matching. If this entry exists, the cidr above will have no effect.
 	// GeoIP fields with the same country code are supposed to contain exactly same content. They will be merged during runtime.
 	// For customized GeoIPs, please leave country code empty.
 	Geoip []*GeoIP `protobuf:"bytes,10,rep,name=geoip,proto3" json:"geoip,omitempty"`
 	// A range of port [from, to]. If the destination port is in this range, this rule takes effect.
 	// Deprecated. Use port_list.
-	PortRange *net.PortRange `protobuf:"bytes,4,opt,name=port_range,json=portRange,proto3" json:"port_range,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	PortRange *net.PortRange `protobuf:"bytes,4,opt,name=port_range,json=portRange,proto3" json:"port_range,omitempty"`
 	// List of ports.
 	PortList *net.PortList `protobuf:"bytes,14,opt,name=port_list,json=portList,proto3" json:"port_list,omitempty"`
 	// List of networks. Deprecated. Use networks.
-	NetworkList *net.NetworkList `protobuf:"bytes,5,opt,name=network_list,json=networkList,proto3" json:"network_list,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	NetworkList *net.NetworkList `protobuf:"bytes,5,opt,name=network_list,json=networkList,proto3" json:"network_list,omitempty"`
 	// List of networks for matching.
 	Networks []net.Network `protobuf:"varint,13,rep,packed,name=networks,proto3,enum=v2ray.core.common.net.Network" json:"networks,omitempty"`
 	// List of CIDRs for source IP address matching.
-	SourceCidr []*CIDR `protobuf:"bytes,6,rep,name=source_cidr,json=sourceCidr,proto3" json:"source_cidr,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	SourceCidr []*CIDR `protobuf:"bytes,6,rep,name=source_cidr,json=sourceCidr,proto3" json:"source_cidr,omitempty"`
 	// List of GeoIPs for source IP address matching. If this entry exists, the source_cidr above will have no effect.
-	SourceGeoip          []*GeoIP `protobuf:"bytes,11,rep,name=source_geoip,json=sourceGeoip,proto3" json:"source_geoip,omitempty"`
-	UserEmail            []string `protobuf:"bytes,7,rep,name=user_email,json=userEmail,proto3" json:"user_email,omitempty"`
-	InboundTag           []string `protobuf:"bytes,8,rep,name=inbound_tag,json=inboundTag,proto3" json:"inbound_tag,omitempty"`
-	Protocol             []string `protobuf:"bytes,9,rep,name=protocol,proto3" json:"protocol,omitempty"`
-	Attributes           string   `protobuf:"bytes,15,opt,name=attributes,proto3" json:"attributes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *RoutingRule) Reset()         { *m = RoutingRule{} }
-func (m *RoutingRule) String() string { return proto.CompactTextString(m) }
-func (*RoutingRule) ProtoMessage()    {}
-func (*RoutingRule) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{6}
+	SourceGeoip []*GeoIP `protobuf:"bytes,11,rep,name=source_geoip,json=sourceGeoip,proto3" json:"source_geoip,omitempty"`
+	UserEmail   []string `protobuf:"bytes,7,rep,name=user_email,json=userEmail,proto3" json:"user_email,omitempty"`
+	InboundTag  []string `protobuf:"bytes,8,rep,name=inbound_tag,json=inboundTag,proto3" json:"inbound_tag,omitempty"`
+	Protocol    []string `protobuf:"bytes,9,rep,name=protocol,proto3" json:"protocol,omitempty"`
+	Attributes  string   `protobuf:"bytes,15,opt,name=attributes,proto3" json:"attributes,omitempty"`
+}
+
+func (x *RoutingRule) Reset() {
+	*x = RoutingRule{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *RoutingRule) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RoutingRule.Unmarshal(m, b)
-}
-func (m *RoutingRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RoutingRule.Marshal(b, m, deterministic)
-}
-func (m *RoutingRule) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RoutingRule.Merge(m, src)
-}
-func (m *RoutingRule) XXX_Size() int {
-	return xxx_messageInfo_RoutingRule.Size(m)
-}
-func (m *RoutingRule) XXX_DiscardUnknown() {
-	xxx_messageInfo_RoutingRule.DiscardUnknown(m)
+func (x *RoutingRule) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_RoutingRule proto.InternalMessageInfo
+func (*RoutingRule) ProtoMessage() {}
 
-type isRoutingRule_TargetTag interface {
-	isRoutingRule_TargetTag()
-}
-
-type RoutingRule_Tag struct {
-	Tag string `protobuf:"bytes,1,opt,name=tag,proto3,oneof"`
+func (x *RoutingRule) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-type RoutingRule_BalancingTag struct {
-	BalancingTag string `protobuf:"bytes,12,opt,name=balancing_tag,json=balancingTag,proto3,oneof"`
+// Deprecated: Use RoutingRule.ProtoReflect.Descriptor instead.
+func (*RoutingRule) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{6}
 }
 
-func (*RoutingRule_Tag) isRoutingRule_TargetTag() {}
-
-func (*RoutingRule_BalancingTag) isRoutingRule_TargetTag() {}
-
 func (m *RoutingRule) GetTargetTag() isRoutingRule_TargetTag {
 	if m != nil {
 		return m.TargetTag
@@ -542,301 +546,684 @@ func (m *RoutingRule) GetTargetTag() isRoutingRule_TargetTag {
 	return nil
 }
 
-func (m *RoutingRule) GetTag() string {
-	if x, ok := m.GetTargetTag().(*RoutingRule_Tag); ok {
+func (x *RoutingRule) GetTag() string {
+	if x, ok := x.GetTargetTag().(*RoutingRule_Tag); ok {
 		return x.Tag
 	}
 	return ""
 }
 
-func (m *RoutingRule) GetBalancingTag() string {
-	if x, ok := m.GetTargetTag().(*RoutingRule_BalancingTag); ok {
+func (x *RoutingRule) GetBalancingTag() string {
+	if x, ok := x.GetTargetTag().(*RoutingRule_BalancingTag); ok {
 		return x.BalancingTag
 	}
 	return ""
 }
 
-func (m *RoutingRule) GetDomain() []*Domain {
-	if m != nil {
-		return m.Domain
+func (x *RoutingRule) GetDomain() []*Domain {
+	if x != nil {
+		return x.Domain
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *RoutingRule) GetCidr() []*CIDR {
-	if m != nil {
-		return m.Cidr
+func (x *RoutingRule) GetCidr() []*CIDR {
+	if x != nil {
+		return x.Cidr
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetGeoip() []*GeoIP {
-	if m != nil {
-		return m.Geoip
+func (x *RoutingRule) GetGeoip() []*GeoIP {
+	if x != nil {
+		return x.Geoip
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *RoutingRule) GetPortRange() *net.PortRange {
-	if m != nil {
-		return m.PortRange
+func (x *RoutingRule) GetPortRange() *net.PortRange {
+	if x != nil {
+		return x.PortRange
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetPortList() *net.PortList {
-	if m != nil {
-		return m.PortList
+func (x *RoutingRule) GetPortList() *net.PortList {
+	if x != nil {
+		return x.PortList
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *RoutingRule) GetNetworkList() *net.NetworkList {
-	if m != nil {
-		return m.NetworkList
+func (x *RoutingRule) GetNetworkList() *net.NetworkList {
+	if x != nil {
+		return x.NetworkList
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetNetworks() []net.Network {
-	if m != nil {
-		return m.Networks
+func (x *RoutingRule) GetNetworks() []net.Network {
+	if x != nil {
+		return x.Networks
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *RoutingRule) GetSourceCidr() []*CIDR {
-	if m != nil {
-		return m.SourceCidr
+func (x *RoutingRule) GetSourceCidr() []*CIDR {
+	if x != nil {
+		return x.SourceCidr
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetSourceGeoip() []*GeoIP {
-	if m != nil {
-		return m.SourceGeoip
+func (x *RoutingRule) GetSourceGeoip() []*GeoIP {
+	if x != nil {
+		return x.SourceGeoip
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetUserEmail() []string {
-	if m != nil {
-		return m.UserEmail
+func (x *RoutingRule) GetUserEmail() []string {
+	if x != nil {
+		return x.UserEmail
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetInboundTag() []string {
-	if m != nil {
-		return m.InboundTag
+func (x *RoutingRule) GetInboundTag() []string {
+	if x != nil {
+		return x.InboundTag
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetProtocol() []string {
-	if m != nil {
-		return m.Protocol
+func (x *RoutingRule) GetProtocol() []string {
+	if x != nil {
+		return x.Protocol
 	}
 	return nil
 }
 
-func (m *RoutingRule) GetAttributes() string {
-	if m != nil {
-		return m.Attributes
+func (x *RoutingRule) GetAttributes() string {
+	if x != nil {
+		return x.Attributes
 	}
 	return ""
 }
 
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*RoutingRule) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*RoutingRule_Tag)(nil),
-		(*RoutingRule_BalancingTag)(nil),
-	}
+type isRoutingRule_TargetTag interface {
+	isRoutingRule_TargetTag()
 }
 
-type BalancingRule struct {
-	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
-	OutboundSelector     []string `protobuf:"bytes,2,rep,name=outbound_selector,json=outboundSelector,proto3" json:"outbound_selector,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+type RoutingRule_Tag struct {
+	// Tag of outbound that this rule is pointing to.
+	Tag string `protobuf:"bytes,1,opt,name=tag,proto3,oneof"`
 }
 
-func (m *BalancingRule) Reset()         { *m = BalancingRule{} }
-func (m *BalancingRule) String() string { return proto.CompactTextString(m) }
-func (*BalancingRule) ProtoMessage()    {}
-func (*BalancingRule) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{7}
+type RoutingRule_BalancingTag struct {
+	// Tag of routing balancer.
+	BalancingTag string `protobuf:"bytes,12,opt,name=balancing_tag,json=balancingTag,proto3,oneof"`
 }
 
-func (m *BalancingRule) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BalancingRule.Unmarshal(m, b)
-}
-func (m *BalancingRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BalancingRule.Marshal(b, m, deterministic)
+func (*RoutingRule_Tag) isRoutingRule_TargetTag() {}
+
+func (*RoutingRule_BalancingTag) isRoutingRule_TargetTag() {}
+
+type BalancingRule struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Tag              string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
+	OutboundSelector []string `protobuf:"bytes,2,rep,name=outbound_selector,json=outboundSelector,proto3" json:"outbound_selector,omitempty"`
 }
-func (m *BalancingRule) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BalancingRule.Merge(m, src)
+
+func (x *BalancingRule) Reset() {
+	*x = BalancingRule{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *BalancingRule) XXX_Size() int {
-	return xxx_messageInfo_BalancingRule.Size(m)
+
+func (x *BalancingRule) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *BalancingRule) XXX_DiscardUnknown() {
-	xxx_messageInfo_BalancingRule.DiscardUnknown(m)
+
+func (*BalancingRule) ProtoMessage() {}
+
+func (x *BalancingRule) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_BalancingRule proto.InternalMessageInfo
+// Deprecated: Use BalancingRule.ProtoReflect.Descriptor instead.
+func (*BalancingRule) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{7}
+}
 
-func (m *BalancingRule) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *BalancingRule) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *BalancingRule) GetOutboundSelector() []string {
-	if m != nil {
-		return m.OutboundSelector
+func (x *BalancingRule) GetOutboundSelector() []string {
+	if x != nil {
+		return x.OutboundSelector
 	}
 	return nil
 }
 
 type Config struct {
-	DomainStrategy       Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,proto3,enum=v2ray.core.app.router.Config_DomainStrategy" json:"domain_strategy,omitempty"`
-	Rule                 []*RoutingRule        `protobuf:"bytes,2,rep,name=rule,proto3" json:"rule,omitempty"`
-	BalancingRule        []*BalancingRule      `protobuf:"bytes,3,rep,name=balancing_rule,json=balancingRule,proto3" json:"balancing_rule,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
-	XXX_unrecognized     []byte                `json:"-"`
-	XXX_sizecache        int32                 `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,proto3,enum=v2ray.core.app.router.Config_DomainStrategy" json:"domain_strategy,omitempty"`
+	Rule           []*RoutingRule        `protobuf:"bytes,2,rep,name=rule,proto3" json:"rule,omitempty"`
+	BalancingRule  []*BalancingRule      `protobuf:"bytes,3,rep,name=balancing_rule,json=balancingRule,proto3" json:"balancing_rule,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
 func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6b1608360690c5fc, []int{8}
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *Config) GetDomainStrategy() Config_DomainStrategy {
+	if x != nil {
+		return x.DomainStrategy
+	}
+	return Config_AsIs
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+func (x *Config) GetRule() []*RoutingRule {
+	if x != nil {
+		return x.Rule
+	}
+	return nil
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+
+func (x *Config) GetBalancingRule() []*BalancingRule {
+	if x != nil {
+		return x.BalancingRule
+	}
+	return nil
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+type Domain_Attribute struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	// Types that are assignable to TypedValue:
+	//	*Domain_Attribute_BoolValue
+	//	*Domain_Attribute_IntValue
+	TypedValue isDomain_Attribute_TypedValue `protobuf_oneof:"typed_value"`
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Domain_Attribute) Reset() {
+	*x = Domain_Attribute{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (x *Domain_Attribute) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+func (*Domain_Attribute) ProtoMessage() {}
 
-func (m *Config) GetDomainStrategy() Config_DomainStrategy {
-	if m != nil {
-		return m.DomainStrategy
+func (x *Domain_Attribute) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_router_config_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return Config_AsIs
+	return mi.MessageOf(x)
 }
 
-func (m *Config) GetRule() []*RoutingRule {
-	if m != nil {
-		return m.Rule
+// Deprecated: Use Domain_Attribute.ProtoReflect.Descriptor instead.
+func (*Domain_Attribute) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_router_config_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Domain_Attribute) GetKey() string {
+	if x != nil {
+		return x.Key
 	}
-	return nil
+	return ""
 }
 
-func (m *Config) GetBalancingRule() []*BalancingRule {
+func (m *Domain_Attribute) GetTypedValue() isDomain_Attribute_TypedValue {
 	if m != nil {
-		return m.BalancingRule
+		return m.TypedValue
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.app.router.Domain_Type", Domain_Type_name, Domain_Type_value)
-	proto.RegisterEnum("v2ray.core.app.router.Config_DomainStrategy", Config_DomainStrategy_name, Config_DomainStrategy_value)
-	proto.RegisterType((*Domain)(nil), "v2ray.core.app.router.Domain")
-	proto.RegisterType((*Domain_Attribute)(nil), "v2ray.core.app.router.Domain.Attribute")
-	proto.RegisterType((*CIDR)(nil), "v2ray.core.app.router.CIDR")
-	proto.RegisterType((*GeoIP)(nil), "v2ray.core.app.router.GeoIP")
-	proto.RegisterType((*GeoIPList)(nil), "v2ray.core.app.router.GeoIPList")
-	proto.RegisterType((*GeoSite)(nil), "v2ray.core.app.router.GeoSite")
-	proto.RegisterType((*GeoSiteList)(nil), "v2ray.core.app.router.GeoSiteList")
-	proto.RegisterType((*RoutingRule)(nil), "v2ray.core.app.router.RoutingRule")
-	proto.RegisterType((*BalancingRule)(nil), "v2ray.core.app.router.BalancingRule")
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.router.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/router/config.proto", fileDescriptor_6b1608360690c5fc)
-}
-
-var fileDescriptor_6b1608360690c5fc = []byte{
-	// 910 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x5f, 0x8f, 0xdb, 0x44,
-	0x10, 0x3f, 0xdb, 0x49, 0x1a, 0x8f, 0x93, 0xd4, 0xac, 0x28, 0x32, 0x07, 0xd7, 0x0b, 0x56, 0xa1,
-	0x91, 0x40, 0x8e, 0x94, 0x02, 0x0f, 0x08, 0x54, 0x2e, 0xb9, 0x72, 0x17, 0x01, 0xc7, 0x69, 0xaf,
-	0xed, 0x03, 0x3c, 0x44, 0x8e, 0xb3, 0x67, 0xac, 0x3a, 0xbb, 0xab, 0xf5, 0xba, 0x34, 0x5f, 0x09,
-	0x89, 0xcf, 0xc0, 0x47, 0x03, 0xed, 0x9f, 0x24, 0x17, 0x68, 0x8e, 0x13, 0x6f, 0x3b, 0xb3, 0xbf,
-	0xf9, 0xed, 0x6f, 0x67, 0x76, 0x66, 0xe1, 0x93, 0xd7, 0x23, 0x91, 0xae, 0x92, 0x8c, 0x2d, 0x87,
-	0x19, 0x13, 0x64, 0x98, 0x72, 0x3e, 0x14, 0xac, 0x96, 0x44, 0x0c, 0x33, 0x46, 0xaf, 0x8b, 0x3c,
-	0xe1, 0x82, 0x49, 0x86, 0x1e, 0xac, 0x71, 0x82, 0x24, 0x29, 0xe7, 0x89, 0xc1, 0x1c, 0x3e, 0xfa,
-	0x47, 0x78, 0xc6, 0x96, 0x4b, 0x46, 0x87, 0x94, 0xc8, 0x21, 0x67, 0x42, 0x9a, 0xe0, 0xc3, 0xc7,
-	0xfb, 0x51, 0x94, 0xc8, 0xdf, 0x98, 0x78, 0x65, 0x80, 0xf1, 0x9f, 0x2e, 0xb4, 0x4e, 0xd9, 0x32,
-	0x2d, 0x28, 0xfa, 0x12, 0x1a, 0x72, 0xc5, 0x49, 0xe4, 0xf4, 0x9d, 0x41, 0x6f, 0x14, 0x27, 0x6f,
-	0x3d, 0x3f, 0x31, 0xe0, 0xe4, 0xf9, 0x8a, 0x13, 0xac, 0xf1, 0xe8, 0x5d, 0x68, 0xbe, 0x4e, 0xcb,
-	0x9a, 0x44, 0x6e, 0xdf, 0x19, 0xf8, 0xd8, 0x18, 0xe8, 0x19, 0xf8, 0xa9, 0x94, 0xa2, 0x98, 0xd7,
-	0x92, 0x44, 0x5e, 0xdf, 0x1b, 0x04, 0xa3, 0xc7, 0xb7, 0x53, 0x9e, 0xac, 0xe1, 0x78, 0x1b, 0x79,
-	0x58, 0x82, 0xbf, 0xf1, 0xa3, 0x10, 0xbc, 0x57, 0x64, 0xa5, 0x05, 0xfa, 0x58, 0x2d, 0xd1, 0x31,
-	0xc0, 0x9c, 0xb1, 0x72, 0xb6, 0x15, 0xd0, 0x3e, 0x3f, 0xc0, 0xbe, 0xf2, 0xbd, 0xd4, 0x32, 0x8e,
-	0xc0, 0x2f, 0xa8, 0xb4, 0xfb, 0x5e, 0xdf, 0x19, 0x78, 0xe7, 0x07, 0xb8, 0x5d, 0x50, 0xa9, 0xb7,
-	0xc7, 0x5d, 0x08, 0xd4, 0x1d, 0x16, 0x06, 0x10, 0x8f, 0xa0, 0xa1, 0x2e, 0x86, 0x7c, 0x68, 0x5e,
-	0x96, 0x69, 0x41, 0xc3, 0x03, 0xb5, 0xc4, 0x24, 0x27, 0x6f, 0x42, 0x07, 0xc1, 0x3a, 0x55, 0xa1,
-	0x8b, 0xda, 0xd0, 0xf8, 0xae, 0x2e, 0xcb, 0xd0, 0x8b, 0x13, 0x68, 0x4c, 0xa6, 0xa7, 0x18, 0xf5,
-	0xc0, 0x2d, 0xb8, 0xd6, 0xd6, 0xc1, 0x6e, 0xc1, 0xd1, 0x7b, 0xd0, 0xe2, 0x82, 0x5c, 0x17, 0x6f,
-	0xb4, 0xac, 0x2e, 0xb6, 0x56, 0xfc, 0x0b, 0x34, 0xcf, 0x08, 0x9b, 0x5e, 0xa2, 0x8f, 0xa0, 0x93,
-	0xb1, 0x9a, 0x4a, 0xb1, 0x9a, 0x65, 0x6c, 0x41, 0xec, 0xb5, 0x02, 0xeb, 0x9b, 0xb0, 0x05, 0x41,
-	0x43, 0x68, 0x64, 0xc5, 0x42, 0x44, 0xae, 0xce, 0xdf, 0x07, 0x7b, 0xf2, 0xa7, 0x8e, 0xc7, 0x1a,
-	0x18, 0x3f, 0x05, 0x5f, 0x93, 0xff, 0x50, 0x54, 0x12, 0x8d, 0xa0, 0x49, 0x14, 0x55, 0xe4, 0xe8,
-	0xf0, 0x0f, 0xf7, 0x84, 0xeb, 0x00, 0x6c, 0xa0, 0x71, 0x06, 0xf7, 0xce, 0x08, 0xbb, 0x2a, 0x24,
-	0xb9, 0x8b, 0xbe, 0x2f, 0xa0, 0xb5, 0xd0, 0x19, 0xb1, 0x0a, 0x8f, 0x6e, 0xad, 0x30, 0xb6, 0xe0,
-	0x78, 0x02, 0x81, 0x3d, 0x44, 0xeb, 0xfc, 0x7c, 0x57, 0xe7, 0xc3, 0xfd, 0x3a, 0x55, 0xc8, 0x5a,
-	0xe9, 0x5f, 0x4d, 0x08, 0x30, 0xab, 0x65, 0x41, 0x73, 0x5c, 0x97, 0x04, 0x21, 0xf0, 0x64, 0x9a,
-	0x1b, 0x95, 0xe7, 0x07, 0x58, 0x19, 0xe8, 0x63, 0xe8, 0xce, 0xd3, 0x32, 0xa5, 0x59, 0x41, 0xf3,
-	0x99, 0xda, 0xed, 0xd8, 0xdd, 0xce, 0xc6, 0xfd, 0x3c, 0xcd, 0xff, 0xe7, 0x35, 0xd0, 0x13, 0x5b,
-	0x1d, 0xef, 0x3f, 0xab, 0x33, 0x76, 0x23, 0xc7, 0x54, 0x48, 0x15, 0x25, 0x27, 0xac, 0xe0, 0x11,
-	0xdc, 0xa5, 0x28, 0x1a, 0x8a, 0x26, 0x00, 0xaa, 0xb7, 0x67, 0x22, 0xa5, 0x39, 0x89, 0x1a, 0x7d,
-	0x67, 0x10, 0x8c, 0xfa, 0x37, 0x03, 0x4d, 0x7b, 0x27, 0x94, 0xc8, 0xe4, 0x92, 0x09, 0x89, 0x15,
-	0x4e, 0x9f, 0xe9, 0xf3, 0xb5, 0x89, 0xbe, 0x06, 0x6d, 0xcc, 0xca, 0xa2, 0x92, 0x51, 0x4f, 0x73,
-	0x1c, 0xdf, 0xc2, 0xa1, 0x2a, 0x83, 0xdb, 0xdc, 0xae, 0xd0, 0x14, 0x3a, 0x76, 0x70, 0x18, 0x82,
-	0xa6, 0x26, 0x88, 0xf7, 0x10, 0x5c, 0x18, 0xa8, 0x8a, 0xd4, 0x32, 0x02, 0xba, 0x75, 0xa0, 0xaf,
-	0xa0, 0x6d, 0xcd, 0x2a, 0xea, 0xf6, 0xbd, 0x41, 0x6f, 0xb7, 0xe2, 0xff, 0xa6, 0xc1, 0x1b, 0x3c,
-	0xfa, 0x16, 0x82, 0x8a, 0xd5, 0x22, 0x23, 0x33, 0x9d, 0xf9, 0xd6, 0xdd, 0x32, 0x0f, 0x26, 0x66,
-	0xa2, 0xf2, 0xff, 0x14, 0x3a, 0x96, 0xc1, 0x94, 0x21, 0xb8, 0x43, 0x19, 0xec, 0x99, 0x67, 0xba,
-	0x18, 0x47, 0x00, 0x75, 0x45, 0xc4, 0x8c, 0x2c, 0xd3, 0xa2, 0x8c, 0xee, 0xf5, 0xbd, 0x81, 0x8f,
-	0x7d, 0xe5, 0x79, 0xa6, 0x1c, 0xe8, 0x18, 0x82, 0x82, 0xce, 0x59, 0x4d, 0x17, 0xfa, 0xc1, 0xb5,
-	0xf5, 0x3e, 0x58, 0x97, 0x7a, 0x6c, 0x87, 0xd0, 0xd6, 0xa3, 0x37, 0x63, 0x65, 0xe4, 0xeb, 0xdd,
-	0x8d, 0x8d, 0x1e, 0x02, 0x6c, 0x46, 0x5f, 0x15, 0xdd, 0xd7, 0x0d, 0x77, 0xc3, 0x33, 0xee, 0x00,
-	0xc8, 0x54, 0xe4, 0x44, 0x2a, 0xee, 0xf8, 0x02, 0xba, 0xe3, 0xf5, 0x33, 0xd6, 0x2d, 0x10, 0xde,
-	0x68, 0x01, 0xd3, 0x00, 0x9f, 0xc2, 0x3b, 0xac, 0x96, 0x46, 0x4e, 0x45, 0x4a, 0x92, 0x49, 0x66,
-	0xa6, 0x89, 0x8f, 0xc3, 0xf5, 0xc6, 0x95, 0xf5, 0xc7, 0x7f, 0xb8, 0xd0, 0x9a, 0xe8, 0x2f, 0x08,
-	0xbd, 0x80, 0xfb, 0xe6, 0x91, 0xcf, 0x2a, 0x29, 0x52, 0x49, 0xf2, 0x95, 0xfd, 0x16, 0x3e, 0xdb,
-	0x97, 0x6b, 0xf3, 0x75, 0x99, 0x0e, 0xb9, 0xb2, 0x31, 0xb8, 0xb7, 0xd8, 0xb1, 0xd5, 0x17, 0x23,
-	0xea, 0x92, 0xd8, 0x36, 0xdb, 0xf7, 0xc5, 0xdc, 0xe8, 0x6a, 0xac, 0xf1, 0xe8, 0x7b, 0xe8, 0x6d,
-	0xfb, 0x58, 0x33, 0x98, 0x9e, 0x7b, 0xb4, 0x87, 0x61, 0x27, 0x2d, 0x78, 0x3b, 0x03, 0x94, 0x19,
-	0x9f, 0x41, 0x6f, 0x57, 0xa6, 0x1a, 0xe6, 0x27, 0xd5, 0xb4, 0x32, 0xd3, 0xfe, 0x45, 0x45, 0xa6,
-	0x3c, 0x74, 0x50, 0x08, 0x9d, 0x29, 0x9f, 0x5e, 0x5f, 0x30, 0xfa, 0x63, 0x2a, 0xb3, 0x5f, 0x43,
-	0x17, 0xf5, 0x00, 0xa6, 0xfc, 0x27, 0x7a, 0x4a, 0x96, 0x29, 0x5d, 0x84, 0xde, 0xf8, 0x1b, 0x78,
-	0x3f, 0x63, 0xcb, 0xb7, 0x4b, 0xb8, 0x74, 0x7e, 0x6e, 0x99, 0xd5, 0xef, 0xee, 0x83, 0x97, 0x23,
-	0x9c, 0xae, 0x92, 0x89, 0x42, 0x9c, 0x70, 0xae, 0xef, 0x47, 0xc4, 0xbc, 0xa5, 0xcb, 0xfe, 0xe4,
-	0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x3e, 0x38, 0x1b, 0x11, 0x08, 0x00, 0x00,
+func (x *Domain_Attribute) GetBoolValue() bool {
+	if x, ok := x.GetTypedValue().(*Domain_Attribute_BoolValue); ok {
+		return x.BoolValue
+	}
+	return false
+}
+
+func (x *Domain_Attribute) GetIntValue() int64 {
+	if x, ok := x.GetTypedValue().(*Domain_Attribute_IntValue); ok {
+		return x.IntValue
+	}
+	return 0
+}
+
+type isDomain_Attribute_TypedValue interface {
+	isDomain_Attribute_TypedValue()
+}
+
+type Domain_Attribute_BoolValue struct {
+	BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"`
+}
+
+type Domain_Attribute_IntValue struct {
+	IntValue int64 `protobuf:"varint,3,opt,name=int_value,json=intValue,proto3,oneof"`
+}
+
+func (*Domain_Attribute_BoolValue) isDomain_Attribute_TypedValue() {}
+
+func (*Domain_Attribute_IntValue) isDomain_Attribute_TypedValue() {}
+
+var File_v2ray_com_core_app_router_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_router_config_proto_rawDesc = []byte{
+	0x0a, 0x26, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x1a,
+	0x24, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74,
+	0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf,
+	0x02, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e,
+	0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69,
+	0x62, 0x75, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74,
+	0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x65, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x1a, 0x6c,
+	0x0a, 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a,
+	0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d,
+	0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0d, 0x0a,
+	0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x32, 0x0a, 0x04,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x10, 0x00, 0x12,
+	0x09, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x6f,
+	0x6d, 0x61, 0x69, 0x6e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x03,
+	0x22, 0x2e, 0x0a, 0x04, 0x43, 0x49, 0x44, 0x52, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66,
+	0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+	0x22, 0x5b, 0x0a, 0x05, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x04,
+	0x63, 0x69, 0x64, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74,
+	0x65, 0x72, 0x2e, 0x43, 0x49, 0x44, 0x52, 0x52, 0x04, 0x63, 0x69, 0x64, 0x72, 0x22, 0x3f, 0x0a,
+	0x09, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x6e,
+	0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65,
+	0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x63,
+	0x0a, 0x07, 0x47, 0x65, 0x6f, 0x53, 0x69, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x06,
+	0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
+	0x75, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x06, 0x64, 0x6f, 0x6d,
+	0x61, 0x69, 0x6e, 0x22, 0x43, 0x0a, 0x0b, 0x47, 0x65, 0x6f, 0x53, 0x69, 0x74, 0x65, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x53, 0x69, 0x74,
+	0x65, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xff, 0x05, 0x0a, 0x0b, 0x52, 0x6f, 0x75,
+	0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x25, 0x0a, 0x0d,
+	0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x0c, 0x20,
+	0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67,
+	0x54, 0x61, 0x67, 0x12, 0x35, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61,
+	0x69, 0x6e, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x04, 0x63, 0x69,
+	0x64, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72,
+	0x2e, 0x43, 0x49, 0x44, 0x52, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x63, 0x69, 0x64, 0x72, 0x12,
+	0x32, 0x0a, 0x05, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e,
+	0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x05, 0x67, 0x65,
+	0x6f, 0x69, 0x70, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e,
+	0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x70,
+	0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74,
+	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x70, 0x6f,
+	0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,
+	0x6b, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74,
+	0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x0d, 0x20,
+	0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77,
+	0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x40, 0x0a,
+	0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x06, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x49, 0x44, 0x52, 0x42,
+	0x02, 0x18, 0x01, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x69, 0x64, 0x72, 0x12,
+	0x3f, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x18,
+	0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65,
+	0x6f, 0x49, 0x50, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6f, 0x69, 0x70,
+	0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12,
+	0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x08,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67,
+	0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1e, 0x0a, 0x0a,
+	0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a,
+	0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x22, 0x4e, 0x0a, 0x0d, 0x42, 0x61,
+	0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74,
+	0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x2b, 0x0a,
+	0x11, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75,
+	0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xad, 0x02, 0x0a, 0x06, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f,
+	0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e,
+	0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f,
+	0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f,
+	0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x36, 0x0a, 0x04,
+	0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74,
+	0x65, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04,
+	0x72, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x0e, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e,
+	0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
+	0x75, 0x74, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75,
+	0x6c, 0x65, 0x52, 0x0d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c,
+	0x65, 0x22, 0x47, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74,
+	0x65, 0x67, 0x79, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x73, 0x49, 0x73, 0x10, 0x00, 0x12, 0x09, 0x0a,
+	0x05, 0x55, 0x73, 0x65, 0x49, 0x70, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x70, 0x49, 0x66,
+	0x4e, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x70,
+	0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x42, 0x3d, 0x0a, 0x19, 0x63, 0x6f,
+	0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70,
+	0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65,
+	0x72, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41,
+	0x70, 0x70, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
+}
+
+var (
+	file_v2ray_com_core_app_router_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_router_config_proto_rawDescData = file_v2ray_com_core_app_router_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_app_router_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_router_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_router_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_router_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_router_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_app_router_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_v2ray_com_core_app_router_config_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_v2ray_com_core_app_router_config_proto_goTypes = []interface{}{
+	(Domain_Type)(0),           // 0: v2ray.core.app.router.Domain.Type
+	(Config_DomainStrategy)(0), // 1: v2ray.core.app.router.Config.DomainStrategy
+	(*Domain)(nil),             // 2: v2ray.core.app.router.Domain
+	(*CIDR)(nil),               // 3: v2ray.core.app.router.CIDR
+	(*GeoIP)(nil),              // 4: v2ray.core.app.router.GeoIP
+	(*GeoIPList)(nil),          // 5: v2ray.core.app.router.GeoIPList
+	(*GeoSite)(nil),            // 6: v2ray.core.app.router.GeoSite
+	(*GeoSiteList)(nil),        // 7: v2ray.core.app.router.GeoSiteList
+	(*RoutingRule)(nil),        // 8: v2ray.core.app.router.RoutingRule
+	(*BalancingRule)(nil),      // 9: v2ray.core.app.router.BalancingRule
+	(*Config)(nil),             // 10: v2ray.core.app.router.Config
+	(*Domain_Attribute)(nil),   // 11: v2ray.core.app.router.Domain.Attribute
+	(*net.PortRange)(nil),      // 12: v2ray.core.common.net.PortRange
+	(*net.PortList)(nil),       // 13: v2ray.core.common.net.PortList
+	(*net.NetworkList)(nil),    // 14: v2ray.core.common.net.NetworkList
+	(net.Network)(0),           // 15: v2ray.core.common.net.Network
+}
+var file_v2ray_com_core_app_router_config_proto_depIdxs = []int32{
+	0,  // 0: v2ray.core.app.router.Domain.type:type_name -> v2ray.core.app.router.Domain.Type
+	11, // 1: v2ray.core.app.router.Domain.attribute:type_name -> v2ray.core.app.router.Domain.Attribute
+	3,  // 2: v2ray.core.app.router.GeoIP.cidr:type_name -> v2ray.core.app.router.CIDR
+	4,  // 3: v2ray.core.app.router.GeoIPList.entry:type_name -> v2ray.core.app.router.GeoIP
+	2,  // 4: v2ray.core.app.router.GeoSite.domain:type_name -> v2ray.core.app.router.Domain
+	6,  // 5: v2ray.core.app.router.GeoSiteList.entry:type_name -> v2ray.core.app.router.GeoSite
+	2,  // 6: v2ray.core.app.router.RoutingRule.domain:type_name -> v2ray.core.app.router.Domain
+	3,  // 7: v2ray.core.app.router.RoutingRule.cidr:type_name -> v2ray.core.app.router.CIDR
+	4,  // 8: v2ray.core.app.router.RoutingRule.geoip:type_name -> v2ray.core.app.router.GeoIP
+	12, // 9: v2ray.core.app.router.RoutingRule.port_range:type_name -> v2ray.core.common.net.PortRange
+	13, // 10: v2ray.core.app.router.RoutingRule.port_list:type_name -> v2ray.core.common.net.PortList
+	14, // 11: v2ray.core.app.router.RoutingRule.network_list:type_name -> v2ray.core.common.net.NetworkList
+	15, // 12: v2ray.core.app.router.RoutingRule.networks:type_name -> v2ray.core.common.net.Network
+	3,  // 13: v2ray.core.app.router.RoutingRule.source_cidr:type_name -> v2ray.core.app.router.CIDR
+	4,  // 14: v2ray.core.app.router.RoutingRule.source_geoip:type_name -> v2ray.core.app.router.GeoIP
+	1,  // 15: v2ray.core.app.router.Config.domain_strategy:type_name -> v2ray.core.app.router.Config.DomainStrategy
+	8,  // 16: v2ray.core.app.router.Config.rule:type_name -> v2ray.core.app.router.RoutingRule
+	9,  // 17: v2ray.core.app.router.Config.balancing_rule:type_name -> v2ray.core.app.router.BalancingRule
+	18, // [18:18] is the sub-list for method output_type
+	18, // [18:18] is the sub-list for method input_type
+	18, // [18:18] is the sub-list for extension type_name
+	18, // [18:18] is the sub-list for extension extendee
+	0,  // [0:18] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_app_router_config_proto_init() }
+func file_v2ray_com_core_app_router_config_proto_init() {
+	if File_v2ray_com_core_app_router_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_router_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Domain); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CIDR); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GeoIP); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GeoIPList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GeoSite); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GeoSiteList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RoutingRule); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BalancingRule); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_app_router_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Domain_Attribute); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_v2ray_com_core_app_router_config_proto_msgTypes[6].OneofWrappers = []interface{}{
+		(*RoutingRule_Tag)(nil),
+		(*RoutingRule_BalancingTag)(nil),
+	}
+	file_v2ray_com_core_app_router_config_proto_msgTypes[9].OneofWrappers = []interface{}{
+		(*Domain_Attribute_BoolValue)(nil),
+		(*Domain_Attribute_IntValue)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_router_config_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   10,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_router_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_router_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_app_router_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_app_router_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_router_config_proto = out.File
+	file_v2ray_com_core_app_router_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_router_config_proto_goTypes = nil
+	file_v2ray_com_core_app_router_config_proto_depIdxs = nil
 }

File diff suppressed because it is too large
+ 569 - 317
app/stats/command/command.pb.go


+ 111 - 45
app/stats/config.pb.go

@@ -1,69 +1,135 @@
 package stats
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d494ded44ceaa50d, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_app_stats_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_app_stats_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_app_stats_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+var File_v2ray_com_core_app_stats_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_app_stats_config_proto_rawDesc = []byte{
+	0x0a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x08, 0x0a,
+	0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x3a, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74,
+	0x61, 0x74, 0x73, 0x50, 0x01, 0x5a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0xaa, 0x02, 0x14, 0x56,
+	0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_app_stats_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_app_stats_config_proto_rawDescData = file_v2ray_com_core_app_stats_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.app.stats.Config")
+func file_v2ray_com_core_app_stats_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_app_stats_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_app_stats_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_app_stats_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_app_stats_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/app/stats/config.proto", fileDescriptor_d494ded44ceaa50d)
+var file_v2ray_com_core_app_stats_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_app_stats_config_proto_goTypes = []interface{}{
+	(*Config)(nil), // 0: v2ray.core.app.stats.Config
+}
+var file_v2ray_com_core_app_stats_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_d494ded44ceaa50d = []byte{
-	// 123 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0x2c, 0x28, 0xd0, 0x2f,
-	0x2e, 0x49, 0x2c, 0x29, 0xd6, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f,
-	0xc9, 0x17, 0x12, 0x81, 0x29, 0x2b, 0x4a, 0xd5, 0x4b, 0x2c, 0x28, 0xd0, 0x03, 0x2b, 0x51, 0xe2,
-	0xe0, 0x62, 0x73, 0x06, 0xab, 0x72, 0xb2, 0xe2, 0x92, 0x48, 0xce, 0xcf, 0xd5, 0xc3, 0xa6, 0x2a,
-	0x80, 0x31, 0x8a, 0x15, 0xcc, 0x58, 0xc5, 0x24, 0x12, 0x66, 0x14, 0x94, 0x58, 0xa9, 0xe7, 0x0c,
-	0x92, 0x77, 0x2c, 0x28, 0xd0, 0x0b, 0x06, 0x09, 0x27, 0xb1, 0x81, 0xad, 0x30, 0x06, 0x04, 0x00,
-	0x00, 0xff, 0xff, 0x88, 0x24, 0xc6, 0x41, 0x8b, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_app_stats_config_proto_init() }
+func file_v2ray_com_core_app_stats_config_proto_init() {
+	if File_v2ray_com_core_app_stats_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_app_stats_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_app_stats_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_app_stats_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_app_stats_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_app_stats_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_app_stats_config_proto = out.File
+	file_v2ray_com_core_app_stats_config_proto_rawDesc = nil
+	file_v2ray_com_core_app_stats_config_proto_goTypes = nil
+	file_v2ray_com_core_app_stats_config_proto_depIdxs = nil
 }

+ 110 - 44
common/log/log.pb.go

@@ -1,21 +1,23 @@
 package log
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Severity int32
 
@@ -27,50 +29,114 @@ const (
 	Severity_Debug   Severity = 4
 )
 
-var Severity_name = map[int32]string{
-	0: "Unknown",
-	1: "Error",
-	2: "Warning",
-	3: "Info",
-	4: "Debug",
-}
+// Enum value maps for Severity.
+var (
+	Severity_name = map[int32]string{
+		0: "Unknown",
+		1: "Error",
+		2: "Warning",
+		3: "Info",
+		4: "Debug",
+	}
+	Severity_value = map[string]int32{
+		"Unknown": 0,
+		"Error":   1,
+		"Warning": 2,
+		"Info":    3,
+		"Debug":   4,
+	}
+)
 
-var Severity_value = map[string]int32{
-	"Unknown": 0,
-	"Error":   1,
-	"Warning": 2,
-	"Info":    3,
-	"Debug":   4,
+func (x Severity) Enum() *Severity {
+	p := new(Severity)
+	*p = x
+	return p
 }
 
 func (x Severity) String() string {
-	return proto.EnumName(Severity_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Severity) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_common_log_log_proto_enumTypes[0].Descriptor()
+}
+
+func (Severity) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_common_log_log_proto_enumTypes[0]
 }
 
+func (x Severity) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Severity.Descriptor instead.
 func (Severity) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_903ab33e40dced38, []int{0}
+	return file_v2ray_com_core_common_log_log_proto_rawDescGZIP(), []int{0}
+}
+
+var File_v2ray_com_core_common_log_log_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_log_log_proto_rawDesc = []byte{
+	0x0a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2a, 0x44, 0x0a, 0x08,
+	0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e,
+	0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01,
+	0x12, 0x0b, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a,
+	0x04, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67,
+	0x10, 0x04, 0x42, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x50,
+	0x01, 0x5a, 0x03, 0x6c, 0x6f, 0x67, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43,
+	0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.common.log.Severity", Severity_name, Severity_value)
+var (
+	file_v2ray_com_core_common_log_log_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_log_log_proto_rawDescData = file_v2ray_com_core_common_log_log_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_log_log_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_log_log_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_log_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_log_log_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_log_log_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/log/log.proto", fileDescriptor_903ab33e40dced38)
+var file_v2ray_com_core_common_log_log_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_common_log_log_proto_goTypes = []interface{}{
+	(Severity)(0), // 0: v2ray.core.common.log.Severity
+}
+var file_v2ray_com_core_common_log_log_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_903ab33e40dced38 = []byte{
-	// 178 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2e, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0xcf, 0xc9, 0x4f, 0x07, 0x61, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x51, 0x98,
-	0xa2, 0xa2, 0x54, 0x3d, 0x88, 0x02, 0xbd, 0x9c, 0xfc, 0x74, 0x2d, 0x17, 0x2e, 0x8e, 0xe0, 0xd4,
-	0xb2, 0xd4, 0xa2, 0xcc, 0x92, 0x4a, 0x21, 0x6e, 0x2e, 0xf6, 0xd0, 0xbc, 0xec, 0xbc, 0xfc, 0xf2,
-	0x3c, 0x01, 0x06, 0x21, 0x4e, 0x2e, 0x56, 0xd7, 0xa2, 0xa2, 0xfc, 0x22, 0x01, 0x46, 0x90, 0x78,
-	0x78, 0x62, 0x51, 0x5e, 0x66, 0x5e, 0xba, 0x00, 0x93, 0x10, 0x07, 0x17, 0x8b, 0x67, 0x5e, 0x5a,
-	0xbe, 0x00, 0x33, 0x48, 0x85, 0x4b, 0x6a, 0x52, 0x69, 0xba, 0x00, 0x8b, 0x93, 0x15, 0x97, 0x64,
-	0x72, 0x7e, 0xae, 0x1e, 0x56, 0x2b, 0x02, 0x18, 0xa3, 0x98, 0x73, 0xf2, 0xd3, 0x57, 0x31, 0x89,
-	0x86, 0x19, 0x05, 0x25, 0x56, 0xea, 0x39, 0x83, 0xa4, 0x9d, 0x21, 0xd2, 0x3e, 0xf9, 0xe9, 0x49,
-	0x6c, 0x60, 0xf7, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x69, 0xef, 0x0e, 0xc6, 0x00,
-	0x00, 0x00,
+func init() { file_v2ray_com_core_common_log_log_proto_init() }
+func file_v2ray_com_core_common_log_log_proto_init() {
+	if File_v2ray_com_core_common_log_log_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_log_log_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_log_log_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_log_log_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_common_log_log_proto_enumTypes,
+	}.Build()
+	File_v2ray_com_core_common_log_log_proto = out.File
+	file_v2ray_com_core_common_log_log_proto_rawDesc = nil
+	file_v2ray_com_core_common_log_log_proto_goTypes = nil
+	file_v2ray_com_core_common_log_log_proto_depIdxs = nil
 }

+ 140 - 74
common/net/address.pb.go

@@ -1,67 +1,100 @@
 package net
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Address of a network host. It may be either an IP address or a domain address.
 type IPOrDomain struct {
-	// Types that are valid to be assigned to Address:
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Address:
 	//	*IPOrDomain_Ip
 	//	*IPOrDomain_Domain
-	Address              isIPOrDomain_Address `protobuf_oneof:"address"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	Address isIPOrDomain_Address `protobuf_oneof:"address"`
 }
 
-func (m *IPOrDomain) Reset()         { *m = IPOrDomain{} }
-func (m *IPOrDomain) String() string { return proto.CompactTextString(m) }
-func (*IPOrDomain) ProtoMessage()    {}
-func (*IPOrDomain) Descriptor() ([]byte, []int) {
-	return fileDescriptor_4ba9b4a4304e7c1f, []int{0}
+func (x *IPOrDomain) Reset() {
+	*x = IPOrDomain{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_net_address_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *IPOrDomain) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_IPOrDomain.Unmarshal(m, b)
+func (x *IPOrDomain) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *IPOrDomain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_IPOrDomain.Marshal(b, m, deterministic)
+
+func (*IPOrDomain) ProtoMessage() {}
+
+func (x *IPOrDomain) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_net_address_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *IPOrDomain) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IPOrDomain.Merge(m, src)
+
+// Deprecated: Use IPOrDomain.ProtoReflect.Descriptor instead.
+func (*IPOrDomain) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_net_address_proto_rawDescGZIP(), []int{0}
 }
-func (m *IPOrDomain) XXX_Size() int {
-	return xxx_messageInfo_IPOrDomain.Size(m)
+
+func (m *IPOrDomain) GetAddress() isIPOrDomain_Address {
+	if m != nil {
+		return m.Address
+	}
+	return nil
 }
-func (m *IPOrDomain) XXX_DiscardUnknown() {
-	xxx_messageInfo_IPOrDomain.DiscardUnknown(m)
+
+func (x *IPOrDomain) GetIp() []byte {
+	if x, ok := x.GetAddress().(*IPOrDomain_Ip); ok {
+		return x.Ip
+	}
+	return nil
 }
 
-var xxx_messageInfo_IPOrDomain proto.InternalMessageInfo
+func (x *IPOrDomain) GetDomain() string {
+	if x, ok := x.GetAddress().(*IPOrDomain_Domain); ok {
+		return x.Domain
+	}
+	return ""
+}
 
 type isIPOrDomain_Address interface {
 	isIPOrDomain_Address()
 }
 
 type IPOrDomain_Ip struct {
+	// IP address. Must by either 4 or 16 bytes.
 	Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3,oneof"`
 }
 
 type IPOrDomain_Domain struct {
+	// Domain address.
 	Domain string `protobuf:"bytes,2,opt,name=domain,proto3,oneof"`
 }
 
@@ -69,54 +102,87 @@ func (*IPOrDomain_Ip) isIPOrDomain_Address() {}
 
 func (*IPOrDomain_Domain) isIPOrDomain_Address() {}
 
-func (m *IPOrDomain) GetAddress() isIPOrDomain_Address {
-	if m != nil {
-		return m.Address
-	}
-	return nil
-}
+var File_v2ray_com_core_common_net_address_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_net_address_proto_rawDesc = []byte{
+	0x0a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74,
+	0x22, 0x43, 0x0a, 0x0a, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x10,
+	0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x69, 0x70,
+	0x12, 0x18, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e,
+	0x65, 0x74, 0x50, 0x01, 0x5a, 0x03, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61,
+	0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65,
+	0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_common_net_address_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_net_address_proto_rawDescData = file_v2ray_com_core_common_net_address_proto_rawDesc
+)
 
-func (m *IPOrDomain) GetIp() []byte {
-	if x, ok := m.GetAddress().(*IPOrDomain_Ip); ok {
-		return x.Ip
-	}
-	return nil
+func file_v2ray_com_core_common_net_address_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_net_address_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_net_address_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_net_address_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_net_address_proto_rawDescData
 }
 
-func (m *IPOrDomain) GetDomain() string {
-	if x, ok := m.GetAddress().(*IPOrDomain_Domain); ok {
-		return x.Domain
-	}
-	return ""
+var file_v2ray_com_core_common_net_address_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_net_address_proto_goTypes = []interface{}{
+	(*IPOrDomain)(nil), // 0: v2ray.core.common.net.IPOrDomain
+}
+var file_v2ray_com_core_common_net_address_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*IPOrDomain) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
+func init() { file_v2ray_com_core_common_net_address_proto_init() }
+func file_v2ray_com_core_common_net_address_proto_init() {
+	if File_v2ray_com_core_common_net_address_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_net_address_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IPOrDomain); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_v2ray_com_core_common_net_address_proto_msgTypes[0].OneofWrappers = []interface{}{
 		(*IPOrDomain_Ip)(nil),
 		(*IPOrDomain_Domain)(nil),
 	}
-}
-
-func init() {
-	proto.RegisterType((*IPOrDomain)(nil), "v2ray.core.common.net.IPOrDomain")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/net/address.proto", fileDescriptor_4ba9b4a4304e7c1f)
-}
-
-var fileDescriptor_4ba9b4a4304e7c1f = []byte{
-	// 174 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2f, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0xcf, 0x4b, 0x2d, 0xd1, 0x4f, 0x4c, 0x49, 0x29, 0x4a, 0x2d, 0x2e, 0xd6, 0x2b, 0x28,
-	0xca, 0x2f, 0xc9, 0x17, 0x12, 0x85, 0x29, 0x2c, 0x4a, 0xd5, 0x83, 0x28, 0xd2, 0xcb, 0x4b, 0x2d,
-	0x51, 0x72, 0xe6, 0xe2, 0xf2, 0x0c, 0xf0, 0x2f, 0x72, 0xc9, 0xcf, 0x4d, 0xcc, 0xcc, 0x13, 0x12,
-	0xe0, 0x62, 0xca, 0x2c, 0x90, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0xf1, 0x60, 0x08, 0x62, 0xca, 0x2c,
-	0x10, 0x92, 0xe0, 0x62, 0x4b, 0x01, 0xcb, 0x49, 0x30, 0x29, 0x30, 0x6a, 0x70, 0x7a, 0x30, 0x04,
-	0x41, 0xf9, 0x4e, 0x9c, 0x5c, 0xec, 0x50, 0x1b, 0x9c, 0xac, 0xb8, 0x24, 0x93, 0xf3, 0x73, 0xf5,
-	0xb0, 0xda, 0x10, 0xc0, 0x18, 0xc5, 0x9c, 0x97, 0x5a, 0xb2, 0x8a, 0x49, 0x34, 0xcc, 0x28, 0x28,
-	0xb1, 0x52, 0xcf, 0x19, 0x24, 0xed, 0x0c, 0x91, 0xf6, 0x4b, 0x2d, 0x49, 0x62, 0x03, 0x3b, 0xcf,
-	0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xb4, 0xfa, 0x61, 0xc9, 0x00, 0x00, 0x00,
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_net_address_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_net_address_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_net_address_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_common_net_address_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_net_address_proto = out.File
+	file_v2ray_com_core_common_net_address_proto_rawDesc = nil
+	file_v2ray_com_core_common_net_address_proto_goTypes = nil
+	file_v2ray_com_core_common_net_address_proto_depIdxs = nil
 }

+ 147 - 66
common/net/destination.pb.go

@@ -1,101 +1,182 @@
 package net
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Endpoint of a network connection.
 type Endpoint struct {
-	Network              Network     `protobuf:"varint,1,opt,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
-	Address              *IPOrDomain `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
-	Port                 uint32      `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
-	XXX_unrecognized     []byte      `json:"-"`
-	XXX_sizecache        int32       `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Endpoint) Reset()         { *m = Endpoint{} }
-func (m *Endpoint) String() string { return proto.CompactTextString(m) }
-func (*Endpoint) ProtoMessage()    {}
-func (*Endpoint) Descriptor() ([]byte, []int) {
-	return fileDescriptor_77acfe1424029862, []int{0}
+	Network Network     `protobuf:"varint,1,opt,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
+	Address *IPOrDomain `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
+	Port    uint32      `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
 }
 
-func (m *Endpoint) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Endpoint.Unmarshal(m, b)
-}
-func (m *Endpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Endpoint.Marshal(b, m, deterministic)
-}
-func (m *Endpoint) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Endpoint.Merge(m, src)
+func (x *Endpoint) Reset() {
+	*x = Endpoint{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_net_destination_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Endpoint) XXX_Size() int {
-	return xxx_messageInfo_Endpoint.Size(m)
+
+func (x *Endpoint) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Endpoint) XXX_DiscardUnknown() {
-	xxx_messageInfo_Endpoint.DiscardUnknown(m)
+
+func (*Endpoint) ProtoMessage() {}
+
+func (x *Endpoint) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_net_destination_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Endpoint proto.InternalMessageInfo
+// Deprecated: Use Endpoint.ProtoReflect.Descriptor instead.
+func (*Endpoint) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_net_destination_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Endpoint) GetNetwork() Network {
-	if m != nil {
-		return m.Network
+func (x *Endpoint) GetNetwork() Network {
+	if x != nil {
+		return x.Network
 	}
 	return Network_Unknown
 }
 
-func (m *Endpoint) GetAddress() *IPOrDomain {
-	if m != nil {
-		return m.Address
+func (x *Endpoint) GetAddress() *IPOrDomain {
+	if x != nil {
+		return x.Address
 	}
 	return nil
 }
 
-func (m *Endpoint) GetPort() uint32 {
-	if m != nil {
-		return m.Port
+func (x *Endpoint) GetPort() uint32 {
+	if x != nil {
+		return x.Port
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*Endpoint)(nil), "v2ray.core.common.net.Endpoint")
+var File_v2ray_com_core_common_net_destination_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_net_destination_proto_rawDesc = []byte{
+	0x0a, 0x2b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x73, 0x74,
+	0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x6e, 0x65, 0x74, 0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f,
+	0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x70, 0x6f,
+	0x69, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74,
+	0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x3b, 0x0a,
+	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69,
+	0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f,
+	0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x3a,
+	0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x03, 0x6e,
+	0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e,
+	0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_common_net_destination_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_net_destination_proto_rawDescData = file_v2ray_com_core_common_net_destination_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_net_destination_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_net_destination_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_net_destination_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_net_destination_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_net_destination_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/net/destination.proto", fileDescriptor_77acfe1424029862)
+var file_v2ray_com_core_common_net_destination_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_net_destination_proto_goTypes = []interface{}{
+	(*Endpoint)(nil),   // 0: v2ray.core.common.net.Endpoint
+	(Network)(0),       // 1: v2ray.core.common.net.Network
+	(*IPOrDomain)(nil), // 2: v2ray.core.common.net.IPOrDomain
+}
+var file_v2ray_com_core_common_net_destination_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.common.net.Endpoint.network:type_name -> v2ray.core.common.net.Network
+	2, // 1: v2ray.core.common.net.Endpoint.address:type_name -> v2ray.core.common.net.IPOrDomain
+	2, // [2:2] is the sub-list for method output_type
+	2, // [2:2] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
 }
 
-var fileDescriptor_77acfe1424029862 = []byte{
-	// 230 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2e, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0xcf, 0x4b, 0x2d, 0xd1, 0x4f, 0x49, 0x2d, 0x2e, 0xc9, 0xcc, 0x4b, 0x2c, 0xc9, 0xcc,
-	0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x85, 0x29, 0x2e, 0x4a, 0xd5, 0x83, 0x28,
-	0xd4, 0xcb, 0x4b, 0x2d, 0x91, 0x52, 0xc7, 0x6d, 0x46, 0x5e, 0x6a, 0x49, 0x79, 0x7e, 0x51, 0x36,
-	0x44, 0x3f, 0x3e, 0x85, 0x89, 0x29, 0x29, 0x45, 0xa9, 0xc5, 0xc5, 0x10, 0x85, 0x4a, 0x53, 0x19,
-	0xb9, 0x38, 0x5c, 0xf3, 0x52, 0x0a, 0xf2, 0x33, 0xf3, 0x4a, 0x84, 0x2c, 0xb8, 0xd8, 0xa1, 0xc6,
-	0x48, 0x30, 0x2a, 0x30, 0x6a, 0xf0, 0x19, 0xc9, 0xe9, 0x61, 0x75, 0x87, 0x9e, 0x1f, 0x44, 0x55,
-	0x10, 0x4c, 0xb9, 0x90, 0x35, 0x17, 0x3b, 0xd4, 0x5c, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x6e, 0x23,
-	0x45, 0x1c, 0x3a, 0x3d, 0x03, 0xfc, 0x8b, 0x5c, 0xf2, 0x73, 0x13, 0x33, 0xf3, 0x82, 0x60, 0x3a,
-	0x84, 0x84, 0xb8, 0x58, 0x0a, 0xf2, 0x8b, 0x4a, 0x24, 0x98, 0x15, 0x18, 0x35, 0x78, 0x83, 0xc0,
-	0x6c, 0x27, 0x2b, 0x2e, 0xc9, 0xe4, 0xfc, 0x5c, 0xec, 0x86, 0x04, 0x30, 0x46, 0x31, 0xe7, 0xa5,
-	0x96, 0xac, 0x62, 0x12, 0x0d, 0x33, 0x0a, 0x4a, 0xac, 0xd4, 0x73, 0x06, 0x49, 0x3b, 0x43, 0xa4,
-	0xfd, 0x52, 0x4b, 0x92, 0xd8, 0xc0, 0x5e, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x75, 0xe4,
-	0xce, 0x58, 0x72, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_common_net_destination_proto_init() }
+func file_v2ray_com_core_common_net_destination_proto_init() {
+	if File_v2ray_com_core_common_net_destination_proto != nil {
+		return
+	}
+	file_v2ray_com_core_common_net_network_proto_init()
+	file_v2ray_com_core_common_net_address_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_net_destination_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Endpoint); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_net_destination_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_net_destination_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_net_destination_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_common_net_destination_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_net_destination_proto = out.File
+	file_v2ray_com_core_common_net_destination_proto_rawDesc = nil
+	file_v2ray_com_core_common_net_destination_proto_goTypes = nil
+	file_v2ray_com_core_common_net_destination_proto_depIdxs = nil
 }

+ 168 - 73
common/net/network.pb.go

@@ -1,115 +1,210 @@
 package net
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Network int32
 
 const (
 	Network_Unknown Network = 0
-	Network_RawTCP  Network = 1 // Deprecated: Do not use.
-	Network_TCP     Network = 2
-	Network_UDP     Network = 3
+	// Deprecated: Do not use.
+	Network_RawTCP Network = 1
+	Network_TCP    Network = 2
+	Network_UDP    Network = 3
 )
 
-var Network_name = map[int32]string{
-	0: "Unknown",
-	1: "RawTCP",
-	2: "TCP",
-	3: "UDP",
-}
+// Enum value maps for Network.
+var (
+	Network_name = map[int32]string{
+		0: "Unknown",
+		1: "RawTCP",
+		2: "TCP",
+		3: "UDP",
+	}
+	Network_value = map[string]int32{
+		"Unknown": 0,
+		"RawTCP":  1,
+		"TCP":     2,
+		"UDP":     3,
+	}
+)
 
-var Network_value = map[string]int32{
-	"Unknown": 0,
-	"RawTCP":  1,
-	"TCP":     2,
-	"UDP":     3,
+func (x Network) Enum() *Network {
+	p := new(Network)
+	*p = x
+	return p
 }
 
 func (x Network) String() string {
-	return proto.EnumName(Network_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (Network) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_6a103d5ccb9e785e, []int{0}
+func (Network) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_common_net_network_proto_enumTypes[0].Descriptor()
 }
 
-// NetworkList is a list of Networks.
-type NetworkList struct {
-	Network              []Network `protobuf:"varint,1,rep,packed,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
+func (Network) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_common_net_network_proto_enumTypes[0]
 }
 
-func (m *NetworkList) Reset()         { *m = NetworkList{} }
-func (m *NetworkList) String() string { return proto.CompactTextString(m) }
-func (*NetworkList) ProtoMessage()    {}
-func (*NetworkList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6a103d5ccb9e785e, []int{0}
+func (x Network) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *NetworkList) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NetworkList.Unmarshal(m, b)
+// Deprecated: Use Network.Descriptor instead.
+func (Network) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_net_network_proto_rawDescGZIP(), []int{0}
 }
-func (m *NetworkList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NetworkList.Marshal(b, m, deterministic)
+
+// NetworkList is a list of Networks.
+type NetworkList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Network []Network `protobuf:"varint,1,rep,packed,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
 }
-func (m *NetworkList) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NetworkList.Merge(m, src)
+
+func (x *NetworkList) Reset() {
+	*x = NetworkList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_net_network_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *NetworkList) XXX_Size() int {
-	return xxx_messageInfo_NetworkList.Size(m)
+
+func (x *NetworkList) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *NetworkList) XXX_DiscardUnknown() {
-	xxx_messageInfo_NetworkList.DiscardUnknown(m)
+
+func (*NetworkList) ProtoMessage() {}
+
+func (x *NetworkList) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_net_network_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_NetworkList proto.InternalMessageInfo
+// Deprecated: Use NetworkList.ProtoReflect.Descriptor instead.
+func (*NetworkList) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_net_network_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *NetworkList) GetNetwork() []Network {
-	if m != nil {
-		return m.Network
+func (x *NetworkList) GetNetwork() []Network {
+	if x != nil {
+		return x.Network
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.common.net.Network", Network_name, Network_value)
-	proto.RegisterType((*NetworkList)(nil), "v2ray.core.common.net.NetworkList")
+var File_v2ray_com_core_common_net_network_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_net_network_proto_rawDesc = []byte{
+	0x0a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77,
+	0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74,
+	0x22, 0x47, 0x0a, 0x0b, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x38, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e,
+	0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+	0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2a, 0x38, 0x0a, 0x07, 0x4e, 0x65, 0x74,
+	0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10,
+	0x00, 0x12, 0x0e, 0x0a, 0x06, 0x52, 0x61, 0x77, 0x54, 0x43, 0x50, 0x10, 0x01, 0x1a, 0x02, 0x08,
+	0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44,
+	0x50, 0x10, 0x03, 0x42, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74,
+	0x50, 0x01, 0x5a, 0x03, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e,
+	0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/net/network.proto", fileDescriptor_6a103d5ccb9e785e)
+var (
+	file_v2ray_com_core_common_net_network_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_net_network_proto_rawDescData = file_v2ray_com_core_common_net_network_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_net_network_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_net_network_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_net_network_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_net_network_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_net_network_proto_rawDescData
 }
 
-var fileDescriptor_6a103d5ccb9e785e = []byte{
-	// 198 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2f, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0xcf, 0x4b, 0x2d, 0x01, 0xe1, 0xf2, 0xfc, 0xa2, 0x6c, 0xbd, 0x82, 0xa2, 0xfc, 0x92,
-	0x7c, 0x21, 0x51, 0x98, 0xc2, 0xa2, 0x54, 0x3d, 0x88, 0x22, 0xbd, 0xbc, 0xd4, 0x12, 0x25, 0x77,
-	0x2e, 0x6e, 0x3f, 0x88, 0x3a, 0x9f, 0xcc, 0xe2, 0x12, 0x21, 0x0b, 0x2e, 0x76, 0xa8, 0x36, 0x09,
-	0x46, 0x05, 0x66, 0x0d, 0x3e, 0x23, 0x39, 0x3d, 0xac, 0xfa, 0xf4, 0xa0, 0x9a, 0x82, 0x60, 0xca,
-	0xb5, 0x2c, 0xb8, 0xd8, 0xa1, 0x62, 0x42, 0xdc, 0x5c, 0xec, 0xa1, 0x79, 0xd9, 0x79, 0xf9, 0xe5,
-	0x79, 0x02, 0x0c, 0x42, 0x7c, 0x5c, 0x6c, 0x41, 0x89, 0xe5, 0x21, 0xce, 0x01, 0x02, 0x8c, 0x52,
-	0x4c, 0x1c, 0x8c, 0x42, 0xec, 0x5c, 0xcc, 0x20, 0x0e, 0x13, 0x88, 0x11, 0xea, 0x12, 0x20, 0xc0,
-	0xec, 0x64, 0xc5, 0x25, 0x99, 0x9c, 0x9f, 0x8b, 0xdd, 0x9e, 0x00, 0xc6, 0x28, 0xe6, 0xbc, 0xd4,
-	0x92, 0x55, 0x4c, 0xa2, 0x61, 0x46, 0x41, 0x89, 0x95, 0x7a, 0xce, 0x20, 0x69, 0x67, 0x88, 0xb4,
-	0x5f, 0x6a, 0x49, 0x12, 0x1b, 0xd8, 0x73, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xef, 0x75,
-	0xd9, 0x5b, 0x07, 0x01, 0x00, 0x00,
+var file_v2ray_com_core_common_net_network_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_common_net_network_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_net_network_proto_goTypes = []interface{}{
+	(Network)(0),        // 0: v2ray.core.common.net.Network
+	(*NetworkList)(nil), // 1: v2ray.core.common.net.NetworkList
+}
+var file_v2ray_com_core_common_net_network_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.common.net.NetworkList.network:type_name -> v2ray.core.common.net.Network
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_common_net_network_proto_init() }
+func file_v2ray_com_core_common_net_network_proto_init() {
+	if File_v2ray_com_core_common_net_network_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_net_network_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NetworkList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_net_network_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_net_network_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_net_network_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_common_net_network_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_common_net_network_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_net_network_proto = out.File
+	file_v2ray_com_core_common_net_network_proto_rawDesc = nil
+	file_v2ray_com_core_common_net_network_proto_goTypes = nil
+	file_v2ray_com_core_common_net_network_proto_depIdxs = nil
 }

+ 176 - 85
common/net/port.pb.go

@@ -1,133 +1,224 @@
 package net
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // PortRange represents a range of ports.
 type PortRange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// The port that this range starts from.
 	From uint32 `protobuf:"varint,1,opt,name=From,proto3" json:"From,omitempty"`
 	// The port that this range ends with (inclusive).
-	To                   uint32   `protobuf:"varint,2,opt,name=To,proto3" json:"To,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	To uint32 `protobuf:"varint,2,opt,name=To,proto3" json:"To,omitempty"`
 }
 
-func (m *PortRange) Reset()         { *m = PortRange{} }
-func (m *PortRange) String() string { return proto.CompactTextString(m) }
-func (*PortRange) ProtoMessage()    {}
-func (*PortRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_166067e37a39f913, []int{0}
+func (x *PortRange) Reset() {
+	*x = PortRange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_net_port_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *PortRange) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PortRange.Unmarshal(m, b)
-}
-func (m *PortRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PortRange.Marshal(b, m, deterministic)
-}
-func (m *PortRange) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PortRange.Merge(m, src)
-}
-func (m *PortRange) XXX_Size() int {
-	return xxx_messageInfo_PortRange.Size(m)
+func (x *PortRange) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *PortRange) XXX_DiscardUnknown() {
-	xxx_messageInfo_PortRange.DiscardUnknown(m)
+
+func (*PortRange) ProtoMessage() {}
+
+func (x *PortRange) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_net_port_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_PortRange proto.InternalMessageInfo
+// Deprecated: Use PortRange.ProtoReflect.Descriptor instead.
+func (*PortRange) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_net_port_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *PortRange) GetFrom() uint32 {
-	if m != nil {
-		return m.From
+func (x *PortRange) GetFrom() uint32 {
+	if x != nil {
+		return x.From
 	}
 	return 0
 }
 
-func (m *PortRange) GetTo() uint32 {
-	if m != nil {
-		return m.To
+func (x *PortRange) GetTo() uint32 {
+	if x != nil {
+		return x.To
 	}
 	return 0
 }
 
 // PortList is a list of ports.
 type PortList struct {
-	Range                []*PortRange `protobuf:"bytes,1,rep,name=range,proto3" json:"range,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *PortList) Reset()         { *m = PortList{} }
-func (m *PortList) String() string { return proto.CompactTextString(m) }
-func (*PortList) ProtoMessage()    {}
-func (*PortList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_166067e37a39f913, []int{1}
+	Range []*PortRange `protobuf:"bytes,1,rep,name=range,proto3" json:"range,omitempty"`
 }
 
-func (m *PortList) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PortList.Unmarshal(m, b)
-}
-func (m *PortList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PortList.Marshal(b, m, deterministic)
-}
-func (m *PortList) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PortList.Merge(m, src)
+func (x *PortList) Reset() {
+	*x = PortList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_net_port_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *PortList) XXX_Size() int {
-	return xxx_messageInfo_PortList.Size(m)
+
+func (x *PortList) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *PortList) XXX_DiscardUnknown() {
-	xxx_messageInfo_PortList.DiscardUnknown(m)
+
+func (*PortList) ProtoMessage() {}
+
+func (x *PortList) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_net_port_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_PortList proto.InternalMessageInfo
+// Deprecated: Use PortList.ProtoReflect.Descriptor instead.
+func (*PortList) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_net_port_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *PortList) GetRange() []*PortRange {
-	if m != nil {
-		return m.Range
+func (x *PortList) GetRange() []*PortRange {
+	if x != nil {
+		return x.Range
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*PortRange)(nil), "v2ray.core.common.net.PortRange")
-	proto.RegisterType((*PortList)(nil), "v2ray.core.common.net.PortList")
+var File_v2ray_com_core_common_net_port_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_net_port_proto_rawDesc = []byte{
+	0x0a, 0x24, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6f, 0x72, 0x74,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x22, 0x2f, 0x0a,
+	0x09, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x72,
+	0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x0e,
+	0x0a, 0x02, 0x54, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x54, 0x6f, 0x22, 0x42,
+	0x0a, 0x08, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x61,
+	0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65,
+	0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e,
+	0x67, 0x65, 0x42, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x50,
+	0x01, 0x5a, 0x03, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43,
+	0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_common_net_port_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_net_port_proto_rawDescData = file_v2ray_com_core_common_net_port_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_net_port_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_net_port_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_net_port_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_net_port_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_net_port_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/net/port.proto", fileDescriptor_166067e37a39f913)
+var file_v2ray_com_core_common_net_port_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_v2ray_com_core_common_net_port_proto_goTypes = []interface{}{
+	(*PortRange)(nil), // 0: v2ray.core.common.net.PortRange
+	(*PortList)(nil),  // 1: v2ray.core.common.net.PortList
+}
+var file_v2ray_com_core_common_net_port_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.common.net.PortList.range:type_name -> v2ray.core.common.net.PortRange
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_166067e37a39f913 = []byte{
-	// 192 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x29, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0xcf, 0x4b, 0x2d, 0xd1, 0x2f, 0xc8, 0x2f, 0x2a, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9,
-	0x17, 0x12, 0x85, 0xa9, 0x2a, 0x4a, 0xd5, 0x83, 0xa8, 0xd0, 0xcb, 0x4b, 0x2d, 0x51, 0xd2, 0xe7,
-	0xe2, 0x0c, 0xc8, 0x2f, 0x2a, 0x09, 0x4a, 0xcc, 0x4b, 0x4f, 0x15, 0x12, 0xe2, 0x62, 0x71, 0x2b,
-	0xca, 0xcf, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0d, 0x02, 0xb3, 0x85, 0xf8, 0xb8, 0x98, 0x42,
-	0xf2, 0x25, 0x98, 0xc0, 0x22, 0x4c, 0x21, 0xf9, 0x4a, 0x4e, 0x5c, 0x1c, 0x20, 0x0d, 0x3e, 0x99,
-	0xc5, 0x25, 0x42, 0x66, 0x5c, 0xac, 0x45, 0x20, 0x8d, 0x12, 0x8c, 0x0a, 0xcc, 0x1a, 0xdc, 0x46,
-	0x0a, 0x7a, 0x58, 0xed, 0xd0, 0x83, 0x5b, 0x10, 0x04, 0x51, 0xee, 0x64, 0xc5, 0x25, 0x99, 0x9c,
-	0x9f, 0x8b, 0x5d, 0x75, 0x00, 0x63, 0x14, 0x73, 0x5e, 0x6a, 0xc9, 0x2a, 0x26, 0xd1, 0x30, 0xa3,
-	0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0xb4, 0x33, 0x44, 0xda, 0x2f, 0xb5, 0x24, 0x89, 0x0d, 0xec,
-	0x1d, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xba, 0xd0, 0x7b, 0xfa, 0xf6, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_common_net_port_proto_init() }
+func file_v2ray_com_core_common_net_port_proto_init() {
+	if File_v2ray_com_core_common_net_port_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_net_port_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PortRange); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_common_net_port_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PortList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_net_port_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_net_port_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_net_port_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_common_net_port_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_net_port_proto = out.File
+	file_v2ray_com_core_common_net_port_proto_rawDesc = nil
+	file_v2ray_com_core_common_net_port_proto_goTypes = nil
+	file_v2ray_com_core_common_net_port_proto_depIdxs = nil
 }

+ 176 - 80
common/protocol/headers.pb.go

@@ -1,21 +1,23 @@
 package protocol
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type SecurityType int32
 
@@ -28,96 +30,190 @@ const (
 	SecurityType_NONE              SecurityType = 5
 )
 
-var SecurityType_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "LEGACY",
-	2: "AUTO",
-	3: "AES128_GCM",
-	4: "CHACHA20_POLY1305",
-	5: "NONE",
-}
+// Enum value maps for SecurityType.
+var (
+	SecurityType_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "LEGACY",
+		2: "AUTO",
+		3: "AES128_GCM",
+		4: "CHACHA20_POLY1305",
+		5: "NONE",
+	}
+	SecurityType_value = map[string]int32{
+		"UNKNOWN":           0,
+		"LEGACY":            1,
+		"AUTO":              2,
+		"AES128_GCM":        3,
+		"CHACHA20_POLY1305": 4,
+		"NONE":              5,
+	}
+)
 
-var SecurityType_value = map[string]int32{
-	"UNKNOWN":           0,
-	"LEGACY":            1,
-	"AUTO":              2,
-	"AES128_GCM":        3,
-	"CHACHA20_POLY1305": 4,
-	"NONE":              5,
+func (x SecurityType) Enum() *SecurityType {
+	p := new(SecurityType)
+	*p = x
+	return p
 }
 
 func (x SecurityType) String() string {
-	return proto.EnumName(SecurityType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (SecurityType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_5931f958a3c1d408, []int{0}
+func (SecurityType) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_common_protocol_headers_proto_enumTypes[0].Descriptor()
 }
 
-type SecurityConfig struct {
-	Type                 SecurityType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.common.protocol.SecurityType" json:"type,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+func (SecurityType) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_common_protocol_headers_proto_enumTypes[0]
 }
 
-func (m *SecurityConfig) Reset()         { *m = SecurityConfig{} }
-func (m *SecurityConfig) String() string { return proto.CompactTextString(m) }
-func (*SecurityConfig) ProtoMessage()    {}
-func (*SecurityConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5931f958a3c1d408, []int{0}
+func (x SecurityType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *SecurityConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SecurityConfig.Unmarshal(m, b)
+// Deprecated: Use SecurityType.Descriptor instead.
+func (SecurityType) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_protocol_headers_proto_rawDescGZIP(), []int{0}
 }
-func (m *SecurityConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SecurityConfig.Marshal(b, m, deterministic)
+
+type SecurityConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Type SecurityType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.common.protocol.SecurityType" json:"type,omitempty"`
 }
-func (m *SecurityConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SecurityConfig.Merge(m, src)
+
+func (x *SecurityConfig) Reset() {
+	*x = SecurityConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_protocol_headers_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *SecurityConfig) XXX_Size() int {
-	return xxx_messageInfo_SecurityConfig.Size(m)
+
+func (x *SecurityConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *SecurityConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SecurityConfig.DiscardUnknown(m)
+
+func (*SecurityConfig) ProtoMessage() {}
+
+func (x *SecurityConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_protocol_headers_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_SecurityConfig proto.InternalMessageInfo
+// Deprecated: Use SecurityConfig.ProtoReflect.Descriptor instead.
+func (*SecurityConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_protocol_headers_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *SecurityConfig) GetType() SecurityType {
-	if m != nil {
-		return m.Type
+func (x *SecurityConfig) GetType() SecurityType {
+	if x != nil {
+		return x.Type
 	}
 	return SecurityType_UNKNOWN
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.common.protocol.SecurityType", SecurityType_name, SecurityType_value)
-	proto.RegisterType((*SecurityConfig)(nil), "v2ray.core.common.protocol.SecurityConfig")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/protocol/headers.proto", fileDescriptor_5931f958a3c1d408)
-}
-
-var fileDescriptor_5931f958a3c1d408 = []byte{
-	// 252 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0xce, 0xcf, 0xd1, 0xcf, 0x48, 0x4d, 0x4c, 0x49,
-	0x2d, 0x2a, 0xd6, 0x03, 0x0b, 0x08, 0x49, 0xc1, 0x54, 0x17, 0xa5, 0xea, 0x41, 0x54, 0xea, 0xc1,
-	0x54, 0x2a, 0xf9, 0x71, 0xf1, 0x05, 0xa7, 0x26, 0x97, 0x16, 0x65, 0x96, 0x54, 0x3a, 0xe7, 0xe7,
-	0xa5, 0x65, 0xa6, 0x0b, 0xd9, 0x70, 0xb1, 0x94, 0x54, 0x16, 0xa4, 0x4a, 0x30, 0x2a, 0x30, 0x6a,
-	0xf0, 0x19, 0x69, 0xe8, 0xe1, 0xd6, 0xac, 0x07, 0xd3, 0x19, 0x52, 0x59, 0x90, 0x1a, 0x04, 0xd6,
-	0xa5, 0x95, 0xc4, 0xc5, 0x83, 0x2c, 0x2a, 0xc4, 0xcd, 0xc5, 0x1e, 0xea, 0xe7, 0xed, 0xe7, 0x1f,
-	0xee, 0x27, 0xc0, 0x20, 0xc4, 0xc5, 0xc5, 0xe6, 0xe3, 0xea, 0xee, 0xe8, 0x1c, 0x29, 0xc0, 0x28,
-	0xc4, 0xc1, 0xc5, 0xe2, 0x18, 0x1a, 0xe2, 0x2f, 0xc0, 0x24, 0xc4, 0xc7, 0xc5, 0xe5, 0xe8, 0x1a,
-	0x6c, 0x68, 0x64, 0x11, 0xef, 0xee, 0xec, 0x2b, 0xc0, 0x2c, 0x24, 0xca, 0x25, 0xe8, 0xec, 0xe1,
-	0xe8, 0xec, 0xe1, 0x68, 0x64, 0x10, 0x1f, 0xe0, 0xef, 0x13, 0x69, 0x68, 0x6c, 0x60, 0x2a, 0xc0,
-	0x02, 0xd2, 0xe0, 0xe7, 0xef, 0xe7, 0x2a, 0xc0, 0xea, 0xe4, 0xc9, 0x25, 0x97, 0x9c, 0x9f, 0x8b,
-	0xc7, 0x61, 0x01, 0x8c, 0x51, 0x1c, 0x30, 0xf6, 0x2a, 0x26, 0xa9, 0x30, 0xa3, 0xa0, 0xc4, 0x4a,
-	0x3d, 0x67, 0x90, 0x42, 0x67, 0x88, 0xc2, 0x00, 0xa8, 0x64, 0x12, 0x1b, 0x58, 0x99, 0x31, 0x20,
-	0x00, 0x00, 0xff, 0xff, 0x0b, 0xc1, 0xe1, 0x94, 0x51, 0x01, 0x00, 0x00,
+var File_v2ray_com_core_common_protocol_headers_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_protocol_headers_proto_rawDesc = []byte{
+	0x0a, 0x2c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x4e, 0x0a, 0x0e, 0x53, 0x65,
+	0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x62, 0x0a, 0x0c, 0x53, 0x65,
+	0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e,
+	0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x47, 0x41, 0x43,
+	0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a,
+	0x0a, 0x41, 0x45, 0x53, 0x31, 0x32, 0x38, 0x5f, 0x47, 0x43, 0x4d, 0x10, 0x03, 0x12, 0x15, 0x0a,
+	0x11, 0x43, 0x48, 0x41, 0x43, 0x48, 0x41, 0x32, 0x30, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x31, 0x33,
+	0x30, 0x35, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x05, 0x42, 0x49,
+	0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x50, 0x01, 0x5a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xaa, 0x02, 0x1a, 0x56,
+	0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
+}
+
+var (
+	file_v2ray_com_core_common_protocol_headers_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_protocol_headers_proto_rawDescData = file_v2ray_com_core_common_protocol_headers_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_protocol_headers_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_protocol_headers_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_protocol_headers_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_protocol_headers_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_protocol_headers_proto_rawDescData
+}
+
+var file_v2ray_com_core_common_protocol_headers_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_common_protocol_headers_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_protocol_headers_proto_goTypes = []interface{}{
+	(SecurityType)(0),      // 0: v2ray.core.common.protocol.SecurityType
+	(*SecurityConfig)(nil), // 1: v2ray.core.common.protocol.SecurityConfig
+}
+var file_v2ray_com_core_common_protocol_headers_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.common.protocol.SecurityConfig.type:type_name -> v2ray.core.common.protocol.SecurityType
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_common_protocol_headers_proto_init() }
+func file_v2ray_com_core_common_protocol_headers_proto_init() {
+	if File_v2ray_com_core_common_protocol_headers_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_protocol_headers_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SecurityConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_protocol_headers_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_protocol_headers_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_protocol_headers_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_common_protocol_headers_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_common_protocol_headers_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_protocol_headers_proto = out.File
+	file_v2ray_com_core_common_protocol_headers_proto_rawDesc = nil
+	file_v2ray_com_core_common_protocol_headers_proto_goTypes = nil
+	file_v2ray_com_core_common_protocol_headers_proto_depIdxs = nil
 }

+ 147 - 67
common/protocol/server_spec.pb.go

@@ -1,102 +1,182 @@
 package protocol
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type ServerEndpoint struct {
-	Address              *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
-	Port                 uint32          `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
-	User                 []*User         `protobuf:"bytes,3,rep,name=user,proto3" json:"user,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ServerEndpoint) Reset()         { *m = ServerEndpoint{} }
-func (m *ServerEndpoint) String() string { return proto.CompactTextString(m) }
-func (*ServerEndpoint) ProtoMessage()    {}
-func (*ServerEndpoint) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8741b2fa976e72fc, []int{0}
+	Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Port    uint32          `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
+	User    []*User         `protobuf:"bytes,3,rep,name=user,proto3" json:"user,omitempty"`
 }
 
-func (m *ServerEndpoint) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerEndpoint.Unmarshal(m, b)
-}
-func (m *ServerEndpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerEndpoint.Marshal(b, m, deterministic)
-}
-func (m *ServerEndpoint) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerEndpoint.Merge(m, src)
+func (x *ServerEndpoint) Reset() {
+	*x = ServerEndpoint{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_protocol_server_spec_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ServerEndpoint) XXX_Size() int {
-	return xxx_messageInfo_ServerEndpoint.Size(m)
+
+func (x *ServerEndpoint) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ServerEndpoint) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerEndpoint.DiscardUnknown(m)
+
+func (*ServerEndpoint) ProtoMessage() {}
+
+func (x *ServerEndpoint) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_protocol_server_spec_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ServerEndpoint proto.InternalMessageInfo
+// Deprecated: Use ServerEndpoint.ProtoReflect.Descriptor instead.
+func (*ServerEndpoint) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_protocol_server_spec_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *ServerEndpoint) GetAddress() *net.IPOrDomain {
-	if m != nil {
-		return m.Address
+func (x *ServerEndpoint) GetAddress() *net.IPOrDomain {
+	if x != nil {
+		return x.Address
 	}
 	return nil
 }
 
-func (m *ServerEndpoint) GetPort() uint32 {
-	if m != nil {
-		return m.Port
+func (x *ServerEndpoint) GetPort() uint32 {
+	if x != nil {
+		return x.Port
 	}
 	return 0
 }
 
-func (m *ServerEndpoint) GetUser() []*User {
-	if m != nil {
-		return m.User
+func (x *ServerEndpoint) GetUser() []*User {
+	if x != nil {
+		return x.User
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*ServerEndpoint)(nil), "v2ray.core.common.protocol.ServerEndpoint")
+var File_v2ray_com_core_common_protocol_server_spec_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_protocol_server_spec_proto_rawDesc = []byte{
+	0x0a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x1a, 0x27,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64,
+	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49,
+	0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d,
+	0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x42, 0x49, 0x0a, 0x1e,
+	0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x01,
+	0x5a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52,
+	0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_common_protocol_server_spec_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_protocol_server_spec_proto_rawDescData = file_v2ray_com_core_common_protocol_server_spec_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_protocol_server_spec_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_protocol_server_spec_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_protocol_server_spec_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_protocol_server_spec_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_protocol_server_spec_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/protocol/server_spec.proto", fileDescriptor_8741b2fa976e72fc)
+var file_v2ray_com_core_common_protocol_server_spec_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_protocol_server_spec_proto_goTypes = []interface{}{
+	(*ServerEndpoint)(nil), // 0: v2ray.core.common.protocol.ServerEndpoint
+	(*net.IPOrDomain)(nil), // 1: v2ray.core.common.net.IPOrDomain
+	(*User)(nil),           // 2: v2ray.core.common.protocol.User
+}
+var file_v2ray_com_core_common_protocol_server_spec_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.common.protocol.ServerEndpoint.address:type_name -> v2ray.core.common.net.IPOrDomain
+	2, // 1: v2ray.core.common.protocol.ServerEndpoint.user:type_name -> v2ray.core.common.protocol.User
+	2, // [2:2] is the sub-list for method output_type
+	2, // [2:2] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
 }
 
-var fileDescriptor_8741b2fa976e72fc = []byte{
-	// 241 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0xcf, 0xbd, 0x4e, 0xc3, 0x30,
-	0x10, 0x07, 0x70, 0xb9, 0xad, 0x00, 0xb9, 0x82, 0xc1, 0x53, 0x94, 0x01, 0x05, 0x16, 0xc2, 0x72,
-	0x46, 0x81, 0x8d, 0x8d, 0xc2, 0xd0, 0x89, 0x28, 0x08, 0x06, 0x16, 0x14, 0x9c, 0x1b, 0x2a, 0x61,
-	0x5f, 0x74, 0x36, 0x95, 0xfa, 0x24, 0xbc, 0x03, 0x4f, 0x89, 0x6a, 0xd7, 0x13, 0x5f, 0xdb, 0xc9,
-	0xfe, 0xdd, 0xdd, 0xff, 0xe4, 0xc5, 0xba, 0xe1, 0x7e, 0x03, 0x86, 0xac, 0x36, 0xc4, 0xa8, 0x0d,
-	0x59, 0x4b, 0x4e, 0x8f, 0x4c, 0x81, 0x0c, 0xbd, 0x69, 0x8f, 0xbc, 0x46, 0x7e, 0xf1, 0x23, 0x1a,
-	0x88, 0x8f, 0xaa, 0xcc, 0x1d, 0x8c, 0x90, 0x34, 0x64, 0x5d, 0x9e, 0xfd, 0x3c, 0xcd, 0x61, 0xd0,
-	0xfd, 0x30, 0x30, 0x7a, 0x9f, 0x6c, 0x79, 0xfe, 0xcf, 0xda, 0x77, 0x8f, 0x9c, 0xe8, 0xe9, 0x87,
-	0x90, 0x47, 0x0f, 0x31, 0xc5, 0x9d, 0x1b, 0x46, 0x5a, 0xb9, 0xa0, 0xae, 0xe5, 0xfe, 0x6e, 0x5c,
-	0x21, 0x2a, 0x51, 0xcf, 0x9b, 0x13, 0xf8, 0x1e, 0xca, 0x61, 0x80, 0x65, 0x7b, 0xcf, 0xb7, 0x64,
-	0xfb, 0x95, 0xeb, 0x72, 0x87, 0x52, 0x72, 0x36, 0x12, 0x87, 0x62, 0x52, 0x89, 0xfa, 0xb0, 0x8b,
-	0xb5, 0xba, 0x92, 0xb3, 0xed, 0xc6, 0x62, 0x5a, 0x4d, 0xeb, 0x79, 0x53, 0xc1, 0xef, 0x27, 0xc2,
-	0xa3, 0x47, 0xee, 0xa2, 0xbe, 0x59, 0xca, 0x63, 0x43, 0xf6, 0x0f, 0xdc, 0x8a, 0xe7, 0x83, 0x5c,
-	0x7f, 0x4e, 0xca, 0xa7, 0xa6, 0xeb, 0x37, 0xb0, 0xd8, 0xc2, 0x45, 0x82, 0xed, 0xee, 0xf3, 0x75,
-	0x2f, 0xb2, 0xcb, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x61, 0xa2, 0x3c, 0x8f, 0x01, 0x00,
-	0x00,
+func init() { file_v2ray_com_core_common_protocol_server_spec_proto_init() }
+func file_v2ray_com_core_common_protocol_server_spec_proto_init() {
+	if File_v2ray_com_core_common_protocol_server_spec_proto != nil {
+		return
+	}
+	file_v2ray_com_core_common_protocol_user_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_protocol_server_spec_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ServerEndpoint); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_protocol_server_spec_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_protocol_server_spec_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_protocol_server_spec_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_common_protocol_server_spec_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_protocol_server_spec_proto = out.File
+	file_v2ray_com_core_common_protocol_server_spec_proto_rawDesc = nil
+	file_v2ray_com_core_common_protocol_server_spec_proto_goTypes = nil
+	file_v2ray_com_core_common_protocol_server_spec_proto_depIdxs = nil
 }

+ 138 - 63
common/protocol/user.pb.go

@@ -1,102 +1,177 @@
 package protocol
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // User is a generic user for all procotols.
 type User struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	Level uint32 `protobuf:"varint,1,opt,name=level,proto3" json:"level,omitempty"`
 	Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"`
 	// Protocol specific account information. Must be the account proto in one of the proxies.
-	Account              *serial.TypedMessage `protobuf:"bytes,3,opt,name=account,proto3" json:"account,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	Account *serial.TypedMessage `protobuf:"bytes,3,opt,name=account,proto3" json:"account,omitempty"`
 }
 
-func (m *User) Reset()         { *m = User{} }
-func (m *User) String() string { return proto.CompactTextString(m) }
-func (*User) ProtoMessage()    {}
-func (*User) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9da52c16030369bd, []int{0}
+func (x *User) Reset() {
+	*x = User{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_protocol_user_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *User) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_User.Unmarshal(m, b)
-}
-func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_User.Marshal(b, m, deterministic)
+func (x *User) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *User) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_User.Merge(m, src)
-}
-func (m *User) XXX_Size() int {
-	return xxx_messageInfo_User.Size(m)
-}
-func (m *User) XXX_DiscardUnknown() {
-	xxx_messageInfo_User.DiscardUnknown(m)
+
+func (*User) ProtoMessage() {}
+
+func (x *User) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_protocol_user_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_User proto.InternalMessageInfo
+// Deprecated: Use User.ProtoReflect.Descriptor instead.
+func (*User) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_protocol_user_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *User) GetLevel() uint32 {
-	if m != nil {
-		return m.Level
+func (x *User) GetLevel() uint32 {
+	if x != nil {
+		return x.Level
 	}
 	return 0
 }
 
-func (m *User) GetEmail() string {
-	if m != nil {
-		return m.Email
+func (x *User) GetEmail() string {
+	if x != nil {
+		return x.Email
 	}
 	return ""
 }
 
-func (m *User) GetAccount() *serial.TypedMessage {
-	if m != nil {
-		return m.Account
+func (x *User) GetAccount() *serial.TypedMessage {
+	if x != nil {
+		return x.Account
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*User)(nil), "v2ray.core.common.protocol.User")
+var File_v2ray_com_core_common_protocol_user_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_protocol_user_proto_rawDesc = []byte{
+	0x0a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73,
+	0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x04, 0x55, 0x73, 0x65,
+	0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
+	0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x40, 0x0a,
+	0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42,
+	0x49, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x50, 0x01, 0x5a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xaa, 0x02, 0x1a,
+	0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_common_protocol_user_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_protocol_user_proto_rawDescData = file_v2ray_com_core_common_protocol_user_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_protocol_user_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_protocol_user_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_protocol_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_protocol_user_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_protocol_user_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/protocol/user.proto", fileDescriptor_9da52c16030369bd)
+var file_v2ray_com_core_common_protocol_user_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_protocol_user_proto_goTypes = []interface{}{
+	(*User)(nil),                // 0: v2ray.core.common.protocol.User
+	(*serial.TypedMessage)(nil), // 1: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_common_protocol_user_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.common.protocol.User.account:type_name -> v2ray.core.common.serial.TypedMessage
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_9da52c16030369bd = []byte{
-	// 218 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0xce, 0xcf, 0xd1, 0x2f, 0x2d, 0x4e, 0x2d, 0xd2,
-	0x03, 0xf3, 0x84, 0xa4, 0x60, 0x4a, 0x8b, 0x52, 0xf5, 0x20, 0xca, 0xf4, 0x60, 0xca, 0xa4, 0x0c,
-	0xb0, 0x1b, 0x53, 0x9c, 0x5a, 0x94, 0x99, 0x98, 0xa3, 0x5f, 0x52, 0x59, 0x90, 0x9a, 0x12, 0x9f,
-	0x9b, 0x5a, 0x5c, 0x9c, 0x98, 0x9e, 0x0a, 0xd1, 0xa4, 0x54, 0xc2, 0xc5, 0x12, 0x5a, 0x9c, 0x5a,
-	0x24, 0x24, 0xc2, 0xc5, 0x9a, 0x93, 0x5a, 0x96, 0x9a, 0x23, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x1b,
-	0x04, 0xe1, 0x80, 0x44, 0x53, 0x73, 0x13, 0x33, 0x73, 0x24, 0x98, 0x14, 0x18, 0x35, 0x38, 0x83,
-	0x20, 0x1c, 0x21, 0x07, 0x2e, 0xf6, 0xc4, 0xe4, 0xe4, 0xfc, 0xd2, 0xbc, 0x12, 0x09, 0x66, 0x05,
-	0x46, 0x0d, 0x6e, 0x23, 0x35, 0x3d, 0x4c, 0x37, 0x41, 0xec, 0xd4, 0x0b, 0x01, 0xd9, 0xe9, 0x0b,
-	0xb1, 0x32, 0x08, 0xa6, 0xcd, 0xc9, 0x93, 0x4b, 0x2e, 0x39, 0x3f, 0x57, 0x0f, 0xb7, 0x4f, 0x02,
-	0x18, 0xa3, 0x38, 0x60, 0xec, 0x55, 0x4c, 0x52, 0x61, 0x46, 0x41, 0x89, 0x95, 0x7a, 0xce, 0x20,
-	0x85, 0xce, 0x10, 0x85, 0x01, 0x50, 0xc9, 0x24, 0x36, 0xb0, 0x32, 0x63, 0x40, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x02, 0xf5, 0x15, 0xcc, 0x42, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_common_protocol_user_proto_init() }
+func file_v2ray_com_core_common_protocol_user_proto_init() {
+	if File_v2ray_com_core_common_protocol_user_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_protocol_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*User); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_protocol_user_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_protocol_user_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_protocol_user_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_common_protocol_user_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_protocol_user_proto = out.File
+	file_v2ray_com_core_common_protocol_user_proto_rawDesc = nil
+	file_v2ray_com_core_common_protocol_user_proto_goTypes = nil
+	file_v2ray_com_core_common_protocol_user_proto_depIdxs = nil
 }

+ 126 - 57
common/serial/typed_message.pb.go

@@ -1,91 +1,160 @@
 package serial
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // TypedMessage is a serialized proto message along with its type name.
 type TypedMessage struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// The name of the message type, retrieved from protobuf API.
 	Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
 	// Serialized proto message.
-	Value                []byte   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *TypedMessage) Reset()         { *m = TypedMessage{} }
-func (m *TypedMessage) String() string { return proto.CompactTextString(m) }
-func (*TypedMessage) ProtoMessage()    {}
-func (*TypedMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0bb3cdb51e9fc84d, []int{0}
+func (x *TypedMessage) Reset() {
+	*x = TypedMessage{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_common_serial_typed_message_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *TypedMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TypedMessage.Unmarshal(m, b)
-}
-func (m *TypedMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TypedMessage.Marshal(b, m, deterministic)
+func (x *TypedMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *TypedMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TypedMessage.Merge(m, src)
-}
-func (m *TypedMessage) XXX_Size() int {
-	return xxx_messageInfo_TypedMessage.Size(m)
-}
-func (m *TypedMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_TypedMessage.DiscardUnknown(m)
+
+func (*TypedMessage) ProtoMessage() {}
+
+func (x *TypedMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_common_serial_typed_message_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_TypedMessage proto.InternalMessageInfo
+// Deprecated: Use TypedMessage.ProtoReflect.Descriptor instead.
+func (*TypedMessage) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_common_serial_typed_message_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *TypedMessage) GetType() string {
-	if m != nil {
-		return m.Type
+func (x *TypedMessage) GetType() string {
+	if x != nil {
+		return x.Type
 	}
 	return ""
 }
 
-func (m *TypedMessage) GetValue() []byte {
-	if m != nil {
-		return m.Value
+func (x *TypedMessage) GetValue() []byte {
+	if x != nil {
+		return x.Value
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*TypedMessage)(nil), "v2ray.core.common.serial.TypedMessage")
+var File_v2ray_com_core_common_serial_typed_message_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_common_serial_typed_message_proto_rawDesc = []byte{
+	0x0a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74,
+	0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x38, 0x0a, 0x0c,
+	0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,
+	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x43, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x01, 0x5a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c,
+	0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_common_serial_typed_message_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_common_serial_typed_message_proto_rawDescData = file_v2ray_com_core_common_serial_typed_message_proto_rawDesc
+)
+
+func file_v2ray_com_core_common_serial_typed_message_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_common_serial_typed_message_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_common_serial_typed_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_common_serial_typed_message_proto_rawDescData)
+	})
+	return file_v2ray_com_core_common_serial_typed_message_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/common/serial/typed_message.proto", fileDescriptor_0bb3cdb51e9fc84d)
+var file_v2ray_com_core_common_serial_typed_message_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_common_serial_typed_message_proto_goTypes = []interface{}{
+	(*TypedMessage)(nil), // 0: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_common_serial_typed_message_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_0bb3cdb51e9fc84d = []byte{
-	// 168 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x28, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0x2f, 0x4e, 0x2d, 0xca, 0x4c, 0xcc, 0xd1, 0x2f, 0xa9, 0x2c, 0x48, 0x4d, 0x89, 0xcf,
-	0x4d, 0x2d, 0x2e, 0x4e, 0x4c, 0x4f, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xe9,
-	0x28, 0x4a, 0xd5, 0x83, 0xa8, 0xd6, 0x83, 0xa8, 0x56, 0xb2, 0xe0, 0xe2, 0x09, 0x01, 0x69, 0xf0,
-	0x85, 0xa8, 0x17, 0x12, 0xe2, 0x62, 0x01, 0x19, 0x20, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04,
-	0x66, 0x0b, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, 0x94, 0xa6, 0x4a, 0x30, 0x29, 0x30, 0x6a, 0xf0,
-	0x04, 0x41, 0x38, 0x4e, 0xce, 0x5c, 0x32, 0xc9, 0xf9, 0xb9, 0x7a, 0xb8, 0x4c, 0x0e, 0x60, 0x8c,
-	0x62, 0x83, 0xb0, 0x56, 0x31, 0x49, 0x84, 0x19, 0x05, 0x25, 0x56, 0xea, 0x39, 0x83, 0x14, 0x39,
-	0x43, 0x14, 0x05, 0x83, 0xa5, 0x92, 0xd8, 0xc0, 0xee, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff,
-	0x2f, 0x28, 0xe9, 0x5b, 0xd3, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_common_serial_typed_message_proto_init() }
+func file_v2ray_com_core_common_serial_typed_message_proto_init() {
+	if File_v2ray_com_core_common_serial_typed_message_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_common_serial_typed_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TypedMessage); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_common_serial_typed_message_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_common_serial_typed_message_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_common_serial_typed_message_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_common_serial_typed_message_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_common_serial_typed_message_proto = out.File
+	file_v2ray_com_core_common_serial_typed_message_proto_rawDesc = nil
+	file_v2ray_com_core_common_serial_typed_message_proto_goTypes = nil
+	file_v2ray_com_core_common_serial_typed_message_proto_depIdxs = nil
 }

+ 312 - 156
config.pb.go

@@ -1,26 +1,32 @@
 package core
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 	transport "v2ray.com/core/transport"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Config is the master config of V2Ray. V2Ray takes this config as input and functions accordingly.
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Inbound handler configurations. Must have at least one item.
 	Inbound []*InboundHandlerConfig `protobuf:"bytes,1,rep,name=inbound,proto3" json:"inbound,omitempty"`
 	// Outbound handler configurations. Must have at least one item. The first item is used as default for routing.
@@ -30,137 +36,155 @@ type Config struct {
 	// Transport settings.
 	// Deprecated. Each inbound and outbound should choose their own transport config.
 	// Date to remove: 2020-01-13
-	Transport *transport.Config `protobuf:"bytes,5,opt,name=transport,proto3" json:"transport,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	Transport *transport.Config `protobuf:"bytes,5,opt,name=transport,proto3" json:"transport,omitempty"`
 	// Configuration for extensions. The config may not work if corresponding extension is not loaded into V2Ray.
 	// V2Ray will ignore such config during initialization.
-	Extension            []*serial.TypedMessage `protobuf:"bytes,6,rep,name=extension,proto3" json:"extension,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	Extension []*serial.TypedMessage `protobuf:"bytes,6,rep,name=extension,proto3" json:"extension,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_13704400b1045c6b, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetInbound() []*InboundHandlerConfig {
-	if m != nil {
-		return m.Inbound
+func (x *Config) GetInbound() []*InboundHandlerConfig {
+	if x != nil {
+		return x.Inbound
 	}
 	return nil
 }
 
-func (m *Config) GetOutbound() []*OutboundHandlerConfig {
-	if m != nil {
-		return m.Outbound
+func (x *Config) GetOutbound() []*OutboundHandlerConfig {
+	if x != nil {
+		return x.Outbound
 	}
 	return nil
 }
 
-func (m *Config) GetApp() []*serial.TypedMessage {
-	if m != nil {
-		return m.App
+func (x *Config) GetApp() []*serial.TypedMessage {
+	if x != nil {
+		return x.App
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *Config) GetTransport() *transport.Config {
-	if m != nil {
-		return m.Transport
+func (x *Config) GetTransport() *transport.Config {
+	if x != nil {
+		return x.Transport
 	}
 	return nil
 }
 
-func (m *Config) GetExtension() []*serial.TypedMessage {
-	if m != nil {
-		return m.Extension
+func (x *Config) GetExtension() []*serial.TypedMessage {
+	if x != nil {
+		return x.Extension
 	}
 	return nil
 }
 
 // InboundHandlerConfig is the configuration for inbound handler.
 type InboundHandlerConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Tag of the inbound handler. The tag must be unique among all inbound handlers
 	Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
 	// Settings for how this inbound proxy is handled.
 	ReceiverSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=receiver_settings,json=receiverSettings,proto3" json:"receiver_settings,omitempty"`
 	// Settings for inbound proxy. Must be one of the inbound proxies.
-	ProxySettings        *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	ProxySettings *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"`
 }
 
-func (m *InboundHandlerConfig) Reset()         { *m = InboundHandlerConfig{} }
-func (m *InboundHandlerConfig) String() string { return proto.CompactTextString(m) }
-func (*InboundHandlerConfig) ProtoMessage()    {}
-func (*InboundHandlerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_13704400b1045c6b, []int{1}
+func (x *InboundHandlerConfig) Reset() {
+	*x = InboundHandlerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *InboundHandlerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_InboundHandlerConfig.Unmarshal(m, b)
-}
-func (m *InboundHandlerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_InboundHandlerConfig.Marshal(b, m, deterministic)
-}
-func (m *InboundHandlerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_InboundHandlerConfig.Merge(m, src)
+func (x *InboundHandlerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *InboundHandlerConfig) XXX_Size() int {
-	return xxx_messageInfo_InboundHandlerConfig.Size(m)
-}
-func (m *InboundHandlerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_InboundHandlerConfig.DiscardUnknown(m)
+
+func (*InboundHandlerConfig) ProtoMessage() {}
+
+func (x *InboundHandlerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_InboundHandlerConfig proto.InternalMessageInfo
+// Deprecated: Use InboundHandlerConfig.ProtoReflect.Descriptor instead.
+func (*InboundHandlerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *InboundHandlerConfig) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *InboundHandlerConfig) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage {
-	if m != nil {
-		return m.ReceiverSettings
+func (x *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage {
+	if x != nil {
+		return x.ReceiverSettings
 	}
 	return nil
 }
 
-func (m *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage {
-	if m != nil {
-		return m.ProxySettings
+func (x *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage {
+	if x != nil {
+		return x.ProxySettings
 	}
 	return nil
 }
 
 // OutboundHandlerConfig is the configuration for outbound handler.
 type OutboundHandlerConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Tag of this outbound handler.
 	Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
 	// Settings for how to dial connection for this outbound handler.
@@ -170,106 +194,238 @@ type OutboundHandlerConfig struct {
 	// If not zero, this outbound will be expired in seconds. Not used for now.
 	Expire int64 `protobuf:"varint,4,opt,name=expire,proto3" json:"expire,omitempty"`
 	// Comment of this outbound handler. Not used for now.
-	Comment              string   `protobuf:"bytes,5,opt,name=comment,proto3" json:"comment,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Comment string `protobuf:"bytes,5,opt,name=comment,proto3" json:"comment,omitempty"`
 }
 
-func (m *OutboundHandlerConfig) Reset()         { *m = OutboundHandlerConfig{} }
-func (m *OutboundHandlerConfig) String() string { return proto.CompactTextString(m) }
-func (*OutboundHandlerConfig) ProtoMessage()    {}
-func (*OutboundHandlerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_13704400b1045c6b, []int{2}
+func (x *OutboundHandlerConfig) Reset() {
+	*x = OutboundHandlerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *OutboundHandlerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutboundHandlerConfig.Unmarshal(m, b)
-}
-func (m *OutboundHandlerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutboundHandlerConfig.Marshal(b, m, deterministic)
-}
-func (m *OutboundHandlerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutboundHandlerConfig.Merge(m, src)
+func (x *OutboundHandlerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *OutboundHandlerConfig) XXX_Size() int {
-	return xxx_messageInfo_OutboundHandlerConfig.Size(m)
-}
-func (m *OutboundHandlerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutboundHandlerConfig.DiscardUnknown(m)
+
+func (*OutboundHandlerConfig) ProtoMessage() {}
+
+func (x *OutboundHandlerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_OutboundHandlerConfig proto.InternalMessageInfo
+// Deprecated: Use OutboundHandlerConfig.ProtoReflect.Descriptor instead.
+func (*OutboundHandlerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *OutboundHandlerConfig) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *OutboundHandlerConfig) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
-func (m *OutboundHandlerConfig) GetSenderSettings() *serial.TypedMessage {
-	if m != nil {
-		return m.SenderSettings
+func (x *OutboundHandlerConfig) GetSenderSettings() *serial.TypedMessage {
+	if x != nil {
+		return x.SenderSettings
 	}
 	return nil
 }
 
-func (m *OutboundHandlerConfig) GetProxySettings() *serial.TypedMessage {
-	if m != nil {
-		return m.ProxySettings
+func (x *OutboundHandlerConfig) GetProxySettings() *serial.TypedMessage {
+	if x != nil {
+		return x.ProxySettings
 	}
 	return nil
 }
 
-func (m *OutboundHandlerConfig) GetExpire() int64 {
-	if m != nil {
-		return m.Expire
+func (x *OutboundHandlerConfig) GetExpire() int64 {
+	if x != nil {
+		return x.Expire
 	}
 	return 0
 }
 
-func (m *OutboundHandlerConfig) GetComment() string {
-	if m != nil {
-		return m.Comment
+func (x *OutboundHandlerConfig) GetComment() string {
+	if x != nil {
+		return x.Comment
 	}
 	return ""
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.Config")
-	proto.RegisterType((*InboundHandlerConfig)(nil), "v2ray.core.InboundHandlerConfig")
-	proto.RegisterType((*OutboundHandlerConfig)(nil), "v2ray.core.OutboundHandlerConfig")
-}
-
-func init() { proto.RegisterFile("v2ray.com/core/config.proto", fileDescriptor_13704400b1045c6b) }
-
-var fileDescriptor_13704400b1045c6b = []byte{
-	// 409 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0xd3, 0xcf, 0x6b, 0xd4, 0x40,
-	0x14, 0x07, 0x70, 0x26, 0x89, 0xdb, 0xe6, 0x15, 0xd7, 0x75, 0x50, 0x19, 0xaa, 0x87, 0xb8, 0x50,
-	0xc9, 0x69, 0x22, 0xf1, 0x22, 0x82, 0x1e, 0x5a, 0x0f, 0x2a, 0x94, 0x4a, 0x2a, 0x1e, 0xbc, 0x94,
-	0x69, 0xf2, 0x0c, 0x81, 0x66, 0x26, 0xcc, 0x4c, 0xcb, 0xe6, 0x5f, 0xf2, 0x3f, 0x11, 0xfc, 0x8f,
-	0xbc, 0x48, 0x32, 0x9b, 0x4d, 0xaa, 0x7b, 0x70, 0x05, 0x4f, 0xc9, 0xe4, 0xe5, 0xf3, 0xde, 0x7c,
-	0xf3, 0x03, 0x1e, 0xdf, 0xa4, 0x5a, 0xb4, 0x3c, 0x57, 0x75, 0x92, 0x2b, 0x8d, 0x49, 0xae, 0xe4,
-	0xd7, 0xaa, 0xe4, 0x8d, 0x56, 0x56, 0x51, 0x18, 0x8a, 0x1a, 0x0f, 0x9f, 0xff, 0x71, 0x63, 0x5d,
-	0x2b, 0x99, 0x18, 0xd4, 0x95, 0xb8, 0x4a, 0x6c, 0xdb, 0x60, 0x71, 0x51, 0xa3, 0x31, 0xa2, 0x44,
-	0xa7, 0x0f, 0x8f, 0x7e, 0x13, 0x56, 0x0b, 0x69, 0x1a, 0xa5, 0xed, 0xad, 0x21, 0xcb, 0xef, 0x1e,
-	0xcc, 0x4e, 0xfa, 0x0b, 0xf4, 0x15, 0xec, 0x55, 0xf2, 0x52, 0x5d, 0xcb, 0x82, 0x91, 0xc8, 0x8f,
-	0x0f, 0xd2, 0x88, 0x8f, 0x3b, 0xe0, 0xef, 0x5d, 0xe9, 0x9d, 0x90, 0xc5, 0x15, 0x6a, 0x47, 0xb2,
-	0x01, 0xd0, 0xd7, 0xb0, 0xaf, 0xae, 0xad, 0xc3, 0x5e, 0x8f, 0x9f, 0x4e, 0xf1, 0xd9, 0xba, 0x76,
-	0x5b, 0x6f, 0x08, 0x7d, 0x09, 0xbe, 0x68, 0x1a, 0x16, 0xf4, 0xf2, 0xd9, 0x54, 0xba, 0xa0, 0xdc,
-	0x05, 0xe5, 0x9f, 0xba, 0xa0, 0xa7, 0x2e, 0x67, 0xd6, 0x11, 0xfa, 0x06, 0xc2, 0x4d, 0x32, 0x76,
-	0x27, 0x22, 0xf1, 0x41, 0xfa, 0x64, 0xea, 0x37, 0x45, 0xee, 0x86, 0x1e, 0x7b, 0x8c, 0x64, 0x23,
-	0xa1, 0x6f, 0x21, 0xc4, 0x95, 0x45, 0x69, 0x2a, 0x25, 0xd9, 0x6c, 0xa7, 0xf9, 0x23, 0xfc, 0x10,
-	0xec, 0xfb, 0x8b, 0x60, 0xf9, 0x83, 0xc0, 0x83, 0x6d, 0x8f, 0x89, 0x2e, 0xc0, 0xb7, 0xa2, 0x64,
-	0x24, 0x22, 0x71, 0x98, 0x75, 0xa7, 0xf4, 0x1c, 0xee, 0x6b, 0xcc, 0xb1, 0xba, 0x41, 0x7d, 0x61,
-	0xd0, 0xda, 0x4a, 0x96, 0x86, 0x79, 0xfd, 0xf6, 0xff, 0x76, 0xfc, 0x62, 0x68, 0x70, 0xbe, 0xf6,
-	0xf4, 0x14, 0xe6, 0x8d, 0x56, 0xab, 0x76, 0xec, 0xe8, 0xef, 0xd4, 0xf1, 0x6e, 0xaf, 0x87, 0x76,
-	0xcb, 0x9f, 0x04, 0x1e, 0x6e, 0x7d, 0x71, 0x5b, 0xf2, 0x9c, 0xc1, 0x3d, 0x83, 0xb2, 0xf8, 0xf7,
-	0x34, 0x73, 0xc7, 0xff, 0x53, 0x16, 0xfa, 0x08, 0x66, 0xb8, 0x6a, 0x2a, 0x8d, 0x2c, 0x88, 0x48,
-	0xec, 0x67, 0xeb, 0x15, 0x65, 0xb0, 0xd7, 0x35, 0x41, 0xe9, 0x3e, 0x9e, 0x30, 0x1b, 0x96, 0xc7,
-	0x47, 0x30, 0xcf, 0x55, 0x3d, 0x99, 0xf6, 0x91, 0x7c, 0x09, 0xba, 0xe3, 0x37, 0x0f, 0x3e, 0xa7,
-	0x99, 0x68, 0xf9, 0x89, 0xd2, 0x78, 0x39, 0xeb, 0x7f, 0xa3, 0x17, 0xbf, 0x02, 0x00, 0x00, 0xff,
-	0xff, 0xde, 0x43, 0xe7, 0x49, 0xca, 0x03, 0x00, 0x00,
+var File_v2ray_com_core_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_config_proto_rawDesc = []byte{
+	0x0a, 0x1b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x22, 0xc9, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x0a,
+	0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x62, 0x6f,
+	0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x52, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x08, 0x6f, 0x75, 0x74,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08,
+	0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18,
+	0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c,
+	0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x61,
+	0x70, 0x70, 0x12, 0x3e, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c,
+	0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xcc,
+	0x01, 0x0a, 0x14, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
+	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x53, 0x0a, 0x11, 0x72, 0x65, 0x63,
+	0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e,
+	0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x72, 0x65,
+	0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d,
+	0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61,
+	0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xfb, 0x01,
+	0x0a, 0x15, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
+	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x4f, 0x0a, 0x0f, 0x73, 0x65, 0x6e,
+	0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79,
+	0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x73, 0x65, 0x6e, 0x64,
+	0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0e, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79,
+	0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70,
+	0x69, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72,
+	0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x25, 0x0a, 0x0e, 0x63,
+	0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x50, 0x01, 0x5a,
+	0x04, 0x63, 0x6f, 0x72, 0x65, 0xaa, 0x02, 0x0a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f,
+	0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_config_proto_rawDescData = file_v2ray_com_core_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_v2ray_com_core_config_proto_goTypes = []interface{}{
+	(*Config)(nil),                // 0: v2ray.core.Config
+	(*InboundHandlerConfig)(nil),  // 1: v2ray.core.InboundHandlerConfig
+	(*OutboundHandlerConfig)(nil), // 2: v2ray.core.OutboundHandlerConfig
+	(*serial.TypedMessage)(nil),   // 3: v2ray.core.common.serial.TypedMessage
+	(*transport.Config)(nil),      // 4: v2ray.core.transport.Config
+}
+var file_v2ray_com_core_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.Config.inbound:type_name -> v2ray.core.InboundHandlerConfig
+	2, // 1: v2ray.core.Config.outbound:type_name -> v2ray.core.OutboundHandlerConfig
+	3, // 2: v2ray.core.Config.app:type_name -> v2ray.core.common.serial.TypedMessage
+	4, // 3: v2ray.core.Config.transport:type_name -> v2ray.core.transport.Config
+	3, // 4: v2ray.core.Config.extension:type_name -> v2ray.core.common.serial.TypedMessage
+	3, // 5: v2ray.core.InboundHandlerConfig.receiver_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	3, // 6: v2ray.core.InboundHandlerConfig.proxy_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	3, // 7: v2ray.core.OutboundHandlerConfig.sender_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	3, // 8: v2ray.core.OutboundHandlerConfig.proxy_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	9, // [9:9] is the sub-list for method output_type
+	9, // [9:9] is the sub-list for method input_type
+	9, // [9:9] is the sub-list for extension type_name
+	9, // [9:9] is the sub-list for extension extendee
+	0, // [0:9] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_config_proto_init() }
+func file_v2ray_com_core_config_proto_init() {
+	if File_v2ray_com_core_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InboundHandlerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OutboundHandlerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_config_proto = out.File
+	file_v2ray_com_core_config_proto_rawDesc = nil
+	file_v2ray_com_core_config_proto_goTypes = nil
+	file_v2ray_com_core_config_proto_depIdxs = nil
 }

+ 4 - 4
go.mod

@@ -3,8 +3,8 @@ module v2ray.com/core
 require (
 	github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc // indirect
 	github.com/golang/mock v1.2.0
-	github.com/golang/protobuf v1.3.2
-	github.com/google/go-cmp v0.2.0
+	github.com/golang/protobuf v1.4.2
+	github.com/google/go-cmp v0.4.0
 	github.com/gorilla/websocket v1.4.1
 	github.com/miekg/dns v1.1.4
 	github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57
@@ -14,8 +14,8 @@ require (
 	golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3
 	golang.org/x/sync v0.0.0-20190423024810-112230192c58
 	golang.org/x/sys v0.0.0-20190412213103-97732733099d
-	google.golang.org/genproto v0.0.0-20180831171423-11092d34479b // indirect
-	google.golang.org/grpc v1.24.0
+	google.golang.org/grpc v1.27.0
+	google.golang.org/protobuf v1.24.0
 	h12.io/socks v1.0.0
 )
 

+ 50 - 0
go.sum

@@ -1,21 +1,38 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8=
 github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0=
 github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57 h1:SL1K0QAuC1b54KoY1pjPWe6kSlsFHwK9/oC960fKrTY=
 github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57/go.mod h1:tz9gX959MEFfFN5whTIocCLUG57WiILqtdVxI8c6Wj0=
 github.com/seiflotfy/cuckoofilter v0.0.0-20200511222245-56093a4d3841 h1:pnfutQFsV7ySmHUeX6ANGfPsBo29RctUvDn8G3rmJVw=
@@ -26,29 +43,62 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90Pveol
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss=
 golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw=
 google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
 google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
+google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 h12.io/socks v1.0.0 h1:oiFI7YXv4h/0kBNcmAb5EkkoFJgYsOF88EQjMBxjitc=
 h12.io/socks v1.0.0/go.mod h1:MdYbo5/eB9ka7u5dzW2Qh0iSyJENwB3KI5H5ngenFGA=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 216 - 104
proxy/blackhole/config.pb.go

@@ -1,148 +1,260 @@
 package blackhole
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type NoneResponse struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *NoneResponse) Reset()         { *m = NoneResponse{} }
-func (m *NoneResponse) String() string { return proto.CompactTextString(m) }
-func (*NoneResponse) ProtoMessage()    {}
-func (*NoneResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8c8b37c8ae1bdfea, []int{0}
+func (x *NoneResponse) Reset() {
+	*x = NoneResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *NoneResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NoneResponse.Unmarshal(m, b)
+func (x *NoneResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *NoneResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NoneResponse.Marshal(b, m, deterministic)
+
+func (*NoneResponse) ProtoMessage() {}
+
+func (x *NoneResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *NoneResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NoneResponse.Merge(m, src)
+
+// Deprecated: Use NoneResponse.ProtoReflect.Descriptor instead.
+func (*NoneResponse) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_blackhole_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *NoneResponse) XXX_Size() int {
-	return xxx_messageInfo_NoneResponse.Size(m)
+
+type HTTPResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
-func (m *NoneResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_NoneResponse.DiscardUnknown(m)
+
+func (x *HTTPResponse) Reset() {
+	*x = HTTPResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-var xxx_messageInfo_NoneResponse proto.InternalMessageInfo
+func (x *HTTPResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
 
-type HTTPResponse struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (*HTTPResponse) ProtoMessage() {}
+
+func (x *HTTPResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *HTTPResponse) Reset()         { *m = HTTPResponse{} }
-func (m *HTTPResponse) String() string { return proto.CompactTextString(m) }
-func (*HTTPResponse) ProtoMessage()    {}
+// Deprecated: Use HTTPResponse.ProtoReflect.Descriptor instead.
 func (*HTTPResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8c8b37c8ae1bdfea, []int{1}
+	return file_v2ray_com_core_proxy_blackhole_config_proto_rawDescGZIP(), []int{1}
 }
 
-func (m *HTTPResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_HTTPResponse.Unmarshal(m, b)
-}
-func (m *HTTPResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_HTTPResponse.Marshal(b, m, deterministic)
-}
-func (m *HTTPResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_HTTPResponse.Merge(m, src)
+type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Response *serial.TypedMessage `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
 }
-func (m *HTTPResponse) XXX_Size() int {
-	return xxx_messageInfo_HTTPResponse.Size(m)
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *HTTPResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_HTTPResponse.DiscardUnknown(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-var xxx_messageInfo_HTTPResponse proto.InternalMessageInfo
+func (*Config) ProtoMessage() {}
 
-type Config struct {
-	Response             *serial.TypedMessage `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
 func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8c8b37c8ae1bdfea, []int{2}
+	return file_v2ray_com_core_proxy_blackhole_config_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+func (x *Config) GetResponse() *serial.TypedMessage {
+	if x != nil {
+		return x.Response
+	}
+	return nil
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+
+var File_v2ray_com_core_proxy_blackhole_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_blackhole_config_proto_rawDesc = []byte{
+	0x0a, 0x2b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e,
+	0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0e, 0x0a, 0x0c, 0x4e,
+	0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x0a, 0x0c, 0x48,
+	0x54, 0x54, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x0a, 0x06, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69,
+	0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52,
+	0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4a, 0x0a, 0x1e, 0x63, 0x6f, 0x6d,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x2e, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x50, 0x01, 0x5a, 0x09, 0x62,
+	0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79,
+	0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x42, 0x6c, 0x61, 0x63,
+	0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+var (
+	file_v2ray_com_core_proxy_blackhole_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_blackhole_config_proto_rawDescData = file_v2ray_com_core_proxy_blackhole_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_blackhole_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_blackhole_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_blackhole_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_blackhole_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_blackhole_config_proto_rawDescData
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+var file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_v2ray_com_core_proxy_blackhole_config_proto_goTypes = []interface{}{
+	(*NoneResponse)(nil),        // 0: v2ray.core.proxy.blackhole.NoneResponse
+	(*HTTPResponse)(nil),        // 1: v2ray.core.proxy.blackhole.HTTPResponse
+	(*Config)(nil),              // 2: v2ray.core.proxy.blackhole.Config
+	(*serial.TypedMessage)(nil), // 3: v2ray.core.common.serial.TypedMessage
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+var file_v2ray_com_core_proxy_blackhole_config_proto_depIdxs = []int32{
+	3, // 0: v2ray.core.proxy.blackhole.Config.response:type_name -> v2ray.core.common.serial.TypedMessage
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
-
-func (m *Config) GetResponse() *serial.TypedMessage {
-	if m != nil {
-		return m.Response
+func init() { file_v2ray_com_core_proxy_blackhole_config_proto_init() }
+func file_v2ray_com_core_proxy_blackhole_config_proto_init() {
+	if File_v2ray_com_core_proxy_blackhole_config_proto != nil {
+		return
 	}
-	return nil
-}
-
-func init() {
-	proto.RegisterType((*NoneResponse)(nil), "v2ray.core.proxy.blackhole.NoneResponse")
-	proto.RegisterType((*HTTPResponse)(nil), "v2ray.core.proxy.blackhole.HTTPResponse")
-	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.blackhole.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/blackhole/config.proto", fileDescriptor_8c8b37c8ae1bdfea)
-}
-
-var fileDescriptor_8c8b37c8ae1bdfea = []byte{
-	// 217 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2e, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x28, 0xca, 0xaf, 0xa8,
-	0xd4, 0x4f, 0xca, 0x49, 0x4c, 0xce, 0xce, 0xc8, 0xcf, 0x49, 0xd5, 0x4f, 0xce, 0xcf, 0x4b, 0xcb,
-	0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x82, 0x29, 0x2e, 0x4a, 0xd5, 0x03, 0x2b,
-	0xd4, 0x83, 0x2b, 0x94, 0x32, 0x40, 0x33, 0x28, 0x39, 0x3f, 0x37, 0x37, 0x3f, 0x4f, 0xbf, 0x38,
-	0xb5, 0x28, 0x33, 0x31, 0x47, 0xbf, 0xa4, 0xb2, 0x20, 0x35, 0x25, 0x3e, 0x37, 0xb5, 0xb8, 0x38,
-	0x31, 0x3d, 0x15, 0x62, 0x9a, 0x12, 0x1f, 0x17, 0x8f, 0x5f, 0x7e, 0x5e, 0x6a, 0x50, 0x6a, 0x71,
-	0x41, 0x7e, 0x5e, 0x71, 0x2a, 0x88, 0xef, 0x11, 0x12, 0x12, 0x00, 0xe7, 0xfb, 0x70, 0xb1, 0x39,
-	0x83, 0x6d, 0x17, 0x72, 0xe2, 0xe2, 0x28, 0x82, 0x8a, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b,
-	0xa9, 0xe9, 0x21, 0x39, 0x05, 0x62, 0x95, 0x1e, 0xc4, 0x2a, 0xbd, 0x10, 0x90, 0x55, 0xbe, 0x10,
-	0x9b, 0x82, 0xe0, 0xfa, 0x9c, 0xbc, 0xb8, 0xe4, 0x92, 0xf3, 0x73, 0xf5, 0x70, 0xfb, 0x20, 0x80,
-	0x31, 0x8a, 0x13, 0xce, 0x59, 0xc5, 0x24, 0x15, 0x66, 0x14, 0x94, 0x58, 0xa9, 0xe7, 0x0c, 0x52,
-	0x19, 0x00, 0x56, 0xe9, 0x04, 0x93, 0x4c, 0x62, 0x03, 0x7b, 0xc0, 0x18, 0x10, 0x00, 0x00, 0xff,
-	0xff, 0xb6, 0x3c, 0xef, 0x4f, 0x3d, 0x01, 0x00, 0x00,
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NoneResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*HTTPResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_blackhole_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_blackhole_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_blackhole_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_blackhole_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_blackhole_config_proto = out.File
+	file_v2ray_com_core_proxy_blackhole_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_blackhole_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_blackhole_config_proto_depIdxs = nil
 }

+ 126 - 55
proxy/dns/config.pb.go

@@ -1,83 +1,154 @@
 package dns
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Server is the DNS server address. If specified, this address overrides the original one.
-	Server               *net.Endpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
-	XXX_unrecognized     []byte        `json:"-"`
-	XXX_sizecache        int32         `json:"-"`
+	Server *net.Endpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c49bb2d51e576d57, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_dns_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_dns_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_dns_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetServer() *net.Endpoint {
-	if m != nil {
-		return m.Server
+func (x *Config) GetServer() *net.Endpoint {
+	if x != nil {
+		return x.Server
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.dns.Config")
+var File_v2ray_com_core_proxy_dns_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_dns_config_proto_rawDesc = []byte{
+	0x0a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6e, 0x73, 0x1a, 0x2b, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x06, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x64,
+	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x38, 0x0a,
+	0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6e, 0x73, 0x50, 0x01, 0x5a, 0x03, 0x64, 0x6e, 0x73,
+	0xaa, 0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72,
+	0x6f, 0x78, 0x79, 0x2e, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_dns_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_dns_config_proto_rawDescData = file_v2ray_com_core_proxy_dns_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_dns_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_dns_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_dns_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_dns_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_dns_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/dns/config.proto", fileDescriptor_c49bb2d51e576d57)
+var file_v2ray_com_core_proxy_dns_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_proxy_dns_config_proto_goTypes = []interface{}{
+	(*Config)(nil),       // 0: v2ray.core.proxy.dns.Config
+	(*net.Endpoint)(nil), // 1: v2ray.core.common.net.Endpoint
+}
+var file_v2ray_com_core_proxy_dns_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.proxy.dns.Config.server:type_name -> v2ray.core.common.net.Endpoint
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_c49bb2d51e576d57 = []byte{
-	// 190 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x8e, 0x31, 0xab, 0xc2, 0x30,
-	0x14, 0x46, 0xe9, 0x7b, 0xd0, 0x21, 0x6f, 0x2b, 0x1d, 0xca, 0x5b, 0xde, 0x43, 0x10, 0x04, 0xe1,
-	0x06, 0xea, 0xa0, 0xab, 0x56, 0xf7, 0xd2, 0xc1, 0xc1, 0xad, 0x26, 0x51, 0x32, 0xe4, 0xde, 0x72,
-	0x13, 0x8a, 0xfd, 0x4b, 0xfe, 0x4a, 0x31, 0x55, 0x10, 0x71, 0xfe, 0xce, 0x77, 0x38, 0x62, 0xda,
-	0x97, 0xdc, 0x0e, 0xa0, 0xc8, 0x49, 0x45, 0x6c, 0x64, 0xc7, 0x74, 0x19, 0xa4, 0x46, 0x2f, 0x15,
-	0xe1, 0xc9, 0x9e, 0xa1, 0x63, 0x0a, 0x94, 0xe5, 0x4f, 0x8c, 0x0d, 0x44, 0x04, 0x34, 0xfa, 0xdf,
-	0xf9, 0xdb, 0x59, 0x91, 0x73, 0x84, 0x12, 0x4d, 0x90, 0xda, 0xf8, 0x60, 0xb1, 0x0d, 0x96, 0x70,
-	0x54, 0x4c, 0xd6, 0x22, 0xad, 0xa2, 0x32, 0x5b, 0x8a, 0xd4, 0x1b, 0xee, 0x0d, 0x17, 0xc9, 0x7f,
-	0x32, 0xfb, 0x29, 0xff, 0xe0, 0xc5, 0x3e, 0x3a, 0x00, 0x4d, 0x80, 0x1d, 0xea, 0x8e, 0x2c, 0x86,
-	0xe6, 0x81, 0x6f, 0x56, 0xa2, 0x50, 0xe4, 0xe0, 0x53, 0x4b, 0x9d, 0x1c, 0xbe, 0x35, 0xfa, 0xeb,
-	0x57, 0xbe, 0x2f, 0x9b, 0x76, 0x80, 0xea, 0xbe, 0xd6, 0x71, 0xdd, 0xa2, 0x3f, 0xa6, 0xb1, 0x61,
-	0x71, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x84, 0x9c, 0x79, 0xef, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_proxy_dns_config_proto_init() }
+func file_v2ray_com_core_proxy_dns_config_proto_init() {
+	if File_v2ray_com_core_proxy_dns_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_dns_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_dns_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_dns_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_dns_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_dns_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_dns_config_proto = out.File
+	file_v2ray_com_core_proxy_dns_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_dns_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_dns_config_proto_depIdxs = nil
 }

+ 182 - 92
proxy/dokodemo/config.pb.go

@@ -1,144 +1,234 @@
 package dokodemo
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	Port    uint32          `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
 	// List of networks that the Dokodemo accepts.
 	// Deprecated. Use networks.
-	NetworkList *net.NetworkList `protobuf:"bytes,3,opt,name=network_list,json=networkList,proto3" json:"network_list,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	NetworkList *net.NetworkList `protobuf:"bytes,3,opt,name=network_list,json=networkList,proto3" json:"network_list,omitempty"`
 	// List of networks that the Dokodemo accepts.
-	Networks             []net.Network `protobuf:"varint,7,rep,packed,name=networks,proto3,enum=v2ray.core.common.net.Network" json:"networks,omitempty"`
-	Timeout              uint32        `protobuf:"varint,4,opt,name=timeout,proto3" json:"timeout,omitempty"` // Deprecated: Do not use.
-	FollowRedirect       bool          `protobuf:"varint,5,opt,name=follow_redirect,json=followRedirect,proto3" json:"follow_redirect,omitempty"`
-	UserLevel            uint32        `protobuf:"varint,6,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
-	XXX_unrecognized     []byte        `json:"-"`
-	XXX_sizecache        int32         `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_de04411d7254f312, []int{0}
+	Networks []net.Network `protobuf:"varint,7,rep,packed,name=networks,proto3,enum=v2ray.core.common.net.Network" json:"networks,omitempty"`
+	// Deprecated: Do not use.
+	Timeout        uint32 `protobuf:"varint,4,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	FollowRedirect bool   `protobuf:"varint,5,opt,name=follow_redirect,json=followRedirect,proto3" json:"follow_redirect,omitempty"`
+	UserLevel      uint32 `protobuf:"varint,6,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
+}
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_dokodemo_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_dokodemo_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetAddress() *net.IPOrDomain {
-	if m != nil {
-		return m.Address
+func (x *Config) GetAddress() *net.IPOrDomain {
+	if x != nil {
+		return x.Address
 	}
 	return nil
 }
 
-func (m *Config) GetPort() uint32 {
-	if m != nil {
-		return m.Port
+func (x *Config) GetPort() uint32 {
+	if x != nil {
+		return x.Port
 	}
 	return 0
 }
 
 // Deprecated: Do not use.
-func (m *Config) GetNetworkList() *net.NetworkList {
-	if m != nil {
-		return m.NetworkList
+func (x *Config) GetNetworkList() *net.NetworkList {
+	if x != nil {
+		return x.NetworkList
 	}
 	return nil
 }
 
-func (m *Config) GetNetworks() []net.Network {
-	if m != nil {
-		return m.Networks
+func (x *Config) GetNetworks() []net.Network {
+	if x != nil {
+		return x.Networks
 	}
 	return nil
 }
 
 // Deprecated: Do not use.
-func (m *Config) GetTimeout() uint32 {
-	if m != nil {
-		return m.Timeout
+func (x *Config) GetTimeout() uint32 {
+	if x != nil {
+		return x.Timeout
 	}
 	return 0
 }
 
-func (m *Config) GetFollowRedirect() bool {
-	if m != nil {
-		return m.FollowRedirect
+func (x *Config) GetFollowRedirect() bool {
+	if x != nil {
+		return x.FollowRedirect
 	}
 	return false
 }
 
-func (m *Config) GetUserLevel() uint32 {
-	if m != nil {
-		return m.UserLevel
+func (x *Config) GetUserLevel() uint32 {
+	if x != nil {
+		return x.UserLevel
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.dokodemo.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/dokodemo/config.proto", fileDescriptor_de04411d7254f312)
-}
-
-var fileDescriptor_de04411d7254f312 = []byte{
-	// 331 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x4f, 0xea, 0x40,
-	0x10, 0xc7, 0xd3, 0xc2, 0x03, 0xde, 0xf2, 0x1e, 0x26, 0x7b, 0x5a, 0x8c, 0x98, 0xca, 0x85, 0xc6,
-	0xc3, 0x36, 0xa9, 0x37, 0xbd, 0x01, 0x89, 0x21, 0x21, 0x4a, 0xf6, 0xe0, 0xc1, 0x0b, 0xa9, 0xed,
-	0x60, 0x1a, 0xba, 0x3b, 0x64, 0xbb, 0x80, 0x7c, 0x25, 0x3f, 0x88, 0x9f, 0xcb, 0x74, 0xdb, 0xaa,
-	0x31, 0x81, 0xdb, 0xec, 0x7f, 0x7f, 0xfb, 0x9b, 0xd9, 0x0c, 0xb9, 0xde, 0x85, 0x3a, 0x3a, 0xf0,
-	0x18, 0x65, 0x10, 0xa3, 0x86, 0x60, 0xa3, 0xf1, 0xed, 0x10, 0x24, 0xb8, 0xc6, 0x04, 0x24, 0x06,
-	0x31, 0xaa, 0x55, 0xfa, 0xca, 0x37, 0x1a, 0x0d, 0xd2, 0x7e, 0xcd, 0x6a, 0xe0, 0x96, 0xe3, 0x35,
-	0x77, 0x3e, 0xfa, 0xa5, 0x89, 0x51, 0x4a, 0x54, 0x81, 0x02, 0x13, 0x44, 0x49, 0xa2, 0x21, 0xcf,
-	0x4b, 0xc7, 0x29, 0x50, 0x81, 0xd9, 0xa3, 0x5e, 0x97, 0xe0, 0xf0, 0xc3, 0x25, 0xad, 0x89, 0xed,
-	0x4e, 0xef, 0x48, 0xbb, 0x92, 0x30, 0xc7, 0x73, 0xfc, 0x6e, 0x78, 0xc5, 0x7f, 0x4c, 0x52, 0x1a,
-	0xb8, 0x02, 0xc3, 0x67, 0x8b, 0x47, 0x3d, 0x45, 0x19, 0xa5, 0x4a, 0xd4, 0x2f, 0x28, 0x25, 0xcd,
-	0x0d, 0x6a, 0xc3, 0x5c, 0xcf, 0xf1, 0xff, 0x0b, 0x5b, 0xd3, 0x19, 0xf9, 0x57, 0x35, 0x5b, 0x66,
-	0x69, 0x6e, 0x58, 0xc3, 0x5a, 0x87, 0x47, 0xac, 0x0f, 0x25, 0x3a, 0x4f, 0x73, 0x33, 0x76, 0x99,
-	0x23, 0xba, 0xea, 0x3b, 0xa0, 0xb7, 0xa4, 0x53, 0x1d, 0x73, 0xd6, 0xf6, 0x1a, 0x7e, 0x2f, 0xbc,
-	0x3c, 0xad, 0x11, 0x5f, 0x3c, 0xbd, 0x20, 0x6d, 0x93, 0x4a, 0xc0, 0xad, 0x61, 0xcd, 0x62, 0x3a,
-	0x6b, 0xaf, 0x23, 0x3a, 0x22, 0x67, 0x2b, 0xcc, 0x32, 0xdc, 0x2f, 0x35, 0x24, 0xa9, 0x86, 0xd8,
-	0xb0, 0x3f, 0x9e, 0xe3, 0x77, 0x44, 0xaf, 0x8c, 0x45, 0x95, 0xd2, 0x01, 0x21, 0xdb, 0x1c, 0xf4,
-	0x32, 0x83, 0x1d, 0x64, 0xac, 0x65, 0xff, 0xf9, 0xb7, 0x48, 0xe6, 0x45, 0x30, 0xbe, 0x27, 0x83,
-	0x18, 0x25, 0x3f, 0xba, 0xbb, 0x85, 0xf3, 0xdc, 0xa9, 0xeb, 0x77, 0xb7, 0xff, 0x14, 0x8a, 0xe8,
-	0xc0, 0x27, 0x05, 0xb7, 0xb0, 0xdc, 0xb4, 0xba, 0x7b, 0x69, 0xd9, 0xc5, 0xdc, 0x7c, 0x06, 0x00,
-	0x00, 0xff, 0xff, 0xec, 0xf1, 0xbb, 0x96, 0x33, 0x02, 0x00, 0x00,
+var File_v2ray_com_core_proxy_dokodemo_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_dokodemo_config_proto_rawDesc = []byte{
+	0x0a, 0x2a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x2f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64,
+	0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e,
+	0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77,
+	0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc6, 0x02, 0x0a, 0x06, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50,
+	0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x49, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x42,
+	0x02, 0x18, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x3a, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03,
+	0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f,
+	0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x07,
+	0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18,
+	0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x6f,
+	0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x64, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65,
+	0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76,
+	0x65, 0x6c, 0x42, 0x47, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6f, 0x6b, 0x6f, 0x64,
+	0x65, 0x6d, 0x6f, 0x50, 0x01, 0x5a, 0x08, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0xaa,
+	0x02, 0x19, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f,
+	0x78, 0x79, 0x2e, 0x44, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescData = file_v2ray_com_core_proxy_dokodemo_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_dokodemo_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_proxy_dokodemo_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_proxy_dokodemo_config_proto_goTypes = []interface{}{
+	(*Config)(nil),          // 0: v2ray.core.proxy.dokodemo.Config
+	(*net.IPOrDomain)(nil),  // 1: v2ray.core.common.net.IPOrDomain
+	(*net.NetworkList)(nil), // 2: v2ray.core.common.net.NetworkList
+	(net.Network)(0),        // 3: v2ray.core.common.net.Network
+}
+var file_v2ray_com_core_proxy_dokodemo_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.proxy.dokodemo.Config.address:type_name -> v2ray.core.common.net.IPOrDomain
+	2, // 1: v2ray.core.proxy.dokodemo.Config.network_list:type_name -> v2ray.core.common.net.NetworkList
+	3, // 2: v2ray.core.proxy.dokodemo.Config.networks:type_name -> v2ray.core.common.net.Network
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_proxy_dokodemo_config_proto_init() }
+func file_v2ray_com_core_proxy_dokodemo_config_proto_init() {
+	if File_v2ray_com_core_proxy_dokodemo_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_dokodemo_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_dokodemo_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_dokodemo_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_dokodemo_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_dokodemo_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_dokodemo_config_proto = out.File
+	file_v2ray_com_core_proxy_dokodemo_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_dokodemo_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_dokodemo_config_proto_depIdxs = nil
 }

+ 253 - 123
proxy/freedom/config.pb.go

@@ -1,22 +1,24 @@
 package freedom
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config_DomainStrategy int32
 
@@ -27,164 +29,292 @@ const (
 	Config_USE_IP6 Config_DomainStrategy = 3
 )
 
-var Config_DomainStrategy_name = map[int32]string{
-	0: "AS_IS",
-	1: "USE_IP",
-	2: "USE_IP4",
-	3: "USE_IP6",
-}
+// Enum value maps for Config_DomainStrategy.
+var (
+	Config_DomainStrategy_name = map[int32]string{
+		0: "AS_IS",
+		1: "USE_IP",
+		2: "USE_IP4",
+		3: "USE_IP6",
+	}
+	Config_DomainStrategy_value = map[string]int32{
+		"AS_IS":   0,
+		"USE_IP":  1,
+		"USE_IP4": 2,
+		"USE_IP6": 3,
+	}
+)
 
-var Config_DomainStrategy_value = map[string]int32{
-	"AS_IS":   0,
-	"USE_IP":  1,
-	"USE_IP4": 2,
-	"USE_IP6": 3,
+func (x Config_DomainStrategy) Enum() *Config_DomainStrategy {
+	p := new(Config_DomainStrategy)
+	*p = x
+	return p
 }
 
 func (x Config_DomainStrategy) String() string {
-	return proto.EnumName(Config_DomainStrategy_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_66807b6fe2cca4da, []int{1, 0}
+func (Config_DomainStrategy) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_proxy_freedom_config_proto_enumTypes[0].Descriptor()
 }
 
-type DestinationOverride struct {
-	Server               *protocol.ServerEndpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
+func (Config_DomainStrategy) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_proxy_freedom_config_proto_enumTypes[0]
 }
 
-func (m *DestinationOverride) Reset()         { *m = DestinationOverride{} }
-func (m *DestinationOverride) String() string { return proto.CompactTextString(m) }
-func (*DestinationOverride) ProtoMessage()    {}
-func (*DestinationOverride) Descriptor() ([]byte, []int) {
-	return fileDescriptor_66807b6fe2cca4da, []int{0}
+func (x Config_DomainStrategy) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *DestinationOverride) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DestinationOverride.Unmarshal(m, b)
+// Deprecated: Use Config_DomainStrategy.Descriptor instead.
+func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_freedom_config_proto_rawDescGZIP(), []int{1, 0}
 }
-func (m *DestinationOverride) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DestinationOverride.Marshal(b, m, deterministic)
+
+type DestinationOverride struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Server *protocol.ServerEndpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
 }
-func (m *DestinationOverride) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DestinationOverride.Merge(m, src)
+
+func (x *DestinationOverride) Reset() {
+	*x = DestinationOverride{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_freedom_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *DestinationOverride) XXX_Size() int {
-	return xxx_messageInfo_DestinationOverride.Size(m)
+
+func (x *DestinationOverride) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *DestinationOverride) XXX_DiscardUnknown() {
-	xxx_messageInfo_DestinationOverride.DiscardUnknown(m)
+
+func (*DestinationOverride) ProtoMessage() {}
+
+func (x *DestinationOverride) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_freedom_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_DestinationOverride proto.InternalMessageInfo
+// Deprecated: Use DestinationOverride.ProtoReflect.Descriptor instead.
+func (*DestinationOverride) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_freedom_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *DestinationOverride) GetServer() *protocol.ServerEndpoint {
-	if m != nil {
-		return m.Server
+func (x *DestinationOverride) GetServer() *protocol.ServerEndpoint {
+	if x != nil {
+		return x.Server
 	}
 	return nil
 }
 
 type Config struct {
-	DomainStrategy       Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,proto3,enum=v2ray.core.proxy.freedom.Config_DomainStrategy" json:"domain_strategy,omitempty"`
-	Timeout              uint32                `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"` // Deprecated: Do not use.
-	DestinationOverride  *DestinationOverride  `protobuf:"bytes,3,opt,name=destination_override,json=destinationOverride,proto3" json:"destination_override,omitempty"`
-	UserLevel            uint32                `protobuf:"varint,4,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
-	XXX_unrecognized     []byte                `json:"-"`
-	XXX_sizecache        int32                 `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_66807b6fe2cca4da, []int{1}
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+	DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,proto3,enum=v2ray.core.proxy.freedom.Config_DomainStrategy" json:"domain_strategy,omitempty"`
+	// Deprecated: Do not use.
+	Timeout             uint32               `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	DestinationOverride *DestinationOverride `protobuf:"bytes,3,opt,name=destination_override,json=destinationOverride,proto3" json:"destination_override,omitempty"`
+	UserLevel           uint32               `protobuf:"varint,4,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_freedom_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_freedom_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_freedom_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Config) GetDomainStrategy() Config_DomainStrategy {
-	if m != nil {
-		return m.DomainStrategy
+func (x *Config) GetDomainStrategy() Config_DomainStrategy {
+	if x != nil {
+		return x.DomainStrategy
 	}
 	return Config_AS_IS
 }
 
 // Deprecated: Do not use.
-func (m *Config) GetTimeout() uint32 {
-	if m != nil {
-		return m.Timeout
+func (x *Config) GetTimeout() uint32 {
+	if x != nil {
+		return x.Timeout
 	}
 	return 0
 }
 
-func (m *Config) GetDestinationOverride() *DestinationOverride {
-	if m != nil {
-		return m.DestinationOverride
+func (x *Config) GetDestinationOverride() *DestinationOverride {
+	if x != nil {
+		return x.DestinationOverride
 	}
 	return nil
 }
 
-func (m *Config) GetUserLevel() uint32 {
-	if m != nil {
-		return m.UserLevel
+func (x *Config) GetUserLevel() uint32 {
+	if x != nil {
+		return x.UserLevel
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.proxy.freedom.Config_DomainStrategy", Config_DomainStrategy_name, Config_DomainStrategy_value)
-	proto.RegisterType((*DestinationOverride)(nil), "v2ray.core.proxy.freedom.DestinationOverride")
-	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.freedom.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/freedom/config.proto", fileDescriptor_66807b6fe2cca4da)
-}
-
-var fileDescriptor_66807b6fe2cca4da = []byte{
-	// 357 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x51, 0x5d, 0x4b, 0xeb, 0x40,
-	0x10, 0xbd, 0x49, 0xef, 0x4d, 0xe9, 0x94, 0xdb, 0x1b, 0xb6, 0xf7, 0x21, 0x48, 0x85, 0xd2, 0xa7,
-	0x2a, 0xb8, 0x91, 0x28, 0xbe, 0xf7, 0x4b, 0x28, 0x08, 0x96, 0x04, 0x45, 0x7d, 0x89, 0x31, 0x99,
-	0x96, 0x40, 0xb3, 0x1b, 0x36, 0xdb, 0x60, 0xfe, 0x92, 0xbf, 0xc3, 0x1f, 0x26, 0xd9, 0xa4, 0xd4,
-	0x4a, 0xfb, 0x36, 0x73, 0xf6, 0x9c, 0x33, 0x73, 0x66, 0xe1, 0x2c, 0x77, 0x44, 0x50, 0xd0, 0x90,
-	0x27, 0x76, 0xc8, 0x05, 0xda, 0xa9, 0xe0, 0xef, 0x85, 0xbd, 0x14, 0x88, 0x91, 0x82, 0xd8, 0x32,
-	0x5e, 0xd1, 0x54, 0x70, 0xc9, 0x89, 0xb5, 0xa5, 0x0a, 0xa4, 0x8a, 0x46, 0x6b, 0xda, 0xc9, 0xe5,
-	0x0f, 0x93, 0x90, 0x27, 0x09, 0x67, 0xb6, 0x92, 0x85, 0x7c, 0x6d, 0x67, 0x28, 0x72, 0x14, 0x7e,
-	0x96, 0x62, 0x58, 0x79, 0x0d, 0x9e, 0xa1, 0x3b, 0xc5, 0x4c, 0xc6, 0x2c, 0x90, 0x31, 0x67, 0xf7,
-	0x39, 0x0a, 0x11, 0x47, 0x48, 0xc6, 0x60, 0x54, 0x5c, 0x4b, 0xeb, 0x6b, 0xc3, 0xb6, 0x73, 0x4e,
-	0xbf, 0xcd, 0xac, 0x5c, 0xe9, 0xd6, 0x95, 0x7a, 0x8a, 0x39, 0x63, 0x51, 0xca, 0x63, 0x26, 0xdd,
-	0x5a, 0x39, 0xf8, 0xd4, 0xc1, 0x98, 0xa8, 0xbd, 0xc9, 0x13, 0xfc, 0x8b, 0x78, 0x12, 0xc4, 0xcc,
-	0xcf, 0xa4, 0x08, 0x24, 0xae, 0x0a, 0xe5, 0xdb, 0x71, 0x6c, 0x7a, 0x2c, 0x0b, 0xad, 0xa4, 0x74,
-	0xaa, 0x74, 0x5e, 0x2d, 0x73, 0x3b, 0xd1, 0x5e, 0x4f, 0x7a, 0xd0, 0x94, 0x71, 0x82, 0x7c, 0x23,
-	0x2d, 0xbd, 0xaf, 0x0d, 0xff, 0x8e, 0x75, 0x4b, 0x73, 0xb7, 0x10, 0x79, 0x85, 0xff, 0xd1, 0x2e,
-	0x9d, 0xcf, 0xeb, 0x78, 0x56, 0x43, 0x85, 0xba, 0x38, 0x3e, 0xfc, 0xc0, 0x4d, 0xdc, 0x6e, 0x74,
-	0xe0, 0x50, 0xa7, 0x00, 0x9b, 0x0c, 0x85, 0xbf, 0xc6, 0x1c, 0xd7, 0xd6, 0xef, 0x72, 0x05, 0xb7,
-	0x55, 0x22, 0x77, 0x25, 0x30, 0x18, 0x41, 0x67, 0x3f, 0x00, 0x69, 0xc1, 0x9f, 0x91, 0xe7, 0xcf,
-	0x3d, 0xf3, 0x17, 0x01, 0x30, 0x1e, 0xbc, 0x99, 0x3f, 0x5f, 0x98, 0x1a, 0x69, 0x43, 0xb3, 0xaa,
-	0xaf, 0x4d, 0x7d, 0xd7, 0xdc, 0x98, 0x8d, 0xf1, 0x14, 0x7a, 0x21, 0x4f, 0x8e, 0xae, 0xba, 0xd0,
-	0x5e, 0x9a, 0x75, 0xf9, 0xa1, 0x5b, 0x8f, 0x8e, 0x1b, 0x14, 0x74, 0x52, 0xb2, 0x16, 0x8a, 0x75,
-	0x5b, 0x3d, 0xbd, 0x19, 0xea, 0xb7, 0xae, 0xbe, 0x02, 0x00, 0x00, 0xff, 0xff, 0x72, 0x98, 0x5b,
-	0x40, 0x67, 0x02, 0x00, 0x00,
+var File_v2ray_com_core_proxy_freedom_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_freedom_config_proto_rawDesc = []byte{
+	0x0a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72,
+	0x65, 0x65, 0x64, 0x6f, 0x6d, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65,
+	0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x13, 0x44, 0x65, 0x73, 0x74, 0x69,
+	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x42,
+	0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x22, 0xc4, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a,
+	0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f,
+	0x6d, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53,
+	0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53,
+	0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x74, 0x69,
+	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x60, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x44,
+	0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
+	0x64, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f,
+	0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f,
+	0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65,
+	0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x41, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+	0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x5f, 0x49,
+	0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x01, 0x12,
+	0x0b, 0x0a, 0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07,
+	0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x03, 0x42, 0x44, 0x0a, 0x1c, 0x63, 0x6f, 0x6d,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x50, 0x01, 0x5a, 0x07, 0x66, 0x72, 0x65,
+	0x65, 0x64, 0x6f, 0x6d, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72,
+	0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_freedom_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_freedom_config_proto_rawDescData = file_v2ray_com_core_proxy_freedom_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_freedom_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_freedom_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_freedom_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_freedom_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_freedom_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_proxy_freedom_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_proxy_freedom_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_v2ray_com_core_proxy_freedom_config_proto_goTypes = []interface{}{
+	(Config_DomainStrategy)(0),      // 0: v2ray.core.proxy.freedom.Config.DomainStrategy
+	(*DestinationOverride)(nil),     // 1: v2ray.core.proxy.freedom.DestinationOverride
+	(*Config)(nil),                  // 2: v2ray.core.proxy.freedom.Config
+	(*protocol.ServerEndpoint)(nil), // 3: v2ray.core.common.protocol.ServerEndpoint
+}
+var file_v2ray_com_core_proxy_freedom_config_proto_depIdxs = []int32{
+	3, // 0: v2ray.core.proxy.freedom.DestinationOverride.server:type_name -> v2ray.core.common.protocol.ServerEndpoint
+	0, // 1: v2ray.core.proxy.freedom.Config.domain_strategy:type_name -> v2ray.core.proxy.freedom.Config.DomainStrategy
+	1, // 2: v2ray.core.proxy.freedom.Config.destination_override:type_name -> v2ray.core.proxy.freedom.DestinationOverride
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_proxy_freedom_config_proto_init() }
+func file_v2ray_com_core_proxy_freedom_config_proto_init() {
+	if File_v2ray_com_core_proxy_freedom_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_freedom_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DestinationOverride); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_freedom_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_freedom_config_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_freedom_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_freedom_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_proxy_freedom_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_proxy_freedom_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_freedom_config_proto = out.File
+	file_v2ray_com_core_proxy_freedom_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_freedom_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_freedom_config_proto_depIdxs = nil
 }

+ 266 - 142
proxy/http/config.pb.go

@@ -1,211 +1,335 @@
 package http
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Account struct {
-	Username             string   `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
-	Password             string   `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Account) Reset()         { *m = Account{} }
-func (m *Account) String() string { return proto.CompactTextString(m) }
-func (*Account) ProtoMessage()    {}
-func (*Account) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e66c3db3a635d8e4, []int{0}
+	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
+	Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
 }
 
-func (m *Account) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Account.Unmarshal(m, b)
-}
-func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Account.Marshal(b, m, deterministic)
-}
-func (m *Account) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Account.Merge(m, src)
+func (x *Account) Reset() {
+	*x = Account{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_http_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Account) XXX_Size() int {
-	return xxx_messageInfo_Account.Size(m)
+
+func (x *Account) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Account) XXX_DiscardUnknown() {
-	xxx_messageInfo_Account.DiscardUnknown(m)
+
+func (*Account) ProtoMessage() {}
+
+func (x *Account) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_http_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Account proto.InternalMessageInfo
+// Deprecated: Use Account.ProtoReflect.Descriptor instead.
+func (*Account) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_http_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Account) GetUsername() string {
-	if m != nil {
-		return m.Username
+func (x *Account) GetUsername() string {
+	if x != nil {
+		return x.Username
 	}
 	return ""
 }
 
-func (m *Account) GetPassword() string {
-	if m != nil {
-		return m.Password
+func (x *Account) GetPassword() string {
+	if x != nil {
+		return x.Password
 	}
 	return ""
 }
 
 // Config for HTTP proxy server.
 type ServerConfig struct {
-	Timeout              uint32            `protobuf:"varint,1,opt,name=timeout,proto3" json:"timeout,omitempty"` // Deprecated: Do not use.
-	Accounts             map[string]string `protobuf:"bytes,2,rep,name=accounts,proto3" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	AllowTransparent     bool              `protobuf:"varint,3,opt,name=allow_transparent,json=allowTransparent,proto3" json:"allow_transparent,omitempty"`
-	UserLevel            uint32            `protobuf:"varint,4,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *ServerConfig) Reset()         { *m = ServerConfig{} }
-func (m *ServerConfig) String() string { return proto.CompactTextString(m) }
-func (*ServerConfig) ProtoMessage()    {}
-func (*ServerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e66c3db3a635d8e4, []int{1}
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ServerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerConfig.Unmarshal(m, b)
+	// Deprecated: Do not use.
+	Timeout          uint32            `protobuf:"varint,1,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	Accounts         map[string]string `protobuf:"bytes,2,rep,name=accounts,proto3" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	AllowTransparent bool              `protobuf:"varint,3,opt,name=allow_transparent,json=allowTransparent,proto3" json:"allow_transparent,omitempty"`
+	UserLevel        uint32            `protobuf:"varint,4,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
 }
-func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerConfig.Marshal(b, m, deterministic)
-}
-func (m *ServerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerConfig.Merge(m, src)
+
+func (x *ServerConfig) Reset() {
+	*x = ServerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_http_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ServerConfig) XXX_Size() int {
-	return xxx_messageInfo_ServerConfig.Size(m)
+
+func (x *ServerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ServerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerConfig.DiscardUnknown(m)
+
+func (*ServerConfig) ProtoMessage() {}
+
+func (x *ServerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_http_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ServerConfig proto.InternalMessageInfo
+// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead.
+func (*ServerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_http_config_proto_rawDescGZIP(), []int{1}
+}
 
 // Deprecated: Do not use.
-func (m *ServerConfig) GetTimeout() uint32 {
-	if m != nil {
-		return m.Timeout
+func (x *ServerConfig) GetTimeout() uint32 {
+	if x != nil {
+		return x.Timeout
 	}
 	return 0
 }
 
-func (m *ServerConfig) GetAccounts() map[string]string {
-	if m != nil {
-		return m.Accounts
+func (x *ServerConfig) GetAccounts() map[string]string {
+	if x != nil {
+		return x.Accounts
 	}
 	return nil
 }
 
-func (m *ServerConfig) GetAllowTransparent() bool {
-	if m != nil {
-		return m.AllowTransparent
+func (x *ServerConfig) GetAllowTransparent() bool {
+	if x != nil {
+		return x.AllowTransparent
 	}
 	return false
 }
 
-func (m *ServerConfig) GetUserLevel() uint32 {
-	if m != nil {
-		return m.UserLevel
+func (x *ServerConfig) GetUserLevel() uint32 {
+	if x != nil {
+		return x.UserLevel
 	}
 	return 0
 }
 
 // ClientConfig is the protobuf config for HTTP proxy client.
 type ClientConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Sever is a list of HTTP server addresses.
-	Server               []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
-	XXX_unrecognized     []byte                     `json:"-"`
-	XXX_sizecache        int32                      `json:"-"`
+	Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
 }
 
-func (m *ClientConfig) Reset()         { *m = ClientConfig{} }
-func (m *ClientConfig) String() string { return proto.CompactTextString(m) }
-func (*ClientConfig) ProtoMessage()    {}
-func (*ClientConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e66c3db3a635d8e4, []int{2}
+func (x *ClientConfig) Reset() {
+	*x = ClientConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_http_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ClientConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ClientConfig.Unmarshal(m, b)
+func (x *ClientConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ClientConfig.Marshal(b, m, deterministic)
+
+func (*ClientConfig) ProtoMessage() {}
+
+func (x *ClientConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_http_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *ClientConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ClientConfig.Merge(m, src)
+
+// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead.
+func (*ClientConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_http_config_proto_rawDescGZIP(), []int{2}
 }
-func (m *ClientConfig) XXX_Size() int {
-	return xxx_messageInfo_ClientConfig.Size(m)
+
+func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint {
+	if x != nil {
+		return x.Server
+	}
+	return nil
 }
-func (m *ClientConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ClientConfig.DiscardUnknown(m)
+
+var File_v2ray_com_core_proxy_http_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_http_config_proto_rawDesc = []byte{
+	0x0a, 0x26, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x1a,
+	0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f,
+	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x22, 0x41, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08,
+	0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,
+	0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73,
+	0x77, 0x6f, 0x72, 0x64, 0x22, 0x84, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65,
+	0x6f, 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18,
+	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61,
+	0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12,
+	0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3b,
+	0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x0c, 0x43,
+	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42,
+	0x3b, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x04,
+	0x68, 0x74, 0x74, 0x70, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72,
+	0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_ClientConfig proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_proxy_http_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_http_config_proto_rawDescData = file_v2ray_com_core_proxy_http_config_proto_rawDesc
+)
 
-func (m *ClientConfig) GetServer() []*protocol.ServerEndpoint {
-	if m != nil {
-		return m.Server
-	}
-	return nil
+func file_v2ray_com_core_proxy_http_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_http_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_http_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_http_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_http_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.http.Account")
-	proto.RegisterType((*ServerConfig)(nil), "v2ray.core.proxy.http.ServerConfig")
-	proto.RegisterMapType((map[string]string)(nil), "v2ray.core.proxy.http.ServerConfig.AccountsEntry")
-	proto.RegisterType((*ClientConfig)(nil), "v2ray.core.proxy.http.ClientConfig")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/http/config.proto", fileDescriptor_e66c3db3a635d8e4)
-}
-
-var fileDescriptor_e66c3db3a635d8e4 = []byte{
-	// 375 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x51, 0x4d, 0x6b, 0xe3, 0x30,
-	0x10, 0xc5, 0x4e, 0x36, 0x1f, 0xda, 0x04, 0xb2, 0x62, 0x03, 0xde, 0xb0, 0x0b, 0x21, 0x87, 0x25,
-	0xb4, 0x20, 0xb7, 0xe9, 0xa5, 0x34, 0xa7, 0x24, 0x04, 0x7a, 0x68, 0x21, 0xa8, 0xa5, 0x87, 0x5e,
-	0x82, 0xaa, 0xa8, 0xad, 0xa9, 0x2d, 0x09, 0x49, 0x76, 0xea, 0x7b, 0x7f, 0x4d, 0x7f, 0x65, 0x91,
-	0x6c, 0xa7, 0x69, 0xc9, 0xc9, 0x9e, 0xf7, 0x66, 0x9e, 0xe6, 0xbd, 0x01, 0xff, 0xb3, 0x89, 0x22,
-	0x39, 0xa2, 0x22, 0x09, 0xa9, 0x50, 0x2c, 0x94, 0x4a, 0xbc, 0xe6, 0xe1, 0xb3, 0x31, 0x32, 0xa4,
-	0x82, 0x3f, 0x46, 0x4f, 0x48, 0x2a, 0x61, 0x04, 0xec, 0x57, 0x7d, 0x8a, 0x21, 0xd7, 0x83, 0x6c,
-	0xcf, 0xe0, 0xe4, 0xdb, 0x38, 0x15, 0x49, 0x22, 0x78, 0xe8, 0x66, 0xa8, 0x88, 0x43, 0xcd, 0x54,
-	0xc6, 0xd4, 0x5a, 0x4b, 0x46, 0x0b, 0xa1, 0xd1, 0x0c, 0x34, 0x67, 0x94, 0x8a, 0x94, 0x1b, 0x38,
-	0x00, 0xad, 0x54, 0x33, 0xc5, 0x49, 0xc2, 0x02, 0x6f, 0xe8, 0x8d, 0xdb, 0x78, 0x57, 0x5b, 0x4e,
-	0x12, 0xad, 0xb7, 0x42, 0x6d, 0x02, 0xbf, 0xe0, 0xaa, 0x7a, 0xf4, 0xe6, 0x83, 0xce, 0x8d, 0x13,
-	0x5e, 0xb8, 0x15, 0xe1, 0x5f, 0xd0, 0x34, 0x51, 0xc2, 0x44, 0x6a, 0x9c, 0x4e, 0x77, 0xee, 0x07,
-	0x1e, 0xae, 0x20, 0x78, 0x0d, 0x5a, 0xa4, 0x78, 0x51, 0x07, 0xfe, 0xb0, 0x36, 0xfe, 0x39, 0x39,
-	0x45, 0x07, 0xdd, 0xa0, 0x7d, 0x51, 0x54, 0x6e, 0xa9, 0x97, 0xdc, 0xa8, 0x1c, 0xef, 0x24, 0xe0,
-	0x31, 0xf8, 0x45, 0xe2, 0x58, 0x6c, 0xd7, 0x46, 0x11, 0xae, 0x25, 0x51, 0x8c, 0x9b, 0xa0, 0x36,
-	0xf4, 0xc6, 0x2d, 0xdc, 0x73, 0xc4, 0xed, 0x27, 0x0e, 0xff, 0x01, 0x60, 0x2d, 0xad, 0x63, 0x96,
-	0xb1, 0x38, 0xa8, 0xdb, 0xe5, 0x70, 0xdb, 0x22, 0x57, 0x16, 0x18, 0x4c, 0x41, 0xf7, 0xcb, 0x33,
-	0xb0, 0x07, 0x6a, 0x2f, 0x2c, 0x2f, 0xd3, 0xb0, 0xbf, 0xf0, 0x37, 0xf8, 0x91, 0x91, 0x38, 0x65,
-	0x65, 0x0a, 0x45, 0x71, 0xe1, 0x9f, 0x7b, 0x23, 0x0c, 0x3a, 0x8b, 0x38, 0x62, 0xdc, 0x94, 0x29,
-	0xcc, 0x41, 0xa3, 0x88, 0x3b, 0xf0, 0x9c, 0xcb, 0xa3, 0x7d, 0x97, 0xc5, 0x61, 0x50, 0x75, 0x98,
-	0xd2, 0xea, 0x92, 0x6f, 0xa4, 0x88, 0xb8, 0xc1, 0xe5, 0xe4, 0x7c, 0x0a, 0xfe, 0x50, 0x91, 0x1c,
-	0x8e, 0x67, 0xe5, 0xdd, 0xd7, 0xed, 0xf7, 0xdd, 0xef, 0xdf, 0x4d, 0x30, 0xc9, 0xd1, 0xc2, 0xf2,
-	0x2b, 0xc7, 0x5f, 0x1a, 0x23, 0x1f, 0x1a, 0x4e, 0xfd, 0xec, 0x23, 0x00, 0x00, 0xff, 0xff, 0xac,
-	0x7a, 0x67, 0x04, 0x54, 0x02, 0x00, 0x00,
+var file_v2ray_com_core_proxy_http_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_v2ray_com_core_proxy_http_config_proto_goTypes = []interface{}{
+	(*Account)(nil),                 // 0: v2ray.core.proxy.http.Account
+	(*ServerConfig)(nil),            // 1: v2ray.core.proxy.http.ServerConfig
+	(*ClientConfig)(nil),            // 2: v2ray.core.proxy.http.ClientConfig
+	nil,                             // 3: v2ray.core.proxy.http.ServerConfig.AccountsEntry
+	(*protocol.ServerEndpoint)(nil), // 4: v2ray.core.common.protocol.ServerEndpoint
+}
+var file_v2ray_com_core_proxy_http_config_proto_depIdxs = []int32{
+	3, // 0: v2ray.core.proxy.http.ServerConfig.accounts:type_name -> v2ray.core.proxy.http.ServerConfig.AccountsEntry
+	4, // 1: v2ray.core.proxy.http.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint
+	2, // [2:2] is the sub-list for method output_type
+	2, // [2:2] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_proxy_http_config_proto_init() }
+func file_v2ray_com_core_proxy_http_config_proto_init() {
+	if File_v2ray_com_core_proxy_http_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_http_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Account); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_http_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ServerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_http_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClientConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_http_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_http_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_http_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_http_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_http_config_proto = out.File
+	file_v2ray_com_core_proxy_http_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_http_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_http_config_proto_depIdxs = nil
 }

+ 218 - 105
proxy/mtproto/config.pb.go

@@ -1,158 +1,271 @@
 package mtproto
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Account struct {
-	Secret               []byte   `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Account) Reset()         { *m = Account{} }
-func (m *Account) String() string { return proto.CompactTextString(m) }
-func (*Account) ProtoMessage()    {}
-func (*Account) Descriptor() ([]byte, []int) {
-	return fileDescriptor_64514e21c693811b, []int{0}
+	Secret []byte `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"`
 }
 
-func (m *Account) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Account.Unmarshal(m, b)
-}
-func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Account.Marshal(b, m, deterministic)
-}
-func (m *Account) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Account.Merge(m, src)
+func (x *Account) Reset() {
+	*x = Account{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Account) XXX_Size() int {
-	return xxx_messageInfo_Account.Size(m)
+
+func (x *Account) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Account) XXX_DiscardUnknown() {
-	xxx_messageInfo_Account.DiscardUnknown(m)
+
+func (*Account) ProtoMessage() {}
+
+func (x *Account) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Account proto.InternalMessageInfo
+// Deprecated: Use Account.ProtoReflect.Descriptor instead.
+func (*Account) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_mtproto_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Account) GetSecret() []byte {
-	if m != nil {
-		return m.Secret
+func (x *Account) GetSecret() []byte {
+	if x != nil {
+		return x.Secret
 	}
 	return nil
 }
 
 type ServerConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// User is a list of users that allowed to connect to this inbound.
 	// Although this is a repeated field, only the first user is effective for now.
-	User                 []*protocol.User `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
+	User []*protocol.User `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"`
 }
 
-func (m *ServerConfig) Reset()         { *m = ServerConfig{} }
-func (m *ServerConfig) String() string { return proto.CompactTextString(m) }
-func (*ServerConfig) ProtoMessage()    {}
-func (*ServerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_64514e21c693811b, []int{1}
+func (x *ServerConfig) Reset() {
+	*x = ServerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ServerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerConfig.Unmarshal(m, b)
+func (x *ServerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerConfig.Marshal(b, m, deterministic)
-}
-func (m *ServerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerConfig.Merge(m, src)
-}
-func (m *ServerConfig) XXX_Size() int {
-	return xxx_messageInfo_ServerConfig.Size(m)
-}
-func (m *ServerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerConfig.DiscardUnknown(m)
+
+func (*ServerConfig) ProtoMessage() {}
+
+func (x *ServerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ServerConfig proto.InternalMessageInfo
+// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead.
+func (*ServerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_mtproto_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *ServerConfig) GetUser() []*protocol.User {
-	if m != nil {
-		return m.User
+func (x *ServerConfig) GetUser() []*protocol.User {
+	if x != nil {
+		return x.User
 	}
 	return nil
 }
 
 type ClientConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *ClientConfig) Reset()         { *m = ClientConfig{} }
-func (m *ClientConfig) String() string { return proto.CompactTextString(m) }
-func (*ClientConfig) ProtoMessage()    {}
-func (*ClientConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_64514e21c693811b, []int{2}
+func (x *ClientConfig) Reset() {
+	*x = ClientConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ClientConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ClientConfig.Unmarshal(m, b)
-}
-func (m *ClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ClientConfig.Marshal(b, m, deterministic)
+func (x *ClientConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ClientConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ClientConfig.Merge(m, src)
+
+func (*ClientConfig) ProtoMessage() {}
+
+func (x *ClientConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *ClientConfig) XXX_Size() int {
-	return xxx_messageInfo_ClientConfig.Size(m)
+
+// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead.
+func (*ClientConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_mtproto_config_proto_rawDescGZIP(), []int{2}
 }
-func (m *ClientConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ClientConfig.DiscardUnknown(m)
+
+var File_v2ray_com_core_proxy_mtproto_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_mtproto_config_proto_rawDesc = []byte{
+	0x0a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x6d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x74,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0x21, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73,
+	0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x65, 0x63,
+	0x72, 0x65, 0x74, 0x22, 0x44, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55,
+	0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x0e, 0x0a, 0x0c, 0x43, 0x6c, 0x69,
+	0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x44, 0x0a, 0x1c, 0x63, 0x6f, 0x6d,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x2e, 0x6d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x07, 0x6d, 0x74, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72,
+	0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x4d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_ClientConfig proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_proxy_mtproto_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_mtproto_config_proto_rawDescData = file_v2ray_com_core_proxy_mtproto_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.mtproto.Account")
-	proto.RegisterType((*ServerConfig)(nil), "v2ray.core.proxy.mtproto.ServerConfig")
-	proto.RegisterType((*ClientConfig)(nil), "v2ray.core.proxy.mtproto.ClientConfig")
+func file_v2ray_com_core_proxy_mtproto_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_mtproto_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_mtproto_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_mtproto_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_mtproto_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/mtproto/config.proto", fileDescriptor_64514e21c693811b)
+var file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_v2ray_com_core_proxy_mtproto_config_proto_goTypes = []interface{}{
+	(*Account)(nil),       // 0: v2ray.core.proxy.mtproto.Account
+	(*ServerConfig)(nil),  // 1: v2ray.core.proxy.mtproto.ServerConfig
+	(*ClientConfig)(nil),  // 2: v2ray.core.proxy.mtproto.ClientConfig
+	(*protocol.User)(nil), // 3: v2ray.core.common.protocol.User
+}
+var file_v2ray_com_core_proxy_mtproto_config_proto_depIdxs = []int32{
+	3, // 0: v2ray.core.proxy.mtproto.ServerConfig.user:type_name -> v2ray.core.common.protocol.User
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_64514e21c693811b = []byte{
-	// 221 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x8f, 0xc1, 0x4a, 0xc4, 0x30,
-	0x10, 0x86, 0x89, 0xca, 0x2e, 0xc4, 0xe2, 0xa1, 0x07, 0x09, 0xe2, 0xa1, 0xf6, 0xb4, 0x5e, 0x26,
-	0x50, 0x7d, 0x01, 0xed, 0x5e, 0x85, 0xa5, 0xa2, 0x07, 0x6f, 0xeb, 0x30, 0xca, 0xc2, 0x26, 0x53,
-	0xa6, 0x69, 0xb1, 0xaf, 0xe4, 0x53, 0x4a, 0x93, 0x16, 0x44, 0xf0, 0x94, 0xfc, 0xfc, 0x1f, 0xdf,
-	0x9f, 0xe8, 0xdb, 0xa1, 0x92, 0xfd, 0x08, 0xc8, 0xce, 0x22, 0x0b, 0xd9, 0x56, 0xf8, 0x6b, 0xb4,
-	0x2e, 0xb4, 0xc2, 0x81, 0x2d, 0xb2, 0xff, 0x38, 0x7c, 0x42, 0x0c, 0xb9, 0x59, 0x50, 0x21, 0x88,
-	0x18, 0xcc, 0xd8, 0xd5, 0x5f, 0x09, 0xb2, 0x73, 0xec, 0x6d, 0x2c, 0x91, 0x8f, 0xb6, 0xef, 0x48,
-	0x92, 0xa4, 0xbc, 0xd1, 0xeb, 0x07, 0x44, 0xee, 0x7d, 0xc8, 0x2f, 0xf5, 0xaa, 0x23, 0x14, 0x0a,
-	0x46, 0x15, 0x6a, 0x93, 0x35, 0x73, 0x2a, 0xb7, 0x3a, 0x7b, 0x26, 0x19, 0x48, 0xea, 0xb8, 0x9e,
-	0xdf, 0xeb, 0xb3, 0x49, 0x60, 0x54, 0x71, 0xba, 0x39, 0xaf, 0x0a, 0xf8, 0xf5, 0x8c, 0x34, 0x04,
-	0xcb, 0x10, 0xbc, 0x74, 0x24, 0x4d, 0xa4, 0xcb, 0x0b, 0x9d, 0xd5, 0xc7, 0x03, 0xf9, 0x90, 0x2c,
-	0x8f, 0x5b, 0x7d, 0x8d, 0xec, 0xe0, 0xbf, 0x3f, 0xec, 0xd4, 0xdb, 0x7a, 0xbe, 0x7e, 0x9f, 0x98,
-	0xd7, 0xaa, 0xd9, 0x8f, 0x50, 0x4f, 0xd4, 0x2e, 0x52, 0x4f, 0xa9, 0x7a, 0x5f, 0xc5, 0xe3, 0xee,
-	0x27, 0x00, 0x00, 0xff, 0xff, 0x54, 0x23, 0xa0, 0xae, 0x37, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_proxy_mtproto_config_proto_init() }
+func file_v2ray_com_core_proxy_mtproto_config_proto_init() {
+	if File_v2ray_com_core_proxy_mtproto_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Account); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ServerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClientConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_mtproto_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_mtproto_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_mtproto_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_mtproto_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_mtproto_config_proto = out.File
+	file_v2ray_com_core_proxy_mtproto_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_mtproto_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_mtproto_config_proto_depIdxs = nil
 }

+ 374 - 187
proxy/shadowsocks/config.pb.go

@@ -1,23 +1,25 @@
 package shadowsocks
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type CipherType int32
 
@@ -33,36 +35,57 @@ const (
 	CipherType_NONE              CipherType = 8
 )
 
-var CipherType_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "AES_128_CFB",
-	2: "AES_256_CFB",
-	3: "CHACHA20",
-	4: "CHACHA20_IETF",
-	5: "AES_128_GCM",
-	6: "AES_256_GCM",
-	7: "CHACHA20_POLY1305",
-	8: "NONE",
-}
-
-var CipherType_value = map[string]int32{
-	"UNKNOWN":           0,
-	"AES_128_CFB":       1,
-	"AES_256_CFB":       2,
-	"CHACHA20":          3,
-	"CHACHA20_IETF":     4,
-	"AES_128_GCM":       5,
-	"AES_256_GCM":       6,
-	"CHACHA20_POLY1305": 7,
-	"NONE":              8,
+// Enum value maps for CipherType.
+var (
+	CipherType_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "AES_128_CFB",
+		2: "AES_256_CFB",
+		3: "CHACHA20",
+		4: "CHACHA20_IETF",
+		5: "AES_128_GCM",
+		6: "AES_256_GCM",
+		7: "CHACHA20_POLY1305",
+		8: "NONE",
+	}
+	CipherType_value = map[string]int32{
+		"UNKNOWN":           0,
+		"AES_128_CFB":       1,
+		"AES_256_CFB":       2,
+		"CHACHA20":          3,
+		"CHACHA20_IETF":     4,
+		"AES_128_GCM":       5,
+		"AES_256_GCM":       6,
+		"CHACHA20_POLY1305": 7,
+		"NONE":              8,
+	}
+)
+
+func (x CipherType) Enum() *CipherType {
+	p := new(CipherType)
+	*p = x
+	return p
 }
 
 func (x CipherType) String() string {
-	return proto.EnumName(CipherType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (CipherType) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_enumTypes[0].Descriptor()
 }
 
+func (CipherType) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_proxy_shadowsocks_config_proto_enumTypes[0]
+}
+
+func (x CipherType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use CipherType.Descriptor instead.
 func (CipherType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_8d089a30c2106007, []int{0}
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{0}
 }
 
 type Account_OneTimeAuth int32
@@ -73,223 +96,387 @@ const (
 	Account_Enabled  Account_OneTimeAuth = 2
 )
 
-var Account_OneTimeAuth_name = map[int32]string{
-	0: "Auto",
-	1: "Disabled",
-	2: "Enabled",
-}
+// Enum value maps for Account_OneTimeAuth.
+var (
+	Account_OneTimeAuth_name = map[int32]string{
+		0: "Auto",
+		1: "Disabled",
+		2: "Enabled",
+	}
+	Account_OneTimeAuth_value = map[string]int32{
+		"Auto":     0,
+		"Disabled": 1,
+		"Enabled":  2,
+	}
+)
 
-var Account_OneTimeAuth_value = map[string]int32{
-	"Auto":     0,
-	"Disabled": 1,
-	"Enabled":  2,
+func (x Account_OneTimeAuth) Enum() *Account_OneTimeAuth {
+	p := new(Account_OneTimeAuth)
+	*p = x
+	return p
 }
 
 func (x Account_OneTimeAuth) String() string {
-	return proto.EnumName(Account_OneTimeAuth_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (Account_OneTimeAuth) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_8d089a30c2106007, []int{0, 0}
+func (Account_OneTimeAuth) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_enumTypes[1].Descriptor()
 }
 
-type Account struct {
-	Password             string              `protobuf:"bytes,1,opt,name=password,proto3" json:"password,omitempty"`
-	CipherType           CipherType          `protobuf:"varint,2,opt,name=cipher_type,json=cipherType,proto3,enum=v2ray.core.proxy.shadowsocks.CipherType" json:"cipher_type,omitempty"`
-	Ota                  Account_OneTimeAuth `protobuf:"varint,3,opt,name=ota,proto3,enum=v2ray.core.proxy.shadowsocks.Account_OneTimeAuth" json:"ota,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
+func (Account_OneTimeAuth) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_proxy_shadowsocks_config_proto_enumTypes[1]
 }
 
-func (m *Account) Reset()         { *m = Account{} }
-func (m *Account) String() string { return proto.CompactTextString(m) }
-func (*Account) ProtoMessage()    {}
-func (*Account) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8d089a30c2106007, []int{0}
+func (x Account_OneTimeAuth) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *Account) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Account.Unmarshal(m, b)
+// Deprecated: Use Account_OneTimeAuth.Descriptor instead.
+func (Account_OneTimeAuth) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{0, 0}
 }
-func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Account.Marshal(b, m, deterministic)
+
+type Account struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Password   string              `protobuf:"bytes,1,opt,name=password,proto3" json:"password,omitempty"`
+	CipherType CipherType          `protobuf:"varint,2,opt,name=cipher_type,json=cipherType,proto3,enum=v2ray.core.proxy.shadowsocks.CipherType" json:"cipher_type,omitempty"`
+	Ota        Account_OneTimeAuth `protobuf:"varint,3,opt,name=ota,proto3,enum=v2ray.core.proxy.shadowsocks.Account_OneTimeAuth" json:"ota,omitempty"`
 }
-func (m *Account) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Account.Merge(m, src)
+
+func (x *Account) Reset() {
+	*x = Account{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Account) XXX_Size() int {
-	return xxx_messageInfo_Account.Size(m)
+
+func (x *Account) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Account) XXX_DiscardUnknown() {
-	xxx_messageInfo_Account.DiscardUnknown(m)
+
+func (*Account) ProtoMessage() {}
+
+func (x *Account) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Account proto.InternalMessageInfo
+// Deprecated: Use Account.ProtoReflect.Descriptor instead.
+func (*Account) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Account) GetPassword() string {
-	if m != nil {
-		return m.Password
+func (x *Account) GetPassword() string {
+	if x != nil {
+		return x.Password
 	}
 	return ""
 }
 
-func (m *Account) GetCipherType() CipherType {
-	if m != nil {
-		return m.CipherType
+func (x *Account) GetCipherType() CipherType {
+	if x != nil {
+		return x.CipherType
 	}
 	return CipherType_UNKNOWN
 }
 
-func (m *Account) GetOta() Account_OneTimeAuth {
-	if m != nil {
-		return m.Ota
+func (x *Account) GetOta() Account_OneTimeAuth {
+	if x != nil {
+		return x.Ota
 	}
 	return Account_Auto
 }
 
 type ServerConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// UdpEnabled specified whether or not to enable UDP for Shadowsocks.
 	// Deprecated. Use 'network' field.
-	UdpEnabled           bool           `protobuf:"varint,1,opt,name=udp_enabled,json=udpEnabled,proto3" json:"udp_enabled,omitempty"` // Deprecated: Do not use.
-	User                 *protocol.User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
-	Network              []net.Network  `protobuf:"varint,3,rep,packed,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
+	//
+	// Deprecated: Do not use.
+	UdpEnabled bool           `protobuf:"varint,1,opt,name=udp_enabled,json=udpEnabled,proto3" json:"udp_enabled,omitempty"`
+	User       *protocol.User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
+	Network    []net.Network  `protobuf:"varint,3,rep,packed,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
+}
+
+func (x *ServerConfig) Reset() {
+	*x = ServerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ServerConfig) Reset()         { *m = ServerConfig{} }
-func (m *ServerConfig) String() string { return proto.CompactTextString(m) }
-func (*ServerConfig) ProtoMessage()    {}
-func (*ServerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8d089a30c2106007, []int{1}
+func (x *ServerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-func (m *ServerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerConfig.Unmarshal(m, b)
-}
-func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerConfig.Marshal(b, m, deterministic)
-}
-func (m *ServerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerConfig.Merge(m, src)
-}
-func (m *ServerConfig) XXX_Size() int {
-	return xxx_messageInfo_ServerConfig.Size(m)
-}
-func (m *ServerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerConfig.DiscardUnknown(m)
+func (*ServerConfig) ProtoMessage() {}
+
+func (x *ServerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ServerConfig proto.InternalMessageInfo
+// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead.
+func (*ServerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{1}
+}
 
 // Deprecated: Do not use.
-func (m *ServerConfig) GetUdpEnabled() bool {
-	if m != nil {
-		return m.UdpEnabled
+func (x *ServerConfig) GetUdpEnabled() bool {
+	if x != nil {
+		return x.UdpEnabled
 	}
 	return false
 }
 
-func (m *ServerConfig) GetUser() *protocol.User {
-	if m != nil {
-		return m.User
+func (x *ServerConfig) GetUser() *protocol.User {
+	if x != nil {
+		return x.User
 	}
 	return nil
 }
 
-func (m *ServerConfig) GetNetwork() []net.Network {
-	if m != nil {
-		return m.Network
+func (x *ServerConfig) GetNetwork() []net.Network {
+	if x != nil {
+		return x.Network
 	}
 	return nil
 }
 
 type ClientConfig struct {
-	Server               []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
-	XXX_unrecognized     []byte                     `json:"-"`
-	XXX_sizecache        int32                      `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ClientConfig) Reset()         { *m = ClientConfig{} }
-func (m *ClientConfig) String() string { return proto.CompactTextString(m) }
-func (*ClientConfig) ProtoMessage()    {}
-func (*ClientConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8d089a30c2106007, []int{2}
+	Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
 }
 
-func (m *ClientConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ClientConfig.Unmarshal(m, b)
-}
-func (m *ClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ClientConfig.Marshal(b, m, deterministic)
-}
-func (m *ClientConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ClientConfig.Merge(m, src)
+func (x *ClientConfig) Reset() {
+	*x = ClientConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ClientConfig) XXX_Size() int {
-	return xxx_messageInfo_ClientConfig.Size(m)
+
+func (x *ClientConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ClientConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ClientConfig.DiscardUnknown(m)
+
+func (*ClientConfig) ProtoMessage() {}
+
+func (x *ClientConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ClientConfig proto.InternalMessageInfo
+// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead.
+func (*ClientConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *ClientConfig) GetServer() []*protocol.ServerEndpoint {
-	if m != nil {
-		return m.Server
+func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint {
+	if x != nil {
+		return x.Server
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.proxy.shadowsocks.CipherType", CipherType_name, CipherType_value)
-	proto.RegisterEnum("v2ray.core.proxy.shadowsocks.Account_OneTimeAuth", Account_OneTimeAuth_name, Account_OneTimeAuth_value)
-	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.shadowsocks.Account")
-	proto.RegisterType((*ServerConfig)(nil), "v2ray.core.proxy.shadowsocks.ServerConfig")
-	proto.RegisterType((*ClientConfig)(nil), "v2ray.core.proxy.shadowsocks.ClientConfig")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/shadowsocks/config.proto", fileDescriptor_8d089a30c2106007)
-}
-
-var fileDescriptor_8d089a30c2106007 = []byte{
-	// 522 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xc1, 0x6e, 0xd3, 0x4e,
-	0x10, 0xc6, 0xbb, 0x71, 0xff, 0x4d, 0xfe, 0xe3, 0x50, 0xdc, 0x95, 0x90, 0xac, 0xa8, 0x42, 0x56,
-	0x38, 0x10, 0x2a, 0xb1, 0x4e, 0x5c, 0x8a, 0x7a, 0x75, 0x4c, 0x4a, 0x2b, 0xc0, 0x89, 0x9c, 0x14,
-	0x04, 0x17, 0xcb, 0x5d, 0x2f, 0xc4, 0x6a, 0xe2, 0xb5, 0xd6, 0x76, 0x43, 0x9e, 0x86, 0x03, 0x37,
-	0xde, 0x8c, 0xb7, 0x40, 0x5e, 0x3b, 0xa9, 0x85, 0xaa, 0x70, 0x88, 0x94, 0x99, 0xfd, 0x7d, 0x9f,
-	0x66, 0xbe, 0x31, 0xbc, 0xbc, 0xb3, 0x44, 0xb0, 0x26, 0x94, 0x2f, 0x4d, 0xca, 0x05, 0x33, 0x13,
-	0xc1, 0xbf, 0xaf, 0xcd, 0x74, 0x1e, 0x84, 0x7c, 0x95, 0x72, 0x7a, 0x9b, 0x9a, 0x94, 0xc7, 0x5f,
-	0xa3, 0x6f, 0x24, 0x11, 0x3c, 0xe3, 0xf8, 0x78, 0x83, 0x0b, 0x46, 0x24, 0x4a, 0x6a, 0x68, 0xe7,
-	0xf9, 0x5f, 0x66, 0x94, 0x2f, 0x97, 0x3c, 0x36, 0x63, 0x96, 0x15, 0xbf, 0x15, 0x17, 0xb7, 0xa5,
-	0x4d, 0xe7, 0xc5, 0xc3, 0xa0, 0x7c, 0xa4, 0x7c, 0x61, 0xe6, 0x29, 0x13, 0x15, 0xda, 0xff, 0x07,
-	0x9a, 0x32, 0x71, 0xc7, 0x84, 0x9f, 0x26, 0x8c, 0x96, 0x8a, 0xee, 0x6f, 0x04, 0x4d, 0x9b, 0x52,
-	0x9e, 0xc7, 0x19, 0xee, 0x40, 0x2b, 0x09, 0xd2, 0x74, 0xc5, 0x45, 0xa8, 0x23, 0x03, 0xf5, 0xfe,
-	0xf7, 0xb6, 0x35, 0xbe, 0x02, 0x95, 0x46, 0xc9, 0x9c, 0x09, 0x3f, 0x5b, 0x27, 0x4c, 0x6f, 0x18,
-	0xa8, 0x77, 0x68, 0xf5, 0xc8, 0xae, 0x0d, 0x89, 0x23, 0x05, 0xb3, 0x75, 0xc2, 0x3c, 0xa0, 0xdb,
-	0xff, 0xd8, 0x01, 0x85, 0x67, 0x81, 0xae, 0x48, 0x8b, 0xc1, 0x6e, 0x8b, 0x6a, 0x34, 0x32, 0x8e,
-	0xd9, 0x2c, 0x5a, 0x32, 0x3b, 0xcf, 0xe6, 0x5e, 0xa1, 0xee, 0x5a, 0xa0, 0xd6, 0x7a, 0xb8, 0x05,
-	0xfb, 0x76, 0x9e, 0x71, 0x6d, 0x0f, 0xb7, 0xa1, 0xf5, 0x26, 0x4a, 0x83, 0x9b, 0x05, 0x0b, 0x35,
-	0x84, 0x55, 0x68, 0x8e, 0xe2, 0xb2, 0x68, 0x74, 0x7f, 0x22, 0x68, 0x4f, 0x65, 0x02, 0x8e, 0x3c,
-	0x13, 0x7e, 0x06, 0x6a, 0x1e, 0x26, 0x3e, 0x2b, 0x09, 0xb9, 0x73, 0x6b, 0xd8, 0xd0, 0x91, 0x07,
-	0x79, 0x98, 0x54, 0x3a, 0xfc, 0x0a, 0xf6, 0x8b, 0x84, 0xe5, 0xca, 0xaa, 0x65, 0xd4, 0xe7, 0x2d,
-	0xe3, 0x25, 0x9b, 0x78, 0xc9, 0x75, 0xca, 0x84, 0x27, 0x69, 0x7c, 0x0e, 0xcd, 0xea, 0x8a, 0xba,
-	0x62, 0x28, 0xbd, 0x43, 0xeb, 0xe9, 0x03, 0xc2, 0x98, 0x65, 0xc4, 0x2d, 0x29, 0x6f, 0x83, 0x77,
-	0x3d, 0x68, 0x3b, 0x8b, 0x88, 0xc5, 0x59, 0x35, 0xe4, 0x10, 0x0e, 0xca, 0xb3, 0xe9, 0xc8, 0x50,
-	0x7a, 0xaa, 0x75, 0xb2, 0x6b, 0x82, 0x72, 0xbd, 0x51, 0x1c, 0x26, 0x3c, 0x8a, 0x33, 0xaf, 0x52,
-	0x9e, 0xfc, 0x40, 0x00, 0xf7, 0xd7, 0x28, 0x52, 0xb9, 0x76, 0xdf, 0xb9, 0xe3, 0x4f, 0xae, 0xb6,
-	0x87, 0x1f, 0x83, 0x6a, 0x8f, 0xa6, 0xfe, 0xc0, 0x3a, 0xf7, 0x9d, 0x8b, 0xa1, 0x86, 0x36, 0x0d,
-	0xeb, 0xec, 0xb5, 0x6c, 0x34, 0x8a, 0x48, 0x9d, 0x4b, 0xdb, 0xb9, 0xb4, 0xad, 0xbe, 0xa6, 0xe0,
-	0x23, 0x78, 0xb4, 0xa9, 0xfc, 0xab, 0xd1, 0xec, 0x42, 0xdb, 0xaf, 0x5b, 0xbc, 0x75, 0x3e, 0x68,
-	0xff, 0xd5, 0x2d, 0x8a, 0xc6, 0x01, 0x7e, 0x02, 0x47, 0x5b, 0xd1, 0x64, 0xfc, 0xfe, 0xf3, 0xe0,
-	0xb4, 0x7f, 0xa6, 0x35, 0x8b, 0xb3, 0xb9, 0x63, 0x77, 0xa4, 0xb5, 0x86, 0x13, 0x30, 0x28, 0x5f,
-	0xee, 0xfc, 0x18, 0x26, 0xe8, 0x8b, 0x5a, 0x2b, 0x7f, 0x35, 0x8e, 0x3f, 0x5a, 0x5e, 0xb0, 0x26,
-	0x4e, 0x41, 0x4f, 0x24, 0x3d, 0xbd, 0x7f, 0xbe, 0x39, 0x90, 0xa1, 0x9c, 0xfe, 0x09, 0x00, 0x00,
-	0xff, 0xff, 0xdc, 0x7e, 0x6b, 0x61, 0xb5, 0x03, 0x00, 0x00,
+var File_v2ray_com_core_proxy_shadowsocks_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDesc = []byte{
+	0x0a, 0x2d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63,
+	0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x27, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72,
+	0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0xe9, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+	0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x49, 0x0a, 0x0b, 0x63,
+	0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2e,
+	0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68,
+	0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x03, 0x6f, 0x74, 0x61, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63,
+	0x6b, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x4f, 0x6e, 0x65, 0x54, 0x69,
+	0x6d, 0x65, 0x41, 0x75, 0x74, 0x68, 0x52, 0x03, 0x6f, 0x74, 0x61, 0x22, 0x32, 0x0a, 0x0b, 0x4f,
+	0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x75, 0x74, 0x68, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x75,
+	0x74, 0x6f, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64,
+	0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x22,
+	0xa3, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x23, 0x0a, 0x0b, 0x75, 0x64, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x75, 0x64, 0x70, 0x45, 0x6e,
+	0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x6e,
+	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65,
+	0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x52, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
+	0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2a, 0x9f, 0x01, 0x0a, 0x0a, 0x43, 0x69,
+	0x70, 0x68, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e,
+	0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38,
+	0x5f, 0x43, 0x46, 0x42, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35,
+	0x36, 0x5f, 0x43, 0x46, 0x42, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x48, 0x41, 0x43, 0x48,
+	0x41, 0x32, 0x30, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x48, 0x41, 0x43, 0x48, 0x41, 0x32,
+	0x30, 0x5f, 0x49, 0x45, 0x54, 0x46, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f,
+	0x31, 0x32, 0x38, 0x5f, 0x47, 0x43, 0x4d, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53,
+	0x5f, 0x32, 0x35, 0x36, 0x5f, 0x47, 0x43, 0x4d, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48,
+	0x41, 0x43, 0x48, 0x41, 0x32, 0x30, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x31, 0x33, 0x30, 0x35, 0x10,
+	0x07, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x08, 0x42, 0x50, 0x0a, 0x20, 0x63,
+	0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x50,
+	0x01, 0x5a, 0x0b, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0xaa, 0x02,
+	0x1c, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78,
+	0x79, 0x2e, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescData = file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_proxy_shadowsocks_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_v2ray_com_core_proxy_shadowsocks_config_proto_goTypes = []interface{}{
+	(CipherType)(0),                 // 0: v2ray.core.proxy.shadowsocks.CipherType
+	(Account_OneTimeAuth)(0),        // 1: v2ray.core.proxy.shadowsocks.Account.OneTimeAuth
+	(*Account)(nil),                 // 2: v2ray.core.proxy.shadowsocks.Account
+	(*ServerConfig)(nil),            // 3: v2ray.core.proxy.shadowsocks.ServerConfig
+	(*ClientConfig)(nil),            // 4: v2ray.core.proxy.shadowsocks.ClientConfig
+	(*protocol.User)(nil),           // 5: v2ray.core.common.protocol.User
+	(net.Network)(0),                // 6: v2ray.core.common.net.Network
+	(*protocol.ServerEndpoint)(nil), // 7: v2ray.core.common.protocol.ServerEndpoint
+}
+var file_v2ray_com_core_proxy_shadowsocks_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.proxy.shadowsocks.Account.cipher_type:type_name -> v2ray.core.proxy.shadowsocks.CipherType
+	1, // 1: v2ray.core.proxy.shadowsocks.Account.ota:type_name -> v2ray.core.proxy.shadowsocks.Account.OneTimeAuth
+	5, // 2: v2ray.core.proxy.shadowsocks.ServerConfig.user:type_name -> v2ray.core.common.protocol.User
+	6, // 3: v2ray.core.proxy.shadowsocks.ServerConfig.network:type_name -> v2ray.core.common.net.Network
+	7, // 4: v2ray.core.proxy.shadowsocks.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint
+	5, // [5:5] is the sub-list for method output_type
+	5, // [5:5] is the sub-list for method input_type
+	5, // [5:5] is the sub-list for extension type_name
+	5, // [5:5] is the sub-list for extension extendee
+	0, // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_proxy_shadowsocks_config_proto_init() }
+func file_v2ray_com_core_proxy_shadowsocks_config_proto_init() {
+	if File_v2ray_com_core_proxy_shadowsocks_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Account); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ServerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClientConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_shadowsocks_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_shadowsocks_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_proxy_shadowsocks_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_proxy_shadowsocks_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_shadowsocks_config_proto = out.File
+	file_v2ray_com_core_proxy_shadowsocks_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_shadowsocks_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_shadowsocks_config_proto_depIdxs = nil
 }

+ 324 - 168
proxy/socks/config.pb.go

@@ -1,23 +1,25 @@
 package socks
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	net "v2ray.com/core/common/net"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // AuthType is the authentication type of Socks proxy.
 type AuthType int32
@@ -29,236 +31,390 @@ const (
 	AuthType_PASSWORD AuthType = 1
 )
 
-var AuthType_name = map[int32]string{
-	0: "NO_AUTH",
-	1: "PASSWORD",
-}
+// Enum value maps for AuthType.
+var (
+	AuthType_name = map[int32]string{
+		0: "NO_AUTH",
+		1: "PASSWORD",
+	}
+	AuthType_value = map[string]int32{
+		"NO_AUTH":  0,
+		"PASSWORD": 1,
+	}
+)
 
-var AuthType_value = map[string]int32{
-	"NO_AUTH":  0,
-	"PASSWORD": 1,
+func (x AuthType) Enum() *AuthType {
+	p := new(AuthType)
+	*p = x
+	return p
 }
 
 func (x AuthType) String() string {
-	return proto.EnumName(AuthType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (AuthType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e86958e2cebd3303, []int{0}
+func (AuthType) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_proxy_socks_config_proto_enumTypes[0].Descriptor()
 }
 
-// Account represents a Socks account.
-type Account struct {
-	Username             string   `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
-	Password             string   `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+func (AuthType) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_proxy_socks_config_proto_enumTypes[0]
 }
 
-func (m *Account) Reset()         { *m = Account{} }
-func (m *Account) String() string { return proto.CompactTextString(m) }
-func (*Account) ProtoMessage()    {}
-func (*Account) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e86958e2cebd3303, []int{0}
+func (x AuthType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
-func (m *Account) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Account.Unmarshal(m, b)
+// Deprecated: Use AuthType.Descriptor instead.
+func (AuthType) EnumDescriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_socks_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Account.Marshal(b, m, deterministic)
+
+// Account represents a Socks account.
+type Account struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
+	Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
 }
-func (m *Account) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Account.Merge(m, src)
+
+func (x *Account) Reset() {
+	*x = Account{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_socks_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Account) XXX_Size() int {
-	return xxx_messageInfo_Account.Size(m)
+
+func (x *Account) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Account) XXX_DiscardUnknown() {
-	xxx_messageInfo_Account.DiscardUnknown(m)
+
+func (*Account) ProtoMessage() {}
+
+func (x *Account) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_socks_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Account proto.InternalMessageInfo
+// Deprecated: Use Account.ProtoReflect.Descriptor instead.
+func (*Account) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_socks_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Account) GetUsername() string {
-	if m != nil {
-		return m.Username
+func (x *Account) GetUsername() string {
+	if x != nil {
+		return x.Username
 	}
 	return ""
 }
 
-func (m *Account) GetPassword() string {
-	if m != nil {
-		return m.Password
+func (x *Account) GetPassword() string {
+	if x != nil {
+		return x.Password
 	}
 	return ""
 }
 
 // ServerConfig is the protobuf config for Socks server.
 type ServerConfig struct {
-	AuthType             AuthType          `protobuf:"varint,1,opt,name=auth_type,json=authType,proto3,enum=v2ray.core.proxy.socks.AuthType" json:"auth_type,omitempty"`
-	Accounts             map[string]string `protobuf:"bytes,2,rep,name=accounts,proto3" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	Address              *net.IPOrDomain   `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
-	UdpEnabled           bool              `protobuf:"varint,4,opt,name=udp_enabled,json=udpEnabled,proto3" json:"udp_enabled,omitempty"`
-	Timeout              uint32            `protobuf:"varint,5,opt,name=timeout,proto3" json:"timeout,omitempty"` // Deprecated: Do not use.
-	UserLevel            uint32            `protobuf:"varint,6,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *ServerConfig) Reset()         { *m = ServerConfig{} }
-func (m *ServerConfig) String() string { return proto.CompactTextString(m) }
-func (*ServerConfig) ProtoMessage()    {}
-func (*ServerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e86958e2cebd3303, []int{1}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	AuthType   AuthType          `protobuf:"varint,1,opt,name=auth_type,json=authType,proto3,enum=v2ray.core.proxy.socks.AuthType" json:"auth_type,omitempty"`
+	Accounts   map[string]string `protobuf:"bytes,2,rep,name=accounts,proto3" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Address    *net.IPOrDomain   `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
+	UdpEnabled bool              `protobuf:"varint,4,opt,name=udp_enabled,json=udpEnabled,proto3" json:"udp_enabled,omitempty"`
+	// Deprecated: Do not use.
+	Timeout   uint32 `protobuf:"varint,5,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	UserLevel uint32 `protobuf:"varint,6,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
+}
+
+func (x *ServerConfig) Reset() {
+	*x = ServerConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_socks_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ServerConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerConfig.Unmarshal(m, b)
-}
-func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerConfig.Marshal(b, m, deterministic)
-}
-func (m *ServerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerConfig.Merge(m, src)
+func (x *ServerConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ServerConfig) XXX_Size() int {
-	return xxx_messageInfo_ServerConfig.Size(m)
-}
-func (m *ServerConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerConfig.DiscardUnknown(m)
+
+func (*ServerConfig) ProtoMessage() {}
+
+func (x *ServerConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_socks_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ServerConfig proto.InternalMessageInfo
+// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead.
+func (*ServerConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_socks_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *ServerConfig) GetAuthType() AuthType {
-	if m != nil {
-		return m.AuthType
+func (x *ServerConfig) GetAuthType() AuthType {
+	if x != nil {
+		return x.AuthType
 	}
 	return AuthType_NO_AUTH
 }
 
-func (m *ServerConfig) GetAccounts() map[string]string {
-	if m != nil {
-		return m.Accounts
+func (x *ServerConfig) GetAccounts() map[string]string {
+	if x != nil {
+		return x.Accounts
 	}
 	return nil
 }
 
-func (m *ServerConfig) GetAddress() *net.IPOrDomain {
-	if m != nil {
-		return m.Address
+func (x *ServerConfig) GetAddress() *net.IPOrDomain {
+	if x != nil {
+		return x.Address
 	}
 	return nil
 }
 
-func (m *ServerConfig) GetUdpEnabled() bool {
-	if m != nil {
-		return m.UdpEnabled
+func (x *ServerConfig) GetUdpEnabled() bool {
+	if x != nil {
+		return x.UdpEnabled
 	}
 	return false
 }
 
 // Deprecated: Do not use.
-func (m *ServerConfig) GetTimeout() uint32 {
-	if m != nil {
-		return m.Timeout
+func (x *ServerConfig) GetTimeout() uint32 {
+	if x != nil {
+		return x.Timeout
 	}
 	return 0
 }
 
-func (m *ServerConfig) GetUserLevel() uint32 {
-	if m != nil {
-		return m.UserLevel
+func (x *ServerConfig) GetUserLevel() uint32 {
+	if x != nil {
+		return x.UserLevel
 	}
 	return 0
 }
 
 // ClientConfig is the protobuf config for Socks client.
 type ClientConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Sever is a list of Socks server addresses.
-	Server               []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
-	XXX_unrecognized     []byte                     `json:"-"`
-	XXX_sizecache        int32                      `json:"-"`
+	Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
 }
 
-func (m *ClientConfig) Reset()         { *m = ClientConfig{} }
-func (m *ClientConfig) String() string { return proto.CompactTextString(m) }
-func (*ClientConfig) ProtoMessage()    {}
-func (*ClientConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e86958e2cebd3303, []int{2}
+func (x *ClientConfig) Reset() {
+	*x = ClientConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_socks_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ClientConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ClientConfig.Unmarshal(m, b)
+func (x *ClientConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ClientConfig.Marshal(b, m, deterministic)
-}
-func (m *ClientConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ClientConfig.Merge(m, src)
-}
-func (m *ClientConfig) XXX_Size() int {
-	return xxx_messageInfo_ClientConfig.Size(m)
-}
-func (m *ClientConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ClientConfig.DiscardUnknown(m)
+
+func (*ClientConfig) ProtoMessage() {}
+
+func (x *ClientConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_socks_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ClientConfig proto.InternalMessageInfo
+// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead.
+func (*ClientConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_socks_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *ClientConfig) GetServer() []*protocol.ServerEndpoint {
-	if m != nil {
-		return m.Server
+func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint {
+	if x != nil {
+		return x.Server
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.proxy.socks.AuthType", AuthType_name, AuthType_value)
-	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.socks.Account")
-	proto.RegisterType((*ServerConfig)(nil), "v2ray.core.proxy.socks.ServerConfig")
-	proto.RegisterMapType((map[string]string)(nil), "v2ray.core.proxy.socks.ServerConfig.AccountsEntry")
-	proto.RegisterType((*ClientConfig)(nil), "v2ray.core.proxy.socks.ClientConfig")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/socks/config.proto", fileDescriptor_e86958e2cebd3303)
-}
-
-var fileDescriptor_e86958e2cebd3303 = []byte{
-	// 470 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0x5d, 0x8b, 0xd3, 0x40,
-	0x14, 0x75, 0xb2, 0xb6, 0x4d, 0x6f, 0xbb, 0x52, 0x06, 0x59, 0x42, 0x51, 0x8c, 0x05, 0xb1, 0xec,
-	0xc3, 0x44, 0xe2, 0x8b, 0xb8, 0x28, 0xb4, 0xdd, 0x82, 0x82, 0x6c, 0xcb, 0x74, 0x55, 0xf0, 0x25,
-	0xcc, 0x4e, 0x46, 0x37, 0x6c, 0x32, 0x13, 0x66, 0x26, 0xd5, 0xfc, 0x25, 0xff, 0x9f, 0xef, 0x92,
-	0xaf, 0x65, 0x95, 0xee, 0xdb, 0xfd, 0x38, 0xf7, 0xcc, 0x3d, 0xe7, 0x0e, 0xbc, 0xdc, 0x87, 0x9a,
-	0x95, 0x84, 0xab, 0x2c, 0xe0, 0x4a, 0x8b, 0x20, 0xd7, 0xea, 0x57, 0x19, 0x18, 0xc5, 0x6f, 0x4c,
-	0xc0, 0x95, 0xfc, 0x9e, 0xfc, 0x20, 0xb9, 0x56, 0x56, 0xe1, 0x93, 0x0e, 0xa8, 0x05, 0xa9, 0x41,
-	0xa4, 0x06, 0x4d, 0xff, 0x27, 0xe0, 0x2a, 0xcb, 0x94, 0x0c, 0xa4, 0xb0, 0x01, 0x8b, 0x63, 0x2d,
-	0x8c, 0x69, 0x08, 0xa6, 0xaf, 0x0e, 0x03, 0xeb, 0x26, 0x57, 0x69, 0x60, 0x84, 0xde, 0x0b, 0x1d,
-	0x99, 0x5c, 0xf0, 0x66, 0x62, 0xb6, 0x80, 0xc1, 0x82, 0x73, 0x55, 0x48, 0x8b, 0xa7, 0xe0, 0x16,
-	0x46, 0x68, 0xc9, 0x32, 0xe1, 0x21, 0x1f, 0xcd, 0x87, 0xf4, 0x36, 0xaf, 0x7a, 0x39, 0x33, 0xe6,
-	0xa7, 0xd2, 0xb1, 0xe7, 0x34, 0xbd, 0x2e, 0x9f, 0xfd, 0x71, 0x60, 0xbc, 0xab, 0x89, 0x57, 0xb5,
-	0x18, 0xfc, 0x0e, 0x86, 0xac, 0xb0, 0xd7, 0x91, 0x2d, 0xf3, 0x86, 0xe9, 0x51, 0xe8, 0x93, 0xc3,
-	0xd2, 0xc8, 0xa2, 0xb0, 0xd7, 0x97, 0x65, 0x2e, 0xa8, 0xcb, 0xda, 0x08, 0x5f, 0x80, 0xcb, 0x9a,
-	0x95, 0x8c, 0xe7, 0xf8, 0x47, 0xf3, 0x51, 0x18, 0xde, 0x37, 0x7d, 0xf7, 0x59, 0xd2, 0xea, 0x30,
-	0x6b, 0x69, 0x75, 0x49, 0x6f, 0x39, 0xf0, 0x19, 0x0c, 0x5a, 0x97, 0xbc, 0x23, 0x1f, 0xcd, 0x47,
-	0xe1, 0xf3, 0xbb, 0x74, 0x8d, 0x45, 0x44, 0x0a, 0x4b, 0x3e, 0x6e, 0x37, 0xfa, 0x5c, 0x65, 0x2c,
-	0x91, 0xb4, 0x9b, 0xc0, 0xcf, 0x60, 0x54, 0xc4, 0x79, 0x24, 0x24, 0xbb, 0x4a, 0x45, 0xec, 0x3d,
-	0xf4, 0xd1, 0xdc, 0xa5, 0x50, 0xc4, 0xf9, 0xba, 0xa9, 0xe0, 0x27, 0x30, 0xb0, 0x49, 0x26, 0x54,
-	0x61, 0xbd, 0x9e, 0x8f, 0xe6, 0xc7, 0x4b, 0xc7, 0x43, 0xb4, 0x2b, 0xe1, 0xa7, 0x00, 0x95, 0x87,
-	0x51, 0x2a, 0xf6, 0x22, 0xf5, 0xfa, 0x15, 0x80, 0x0e, 0xab, 0xca, 0xa7, 0xaa, 0x30, 0x3d, 0x83,
-	0xe3, 0x7f, 0xb6, 0xc6, 0x13, 0x38, 0xba, 0x11, 0x65, 0x6b, 0x7f, 0x15, 0xe2, 0xc7, 0xd0, 0xdb,
-	0xb3, 0xb4, 0x10, 0xad, 0xed, 0x4d, 0xf2, 0xd6, 0x79, 0x83, 0x66, 0x14, 0xc6, 0xab, 0x34, 0x11,
-	0xd2, 0xb6, 0xb6, 0x2f, 0xa1, 0xdf, 0xdc, 0xd7, 0x43, 0xb5, 0x6b, 0xa7, 0x07, 0x64, 0x76, 0x3f,
-	0xa1, 0x75, 0x6e, 0x2d, 0xe3, 0x5c, 0x25, 0xd2, 0xd2, 0x76, 0xf2, 0xf4, 0x05, 0xb8, 0xdd, 0x45,
-	0xf0, 0x08, 0x06, 0x17, 0x9b, 0x68, 0xf1, 0xf9, 0xf2, 0xc3, 0xe4, 0x01, 0x1e, 0x83, 0xbb, 0x5d,
-	0xec, 0x76, 0x5f, 0x37, 0xf4, 0x7c, 0x82, 0x96, 0xef, 0x61, 0xca, 0x55, 0x76, 0xcf, 0x55, 0xb6,
-	0xe8, 0x5b, 0xaf, 0x0e, 0x7e, 0x3b, 0x27, 0x5f, 0x42, 0xca, 0x4a, 0xb2, 0xaa, 0x10, 0xdb, 0x1a,
-	0xb1, 0xab, 0x1a, 0x57, 0xfd, 0x7a, 0x8f, 0xd7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x23, 0xac,
-	0x72, 0x71, 0x1a, 0x03, 0x00, 0x00,
+var File_v2ray_com_core_proxy_socks_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_socks_config_proto_rawDesc = []byte{
+	0x0a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b,
+	0x73, 0x1a, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72,
+	0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x07,
+	0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22,
+	0xf5, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x3d, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x41, 0x75, 0x74,
+	0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x4e, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12,
+	0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d,
+	0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b,
+	0x75, 0x64, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x0a, 0x75, 0x64, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a,
+	0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02,
+	0x18, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75,
+	0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3b, 0x0a, 0x0d, 0x41, 0x63,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e,
+	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f,
+	0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2a, 0x25, 0x0a, 0x08, 0x41,
+	0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x41, 0x55,
+	0x54, 0x48, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44,
+	0x10, 0x01, 0x42, 0x3e, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73,
+	0x50, 0x01, 0x5a, 0x05, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0xaa, 0x02, 0x16, 0x56, 0x32, 0x52, 0x61,
+	0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x53, 0x6f, 0x63,
+	0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_socks_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_socks_config_proto_rawDescData = file_v2ray_com_core_proxy_socks_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_socks_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_socks_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_socks_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_socks_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_socks_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_proxy_socks_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_proxy_socks_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_v2ray_com_core_proxy_socks_config_proto_goTypes = []interface{}{
+	(AuthType)(0),                   // 0: v2ray.core.proxy.socks.AuthType
+	(*Account)(nil),                 // 1: v2ray.core.proxy.socks.Account
+	(*ServerConfig)(nil),            // 2: v2ray.core.proxy.socks.ServerConfig
+	(*ClientConfig)(nil),            // 3: v2ray.core.proxy.socks.ClientConfig
+	nil,                             // 4: v2ray.core.proxy.socks.ServerConfig.AccountsEntry
+	(*net.IPOrDomain)(nil),          // 5: v2ray.core.common.net.IPOrDomain
+	(*protocol.ServerEndpoint)(nil), // 6: v2ray.core.common.protocol.ServerEndpoint
+}
+var file_v2ray_com_core_proxy_socks_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.proxy.socks.ServerConfig.auth_type:type_name -> v2ray.core.proxy.socks.AuthType
+	4, // 1: v2ray.core.proxy.socks.ServerConfig.accounts:type_name -> v2ray.core.proxy.socks.ServerConfig.AccountsEntry
+	5, // 2: v2ray.core.proxy.socks.ServerConfig.address:type_name -> v2ray.core.common.net.IPOrDomain
+	6, // 3: v2ray.core.proxy.socks.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint
+	4, // [4:4] is the sub-list for method output_type
+	4, // [4:4] is the sub-list for method input_type
+	4, // [4:4] is the sub-list for extension type_name
+	4, // [4:4] is the sub-list for extension extendee
+	0, // [0:4] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_proxy_socks_config_proto_init() }
+func file_v2ray_com_core_proxy_socks_config_proto_init() {
+	if File_v2ray_com_core_proxy_socks_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_socks_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Account); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_socks_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ServerConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_socks_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClientConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_socks_config_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_socks_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_socks_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_proxy_socks_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_proxy_socks_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_socks_config_proto = out.File
+	file_v2ray_com_core_proxy_socks_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_socks_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_socks_config_proto_depIdxs = nil
 }

+ 149 - 65
proxy/vmess/account.pb.go

@@ -1,105 +1,189 @@
 package vmess
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Account struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// ID of the account, in the form of a UUID, e.g., "66ad4540-b58c-4ad2-9926-ea63445a9b57".
 	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	// Number of alternative IDs. Client and server must share the same number.
 	AlterId uint32 `protobuf:"varint,2,opt,name=alter_id,json=alterId,proto3" json:"alter_id,omitempty"`
 	// Security settings. Only applies to client side.
-	SecuritySettings     *protocol.SecurityConfig `protobuf:"bytes,3,opt,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
+	SecuritySettings *protocol.SecurityConfig `protobuf:"bytes,3,opt,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"`
+	// Define tests enabled for this account
+	TestsEnabled string `protobuf:"bytes,4,opt,name=tests_enabled,json=testsEnabled,proto3" json:"tests_enabled,omitempty"`
 }
 
-func (m *Account) Reset()         { *m = Account{} }
-func (m *Account) String() string { return proto.CompactTextString(m) }
-func (*Account) ProtoMessage()    {}
-func (*Account) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d65dee31e5abbda0, []int{0}
+func (x *Account) Reset() {
+	*x = Account{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_vmess_account_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Account) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Account.Unmarshal(m, b)
-}
-func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Account.Marshal(b, m, deterministic)
-}
-func (m *Account) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Account.Merge(m, src)
+func (x *Account) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Account) XXX_Size() int {
-	return xxx_messageInfo_Account.Size(m)
-}
-func (m *Account) XXX_DiscardUnknown() {
-	xxx_messageInfo_Account.DiscardUnknown(m)
+
+func (*Account) ProtoMessage() {}
+
+func (x *Account) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_vmess_account_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Account proto.InternalMessageInfo
+// Deprecated: Use Account.ProtoReflect.Descriptor instead.
+func (*Account) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_vmess_account_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Account) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *Account) GetId() string {
+	if x != nil {
+		return x.Id
 	}
 	return ""
 }
 
-func (m *Account) GetAlterId() uint32 {
-	if m != nil {
-		return m.AlterId
+func (x *Account) GetAlterId() uint32 {
+	if x != nil {
+		return x.AlterId
 	}
 	return 0
 }
 
-func (m *Account) GetSecuritySettings() *protocol.SecurityConfig {
-	if m != nil {
-		return m.SecuritySettings
+func (x *Account) GetSecuritySettings() *protocol.SecurityConfig {
+	if x != nil {
+		return x.SecuritySettings
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.vmess.Account")
+func (x *Account) GetTestsEnabled() string {
+	if x != nil {
+		return x.TestsEnabled
+	}
+	return ""
+}
+
+var File_v2ray_com_core_proxy_vmess_account_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_vmess_account_proto_rawDesc = []byte{
+	0x0a, 0x28, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x61, 0x63, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65,
+	0x73, 0x73, 0x1a, 0x2c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f,
+	0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0xb2, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08,
+	0x61, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
+	0x61, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x75, 0x72,
+	0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10,
+	0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
+	0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e,
+	0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x3e, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d,
+	0x65, 0x73, 0x73, 0x50, 0x01, 0x5a, 0x05, 0x76, 0x6d, 0x65, 0x73, 0x73, 0xaa, 0x02, 0x16, 0x56,
+	0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e,
+	0x56, 0x6d, 0x65, 0x73, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_vmess_account_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_vmess_account_proto_rawDescData = file_v2ray_com_core_proxy_vmess_account_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_vmess_account_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_vmess_account_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_vmess_account_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_vmess_account_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_vmess_account_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/vmess/account.proto", fileDescriptor_d65dee31e5abbda0)
+var file_v2ray_com_core_proxy_vmess_account_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_proxy_vmess_account_proto_goTypes = []interface{}{
+	(*Account)(nil),                 // 0: v2ray.core.proxy.vmess.Account
+	(*protocol.SecurityConfig)(nil), // 1: v2ray.core.common.protocol.SecurityConfig
+}
+var file_v2ray_com_core_proxy_vmess_account_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.proxy.vmess.Account.security_settings:type_name -> v2ray.core.common.protocol.SecurityConfig
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_d65dee31e5abbda0 = []byte{
-	// 244 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x8f, 0xc1, 0x4a, 0x03, 0x31,
-	0x10, 0x86, 0xc9, 0x8a, 0x56, 0x23, 0x8a, 0xee, 0xa1, 0xac, 0x3d, 0x2d, 0x9e, 0x16, 0x91, 0x09,
-	0xac, 0x77, 0x41, 0x7b, 0xf2, 0x56, 0xb6, 0x50, 0xc1, 0x4b, 0x89, 0x49, 0xac, 0x81, 0x66, 0xa7,
-	0x4c, 0xd2, 0x62, 0x1e, 0xc2, 0x17, 0xf1, 0x29, 0xa5, 0xd9, 0x5d, 0x10, 0xe9, 0x2d, 0x61, 0xbe,
-	0xff, 0xfb, 0x67, 0x78, 0xb5, 0xab, 0x49, 0x46, 0x50, 0xe8, 0x84, 0x42, 0x32, 0x62, 0x43, 0xf8,
-	0x15, 0xc5, 0xce, 0x19, 0xef, 0x85, 0x54, 0x0a, 0xb7, 0x6d, 0x80, 0x0d, 0x61, 0xc0, 0x7c, 0x3c,
-	0x90, 0x64, 0x20, 0x51, 0x90, 0xa8, 0xc9, 0xfd, 0x3f, 0x83, 0x42, 0xe7, 0xb0, 0x15, 0x29, 0xa4,
-	0x70, 0x2d, 0x3e, 0x8d, 0xd4, 0x86, 0x7c, 0x67, 0xb9, 0xfd, 0x66, 0x7c, 0xf4, 0xd4, 0x79, 0xf3,
-	0x4b, 0x9e, 0x59, 0x5d, 0xb0, 0x92, 0x55, 0x67, 0x4d, 0x66, 0x75, 0x7e, 0xc3, 0x4f, 0xe5, 0x3a,
-	0x18, 0x5a, 0x5a, 0x5d, 0x64, 0x25, 0xab, 0x2e, 0x9a, 0x51, 0xfa, 0xbf, 0xe8, 0xfc, 0x95, 0x5f,
-	0x7b, 0xa3, 0xb6, 0x64, 0x43, 0x5c, 0x7a, 0x13, 0x82, 0x6d, 0x57, 0xbe, 0x38, 0x2a, 0x59, 0x75,
-	0x5e, 0xdf, 0xc1, 0x9f, 0xc5, 0xba, 0x72, 0x18, 0xca, 0x61, 0xde, 0x87, 0xa6, 0xd8, 0x7e, 0xd8,
-	0x55, 0x73, 0x35, 0x48, 0xe6, 0xbd, 0xe3, 0xf9, 0x91, 0x4f, 0x14, 0x3a, 0x38, 0x7c, 0xdb, 0x8c,
-	0xbd, 0x1d, 0xa7, 0xc7, 0x4f, 0x36, 0x5e, 0xd4, 0x8d, 0x8c, 0x30, 0xdd, 0x13, 0xb3, 0x44, 0x2c,
-	0xf6, 0x83, 0xf7, 0x93, 0x54, 0xf5, 0xf0, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x82, 0xf9, 0x1b, 0xdb,
-	0x48, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_proxy_vmess_account_proto_init() }
+func file_v2ray_com_core_proxy_vmess_account_proto_init() {
+	if File_v2ray_com_core_proxy_vmess_account_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_vmess_account_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Account); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_vmess_account_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_vmess_account_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_vmess_account_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_vmess_account_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_vmess_account_proto = out.File
+	file_v2ray_com_core_proxy_vmess_account_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_vmess_account_proto_goTypes = nil
+	file_v2ray_com_core_proxy_vmess_account_proto_depIdxs = nil
 }

+ 259 - 134
proxy/vmess/inbound/config.pb.go

@@ -1,203 +1,328 @@
 package inbound
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type DetourConfig struct {
-	To                   string   `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *DetourConfig) Reset()         { *m = DetourConfig{} }
-func (m *DetourConfig) String() string { return proto.CompactTextString(m) }
-func (*DetourConfig) ProtoMessage()    {}
-func (*DetourConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a47d4a41f33382d2, []int{0}
+	To string `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"`
 }
 
-func (m *DetourConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DetourConfig.Unmarshal(m, b)
-}
-func (m *DetourConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DetourConfig.Marshal(b, m, deterministic)
-}
-func (m *DetourConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DetourConfig.Merge(m, src)
+func (x *DetourConfig) Reset() {
+	*x = DetourConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *DetourConfig) XXX_Size() int {
-	return xxx_messageInfo_DetourConfig.Size(m)
+
+func (x *DetourConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *DetourConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_DetourConfig.DiscardUnknown(m)
+
+func (*DetourConfig) ProtoMessage() {}
+
+func (x *DetourConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_DetourConfig proto.InternalMessageInfo
+// Deprecated: Use DetourConfig.ProtoReflect.Descriptor instead.
+func (*DetourConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *DetourConfig) GetTo() string {
-	if m != nil {
-		return m.To
+func (x *DetourConfig) GetTo() string {
+	if x != nil {
+		return x.To
 	}
 	return ""
 }
 
 type DefaultConfig struct {
-	AlterId              uint32   `protobuf:"varint,1,opt,name=alter_id,json=alterId,proto3" json:"alter_id,omitempty"`
-	Level                uint32   `protobuf:"varint,2,opt,name=level,proto3" json:"level,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *DefaultConfig) Reset()         { *m = DefaultConfig{} }
-func (m *DefaultConfig) String() string { return proto.CompactTextString(m) }
-func (*DefaultConfig) ProtoMessage()    {}
-func (*DefaultConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a47d4a41f33382d2, []int{1}
+	AlterId uint32 `protobuf:"varint,1,opt,name=alter_id,json=alterId,proto3" json:"alter_id,omitempty"`
+	Level   uint32 `protobuf:"varint,2,opt,name=level,proto3" json:"level,omitempty"`
 }
 
-func (m *DefaultConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DefaultConfig.Unmarshal(m, b)
-}
-func (m *DefaultConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DefaultConfig.Marshal(b, m, deterministic)
-}
-func (m *DefaultConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DefaultConfig.Merge(m, src)
+func (x *DefaultConfig) Reset() {
+	*x = DefaultConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *DefaultConfig) XXX_Size() int {
-	return xxx_messageInfo_DefaultConfig.Size(m)
+
+func (x *DefaultConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *DefaultConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_DefaultConfig.DiscardUnknown(m)
+
+func (*DefaultConfig) ProtoMessage() {}
+
+func (x *DefaultConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_DefaultConfig proto.InternalMessageInfo
+// Deprecated: Use DefaultConfig.ProtoReflect.Descriptor instead.
+func (*DefaultConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *DefaultConfig) GetAlterId() uint32 {
-	if m != nil {
-		return m.AlterId
+func (x *DefaultConfig) GetAlterId() uint32 {
+	if x != nil {
+		return x.AlterId
 	}
 	return 0
 }
 
-func (m *DefaultConfig) GetLevel() uint32 {
-	if m != nil {
-		return m.Level
+func (x *DefaultConfig) GetLevel() uint32 {
+	if x != nil {
+		return x.Level
 	}
 	return 0
 }
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	User                 []*protocol.User `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"`
 	Default              *DefaultConfig   `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"`
 	Detour               *DetourConfig    `protobuf:"bytes,3,opt,name=detour,proto3" json:"detour,omitempty"`
 	SecureEncryptionOnly bool             `protobuf:"varint,4,opt,name=secure_encryption_only,json=secureEncryptionOnly,proto3" json:"secure_encryption_only,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a47d4a41f33382d2, []int{2}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *Config) GetUser() []*protocol.User {
-	if m != nil {
-		return m.User
+func (x *Config) GetUser() []*protocol.User {
+	if x != nil {
+		return x.User
 	}
 	return nil
 }
 
-func (m *Config) GetDefault() *DefaultConfig {
-	if m != nil {
-		return m.Default
+func (x *Config) GetDefault() *DefaultConfig {
+	if x != nil {
+		return x.Default
 	}
 	return nil
 }
 
-func (m *Config) GetDetour() *DetourConfig {
-	if m != nil {
-		return m.Detour
+func (x *Config) GetDetour() *DetourConfig {
+	if x != nil {
+		return x.Detour
 	}
 	return nil
 }
 
-func (m *Config) GetSecureEncryptionOnly() bool {
-	if m != nil {
-		return m.SecureEncryptionOnly
+func (x *Config) GetSecureEncryptionOnly() bool {
+	if x != nil {
+		return x.SecureEncryptionOnly
 	}
 	return false
 }
 
-func init() {
-	proto.RegisterType((*DetourConfig)(nil), "v2ray.core.proxy.vmess.inbound.DetourConfig")
-	proto.RegisterType((*DefaultConfig)(nil), "v2ray.core.proxy.vmess.inbound.DefaultConfig")
-	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.vmess.inbound.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/vmess/inbound/config.proto", fileDescriptor_a47d4a41f33382d2)
-}
-
-var fileDescriptor_a47d4a41f33382d2 = []byte{
-	// 333 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x4f, 0x4f, 0xf2, 0x40,
-	0x10, 0xc6, 0xd3, 0xc2, 0x0b, 0xbc, 0x8b, 0x78, 0x68, 0x88, 0xa9, 0x1e, 0x48, 0xd3, 0x13, 0x26,
-	0xba, 0x9b, 0x54, 0x3e, 0x80, 0x11, 0x8c, 0xe1, 0x24, 0x69, 0x22, 0x07, 0x2f, 0xa4, 0x6c, 0x07,
-	0xd3, 0x64, 0xbb, 0x43, 0xb6, 0x5b, 0x62, 0xcf, 0x7e, 0x1b, 0x3f, 0xa5, 0x61, 0x5a, 0xfc, 0x77,
-	0x90, 0xdb, 0xce, 0xce, 0xef, 0x79, 0xe6, 0x99, 0x61, 0x62, 0x17, 0x99, 0xa4, 0xe2, 0x12, 0x73,
-	0x21, 0xd1, 0x80, 0xd8, 0x1a, 0x7c, 0xad, 0xc4, 0x2e, 0x87, 0xa2, 0x10, 0x99, 0x5e, 0x63, 0xa9,
-	0x53, 0x21, 0x51, 0x6f, 0xb2, 0x17, 0xbe, 0x35, 0x68, 0xd1, 0x1b, 0x1d, 0x04, 0x06, 0x38, 0xc1,
-	0x9c, 0x60, 0xde, 0xc0, 0x17, 0x97, 0xbf, 0x0c, 0x25, 0xe6, 0x39, 0x6a, 0x41, 0x62, 0x89, 0x4a,
-	0x94, 0x05, 0x98, 0xda, 0x2a, 0x1c, 0xb1, 0x93, 0x19, 0x58, 0x2c, 0xcd, 0x94, 0x06, 0x78, 0xa7,
-	0xcc, 0xb5, 0xe8, 0x3b, 0x81, 0x33, 0xfe, 0x1f, 0xbb, 0x16, 0xc3, 0x5b, 0x36, 0x98, 0xc1, 0x26,
-	0x29, 0x95, 0x6d, 0x80, 0x73, 0xd6, 0x4b, 0x94, 0x05, 0xb3, 0xca, 0x52, 0xc2, 0x06, 0x71, 0x97,
-	0xea, 0x79, 0xea, 0x0d, 0xd9, 0x3f, 0x05, 0x3b, 0x50, 0xbe, 0x4b, 0xff, 0x75, 0x11, 0xbe, 0xb9,
-	0xac, 0xd3, 0x68, 0x27, 0xac, 0xbd, 0x1f, 0xed, 0x3b, 0x41, 0x6b, 0xdc, 0x8f, 0x02, 0xfe, 0x6d,
-	0x8d, 0x3a, 0x22, 0x3f, 0x44, 0xe4, 0x4f, 0x05, 0x98, 0x98, 0x68, 0xef, 0x81, 0x75, 0xd3, 0x3a,
-	0x02, 0x19, 0xf7, 0xa3, 0x6b, 0xfe, 0xf7, 0xfe, 0xfc, 0x47, 0xe2, 0xf8, 0xa0, 0xf6, 0x66, 0xac,
-	0x93, 0xd2, 0xae, 0x7e, 0x8b, 0x7c, 0xae, 0x8e, 0xfb, 0x7c, 0x5d, 0x26, 0x6e, 0xb4, 0xde, 0x84,
-	0x9d, 0x15, 0x20, 0x4b, 0x03, 0x2b, 0xd0, 0xd2, 0x54, 0x5b, 0x9b, 0xa1, 0x5e, 0xa1, 0x56, 0x95,
-	0xdf, 0x0e, 0x9c, 0x71, 0x2f, 0x1e, 0xd6, 0xdd, 0xfb, 0xcf, 0xe6, 0xa3, 0x56, 0xd5, 0xdd, 0x82,
-	0x85, 0x12, 0xf3, 0x23, 0x03, 0x17, 0xce, 0x73, 0xb7, 0x79, 0xbe, 0xbb, 0xa3, 0x65, 0x14, 0x27,
-	0x15, 0x9f, 0xee, 0xd9, 0x05, 0xb1, 0x4b, 0x62, 0xe7, 0x35, 0xb0, 0xee, 0xd0, 0xad, 0x6e, 0x3e,
-	0x02, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x49, 0x84, 0xe1, 0x3e, 0x02, 0x00, 0x00,
+var File_v2ray_com_core_proxy_vmess_inbound_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDesc = []byte{
+	0x0a, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62,
+	0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x1a, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72,
+	0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1e, 0x0a, 0x0c,
+	0x44, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02,
+	0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x0d,
+	0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a,
+	0x08, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x07, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65,
+	0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x83,
+	0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65,
+	0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12,
+	0x47, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
+	0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x6f,
+	0x75, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73,
+	0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x74, 0x6f, 0x75, 0x72,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x12, 0x34,
+	0x0a, 0x16, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14,
+	0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x4f, 0x6e, 0x6c, 0x79, 0x42, 0x50, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65,
+	0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x07, 0x69, 0x6e,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x1e, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f,
+	0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x49,
+	0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescData = file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_v2ray_com_core_proxy_vmess_inbound_config_proto_goTypes = []interface{}{
+	(*DetourConfig)(nil),  // 0: v2ray.core.proxy.vmess.inbound.DetourConfig
+	(*DefaultConfig)(nil), // 1: v2ray.core.proxy.vmess.inbound.DefaultConfig
+	(*Config)(nil),        // 2: v2ray.core.proxy.vmess.inbound.Config
+	(*protocol.User)(nil), // 3: v2ray.core.common.protocol.User
+}
+var file_v2ray_com_core_proxy_vmess_inbound_config_proto_depIdxs = []int32{
+	3, // 0: v2ray.core.proxy.vmess.inbound.Config.user:type_name -> v2ray.core.common.protocol.User
+	1, // 1: v2ray.core.proxy.vmess.inbound.Config.default:type_name -> v2ray.core.proxy.vmess.inbound.DefaultConfig
+	0, // 2: v2ray.core.proxy.vmess.inbound.Config.detour:type_name -> v2ray.core.proxy.vmess.inbound.DetourConfig
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_proxy_vmess_inbound_config_proto_init() }
+func file_v2ray_com_core_proxy_vmess_inbound_config_proto_init() {
+	if File_v2ray_com_core_proxy_vmess_inbound_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DetourConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DefaultConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_vmess_inbound_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_vmess_inbound_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_vmess_inbound_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_vmess_inbound_config_proto = out.File
+	file_v2ray_com_core_proxy_vmess_inbound_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_vmess_inbound_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_vmess_inbound_config_proto_depIdxs = nil
 }

+ 131 - 56
proxy/vmess/outbound/config.pb.go

@@ -1,83 +1,158 @@
 package outbound
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	Receiver             []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=Receiver,proto3" json:"Receiver,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
-	XXX_unrecognized     []byte                     `json:"-"`
-	XXX_sizecache        int32                      `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bc22c8b653a4f7ef, []int{0}
+	Receiver []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=Receiver,proto3" json:"Receiver,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_proxy_vmess_outbound_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_proxy_vmess_outbound_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetReceiver() []*protocol.ServerEndpoint {
-	if m != nil {
-		return m.Receiver
+func (x *Config) GetReceiver() []*protocol.ServerEndpoint {
+	if x != nil {
+		return x.Receiver
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.vmess.outbound.Config")
+var File_v2ray_com_core_proxy_vmess_outbound_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDesc = []byte{
+	0x0a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x6f, 0x75, 0x74,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x1f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f,
+	0x75, 0x6e, 0x64, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,
+	0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x50, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
+	0x46, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x52,
+	0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x42, 0x53, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e,
+	0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01,
+	0x5a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x1f, 0x56, 0x32, 0x52,
+	0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6d,
+	0x65, 0x73, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescData = file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/proxy/vmess/outbound/config.proto", fileDescriptor_bc22c8b653a4f7ef)
+var file_v2ray_com_core_proxy_vmess_outbound_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_proxy_vmess_outbound_config_proto_goTypes = []interface{}{
+	(*Config)(nil),                  // 0: v2ray.core.proxy.vmess.outbound.Config
+	(*protocol.ServerEndpoint)(nil), // 1: v2ray.core.common.protocol.ServerEndpoint
+}
+var file_v2ray_com_core_proxy_vmess_outbound_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.proxy.vmess.outbound.Config.Receiver:type_name -> v2ray.core.common.protocol.ServerEndpoint
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_bc22c8b653a4f7ef = []byte{
-	// 208 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8e, 0xb1, 0x4a, 0xc4, 0x40,
-	0x10, 0x86, 0x39, 0x85, 0xe3, 0x58, 0xbb, 0xab, 0xc4, 0xe6, 0x44, 0x1b, 0xb1, 0x98, 0x95, 0xf8,
-	0x06, 0x06, 0x6d, 0x0d, 0x09, 0xa4, 0xb0, 0x91, 0x64, 0x32, 0x4a, 0xc0, 0xdd, 0x59, 0x66, 0x93,
-	0xc5, 0xbc, 0x92, 0x4f, 0x29, 0x4e, 0x5c, 0x11, 0x1b, 0xbb, 0x29, 0xbe, 0xff, 0xfb, 0xc6, 0xdc,
-	0xa4, 0x42, 0xba, 0x05, 0x90, 0x9d, 0x45, 0x16, 0xb2, 0x41, 0xf8, 0x7d, 0xb1, 0xc9, 0x51, 0x8c,
-	0x96, 0xe7, 0xa9, 0xe7, 0xd9, 0x0f, 0x16, 0xd9, 0xbf, 0x8c, 0xaf, 0x10, 0x84, 0x27, 0xde, 0x1f,
-	0xf2, 0x42, 0x08, 0x94, 0x06, 0xa5, 0x21, 0xd3, 0x67, 0x7f, 0x95, 0xc8, 0xce, 0xb1, 0xb7, 0xba,
-	0x46, 0x7e, 0xb3, 0x91, 0x24, 0x91, 0x3c, 0xc7, 0x40, 0xb8, 0x2a, 0x2f, 0x2a, 0xb3, 0x2d, 0x35,
-	0xb1, 0x7f, 0x30, 0xbb, 0x9a, 0x90, 0xc6, 0x44, 0x72, 0xba, 0x39, 0x3f, 0xbe, 0x3a, 0x29, 0xae,
-	0xe1, 0x57, 0x6f, 0x55, 0x41, 0x56, 0x41, 0xa3, 0xaa, 0x7b, 0x3f, 0x04, 0x1e, 0xfd, 0x54, 0xff,
-	0x6c, 0xef, 0x1a, 0x73, 0x89, 0xec, 0xe0, 0x9f, 0x57, 0xab, 0xcd, 0xd3, 0x2e, 0xdf, 0x1f, 0x47,
-	0x87, 0xb6, 0xa8, 0xbb, 0x05, 0xca, 0x2f, 0xba, 0x52, 0xba, 0x55, 0xfa, 0xf1, 0x9b, 0xe8, 0xb7,
-	0xda, 0xbd, 0xfd, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x80, 0xb5, 0x19, 0x90, 0x34, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_proxy_vmess_outbound_config_proto_init() }
+func file_v2ray_com_core_proxy_vmess_outbound_config_proto_init() {
+	if File_v2ray_com_core_proxy_vmess_outbound_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_proxy_vmess_outbound_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_proxy_vmess_outbound_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_proxy_vmess_outbound_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_proxy_vmess_outbound_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_proxy_vmess_outbound_config_proto = out.File
+	file_v2ray_com_core_proxy_vmess_outbound_config_proto_rawDesc = nil
+	file_v2ray_com_core_proxy_vmess_outbound_config_proto_goTypes = nil
+	file_v2ray_com_core_proxy_vmess_outbound_config_proto_depIdxs = nil
 }

+ 6 - 2
testing/scenarios/common.go

@@ -1,6 +1,7 @@
 package scenarios
 
 import (
+	"bytes"
 	"crypto/rand"
 	"fmt"
 	"io"
@@ -13,7 +14,6 @@ import (
 	"time"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/go-cmp/cmp"
 	"v2ray.com/core"
 	"v2ray.com/core/app/dispatcher"
 	"v2ray.com/core/app/proxyman"
@@ -196,9 +196,13 @@ func testTCPConn2(conn net.Conn, payloadSize int, timeout time.Duration) func()
 		if err != nil {
 			return err
 		}
-		if r := cmp.Diff(response, xor(payload)); r != "" {
+		_ = response
+
+		if r := bytes.Compare(response, xor(payload)); r != 0 {
 			return errors.New(r)
 		}
+
 		return nil
+
 	}
 }

+ 129 - 54
transport/config.pb.go

@@ -1,83 +1,158 @@
 package transport
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	internet "v2ray.com/core/transport/internet"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Global transport settings. This affects all type of connections that go through V2Ray.
 // Deprecated. Use each settings in StreamConfig.
 type Config struct {
-	TransportSettings    []*internet.TransportConfig `protobuf:"bytes,1,rep,name=transport_settings,json=transportSettings,proto3" json:"transport_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
-	XXX_unrecognized     []byte                      `json:"-"`
-	XXX_sizecache        int32                       `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e34c3c5557a3c999, []int{0}
+	TransportSettings []*internet.TransportConfig `protobuf:"bytes,1,rep,name=transport_settings,json=transportSettings,proto3" json:"transport_settings,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetTransportSettings() []*internet.TransportConfig {
-	if m != nil {
-		return m.TransportSettings
+func (x *Config) GetTransportSettings() []*internet.TransportConfig {
+	if x != nil {
+		return x.TransportSettings
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.Config")
+var File_v2ray_com_core_transport_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_config_proto_rawDesc = []byte{
+	0x0a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x67, 0x0a,
+	0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65,
+	0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x3e, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x50, 0x01, 0x5a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0xaa,
+	0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_config_proto_rawDescData = file_v2ray_com_core_transport_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/config.proto", fileDescriptor_e34c3c5557a3c999)
+var file_v2ray_com_core_transport_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_config_proto_goTypes = []interface{}{
+	(*Config)(nil),                   // 0: v2ray.core.transport.Config
+	(*internet.TransportConfig)(nil), // 1: v2ray.core.transport.internet.TransportConfig
+}
+var file_v2ray_com_core_transport_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.transport.Config.transport_settings:type_name -> v2ray.core.transport.internet.TransportConfig
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_e34c3c5557a3c999 = []byte{
-	// 170 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f,
-	0xc9, 0x17, 0x12, 0x81, 0x29, 0x2b, 0x4a, 0xd5, 0x83, 0x2b, 0x91, 0xd2, 0xc3, 0xa9, 0x39, 0x33,
-	0xaf, 0x24, 0xb5, 0x28, 0x2f, 0x15, 0xd5, 0x14, 0xa5, 0x74, 0x2e, 0x36, 0x67, 0x30, 0x5f, 0x28,
-	0x96, 0x4b, 0x08, 0xae, 0x38, 0xbe, 0x38, 0xb5, 0xa4, 0x24, 0x33, 0x2f, 0xbd, 0x58, 0x82, 0x51,
-	0x81, 0x59, 0x83, 0xdb, 0x48, 0x4f, 0x0f, 0x9b, 0x65, 0x7a, 0x30, 0x23, 0xf5, 0x42, 0x60, 0x42,
-	0x10, 0xb3, 0x82, 0x04, 0xe1, 0x6a, 0x82, 0xa1, 0x06, 0x39, 0xd9, 0x71, 0x49, 0x24, 0xe7, 0xe7,
-	0x62, 0x35, 0x27, 0x80, 0x31, 0x8a, 0x13, 0xce, 0x59, 0xc5, 0x24, 0x12, 0x66, 0x14, 0x94, 0x58,
-	0xa9, 0xe7, 0x0c, 0x52, 0x03, 0x37, 0x38, 0x89, 0x0d, 0xec, 0x5e, 0x63, 0x40, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x92, 0xcd, 0x15, 0x9b, 0x1e, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_config_proto_init() }
+func file_v2ray_com_core_transport_config_proto_init() {
+	if File_v2ray_com_core_transport_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_config_proto = out.File
+	file_v2ray_com_core_transport_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_config_proto_depIdxs = nil
 }

+ 501 - 250
transport/internet/config.pb.go

@@ -1,22 +1,24 @@
 package internet
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type TransportProtocol int32
 
@@ -29,30 +31,51 @@ const (
 	TransportProtocol_DomainSocket TransportProtocol = 5
 )
 
-var TransportProtocol_name = map[int32]string{
-	0: "TCP",
-	1: "UDP",
-	2: "MKCP",
-	3: "WebSocket",
-	4: "HTTP",
-	5: "DomainSocket",
-}
+// Enum value maps for TransportProtocol.
+var (
+	TransportProtocol_name = map[int32]string{
+		0: "TCP",
+		1: "UDP",
+		2: "MKCP",
+		3: "WebSocket",
+		4: "HTTP",
+		5: "DomainSocket",
+	}
+	TransportProtocol_value = map[string]int32{
+		"TCP":          0,
+		"UDP":          1,
+		"MKCP":         2,
+		"WebSocket":    3,
+		"HTTP":         4,
+		"DomainSocket": 5,
+	}
+)
 
-var TransportProtocol_value = map[string]int32{
-	"TCP":          0,
-	"UDP":          1,
-	"MKCP":         2,
-	"WebSocket":    3,
-	"HTTP":         4,
-	"DomainSocket": 5,
+func (x TransportProtocol) Enum() *TransportProtocol {
+	p := new(TransportProtocol)
+	*p = x
+	return p
 }
 
 func (x TransportProtocol) String() string {
-	return proto.EnumName(TransportProtocol_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (TransportProtocol) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_transport_internet_config_proto_enumTypes[0].Descriptor()
+}
+
+func (TransportProtocol) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_transport_internet_config_proto_enumTypes[0]
+}
+
+func (x TransportProtocol) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use TransportProtocol.Descriptor instead.
 func (TransportProtocol) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{0}
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{0}
 }
 
 type SocketConfig_TCPFastOpenState int32
@@ -66,24 +89,45 @@ const (
 	SocketConfig_Disable SocketConfig_TCPFastOpenState = 2
 )
 
-var SocketConfig_TCPFastOpenState_name = map[int32]string{
-	0: "AsIs",
-	1: "Enable",
-	2: "Disable",
-}
+// Enum value maps for SocketConfig_TCPFastOpenState.
+var (
+	SocketConfig_TCPFastOpenState_name = map[int32]string{
+		0: "AsIs",
+		1: "Enable",
+		2: "Disable",
+	}
+	SocketConfig_TCPFastOpenState_value = map[string]int32{
+		"AsIs":    0,
+		"Enable":  1,
+		"Disable": 2,
+	}
+)
 
-var SocketConfig_TCPFastOpenState_value = map[string]int32{
-	"AsIs":    0,
-	"Enable":  1,
-	"Disable": 2,
+func (x SocketConfig_TCPFastOpenState) Enum() *SocketConfig_TCPFastOpenState {
+	p := new(SocketConfig_TCPFastOpenState)
+	*p = x
+	return p
 }
 
 func (x SocketConfig_TCPFastOpenState) String() string {
-	return proto.EnumName(SocketConfig_TCPFastOpenState_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (SocketConfig_TCPFastOpenState) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_transport_internet_config_proto_enumTypes[1].Descriptor()
+}
+
+func (SocketConfig_TCPFastOpenState) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_transport_internet_config_proto_enumTypes[1]
+}
+
+func (x SocketConfig_TCPFastOpenState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SocketConfig_TCPFastOpenState.Descriptor instead.
 func (SocketConfig_TCPFastOpenState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{3, 0}
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{3, 0}
 }
 
 type SocketConfig_TProxyMode int32
@@ -97,210 +141,261 @@ const (
 	SocketConfig_Redirect SocketConfig_TProxyMode = 2
 )
 
-var SocketConfig_TProxyMode_name = map[int32]string{
-	0: "Off",
-	1: "TProxy",
-	2: "Redirect",
-}
+// Enum value maps for SocketConfig_TProxyMode.
+var (
+	SocketConfig_TProxyMode_name = map[int32]string{
+		0: "Off",
+		1: "TProxy",
+		2: "Redirect",
+	}
+	SocketConfig_TProxyMode_value = map[string]int32{
+		"Off":      0,
+		"TProxy":   1,
+		"Redirect": 2,
+	}
+)
 
-var SocketConfig_TProxyMode_value = map[string]int32{
-	"Off":      0,
-	"TProxy":   1,
-	"Redirect": 2,
+func (x SocketConfig_TProxyMode) Enum() *SocketConfig_TProxyMode {
+	p := new(SocketConfig_TProxyMode)
+	*p = x
+	return p
 }
 
 func (x SocketConfig_TProxyMode) String() string {
-	return proto.EnumName(SocketConfig_TProxyMode_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SocketConfig_TProxyMode) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_transport_internet_config_proto_enumTypes[2].Descriptor()
+}
+
+func (SocketConfig_TProxyMode) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_transport_internet_config_proto_enumTypes[2]
+}
+
+func (x SocketConfig_TProxyMode) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
+// Deprecated: Use SocketConfig_TProxyMode.Descriptor instead.
 func (SocketConfig_TProxyMode) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{3, 1}
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{3, 1}
 }
 
 type TransportConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Type of network that this settings supports.
 	// Deprecated. Use the string form below.
 	Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"`
 	// Type of network that this settings supports.
 	ProtocolName string `protobuf:"bytes,3,opt,name=protocol_name,json=protocolName,proto3" json:"protocol_name,omitempty"`
 	// Specific settings. Must be of the transports.
-	Settings             *serial.TypedMessage `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	Settings *serial.TypedMessage `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"`
 }
 
-func (m *TransportConfig) Reset()         { *m = TransportConfig{} }
-func (m *TransportConfig) String() string { return proto.CompactTextString(m) }
-func (*TransportConfig) ProtoMessage()    {}
-func (*TransportConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{0}
+func (x *TransportConfig) Reset() {
+	*x = TransportConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *TransportConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TransportConfig.Unmarshal(m, b)
-}
-func (m *TransportConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TransportConfig.Marshal(b, m, deterministic)
+func (x *TransportConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *TransportConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TransportConfig.Merge(m, src)
-}
-func (m *TransportConfig) XXX_Size() int {
-	return xxx_messageInfo_TransportConfig.Size(m)
-}
-func (m *TransportConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_TransportConfig.DiscardUnknown(m)
+
+func (*TransportConfig) ProtoMessage() {}
+
+func (x *TransportConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_TransportConfig proto.InternalMessageInfo
+// Deprecated: Use TransportConfig.ProtoReflect.Descriptor instead.
+func (*TransportConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *TransportConfig) GetProtocol() TransportProtocol {
-	if m != nil {
-		return m.Protocol
+func (x *TransportConfig) GetProtocol() TransportProtocol {
+	if x != nil {
+		return x.Protocol
 	}
 	return TransportProtocol_TCP
 }
 
-func (m *TransportConfig) GetProtocolName() string {
-	if m != nil {
-		return m.ProtocolName
+func (x *TransportConfig) GetProtocolName() string {
+	if x != nil {
+		return x.ProtocolName
 	}
 	return ""
 }
 
-func (m *TransportConfig) GetSettings() *serial.TypedMessage {
-	if m != nil {
-		return m.Settings
+func (x *TransportConfig) GetSettings() *serial.TypedMessage {
+	if x != nil {
+		return x.Settings
 	}
 	return nil
 }
 
 type StreamConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Effective network. Deprecated. Use the string form below.
-	Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Do not use.
+	Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"`
 	// Effective network.
 	ProtocolName      string             `protobuf:"bytes,5,opt,name=protocol_name,json=protocolName,proto3" json:"protocol_name,omitempty"`
 	TransportSettings []*TransportConfig `protobuf:"bytes,2,rep,name=transport_settings,json=transportSettings,proto3" json:"transport_settings,omitempty"`
 	// Type of security. Must be a message name of the settings proto.
 	SecurityType string `protobuf:"bytes,3,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"`
 	// Settings for transport security. For now the only choice is TLS.
-	SecuritySettings     []*serial.TypedMessage `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"`
-	SocketSettings       *SocketConfig          `protobuf:"bytes,6,opt,name=socket_settings,json=socketSettings,proto3" json:"socket_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	SecuritySettings []*serial.TypedMessage `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"`
+	SocketSettings   *SocketConfig          `protobuf:"bytes,6,opt,name=socket_settings,json=socketSettings,proto3" json:"socket_settings,omitempty"`
 }
 
-func (m *StreamConfig) Reset()         { *m = StreamConfig{} }
-func (m *StreamConfig) String() string { return proto.CompactTextString(m) }
-func (*StreamConfig) ProtoMessage()    {}
-func (*StreamConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{1}
+func (x *StreamConfig) Reset() {
+	*x = StreamConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *StreamConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_StreamConfig.Unmarshal(m, b)
-}
-func (m *StreamConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_StreamConfig.Marshal(b, m, deterministic)
-}
-func (m *StreamConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_StreamConfig.Merge(m, src)
+func (x *StreamConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *StreamConfig) XXX_Size() int {
-	return xxx_messageInfo_StreamConfig.Size(m)
-}
-func (m *StreamConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_StreamConfig.DiscardUnknown(m)
+
+func (*StreamConfig) ProtoMessage() {}
+
+func (x *StreamConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_StreamConfig proto.InternalMessageInfo
+// Deprecated: Use StreamConfig.ProtoReflect.Descriptor instead.
+func (*StreamConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{1}
+}
 
 // Deprecated: Do not use.
-func (m *StreamConfig) GetProtocol() TransportProtocol {
-	if m != nil {
-		return m.Protocol
+func (x *StreamConfig) GetProtocol() TransportProtocol {
+	if x != nil {
+		return x.Protocol
 	}
 	return TransportProtocol_TCP
 }
 
-func (m *StreamConfig) GetProtocolName() string {
-	if m != nil {
-		return m.ProtocolName
+func (x *StreamConfig) GetProtocolName() string {
+	if x != nil {
+		return x.ProtocolName
 	}
 	return ""
 }
 
-func (m *StreamConfig) GetTransportSettings() []*TransportConfig {
-	if m != nil {
-		return m.TransportSettings
+func (x *StreamConfig) GetTransportSettings() []*TransportConfig {
+	if x != nil {
+		return x.TransportSettings
 	}
 	return nil
 }
 
-func (m *StreamConfig) GetSecurityType() string {
-	if m != nil {
-		return m.SecurityType
+func (x *StreamConfig) GetSecurityType() string {
+	if x != nil {
+		return x.SecurityType
 	}
 	return ""
 }
 
-func (m *StreamConfig) GetSecuritySettings() []*serial.TypedMessage {
-	if m != nil {
-		return m.SecuritySettings
+func (x *StreamConfig) GetSecuritySettings() []*serial.TypedMessage {
+	if x != nil {
+		return x.SecuritySettings
 	}
 	return nil
 }
 
-func (m *StreamConfig) GetSocketSettings() *SocketConfig {
-	if m != nil {
-		return m.SocketSettings
+func (x *StreamConfig) GetSocketSettings() *SocketConfig {
+	if x != nil {
+		return x.SocketSettings
 	}
 	return nil
 }
 
 type ProxyConfig struct {
-	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ProxyConfig) Reset()         { *m = ProxyConfig{} }
-func (m *ProxyConfig) String() string { return proto.CompactTextString(m) }
-func (*ProxyConfig) ProtoMessage()    {}
-func (*ProxyConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{2}
+	Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
 }
 
-func (m *ProxyConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ProxyConfig.Unmarshal(m, b)
-}
-func (m *ProxyConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ProxyConfig.Marshal(b, m, deterministic)
-}
-func (m *ProxyConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ProxyConfig.Merge(m, src)
+func (x *ProxyConfig) Reset() {
+	*x = ProxyConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ProxyConfig) XXX_Size() int {
-	return xxx_messageInfo_ProxyConfig.Size(m)
+
+func (x *ProxyConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ProxyConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ProxyConfig.DiscardUnknown(m)
+
+func (*ProxyConfig) ProtoMessage() {}
+
+func (x *ProxyConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ProxyConfig proto.InternalMessageInfo
+// Deprecated: Use ProxyConfig.ProtoReflect.Descriptor instead.
+func (*ProxyConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *ProxyConfig) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *ProxyConfig) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
 
 // SocketConfig is options to be applied on network sockets.
 type SocketConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Mark of the connection. If non-zero, the value will be set to SO_MARK.
 	Mark int32 `protobuf:"varint,1,opt,name=mark,proto3" json:"mark,omitempty"`
 	// TFO is the state of TFO settings.
@@ -309,135 +404,291 @@ type SocketConfig struct {
 	Tproxy SocketConfig_TProxyMode `protobuf:"varint,3,opt,name=tproxy,proto3,enum=v2ray.core.transport.internet.SocketConfig_TProxyMode" json:"tproxy,omitempty"`
 	// ReceiveOriginalDestAddress is for enabling IP_RECVORIGDSTADDR socket option.
 	// This option is for UDP only.
-	ReceiveOriginalDestAddress bool     `protobuf:"varint,4,opt,name=receive_original_dest_address,json=receiveOriginalDestAddress,proto3" json:"receive_original_dest_address,omitempty"`
-	BindAddress                []byte   `protobuf:"bytes,5,opt,name=bind_address,json=bindAddress,proto3" json:"bind_address,omitempty"`
-	BindPort                   uint32   `protobuf:"varint,6,opt,name=bind_port,json=bindPort,proto3" json:"bind_port,omitempty"`
-	XXX_NoUnkeyedLiteral       struct{} `json:"-"`
-	XXX_unrecognized           []byte   `json:"-"`
-	XXX_sizecache              int32    `json:"-"`
+	ReceiveOriginalDestAddress bool   `protobuf:"varint,4,opt,name=receive_original_dest_address,json=receiveOriginalDestAddress,proto3" json:"receive_original_dest_address,omitempty"`
+	BindAddress                []byte `protobuf:"bytes,5,opt,name=bind_address,json=bindAddress,proto3" json:"bind_address,omitempty"`
+	BindPort                   uint32 `protobuf:"varint,6,opt,name=bind_port,json=bindPort,proto3" json:"bind_port,omitempty"`
 }
 
-func (m *SocketConfig) Reset()         { *m = SocketConfig{} }
-func (m *SocketConfig) String() string { return proto.CompactTextString(m) }
-func (*SocketConfig) ProtoMessage()    {}
-func (*SocketConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_91dbc815c3d97a05, []int{3}
+func (x *SocketConfig) Reset() {
+	*x = SocketConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *SocketConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SocketConfig.Unmarshal(m, b)
-}
-func (m *SocketConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SocketConfig.Marshal(b, m, deterministic)
-}
-func (m *SocketConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SocketConfig.Merge(m, src)
+func (x *SocketConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *SocketConfig) XXX_Size() int {
-	return xxx_messageInfo_SocketConfig.Size(m)
-}
-func (m *SocketConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SocketConfig.DiscardUnknown(m)
+
+func (*SocketConfig) ProtoMessage() {}
+
+func (x *SocketConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_SocketConfig proto.InternalMessageInfo
+// Deprecated: Use SocketConfig.ProtoReflect.Descriptor instead.
+func (*SocketConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *SocketConfig) GetMark() int32 {
-	if m != nil {
-		return m.Mark
+func (x *SocketConfig) GetMark() int32 {
+	if x != nil {
+		return x.Mark
 	}
 	return 0
 }
 
-func (m *SocketConfig) GetTfo() SocketConfig_TCPFastOpenState {
-	if m != nil {
-		return m.Tfo
+func (x *SocketConfig) GetTfo() SocketConfig_TCPFastOpenState {
+	if x != nil {
+		return x.Tfo
 	}
 	return SocketConfig_AsIs
 }
 
-func (m *SocketConfig) GetTproxy() SocketConfig_TProxyMode {
-	if m != nil {
-		return m.Tproxy
+func (x *SocketConfig) GetTproxy() SocketConfig_TProxyMode {
+	if x != nil {
+		return x.Tproxy
 	}
 	return SocketConfig_Off
 }
 
-func (m *SocketConfig) GetReceiveOriginalDestAddress() bool {
-	if m != nil {
-		return m.ReceiveOriginalDestAddress
+func (x *SocketConfig) GetReceiveOriginalDestAddress() bool {
+	if x != nil {
+		return x.ReceiveOriginalDestAddress
 	}
 	return false
 }
 
-func (m *SocketConfig) GetBindAddress() []byte {
-	if m != nil {
-		return m.BindAddress
+func (x *SocketConfig) GetBindAddress() []byte {
+	if x != nil {
+		return x.BindAddress
 	}
 	return nil
 }
 
-func (m *SocketConfig) GetBindPort() uint32 {
-	if m != nil {
-		return m.BindPort
+func (x *SocketConfig) GetBindPort() uint32 {
+	if x != nil {
+		return x.BindPort
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.transport.internet.TransportProtocol", TransportProtocol_name, TransportProtocol_value)
-	proto.RegisterEnum("v2ray.core.transport.internet.SocketConfig_TCPFastOpenState", SocketConfig_TCPFastOpenState_name, SocketConfig_TCPFastOpenState_value)
-	proto.RegisterEnum("v2ray.core.transport.internet.SocketConfig_TProxyMode", SocketConfig_TProxyMode_name, SocketConfig_TProxyMode_value)
-	proto.RegisterType((*TransportConfig)(nil), "v2ray.core.transport.internet.TransportConfig")
-	proto.RegisterType((*StreamConfig)(nil), "v2ray.core.transport.internet.StreamConfig")
-	proto.RegisterType((*ProxyConfig)(nil), "v2ray.core.transport.internet.ProxyConfig")
-	proto.RegisterType((*SocketConfig)(nil), "v2ray.core.transport.internet.SocketConfig")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/config.proto", fileDescriptor_91dbc815c3d97a05)
-}
-
-var fileDescriptor_91dbc815c3d97a05 = []byte{
-	// 636 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xdd, 0x6a, 0xdb, 0x4c,
-	0x10, 0x8d, 0x2c, 0xc7, 0x91, 0xc7, 0x8e, 0xa3, 0xec, 0x95, 0xc9, 0x47, 0xf8, 0x12, 0x17, 0x8a,
-	0x69, 0x41, 0x0a, 0x2a, 0xed, 0x55, 0x6f, 0x12, 0xbb, 0xa5, 0xa1, 0x4d, 0x2c, 0x64, 0xb5, 0x85,
-	0x40, 0x11, 0x6b, 0x69, 0x6c, 0x44, 0x2c, 0xad, 0xd9, 0xdd, 0x86, 0xfa, 0x95, 0x0a, 0xbd, 0xeb,
-	0x43, 0xf4, 0xb1, 0xca, 0xae, 0x7e, 0x6a, 0xd2, 0x92, 0x26, 0xf4, 0x6e, 0x34, 0x73, 0xe6, 0xcc,
-	0x9c, 0x39, 0x5a, 0x70, 0x6e, 0x3c, 0x4e, 0xd7, 0x4e, 0xcc, 0x32, 0x37, 0x66, 0x1c, 0x5d, 0xc9,
-	0x69, 0x2e, 0x56, 0x8c, 0x4b, 0x37, 0xcd, 0x25, 0xf2, 0x1c, 0xa5, 0x1b, 0xb3, 0x7c, 0x9e, 0x2e,
-	0x9c, 0x15, 0x67, 0x92, 0x91, 0xc3, 0x0a, 0xcf, 0xd1, 0xa9, 0xb1, 0x4e, 0x85, 0x3d, 0x38, 0xb9,
-	0x45, 0x17, 0xb3, 0x2c, 0x63, 0xb9, 0x2b, 0x90, 0xa7, 0x74, 0xe9, 0xca, 0xf5, 0x0a, 0x93, 0x28,
-	0x43, 0x21, 0xe8, 0x02, 0x0b, 0xc2, 0xc1, 0x0f, 0x03, 0xf6, 0xc2, 0x8a, 0x68, 0xa4, 0x47, 0x91,
-	0x77, 0x60, 0xe9, 0x62, 0xcc, 0x96, 0x7d, 0xe3, 0xc8, 0x18, 0xf6, 0xbc, 0x13, 0xe7, 0xce, 0xb9,
-	0x4e, 0xcd, 0xe0, 0x97, 0x7d, 0x41, 0xcd, 0x40, 0x1e, 0xc1, 0x6e, 0x15, 0x47, 0x39, 0xcd, 0xb0,
-	0x6f, 0x1e, 0x19, 0xc3, 0x76, 0xd0, 0xad, 0x92, 0x97, 0x34, 0x43, 0x72, 0x06, 0x96, 0x40, 0x29,
-	0xd3, 0x7c, 0x21, 0xfa, 0x8d, 0x23, 0x63, 0xd8, 0xf1, 0x1e, 0x6f, 0x8e, 0x2c, 0x74, 0x38, 0x85,
-	0x0e, 0x27, 0x54, 0x3a, 0x2e, 0x0a, 0x19, 0x41, 0xdd, 0x37, 0xf8, 0x6e, 0x42, 0x77, 0x2a, 0x39,
-	0xd2, 0xac, 0xd4, 0xe1, 0xff, 0xbb, 0x8e, 0xb3, 0x46, 0xdf, 0xb8, 0x4b, 0xcb, 0xf6, 0x1f, 0xb4,
-	0x7c, 0x02, 0x52, 0x53, 0x47, 0x1b, 0xaa, 0xcc, 0x61, 0xc7, 0x73, 0xee, 0xbb, 0x40, 0x21, 0x21,
-	0xd8, 0xaf, 0x31, 0xd3, 0x92, 0x48, 0xed, 0x20, 0x30, 0xfe, 0xcc, 0x53, 0xb9, 0x8e, 0x94, 0xa3,
-	0xd5, 0x3d, 0xab, 0xa4, 0xba, 0x0e, 0x99, 0xc2, 0x7e, 0x0d, 0xaa, 0x57, 0x68, 0xea, 0x15, 0xee,
-	0x7b, 0x58, 0xbb, 0x22, 0xa8, 0x27, 0x87, 0xb0, 0x27, 0x58, 0x7c, 0x8d, 0x1b, 0xaa, 0x5a, 0xda,
-	0xab, 0xa7, 0x7f, 0x51, 0x35, 0xd5, 0x5d, 0xa5, 0xa4, 0x5e, 0xc1, 0x51, 0xb1, 0x0e, 0xfe, 0x87,
-	0x8e, 0xcf, 0xd9, 0x97, 0x75, 0x69, 0x9a, 0x0d, 0xa6, 0xa4, 0x0b, 0xed, 0x57, 0x3b, 0x50, 0xe1,
-	0xe0, 0x9b, 0xf2, 0x75, 0x83, 0x81, 0x10, 0x68, 0x66, 0x94, 0x5f, 0x6b, 0xcc, 0x76, 0xa0, 0x63,
-	0x72, 0x09, 0xa6, 0x9c, 0x33, 0xfd, 0xef, 0xf4, 0xbc, 0x97, 0x0f, 0xd8, 0xc7, 0x09, 0x47, 0xfe,
-	0x6b, 0x2a, 0xe4, 0x64, 0x85, 0xf9, 0x54, 0x52, 0x89, 0x81, 0x22, 0x22, 0x97, 0xd0, 0x92, 0x2b,
-	0xb5, 0x96, 0x3e, 0x6f, 0xcf, 0x7b, 0xf1, 0x20, 0x4a, 0x2d, 0xe8, 0x82, 0x25, 0x18, 0x94, 0x2c,
-	0xe4, 0x14, 0x0e, 0x39, 0xc6, 0x98, 0xde, 0x60, 0xc4, 0x78, 0xba, 0x48, 0x73, 0xba, 0x8c, 0x12,
-	0x14, 0x32, 0xa2, 0x49, 0xc2, 0x51, 0x28, 0x73, 0x8c, 0xa1, 0x15, 0x1c, 0x94, 0xa0, 0x49, 0x89,
-	0x19, 0xa3, 0x90, 0xa7, 0x05, 0x82, 0x1c, 0x43, 0x77, 0x96, 0xe6, 0x49, 0xdd, 0xa1, 0xfe, 0xbd,
-	0x6e, 0xd0, 0x51, 0xb9, 0x0a, 0xf2, 0x1f, 0xb4, 0x35, 0x44, 0xed, 0xa6, 0xbd, 0xd9, 0x0d, 0x2c,
-	0x95, 0xf0, 0x19, 0x97, 0x83, 0xe7, 0x60, 0xdf, 0xd6, 0x4a, 0x2c, 0x68, 0x9e, 0x8a, 0x73, 0x61,
-	0x6f, 0x11, 0x80, 0xd6, 0xab, 0x9c, 0xce, 0x96, 0x68, 0x1b, 0xa4, 0x03, 0x3b, 0xe3, 0x54, 0xe8,
-	0x8f, 0xc6, 0xc0, 0x05, 0xf8, 0xa5, 0x87, 0xec, 0x80, 0x39, 0x99, 0xcf, 0x0b, 0x7c, 0x91, 0xb6,
-	0x0d, 0xd2, 0x05, 0x2b, 0xc0, 0x24, 0xe5, 0x18, 0x4b, 0xbb, 0xf1, 0xe4, 0x0a, 0xf6, 0x7f, 0x7b,
-	0x47, 0xaa, 0x2f, 0x1c, 0xf9, 0xf6, 0x96, 0x0a, 0xde, 0x8f, 0x7d, 0xdb, 0x50, 0xa3, 0x2f, 0xde,
-	0x8e, 0x7c, 0xbb, 0x41, 0x76, 0xa1, 0xfd, 0x11, 0x67, 0xc5, 0x05, 0x6d, 0x53, 0x15, 0xde, 0x84,
-	0xa1, 0x6f, 0x37, 0x89, 0x0d, 0xdd, 0x31, 0xcb, 0x68, 0x9a, 0x97, 0xb5, 0xed, 0xb3, 0x09, 0x1c,
-	0xc7, 0x2c, 0xbb, 0xdb, 0x0b, 0xdf, 0xb8, 0xb2, 0xaa, 0xf8, 0x6b, 0xe3, 0xf0, 0x83, 0x17, 0xd0,
-	0xb5, 0x33, 0x52, 0xd8, 0x7a, 0x2d, 0xe7, 0xbc, 0xac, 0xcf, 0x5a, 0xfa, 0xe9, 0x3e, 0xfb, 0x19,
-	0x00, 0x00, 0xff, 0xff, 0xce, 0xe9, 0xc8, 0x20, 0x89, 0x05, 0x00, 0x00,
+var File_v2ray_com_core_transport_internet_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_config_proto_rawDesc = []byte{
+	0x0a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x1d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x1a,
+	0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79,
+	0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x22, 0xc8, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73,
+	0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xb4, 0x03, 0x0a,
+	0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x50, 0x0a,
+	0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e,
+	0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12,
+	0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+	0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69,
+	0x6e, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x63, 0x75,
+	0x72, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x53, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x75,
+	0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54,
+	0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x73, 0x65, 0x63,
+	0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a,
+	0x0f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69,
+	0x6e, 0x67, 0x73, 0x22, 0x1f, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x74, 0x61, 0x67, 0x22, 0xad, 0x03, 0x0a, 0x0c, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x04, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x4e, 0x0a, 0x03, 0x74, 0x66, 0x6f,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x2e, 0x54, 0x43, 0x50, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x53,
+	0x74, 0x61, 0x74, 0x65, 0x52, 0x03, 0x74, 0x66, 0x6f, 0x12, 0x4e, 0x0a, 0x06, 0x74, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
+	0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64,
+	0x65, 0x52, 0x06, 0x74, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x72, 0x65, 0x63,
+	0x65, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x65,
+	0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61,
+	0x6c, 0x44, 0x65, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c,
+	0x62, 0x69, 0x6e, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0c, 0x52, 0x0b, 0x62, 0x69, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,
+	0x1b, 0x0a, 0x09, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x0d, 0x52, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x35, 0x0a, 0x10,
+	0x54, 0x43, 0x50, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65,
+	0x12, 0x08, 0x0a, 0x04, 0x41, 0x73, 0x49, 0x73, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x6e,
+	0x61, 0x62, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c,
+	0x65, 0x10, 0x02, 0x22, 0x2f, 0x0a, 0x0a, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64,
+	0x65, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x66, 0x66, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x10, 0x02, 0x2a, 0x5a, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50,
+	0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4d,
+	0x4b, 0x43, 0x50, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b,
+	0x65, 0x74, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x04, 0x12, 0x10,
+	0x0a, 0x0c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x10, 0x05,
+	0x42, 0x4f, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0xaa, 0x02, 0x1d, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_config_proto_rawDescData = file_v2ray_com_core_transport_internet_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_transport_internet_config_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
+var file_v2ray_com_core_transport_internet_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_v2ray_com_core_transport_internet_config_proto_goTypes = []interface{}{
+	(TransportProtocol)(0),             // 0: v2ray.core.transport.internet.TransportProtocol
+	(SocketConfig_TCPFastOpenState)(0), // 1: v2ray.core.transport.internet.SocketConfig.TCPFastOpenState
+	(SocketConfig_TProxyMode)(0),       // 2: v2ray.core.transport.internet.SocketConfig.TProxyMode
+	(*TransportConfig)(nil),            // 3: v2ray.core.transport.internet.TransportConfig
+	(*StreamConfig)(nil),               // 4: v2ray.core.transport.internet.StreamConfig
+	(*ProxyConfig)(nil),                // 5: v2ray.core.transport.internet.ProxyConfig
+	(*SocketConfig)(nil),               // 6: v2ray.core.transport.internet.SocketConfig
+	(*serial.TypedMessage)(nil),        // 7: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_transport_internet_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.transport.internet.TransportConfig.protocol:type_name -> v2ray.core.transport.internet.TransportProtocol
+	7, // 1: v2ray.core.transport.internet.TransportConfig.settings:type_name -> v2ray.core.common.serial.TypedMessage
+	0, // 2: v2ray.core.transport.internet.StreamConfig.protocol:type_name -> v2ray.core.transport.internet.TransportProtocol
+	3, // 3: v2ray.core.transport.internet.StreamConfig.transport_settings:type_name -> v2ray.core.transport.internet.TransportConfig
+	7, // 4: v2ray.core.transport.internet.StreamConfig.security_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	6, // 5: v2ray.core.transport.internet.StreamConfig.socket_settings:type_name -> v2ray.core.transport.internet.SocketConfig
+	1, // 6: v2ray.core.transport.internet.SocketConfig.tfo:type_name -> v2ray.core.transport.internet.SocketConfig.TCPFastOpenState
+	2, // 7: v2ray.core.transport.internet.SocketConfig.tproxy:type_name -> v2ray.core.transport.internet.SocketConfig.TProxyMode
+	8, // [8:8] is the sub-list for method output_type
+	8, // [8:8] is the sub-list for method input_type
+	8, // [8:8] is the sub-list for extension type_name
+	8, // [8:8] is the sub-list for extension extendee
+	0, // [0:8] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_transport_internet_config_proto_init() }
+func file_v2ray_com_core_transport_internet_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TransportConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProxyConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SocketConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_config_proto_rawDesc,
+			NumEnums:      3,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_transport_internet_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_transport_internet_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_config_proto = out.File
+	file_v2ray_com_core_transport_internet_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_config_proto_depIdxs = nil
 }

+ 130 - 58
transport/internet/domainsocket/config.pb.go

@@ -1,92 +1,164 @@
 package domainsocket
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Path of the domain socket. This overrides the IP/Port parameter from upstream caller.
 	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
 	// Abstract speicifies whether to use abstract namespace or not.
 	// Traditionally Unix domain socket is file system based. Abstract domain socket can be used without acquiring file lock.
-	Abstract             bool     `protobuf:"varint,2,opt,name=abstract,proto3" json:"abstract,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Abstract bool `protobuf:"varint,2,opt,name=abstract,proto3" json:"abstract,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_76473d52e3e3815d, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_domainsocket_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_domainsocket_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetPath() string {
-	if m != nil {
-		return m.Path
+func (x *Config) GetPath() string {
+	if x != nil {
+		return x.Path
 	}
 	return ""
 }
 
-func (m *Config) GetAbstract() bool {
-	if m != nil {
-		return m.Abstract
+func (x *Config) GetAbstract() bool {
+	if x != nil {
+		return x.Abstract
 	}
 	return false
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.domainsocket.Config")
+var File_v2ray_com_core_transport_internet_domainsocket_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDesc = []byte{
+	0x0a, 0x3b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x64, 0x6f, 0x6d,
+	0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x38, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x62, 0x73, 0x74, 0x72,
+	0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x62, 0x73, 0x74, 0x72,
+	0x61, 0x63, 0x74, 0x42, 0x6d, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73,
+	0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x0c, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73,
+	0x6f, 0x63, 0x6b, 0x65, 0x74, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f,
+	0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74,
+	0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b,
+	0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescData = file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/domainsocket/config.proto", fileDescriptor_76473d52e3e3815d)
+var file_v2ray_com_core_transport_internet_domainsocket_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_domainsocket_config_proto_goTypes = []interface{}{
+	(*Config)(nil), // 0: v2ray.core.transport.internet.domainsocket.Config
+}
+var file_v2ray_com_core_transport_internet_domainsocket_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_76473d52e3e3815d = []byte{
-	// 189 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x2e, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0x4f, 0xc9,
-	0xcf, 0x4d, 0xcc, 0xcc, 0x2b, 0xce, 0x4f, 0xce, 0x4e, 0x2d, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb,
-	0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xd2, 0x82, 0x69, 0x2e, 0x4a, 0xd5, 0x83, 0x6b,
-	0xd4, 0x83, 0x69, 0xd4, 0x43, 0xd6, 0xa8, 0x64, 0xc1, 0xc5, 0xe6, 0x0c, 0xd6, 0x2b, 0x24, 0xc4,
-	0xc5, 0x52, 0x90, 0x58, 0x92, 0x21, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04, 0x66, 0x0b, 0x49,
-	0x71, 0x71, 0x24, 0x26, 0x15, 0x97, 0x14, 0x25, 0x26, 0x97, 0x48, 0x30, 0x29, 0x30, 0x6a, 0x70,
-	0x04, 0xc1, 0xf9, 0x4e, 0xb9, 0x5c, 0x20, 0xe7, 0xe9, 0x11, 0x6f, 0x57, 0x00, 0x63, 0x14, 0x0f,
-	0x32, 0x7f, 0x15, 0x93, 0x56, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33, 0x48, 0x73, 0x08, 0x5c,
-	0xb3, 0x27, 0x4c, 0xb3, 0x0b, 0x58, 0x71, 0x30, 0x58, 0x71, 0x12, 0x1b, 0xd8, 0x6f, 0xc6, 0x80,
-	0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xb3, 0xe6, 0x90, 0x1a, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_domainsocket_config_proto_init() }
+func file_v2ray_com_core_transport_internet_domainsocket_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_domainsocket_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_domainsocket_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_domainsocket_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_domainsocket_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_domainsocket_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_domainsocket_config_proto = out.File
+	file_v2ray_com_core_transport_internet_domainsocket_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_domainsocket_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_domainsocket_config_proto_depIdxs = nil
 }

+ 498 - 261
transport/internet/headers/http/config.pb.go

@@ -1,409 +1,646 @@
 package http
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Header struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// "Accept", "Cookie", etc
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// Each entry must be valid in one piece. Random entry will be chosen if multiple entries present.
-	Value                []string `protobuf:"bytes,2,rep,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Value []string `protobuf:"bytes,2,rep,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *Header) Reset()         { *m = Header{} }
-func (m *Header) String() string { return proto.CompactTextString(m) }
-func (*Header) ProtoMessage()    {}
-func (*Header) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{0}
+func (x *Header) Reset() {
+	*x = Header{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Header) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Header.Unmarshal(m, b)
-}
-func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Header.Marshal(b, m, deterministic)
-}
-func (m *Header) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Header.Merge(m, src)
+func (x *Header) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Header) XXX_Size() int {
-	return xxx_messageInfo_Header.Size(m)
-}
-func (m *Header) XXX_DiscardUnknown() {
-	xxx_messageInfo_Header.DiscardUnknown(m)
+
+func (*Header) ProtoMessage() {}
+
+func (x *Header) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Header proto.InternalMessageInfo
+// Deprecated: Use Header.ProtoReflect.Descriptor instead.
+func (*Header) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Header) GetName() string {
-	if m != nil {
-		return m.Name
+func (x *Header) GetName() string {
+	if x != nil {
+		return x.Name
 	}
 	return ""
 }
 
-func (m *Header) GetValue() []string {
-	if m != nil {
-		return m.Value
+func (x *Header) GetValue() []string {
+	if x != nil {
+		return x.Value
 	}
 	return nil
 }
 
 // HTTP version. Default value "1.1".
 type Version struct {
-	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Version) Reset()         { *m = Version{} }
-func (m *Version) String() string { return proto.CompactTextString(m) }
-func (*Version) ProtoMessage()    {}
-func (*Version) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{1}
+	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *Version) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Version.Unmarshal(m, b)
-}
-func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Version.Marshal(b, m, deterministic)
-}
-func (m *Version) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Version.Merge(m, src)
+func (x *Version) Reset() {
+	*x = Version{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Version) XXX_Size() int {
-	return xxx_messageInfo_Version.Size(m)
+
+func (x *Version) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Version) XXX_DiscardUnknown() {
-	xxx_messageInfo_Version.DiscardUnknown(m)
+
+func (*Version) ProtoMessage() {}
+
+func (x *Version) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Version proto.InternalMessageInfo
+// Deprecated: Use Version.ProtoReflect.Descriptor instead.
+func (*Version) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Version) GetValue() string {
-	if m != nil {
-		return m.Value
+func (x *Version) GetValue() string {
+	if x != nil {
+		return x.Value
 	}
 	return ""
 }
 
 // HTTP method. Default value "GET".
 type Method struct {
-	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Method) Reset()         { *m = Method{} }
-func (m *Method) String() string { return proto.CompactTextString(m) }
-func (*Method) ProtoMessage()    {}
-func (*Method) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{2}
+	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *Method) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Method.Unmarshal(m, b)
-}
-func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Method.Marshal(b, m, deterministic)
-}
-func (m *Method) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Method.Merge(m, src)
+func (x *Method) Reset() {
+	*x = Method{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Method) XXX_Size() int {
-	return xxx_messageInfo_Method.Size(m)
+
+func (x *Method) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Method) XXX_DiscardUnknown() {
-	xxx_messageInfo_Method.DiscardUnknown(m)
+
+func (*Method) ProtoMessage() {}
+
+func (x *Method) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Method proto.InternalMessageInfo
+// Deprecated: Use Method.ProtoReflect.Descriptor instead.
+func (*Method) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *Method) GetValue() string {
-	if m != nil {
-		return m.Value
+func (x *Method) GetValue() string {
+	if x != nil {
+		return x.Value
 	}
 	return ""
 }
 
 type RequestConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Full HTTP version like "1.1".
 	Version *Version `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
 	// GET, POST, CONNECT etc
 	Method *Method `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"`
 	// URI like "/login.php"
-	Uri                  []string  `protobuf:"bytes,3,rep,name=uri,proto3" json:"uri,omitempty"`
-	Header               []*Header `protobuf:"bytes,4,rep,name=header,proto3" json:"header,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
+	Uri    []string  `protobuf:"bytes,3,rep,name=uri,proto3" json:"uri,omitempty"`
+	Header []*Header `protobuf:"bytes,4,rep,name=header,proto3" json:"header,omitempty"`
 }
 
-func (m *RequestConfig) Reset()         { *m = RequestConfig{} }
-func (m *RequestConfig) String() string { return proto.CompactTextString(m) }
-func (*RequestConfig) ProtoMessage()    {}
-func (*RequestConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{3}
+func (x *RequestConfig) Reset() {
+	*x = RequestConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *RequestConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RequestConfig.Unmarshal(m, b)
-}
-func (m *RequestConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RequestConfig.Marshal(b, m, deterministic)
-}
-func (m *RequestConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RequestConfig.Merge(m, src)
+func (x *RequestConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *RequestConfig) XXX_Size() int {
-	return xxx_messageInfo_RequestConfig.Size(m)
-}
-func (m *RequestConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_RequestConfig.DiscardUnknown(m)
+
+func (*RequestConfig) ProtoMessage() {}
+
+func (x *RequestConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_RequestConfig proto.InternalMessageInfo
+// Deprecated: Use RequestConfig.ProtoReflect.Descriptor instead.
+func (*RequestConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *RequestConfig) GetVersion() *Version {
-	if m != nil {
-		return m.Version
+func (x *RequestConfig) GetVersion() *Version {
+	if x != nil {
+		return x.Version
 	}
 	return nil
 }
 
-func (m *RequestConfig) GetMethod() *Method {
-	if m != nil {
-		return m.Method
+func (x *RequestConfig) GetMethod() *Method {
+	if x != nil {
+		return x.Method
 	}
 	return nil
 }
 
-func (m *RequestConfig) GetUri() []string {
-	if m != nil {
-		return m.Uri
+func (x *RequestConfig) GetUri() []string {
+	if x != nil {
+		return x.Uri
 	}
 	return nil
 }
 
-func (m *RequestConfig) GetHeader() []*Header {
-	if m != nil {
-		return m.Header
+func (x *RequestConfig) GetHeader() []*Header {
+	if x != nil {
+		return x.Header
 	}
 	return nil
 }
 
 type Status struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Status code. Default "200".
 	Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
 	// Statue reason. Default "OK".
-	Reason               string   `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
 }
 
-func (m *Status) Reset()         { *m = Status{} }
-func (m *Status) String() string { return proto.CompactTextString(m) }
-func (*Status) ProtoMessage()    {}
-func (*Status) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{4}
+func (x *Status) Reset() {
+	*x = Status{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Status) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Status.Unmarshal(m, b)
-}
-func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Status.Marshal(b, m, deterministic)
-}
-func (m *Status) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Status.Merge(m, src)
+func (x *Status) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Status) XXX_Size() int {
-	return xxx_messageInfo_Status.Size(m)
-}
-func (m *Status) XXX_DiscardUnknown() {
-	xxx_messageInfo_Status.DiscardUnknown(m)
+
+func (*Status) ProtoMessage() {}
+
+func (x *Status) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Status proto.InternalMessageInfo
+// Deprecated: Use Status.ProtoReflect.Descriptor instead.
+func (*Status) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *Status) GetCode() string {
-	if m != nil {
-		return m.Code
+func (x *Status) GetCode() string {
+	if x != nil {
+		return x.Code
 	}
 	return ""
 }
 
-func (m *Status) GetReason() string {
-	if m != nil {
-		return m.Reason
+func (x *Status) GetReason() string {
+	if x != nil {
+		return x.Reason
 	}
 	return ""
 }
 
 type ResponseConfig struct {
-	Version              *Version  `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
-	Status               *Status   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
-	Header               []*Header `protobuf:"bytes,3,rep,name=header,proto3" json:"header,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ResponseConfig) Reset()         { *m = ResponseConfig{} }
-func (m *ResponseConfig) String() string { return proto.CompactTextString(m) }
-func (*ResponseConfig) ProtoMessage()    {}
-func (*ResponseConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{5}
+	Version *Version  `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+	Status  *Status   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
+	Header  []*Header `protobuf:"bytes,3,rep,name=header,proto3" json:"header,omitempty"`
 }
 
-func (m *ResponseConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ResponseConfig.Unmarshal(m, b)
-}
-func (m *ResponseConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ResponseConfig.Marshal(b, m, deterministic)
-}
-func (m *ResponseConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ResponseConfig.Merge(m, src)
+func (x *ResponseConfig) Reset() {
+	*x = ResponseConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ResponseConfig) XXX_Size() int {
-	return xxx_messageInfo_ResponseConfig.Size(m)
+
+func (x *ResponseConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ResponseConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ResponseConfig.DiscardUnknown(m)
+
+func (*ResponseConfig) ProtoMessage() {}
+
+func (x *ResponseConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ResponseConfig proto.InternalMessageInfo
+// Deprecated: Use ResponseConfig.ProtoReflect.Descriptor instead.
+func (*ResponseConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{5}
+}
 
-func (m *ResponseConfig) GetVersion() *Version {
-	if m != nil {
-		return m.Version
+func (x *ResponseConfig) GetVersion() *Version {
+	if x != nil {
+		return x.Version
 	}
 	return nil
 }
 
-func (m *ResponseConfig) GetStatus() *Status {
-	if m != nil {
-		return m.Status
+func (x *ResponseConfig) GetStatus() *Status {
+	if x != nil {
+		return x.Status
 	}
 	return nil
 }
 
-func (m *ResponseConfig) GetHeader() []*Header {
-	if m != nil {
-		return m.Header
+func (x *ResponseConfig) GetHeader() []*Header {
+	if x != nil {
+		return x.Header
 	}
 	return nil
 }
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Settings for authenticating requests. If not set, client side will not send authenication header, and server side will bypass authentication.
 	Request *RequestConfig `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
 	// Settings for authenticating responses. If not set, client side will bypass authentication, and server side will not send authentication header.
-	Response             *ResponseConfig `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
+	Response *ResponseConfig `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e2685d0b4b039e80, []int{6}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{6}
+}
 
-func (m *Config) GetRequest() *RequestConfig {
-	if m != nil {
-		return m.Request
+func (x *Config) GetRequest() *RequestConfig {
+	if x != nil {
+		return x.Request
 	}
 	return nil
 }
 
-func (m *Config) GetResponse() *ResponseConfig {
-	if m != nil {
-		return m.Response
+func (x *Config) GetResponse() *ResponseConfig {
+	if x != nil {
+		return x.Response
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Header)(nil), "v2ray.core.transport.internet.headers.http.Header")
-	proto.RegisterType((*Version)(nil), "v2ray.core.transport.internet.headers.http.Version")
-	proto.RegisterType((*Method)(nil), "v2ray.core.transport.internet.headers.http.Method")
-	proto.RegisterType((*RequestConfig)(nil), "v2ray.core.transport.internet.headers.http.RequestConfig")
-	proto.RegisterType((*Status)(nil), "v2ray.core.transport.internet.headers.http.Status")
-	proto.RegisterType((*ResponseConfig)(nil), "v2ray.core.transport.internet.headers.http.ResponseConfig")
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.headers.http.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/http/config.proto", fileDescriptor_e2685d0b4b039e80)
-}
-
-var fileDescriptor_e2685d0b4b039e80 = []byte{
-	// 394 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x94, 0xbf, 0x8a, 0xdb, 0x40,
-	0x10, 0xc6, 0x91, 0xe4, 0xc8, 0xf1, 0x84, 0x84, 0xb0, 0x84, 0xa0, 0x2a, 0x31, 0xaa, 0x8c, 0x8b,
-	0x15, 0xc8, 0x69, 0x92, 0x74, 0x71, 0xe3, 0x04, 0x0c, 0x61, 0x1d, 0x5c, 0xa4, 0xdb, 0xc8, 0x93,
-	0x58, 0x10, 0xef, 0x2a, 0xbb, 0x2b, 0x83, 0xdf, 0x20, 0xcf, 0x72, 0xfd, 0x3d, 0xdb, 0xb5, 0xc7,
-	0xfe, 0x91, 0xce, 0x57, 0x1c, 0x9c, 0xee, 0xb8, 0x4a, 0x33, 0x68, 0xbe, 0x1f, 0xf3, 0x7d, 0x5a,
-	0x2d, 0x7c, 0x3e, 0x96, 0x8a, 0x9f, 0x68, 0x25, 0x0f, 0x45, 0x25, 0x15, 0x16, 0x46, 0x71, 0xa1,
-	0x1b, 0xa9, 0x4c, 0x51, 0x0b, 0x83, 0x4a, 0xa0, 0x29, 0xf6, 0xc8, 0x77, 0xa8, 0x74, 0xb1, 0x37,
-	0xa6, 0x29, 0x2a, 0x29, 0x7e, 0xd7, 0x7f, 0x68, 0xa3, 0xa4, 0x91, 0x64, 0xde, 0x89, 0x15, 0xd2,
-	0x5e, 0x48, 0x3b, 0x21, 0x0d, 0x42, 0x6a, 0x85, 0x79, 0x09, 0xe9, 0xca, 0xf5, 0x84, 0xc0, 0x48,
-	0xf0, 0x03, 0x66, 0xd1, 0x34, 0x9a, 0x4d, 0x98, 0xab, 0xc9, 0x1b, 0x78, 0x76, 0xe4, 0x7f, 0x5b,
-	0xcc, 0xe2, 0x69, 0x32, 0x9b, 0x30, 0xdf, 0xe4, 0xef, 0x61, 0xbc, 0x45, 0xa5, 0x6b, 0x29, 0x6e,
-	0x06, 0xbc, 0x2a, 0x0c, 0xbc, 0x83, 0x74, 0x8d, 0x66, 0x2f, 0x77, 0x77, 0xbc, 0xff, 0x1f, 0xc3,
-	0x4b, 0x86, 0xff, 0x5a, 0xd4, 0x66, 0xe9, 0x16, 0x27, 0x6b, 0x18, 0x1f, 0x3d, 0xd2, 0x4d, 0xbe,
-	0x28, 0x17, 0xf4, 0xfe, 0x26, 0x68, 0xd8, 0x86, 0x75, 0x0c, 0xf2, 0x0d, 0xd2, 0x83, 0x5b, 0x20,
-	0x8b, 0x1d, 0xad, 0x1c, 0x42, 0xf3, 0xab, 0xb3, 0x40, 0x20, 0xaf, 0x21, 0x69, 0x55, 0x9d, 0x25,
-	0x2e, 0x01, 0x5b, 0x5a, 0xba, 0x17, 0x64, 0xa3, 0x69, 0x32, 0x94, 0xee, 0xd3, 0x66, 0x81, 0x90,
-	0x7f, 0x80, 0x74, 0x63, 0xb8, 0x69, 0xb5, 0xcd, 0xbf, 0x92, 0xbb, 0x3e, 0x7f, 0x5b, 0x93, 0xb7,
-	0x90, 0x2a, 0xe4, 0x5a, 0x0a, 0xe7, 0x63, 0xc2, 0x42, 0x97, 0x5f, 0x45, 0xf0, 0x8a, 0xa1, 0x6e,
-	0xa4, 0xd0, 0xf8, 0x64, 0x09, 0x6a, 0xb7, 0xd7, 0x43, 0x12, 0xf4, 0x8e, 0x58, 0x20, 0x9c, 0xe5,
-	0x95, 0x3c, 0x3a, 0xaf, 0xcb, 0x08, 0xd2, 0xe0, 0x78, 0x03, 0x63, 0xe5, 0x0f, 0x51, 0x70, 0xfc,
-	0x71, 0x08, 0xf7, 0xd6, 0xf9, 0x63, 0x1d, 0x89, 0x6c, 0xe1, 0xb9, 0x0a, 0xc1, 0x06, 0xe7, 0x9f,
-	0x86, 0x51, 0xcf, 0x3f, 0x0a, 0xeb, 0x59, 0x5f, 0x10, 0xec, 0xcf, 0x3c, 0x00, 0xf5, 0x3d, 0xfa,
-	0x39, 0xb2, 0xcf, 0x8b, 0x78, 0xbe, 0x2d, 0x19, 0x3f, 0xd1, 0xa5, 0x15, 0xfd, 0xe8, 0x45, 0x5f,
-	0x3b, 0xd1, 0x2a, 0x88, 0x56, 0xc6, 0x34, 0xbf, 0x52, 0x77, 0x03, 0x2c, 0xae, 0x03, 0x00, 0x00,
-	0xff, 0xff, 0x10, 0xea, 0x22, 0x27, 0x40, 0x04, 0x00, 0x00,
+var File_v2ray_com_core_transport_internet_headers_http_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDesc = []byte{
+	0x0a, 0x3b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x22, 0x32, 0x0a, 0x06, 0x48, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1f, 0x0a,
+	0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e,
+	0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x88,
+	0x02, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x4d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x4a, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e,
+	0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x4d, 0x65, 0x74,
+	0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75,
+	0x72, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x4a, 0x0a,
+	0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65,
+	0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x34, 0x0a, 0x06, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f,
+	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22,
+	0xf7, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70,
+	0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4a, 0x0a,
+	0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65,
+	0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x53, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74,
+	0x74, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x08, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x42, 0x65, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68,
+	0x74, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x04, 0x68, 0x74, 0x74, 0x70, 0xaa, 0x02, 0x2a, 0x56, 0x32,
+	0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_v2ray_com_core_transport_internet_headers_http_config_proto_goTypes = []interface{}{
+	(*Header)(nil),         // 0: v2ray.core.transport.internet.headers.http.Header
+	(*Version)(nil),        // 1: v2ray.core.transport.internet.headers.http.Version
+	(*Method)(nil),         // 2: v2ray.core.transport.internet.headers.http.Method
+	(*RequestConfig)(nil),  // 3: v2ray.core.transport.internet.headers.http.RequestConfig
+	(*Status)(nil),         // 4: v2ray.core.transport.internet.headers.http.Status
+	(*ResponseConfig)(nil), // 5: v2ray.core.transport.internet.headers.http.ResponseConfig
+	(*Config)(nil),         // 6: v2ray.core.transport.internet.headers.http.Config
+}
+var file_v2ray_com_core_transport_internet_headers_http_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.transport.internet.headers.http.RequestConfig.version:type_name -> v2ray.core.transport.internet.headers.http.Version
+	2, // 1: v2ray.core.transport.internet.headers.http.RequestConfig.method:type_name -> v2ray.core.transport.internet.headers.http.Method
+	0, // 2: v2ray.core.transport.internet.headers.http.RequestConfig.header:type_name -> v2ray.core.transport.internet.headers.http.Header
+	1, // 3: v2ray.core.transport.internet.headers.http.ResponseConfig.version:type_name -> v2ray.core.transport.internet.headers.http.Version
+	4, // 4: v2ray.core.transport.internet.headers.http.ResponseConfig.status:type_name -> v2ray.core.transport.internet.headers.http.Status
+	0, // 5: v2ray.core.transport.internet.headers.http.ResponseConfig.header:type_name -> v2ray.core.transport.internet.headers.http.Header
+	3, // 6: v2ray.core.transport.internet.headers.http.Config.request:type_name -> v2ray.core.transport.internet.headers.http.RequestConfig
+	5, // 7: v2ray.core.transport.internet.headers.http.Config.response:type_name -> v2ray.core.transport.internet.headers.http.ResponseConfig
+	8, // [8:8] is the sub-list for method output_type
+	8, // [8:8] is the sub-list for method input_type
+	8, // [8:8] is the sub-list for extension type_name
+	8, // [8:8] is the sub-list for extension extendee
+	0, // [0:8] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_transport_internet_headers_http_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_http_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_http_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Header); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Version); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Method); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RequestConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Status); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ResponseConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   7,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_http_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_http_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_http_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_http_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_http_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_http_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_http_config_proto_depIdxs = nil
 }

+ 160 - 71
transport/internet/headers/noop/config.pb.go

@@ -1,104 +1,193 @@
 package noop
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b4a070eec05ae9a3, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescGZIP(), []int{0}
+}
 
 type ConnectionConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *ConnectionConfig) Reset()         { *m = ConnectionConfig{} }
-func (m *ConnectionConfig) String() string { return proto.CompactTextString(m) }
-func (*ConnectionConfig) ProtoMessage()    {}
-func (*ConnectionConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_b4a070eec05ae9a3, []int{1}
+func (x *ConnectionConfig) Reset() {
+	*x = ConnectionConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ConnectionConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConnectionConfig.Unmarshal(m, b)
-}
-func (m *ConnectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConnectionConfig.Marshal(b, m, deterministic)
+func (x *ConnectionConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ConnectionConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConnectionConfig.Merge(m, src)
+
+func (*ConnectionConfig) ProtoMessage() {}
+
+func (x *ConnectionConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *ConnectionConfig) XXX_Size() int {
-	return xxx_messageInfo_ConnectionConfig.Size(m)
+
+// Deprecated: Use ConnectionConfig.ProtoReflect.Descriptor instead.
+func (*ConnectionConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescGZIP(), []int{1}
 }
-func (m *ConnectionConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConnectionConfig.DiscardUnknown(m)
+
+var File_v2ray_com_core_transport_internet_headers_noop_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDesc = []byte{
+	0x0a, 0x3b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x6f, 0x6f, 0x70,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x6f, 0x6f, 0x70, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x65, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x6f, 0x6f, 0x70, 0x50, 0x01, 0x5a, 0x04, 0x6e, 0x6f, 0x6f,
+	0x70, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x4e, 0x6f, 0x6f, 0x70, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_ConnectionConfig proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.headers.noop.Config")
-	proto.RegisterType((*ConnectionConfig)(nil), "v2ray.core.transport.internet.headers.noop.ConnectionConfig")
+func file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/noop/config.proto", fileDescriptor_b4a070eec05ae9a3)
+var file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_v2ray_com_core_transport_internet_headers_noop_config_proto_goTypes = []interface{}{
+	(*Config)(nil),           // 0: v2ray.core.transport.internet.headers.noop.Config
+	(*ConnectionConfig)(nil), // 1: v2ray.core.transport.internet.headers.noop.ConnectionConfig
+}
+var file_v2ray_com_core_transport_internet_headers_noop_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_b4a070eec05ae9a3 = []byte{
-	// 170 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0xce, 0xb1, 0xaa, 0xc2, 0x40,
-	0x10, 0x85, 0x61, 0xee, 0x45, 0x82, 0x6c, 0x25, 0x79, 0x84, 0x94, 0x29, 0x66, 0x21, 0x96, 0x76,
-	0xa6, 0xd1, 0x46, 0x44, 0xc4, 0xc2, 0x6e, 0x5d, 0x47, 0x4d, 0xe1, 0x9c, 0x65, 0xb2, 0x08, 0x79,
-	0x25, 0x9f, 0x52, 0x36, 0x26, 0xa9, 0xad, 0x06, 0x06, 0xbe, 0xc3, 0x6f, 0x56, 0xaf, 0x4a, 0x5d,
-	0x47, 0x1e, 0x4f, 0xeb, 0xa1, 0x6c, 0xa3, 0x3a, 0x69, 0x03, 0x34, 0xda, 0x46, 0x22, 0xab, 0x70,
-	0xb4, 0x0f, 0x76, 0x57, 0xd6, 0xd6, 0x0a, 0x10, 0xac, 0x87, 0xdc, 0x9a, 0x3b, 0x05, 0x45, 0x44,
-	0x5e, 0x8e, 0x58, 0x99, 0x26, 0x48, 0x23, 0xa4, 0x01, 0x52, 0x82, 0xc5, 0xdc, 0x64, 0x75, 0x6f,
-	0x8b, 0xdc, 0x2c, 0x6a, 0x88, 0xb0, 0x8f, 0x0d, 0xe4, 0xfb, 0x5b, 0xb3, 0x49, 0x09, 0xf4, 0xfb,
-	0xde, 0xfe, 0xef, 0x3c, 0x4b, 0xf7, 0xfd, 0x5f, 0x9e, 0xaa, 0x83, 0xeb, 0xa8, 0x4e, 0xe8, 0x38,
-	0xa1, 0xed, 0x88, 0x36, 0x03, 0xda, 0x01, 0xe1, 0x92, 0xf5, 0xdd, 0xcb, 0x4f, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0xd0, 0xe6, 0xd7, 0x87, 0xf6, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_headers_noop_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_noop_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_noop_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ConnectionConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_noop_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_noop_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_noop_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_noop_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_noop_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_noop_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_noop_config_proto_depIdxs = nil
 }

+ 160 - 86
transport/internet/headers/srtp/config.pb.go

@@ -1,126 +1,200 @@
 package srtp
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	Version              uint32   `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
-	Padding              bool     `protobuf:"varint,2,opt,name=padding,proto3" json:"padding,omitempty"`
-	Extension            bool     `protobuf:"varint,3,opt,name=extension,proto3" json:"extension,omitempty"`
-	CsrcCount            uint32   `protobuf:"varint,4,opt,name=csrc_count,json=csrcCount,proto3" json:"csrc_count,omitempty"`
-	Marker               bool     `protobuf:"varint,5,opt,name=marker,proto3" json:"marker,omitempty"`
-	PayloadType          uint32   `protobuf:"varint,6,opt,name=payload_type,json=payloadType,proto3" json:"payload_type,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0aa82c2c1e59b567, []int{0}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version     uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
+	Padding     bool   `protobuf:"varint,2,opt,name=padding,proto3" json:"padding,omitempty"`
+	Extension   bool   `protobuf:"varint,3,opt,name=extension,proto3" json:"extension,omitempty"`
+	CsrcCount   uint32 `protobuf:"varint,4,opt,name=csrc_count,json=csrcCount,proto3" json:"csrc_count,omitempty"`
+	Marker      bool   `protobuf:"varint,5,opt,name=marker,proto3" json:"marker,omitempty"`
+	PayloadType uint32 `protobuf:"varint,6,opt,name=payload_type,json=payloadType,proto3" json:"payload_type,omitempty"`
+}
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_srtp_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_srtp_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetVersion() uint32 {
-	if m != nil {
-		return m.Version
+func (x *Config) GetVersion() uint32 {
+	if x != nil {
+		return x.Version
 	}
 	return 0
 }
 
-func (m *Config) GetPadding() bool {
-	if m != nil {
-		return m.Padding
+func (x *Config) GetPadding() bool {
+	if x != nil {
+		return x.Padding
 	}
 	return false
 }
 
-func (m *Config) GetExtension() bool {
-	if m != nil {
-		return m.Extension
+func (x *Config) GetExtension() bool {
+	if x != nil {
+		return x.Extension
 	}
 	return false
 }
 
-func (m *Config) GetCsrcCount() uint32 {
-	if m != nil {
-		return m.CsrcCount
+func (x *Config) GetCsrcCount() uint32 {
+	if x != nil {
+		return x.CsrcCount
 	}
 	return 0
 }
 
-func (m *Config) GetMarker() bool {
-	if m != nil {
-		return m.Marker
+func (x *Config) GetMarker() bool {
+	if x != nil {
+		return x.Marker
 	}
 	return false
 }
 
-func (m *Config) GetPayloadType() uint32 {
-	if m != nil {
-		return m.PayloadType
+func (x *Config) GetPayloadType() uint32 {
+	if x != nil {
+		return x.PayloadType
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.headers.srtp.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/srtp/config.proto", fileDescriptor_0aa82c2c1e59b567)
-}
-
-var fileDescriptor_0aa82c2c1e59b567 = []byte{
-	// 260 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0xd0, 0x31, 0x4b, 0x03, 0x31,
-	0x14, 0x07, 0x70, 0xae, 0xd6, 0xd3, 0x46, 0x5d, 0x32, 0x48, 0x06, 0x85, 0xea, 0x54, 0x3a, 0x24,
-	0x50, 0x47, 0x37, 0x6f, 0xd1, 0x4d, 0xce, 0xe2, 0xe0, 0x52, 0x62, 0xee, 0x59, 0x0f, 0x6d, 0x12,
-	0x5e, 0x9e, 0xc5, 0x7c, 0x25, 0x67, 0x3f, 0xa0, 0x24, 0x5c, 0xea, 0xda, 0x29, 0xfc, 0xff, 0x8f,
-	0x5f, 0xe0, 0x3d, 0x76, 0xbb, 0x5d, 0xa0, 0x8e, 0xd2, 0xb8, 0x8d, 0x32, 0x0e, 0x41, 0x11, 0x6a,
-	0x1b, 0xbc, 0x43, 0x52, 0xbd, 0x25, 0x40, 0x0b, 0xa4, 0xde, 0x41, 0x77, 0x80, 0x41, 0x05, 0x24,
-	0xaf, 0x8c, 0xb3, 0x6f, 0xfd, 0x5a, 0x7a, 0x74, 0xe4, 0xf8, 0xbc, 0x60, 0x04, 0xb9, 0x83, 0xb2,
-	0x40, 0x39, 0x40, 0x99, 0xe0, 0xf5, 0x6f, 0xc5, 0xea, 0x26, 0x63, 0x2e, 0xd8, 0xd1, 0x16, 0x30,
-	0xf4, 0xce, 0x8a, 0x6a, 0x5a, 0xcd, 0xce, 0xda, 0x12, 0xd3, 0xc4, 0xeb, 0xae, 0xeb, 0xed, 0x5a,
-	0x8c, 0xa6, 0xd5, 0xec, 0xb8, 0x2d, 0x91, 0x5f, 0xb0, 0x09, 0x7c, 0x13, 0xd8, 0xac, 0x0e, 0xf2,
-	0xec, 0xbf, 0xe0, 0x97, 0x8c, 0x99, 0x80, 0x66, 0x65, 0xdc, 0x97, 0x25, 0x31, 0xce, 0x9f, 0x4e,
-	0x52, 0xd3, 0xa4, 0x82, 0x9f, 0xb3, 0x7a, 0xa3, 0xf1, 0x03, 0x50, 0x1c, 0x66, 0x39, 0x24, 0x7e,
-	0xc5, 0x4e, 0xbd, 0x8e, 0x9f, 0x4e, 0x77, 0x2b, 0x8a, 0x1e, 0x44, 0x9d, 0xe1, 0xc9, 0xd0, 0x2d,
-	0xa3, 0x87, 0x3b, 0x60, 0xe9, 0x36, 0x72, 0xff, 0x45, 0x1f, 0xab, 0x97, 0x71, 0x7a, 0x7f, 0x46,
-	0xf3, 0xe7, 0x45, 0xab, 0xa3, 0x6c, 0x12, 0x5a, 0xee, 0xd0, 0x43, 0x41, 0xf7, 0x03, 0x7a, 0x42,
-	0xf2, 0xaf, 0x75, 0x3e, 0xe8, 0xcd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x13, 0x73, 0xfd, 0x63,
-	0x8f, 0x01, 0x00, 0x00,
+var File_v2ray_com_core_transport_internet_headers_srtp_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDesc = []byte{
+	0x0a, 0x3b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x72, 0x74, 0x70,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x72, 0x74, 0x70, 0x22, 0xb4, 0x01, 0x0a, 0x06, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18,
+	0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x73, 0x72, 0x63, 0x5f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x73, 0x72, 0x63,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x21, 0x0a,
+	0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65,
+	0x42, 0x65, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x72,
+	0x74, 0x70, 0x50, 0x01, 0x5a, 0x04, 0x73, 0x72, 0x74, 0x70, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52,
+	0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x73, 0x2e, 0x53, 0x72, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_transport_internet_headers_srtp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_headers_srtp_config_proto_goTypes = []interface{}{
+	(*Config)(nil), // 0: v2ray.core.transport.internet.headers.srtp.Config
+}
+var file_v2ray_com_core_transport_internet_headers_srtp_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_transport_internet_headers_srtp_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_srtp_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_srtp_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_srtp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_srtp_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_srtp_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_srtp_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_srtp_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_srtp_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_srtp_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_srtp_config_proto_depIdxs = nil
 }

+ 117 - 48
transport/internet/headers/tls/config.pb.go

@@ -1,72 +1,141 @@
 package tls
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type PacketConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *PacketConfig) Reset()         { *m = PacketConfig{} }
-func (m *PacketConfig) String() string { return proto.CompactTextString(m) }
-func (*PacketConfig) ProtoMessage()    {}
-func (*PacketConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e55187b75c46dc0d, []int{0}
+func (x *PacketConfig) Reset() {
+	*x = PacketConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_tls_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *PacketConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PacketConfig.Unmarshal(m, b)
-}
-func (m *PacketConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PacketConfig.Marshal(b, m, deterministic)
+func (x *PacketConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *PacketConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PacketConfig.Merge(m, src)
+
+func (*PacketConfig) ProtoMessage() {}
+
+func (x *PacketConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_tls_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *PacketConfig) XXX_Size() int {
-	return xxx_messageInfo_PacketConfig.Size(m)
+
+// Deprecated: Use PacketConfig.ProtoReflect.Descriptor instead.
+func (*PacketConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *PacketConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_PacketConfig.DiscardUnknown(m)
+
+var File_v2ray_com_core_transport_internet_headers_tls_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDesc = []byte{
+	0x0a, 0x3a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65,
+	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x62, 0x0a, 0x2d, 0x63, 0x6f, 0x6d, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x50, 0x01, 0x5a, 0x03, 0x74, 0x6c, 0x73, 0xaa,
+	0x02, 0x29, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e,
+	0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x6c, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_PacketConfig proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*PacketConfig)(nil), "v2ray.core.transport.internet.headers.tls.PacketConfig")
+func file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/tls/config.proto", fileDescriptor_e55187b75c46dc0d)
+var file_v2ray_com_core_transport_internet_headers_tls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_headers_tls_config_proto_goTypes = []interface{}{
+	(*PacketConfig)(nil), // 0: v2ray.core.transport.internet.headers.tls.PacketConfig
+}
+var file_v2ray_com_core_transport_internet_headers_tls_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_e55187b75c46dc0d = []byte{
-	// 163 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x2a, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0xcf, 0x48,
-	0x4d, 0x4c, 0x49, 0x2d, 0x2a, 0xd6, 0x2f, 0xc9, 0x29, 0xd6, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c,
-	0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xd2, 0x84, 0xe9, 0x2d, 0x4a, 0xd5, 0x83, 0xeb, 0xd3,
-	0x83, 0xe9, 0xd3, 0x83, 0xea, 0xd3, 0x2b, 0xc9, 0x29, 0x56, 0xe2, 0xe3, 0xe2, 0x09, 0x48, 0x4c,
-	0xce, 0x4e, 0x2d, 0x71, 0x06, 0x1b, 0xe0, 0x94, 0xc4, 0xa5, 0x9b, 0x9c, 0x9f, 0xab, 0x47, 0xb4,
-	0x01, 0x01, 0x8c, 0x51, 0xcc, 0x25, 0x39, 0xc5, 0xab, 0x98, 0x34, 0xc3, 0x8c, 0x82, 0x12, 0x2b,
-	0xf5, 0x9c, 0x41, 0x5a, 0x42, 0xe0, 0x5a, 0x3c, 0x61, 0x5a, 0x3c, 0xa0, 0x5a, 0x42, 0x72, 0x8a,
-	0x93, 0xd8, 0xc0, 0xae, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x21, 0xb5, 0x48, 0xe3,
-	0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_headers_tls_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_tls_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_tls_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_tls_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PacketConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_tls_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_tls_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_tls_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_tls_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_tls_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_tls_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_tls_config_proto_depIdxs = nil
 }

+ 125 - 55
transport/internet/headers/utp/config.pb.go

@@ -1,81 +1,151 @@
 package utp
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	Version              uint32   `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_326a99ff25d90470, []int{0}
+	Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_utp_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_utp_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetVersion() uint32 {
-	if m != nil {
-		return m.Version
+func (x *Config) GetVersion() uint32 {
+	if x != nil {
+		return x.Version
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.headers.utp.Config")
+var File_v2ray_com_core_transport_internet_headers_utp_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDesc = []byte{
+	0x0a, 0x3a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x75, 0x74, 0x70, 0x2f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x2e, 0x75, 0x74, 0x70, 0x22, 0x22, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x62, 0x0a, 0x2d, 0x63,
+	0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+	0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x03,
+	0x75, 0x74, 0x70, 0xaa, 0x02, 0x29, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65,
+	0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x74, 0x70, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/utp/config.proto", fileDescriptor_326a99ff25d90470)
+var file_v2ray_com_core_transport_internet_headers_utp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_headers_utp_config_proto_goTypes = []interface{}{
+	(*Config)(nil), // 0: v2ray.core.transport.internet.headers.utp.Config
+}
+var file_v2ray_com_core_transport_internet_headers_utp_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_326a99ff25d90470 = []byte{
-	// 177 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x2a, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0xcf, 0x48,
-	0x4d, 0x4c, 0x49, 0x2d, 0x2a, 0xd6, 0x2f, 0x2d, 0x29, 0xd0, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c,
-	0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xd2, 0x84, 0xe9, 0x2d, 0x4a, 0xd5, 0x83, 0xeb, 0xd3,
-	0x83, 0xe9, 0xd3, 0x83, 0xea, 0xd3, 0x2b, 0x2d, 0x29, 0x50, 0x52, 0xe2, 0x62, 0x73, 0x06, 0x6b,
-	0x15, 0x92, 0xe0, 0x62, 0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0x93, 0x60, 0x54, 0x60, 0xd4,
-	0xe0, 0x0d, 0x82, 0x71, 0x9d, 0x92, 0xb8, 0x74, 0x93, 0xf3, 0x73, 0xf5, 0x88, 0x36, 0x34, 0x80,
-	0x31, 0x8a, 0xb9, 0xb4, 0xa4, 0x60, 0x15, 0x93, 0x66, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33,
-	0x48, 0x4b, 0x08, 0x5c, 0x8b, 0x27, 0x4c, 0x8b, 0x07, 0x54, 0x4b, 0x68, 0x49, 0x41, 0x12, 0x1b,
-	0xd8, 0xe5, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd3, 0x86, 0xa8, 0x3b, 0xf7, 0x00, 0x00,
-	0x00,
+func init() { file_v2ray_com_core_transport_internet_headers_utp_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_utp_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_utp_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_utp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_utp_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_utp_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_utp_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_utp_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_utp_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_utp_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_utp_config_proto_depIdxs = nil
 }

+ 118 - 48
transport/internet/headers/wechat/config.pb.go

@@ -1,72 +1,142 @@
 package wechat
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type VideoConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *VideoConfig) Reset()         { *m = VideoConfig{} }
-func (m *VideoConfig) String() string { return proto.CompactTextString(m) }
-func (*VideoConfig) ProtoMessage()    {}
-func (*VideoConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ad582a12d5e4846, []int{0}
+func (x *VideoConfig) Reset() {
+	*x = VideoConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_wechat_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *VideoConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VideoConfig.Unmarshal(m, b)
-}
-func (m *VideoConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VideoConfig.Marshal(b, m, deterministic)
+func (x *VideoConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *VideoConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VideoConfig.Merge(m, src)
+
+func (*VideoConfig) ProtoMessage() {}
+
+func (x *VideoConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_wechat_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *VideoConfig) XXX_Size() int {
-	return xxx_messageInfo_VideoConfig.Size(m)
+
+// Deprecated: Use VideoConfig.ProtoReflect.Descriptor instead.
+func (*VideoConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *VideoConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_VideoConfig.DiscardUnknown(m)
+
+var File_v2ray_com_core_transport_internet_headers_wechat_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDesc = []byte{
+	0x0a, 0x3d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x65, 0x63, 0x68,
+	0x61, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x2c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68,
+	0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74, 0x22, 0x0d, 0x0a,
+	0x0b, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x6b, 0x0a, 0x30,
+	0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74,
+	0x50, 0x01, 0x5a, 0x06, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74, 0xaa, 0x02, 0x2c, 0x56, 0x32, 0x52,
+	0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x73, 0x2e, 0x57, 0x65, 0x63, 0x68, 0x61, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
-var xxx_messageInfo_VideoConfig proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*VideoConfig)(nil), "v2ray.core.transport.internet.headers.wechat.VideoConfig")
+func file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/wechat/config.proto", fileDescriptor_0ad582a12d5e4846)
+var file_v2ray_com_core_transport_internet_headers_wechat_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_headers_wechat_config_proto_goTypes = []interface{}{
+	(*VideoConfig)(nil), // 0: v2ray.core.transport.internet.headers.wechat.VideoConfig
+}
+var file_v2ray_com_core_transport_internet_headers_wechat_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_0ad582a12d5e4846 = []byte{
-	// 163 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x2d, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0xcf, 0x48,
-	0x4d, 0x4c, 0x49, 0x2d, 0x2a, 0xd6, 0x2f, 0x4f, 0x4d, 0xce, 0x48, 0x2c, 0xd1, 0x4f, 0xce, 0xcf,
-	0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xd2, 0x81, 0x69, 0x2f, 0x4a, 0xd5,
-	0x83, 0x6b, 0xd5, 0x83, 0x69, 0xd5, 0x83, 0x6a, 0xd5, 0x83, 0x68, 0x55, 0xe2, 0xe5, 0xe2, 0x0e,
-	0xcb, 0x4c, 0x49, 0xcd, 0x77, 0x06, 0x1b, 0xe1, 0x94, 0xcd, 0x65, 0x90, 0x9c, 0x9f, 0xab, 0x47,
-	0x8a, 0x11, 0x01, 0x8c, 0x51, 0x6c, 0x10, 0xd6, 0x2a, 0x26, 0x9d, 0x30, 0xa3, 0xa0, 0xc4, 0x4a,
-	0x3d, 0x67, 0x90, 0xc6, 0x10, 0xb8, 0x46, 0x4f, 0x98, 0x46, 0x0f, 0xa8, 0xc6, 0x70, 0xb0, 0xf2,
-	0x24, 0x36, 0xb0, 0x83, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x46, 0x75, 0xf8, 0xf1,
-	0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_headers_wechat_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_wechat_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_wechat_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_wechat_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VideoConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_wechat_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_wechat_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_wechat_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_wechat_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_wechat_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_wechat_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_wechat_config_proto_depIdxs = nil
 }

+ 119 - 48
transport/internet/headers/wireguard/config.pb.go

@@ -1,72 +1,143 @@
 package wireguard
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type WireguardConfig struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *WireguardConfig) Reset()         { *m = WireguardConfig{} }
-func (m *WireguardConfig) String() string { return proto.CompactTextString(m) }
-func (*WireguardConfig) ProtoMessage()    {}
-func (*WireguardConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a4c21f616af3c531, []int{0}
+func (x *WireguardConfig) Reset() {
+	*x = WireguardConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *WireguardConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_WireguardConfig.Unmarshal(m, b)
-}
-func (m *WireguardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_WireguardConfig.Marshal(b, m, deterministic)
+func (x *WireguardConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *WireguardConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_WireguardConfig.Merge(m, src)
+
+func (*WireguardConfig) ProtoMessage() {}
+
+func (x *WireguardConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *WireguardConfig) XXX_Size() int {
-	return xxx_messageInfo_WireguardConfig.Size(m)
+
+// Deprecated: Use WireguardConfig.ProtoReflect.Descriptor instead.
+func (*WireguardConfig) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *WireguardConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_WireguardConfig.DiscardUnknown(m)
+
+var File_v2ray_com_core_transport_internet_headers_wireguard_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDesc = []byte{
+	0x0a, 0x40, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x69, 0x72, 0x65,
+	0x67, 0x75, 0x61, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75,
+	0x61, 0x72, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x57, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x74, 0x0a, 0x33, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x2e, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x50, 0x01, 0x5a,
+	0x09, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0xaa, 0x02, 0x2f, 0x56, 0x32, 0x52,
+	0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x73, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_WireguardConfig proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescData = file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*WireguardConfig)(nil), "v2ray.core.transport.internet.headers.wireguard.WireguardConfig")
+func file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/headers/wireguard/config.proto", fileDescriptor_a4c21f616af3c531)
+var file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_goTypes = []interface{}{
+	(*WireguardConfig)(nil), // 0: v2ray.core.transport.internet.headers.wireguard.WireguardConfig
+}
+var file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_a4c21f616af3c531 = []byte{
-	// 163 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x72, 0x28, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0xcf, 0x48,
-	0x4d, 0x4c, 0x49, 0x2d, 0x2a, 0xd6, 0x2f, 0xcf, 0x2c, 0x4a, 0x4d, 0x2f, 0x4d, 0x2c, 0x4a, 0xd1,
-	0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xd2, 0x87, 0x99,
-	0x50, 0x94, 0xaa, 0x07, 0xd7, 0xad, 0x07, 0xd3, 0xad, 0x07, 0xd5, 0xad, 0x07, 0xd7, 0xad, 0x24,
-	0xc8, 0xc5, 0x1f, 0x0e, 0xe3, 0x38, 0x83, 0x4d, 0x72, 0x2a, 0xe1, 0x32, 0x4e, 0xce, 0xcf, 0xd5,
-	0x23, 0xd1, 0xa4, 0x00, 0xc6, 0x28, 0x4e, 0x38, 0x67, 0x15, 0x93, 0x7e, 0x98, 0x51, 0x50, 0x62,
-	0xa5, 0x9e, 0x33, 0x48, 0x7b, 0x08, 0x5c, 0xbb, 0x27, 0x4c, 0xbb, 0x07, 0x54, 0x3b, 0xdc, 0xee,
-	0x24, 0x36, 0xb0, 0x07, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x59, 0xf8, 0x04,
-	0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_init() }
+func file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_headers_wireguard_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WireguardConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_headers_wireguard_config_proto = out.File
+	file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_headers_wireguard_config_proto_depIdxs = nil
 }

+ 128 - 58
transport/internet/http/config.pb.go

@@ -1,88 +1,158 @@
 package http
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	Host                 []string `protobuf:"bytes,1,rep,name=host,proto3" json:"host,omitempty"`
-	Path                 string   `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_18c29e00ea34cfae, []int{0}
+	Host []string `protobuf:"bytes,1,rep,name=host,proto3" json:"host,omitempty"`
+	Path string   `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_http_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_http_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_http_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetHost() []string {
-	if m != nil {
-		return m.Host
+func (x *Config) GetHost() []string {
+	if x != nil {
+		return x.Host
 	}
 	return nil
 }
 
-func (m *Config) GetPath() string {
-	if m != nil {
-		return m.Path
+func (x *Config) GetPath() string {
+	if x != nil {
+		return x.Path
 	}
 	return ""
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.http.Config")
+var File_v2ray_com_core_transport_internet_http_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_http_config_proto_rawDesc = []byte{
+	0x0a, 0x33, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x55, 0x0a, 0x26, 0x63,
+	0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+	0x2e, 0x68, 0x74, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x04, 0x68, 0x74, 0x74, 0x70, 0xaa, 0x02, 0x22,
+	0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x74,
+	0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_http_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_http_config_proto_rawDescData = file_v2ray_com_core_transport_internet_http_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_http_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_http_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_http_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_http_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_http_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/http/config.proto", fileDescriptor_18c29e00ea34cfae)
+var file_v2ray_com_core_transport_internet_http_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_http_config_proto_goTypes = []interface{}{
+	(*Config)(nil), // 0: v2ray.core.transport.internet.http.Config
+}
+var file_v2ray_com_core_transport_internet_http_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_18c29e00ea34cfae = []byte{
-	// 173 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x2e, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0xcf, 0x28,
-	0x29, 0x29, 0xd0, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17,
-	0x52, 0x82, 0x69, 0x2a, 0x4a, 0xd5, 0x83, 0x6b, 0xd0, 0x83, 0x69, 0xd0, 0x03, 0x69, 0x50, 0x32,
-	0xe0, 0x62, 0x73, 0x06, 0xeb, 0x11, 0x12, 0xe2, 0x62, 0xc9, 0xc8, 0x2f, 0x2e, 0x91, 0x60, 0x54,
-	0x60, 0xd6, 0xe0, 0x0c, 0x02, 0xb3, 0x41, 0x62, 0x05, 0x89, 0x25, 0x19, 0x12, 0x4c, 0x0a, 0x8c,
-	0x20, 0x31, 0x10, 0xdb, 0x29, 0x94, 0x4b, 0x2d, 0x39, 0x3f, 0x57, 0x8f, 0xb0, 0xd9, 0x01, 0x8c,
-	0x51, 0x2c, 0x20, 0x7a, 0x15, 0x93, 0x52, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33, 0x48, 0x71,
-	0x08, 0x5c, 0xb1, 0x27, 0x4c, 0xb1, 0x47, 0x49, 0x49, 0x41, 0x12, 0x1b, 0xd8, 0xcd, 0xc6, 0x80,
-	0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xf2, 0x95, 0x63, 0xea, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_http_config_proto_init() }
+func file_v2ray_com_core_transport_internet_http_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_http_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_http_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_http_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_http_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_http_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_http_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_http_config_proto = out.File
+	file_v2ray_com_core_transport_internet_http_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_http_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_http_config_proto_depIdxs = nil
 }

+ 548 - 296
transport/internet/kcp/config.pb.go

@@ -1,442 +1,694 @@
 package kcp
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 // Maximum Transmission Unit, in bytes.
 type MTU struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *MTU) Reset()         { *m = MTU{} }
-func (m *MTU) String() string { return proto.CompactTextString(m) }
-func (*MTU) ProtoMessage()    {}
-func (*MTU) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{0}
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *MTU) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MTU.Unmarshal(m, b)
-}
-func (m *MTU) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MTU.Marshal(b, m, deterministic)
-}
-func (m *MTU) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MTU.Merge(m, src)
+func (x *MTU) Reset() {
+	*x = MTU{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *MTU) XXX_Size() int {
-	return xxx_messageInfo_MTU.Size(m)
+
+func (x *MTU) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MTU) XXX_DiscardUnknown() {
-	xxx_messageInfo_MTU.DiscardUnknown(m)
+
+func (*MTU) ProtoMessage() {}
+
+func (x *MTU) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MTU proto.InternalMessageInfo
+// Deprecated: Use MTU.ProtoReflect.Descriptor instead.
+func (*MTU) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *MTU) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *MTU) GetValue() uint32 {
+	if x != nil {
+		return x.Value
 	}
 	return 0
 }
 
 // Transmission Time Interview, in milli-sec.
 type TTI struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *TTI) Reset()         { *m = TTI{} }
-func (m *TTI) String() string { return proto.CompactTextString(m) }
-func (*TTI) ProtoMessage()    {}
-func (*TTI) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{1}
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *TTI) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TTI.Unmarshal(m, b)
-}
-func (m *TTI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TTI.Marshal(b, m, deterministic)
-}
-func (m *TTI) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TTI.Merge(m, src)
+func (x *TTI) Reset() {
+	*x = TTI{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *TTI) XXX_Size() int {
-	return xxx_messageInfo_TTI.Size(m)
+
+func (x *TTI) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *TTI) XXX_DiscardUnknown() {
-	xxx_messageInfo_TTI.DiscardUnknown(m)
+
+func (*TTI) ProtoMessage() {}
+
+func (x *TTI) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_TTI proto.InternalMessageInfo
+// Deprecated: Use TTI.ProtoReflect.Descriptor instead.
+func (*TTI) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *TTI) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *TTI) GetValue() uint32 {
+	if x != nil {
+		return x.Value
 	}
 	return 0
 }
 
 // Uplink capacity, in MB.
 type UplinkCapacity struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *UplinkCapacity) Reset()         { *m = UplinkCapacity{} }
-func (m *UplinkCapacity) String() string { return proto.CompactTextString(m) }
-func (*UplinkCapacity) ProtoMessage()    {}
-func (*UplinkCapacity) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{2}
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *UplinkCapacity) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UplinkCapacity.Unmarshal(m, b)
-}
-func (m *UplinkCapacity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UplinkCapacity.Marshal(b, m, deterministic)
-}
-func (m *UplinkCapacity) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UplinkCapacity.Merge(m, src)
+func (x *UplinkCapacity) Reset() {
+	*x = UplinkCapacity{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *UplinkCapacity) XXX_Size() int {
-	return xxx_messageInfo_UplinkCapacity.Size(m)
+
+func (x *UplinkCapacity) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *UplinkCapacity) XXX_DiscardUnknown() {
-	xxx_messageInfo_UplinkCapacity.DiscardUnknown(m)
+
+func (*UplinkCapacity) ProtoMessage() {}
+
+func (x *UplinkCapacity) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_UplinkCapacity proto.InternalMessageInfo
+// Deprecated: Use UplinkCapacity.ProtoReflect.Descriptor instead.
+func (*UplinkCapacity) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *UplinkCapacity) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *UplinkCapacity) GetValue() uint32 {
+	if x != nil {
+		return x.Value
 	}
 	return 0
 }
 
 // Downlink capacity, in MB.
 type DownlinkCapacity struct {
-	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *DownlinkCapacity) Reset()         { *m = DownlinkCapacity{} }
-func (m *DownlinkCapacity) String() string { return proto.CompactTextString(m) }
-func (*DownlinkCapacity) ProtoMessage()    {}
-func (*DownlinkCapacity) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{3}
+	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *DownlinkCapacity) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DownlinkCapacity.Unmarshal(m, b)
-}
-func (m *DownlinkCapacity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DownlinkCapacity.Marshal(b, m, deterministic)
-}
-func (m *DownlinkCapacity) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DownlinkCapacity.Merge(m, src)
+func (x *DownlinkCapacity) Reset() {
+	*x = DownlinkCapacity{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *DownlinkCapacity) XXX_Size() int {
-	return xxx_messageInfo_DownlinkCapacity.Size(m)
+
+func (x *DownlinkCapacity) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *DownlinkCapacity) XXX_DiscardUnknown() {
-	xxx_messageInfo_DownlinkCapacity.DiscardUnknown(m)
+
+func (*DownlinkCapacity) ProtoMessage() {}
+
+func (x *DownlinkCapacity) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_DownlinkCapacity proto.InternalMessageInfo
+// Deprecated: Use DownlinkCapacity.ProtoReflect.Descriptor instead.
+func (*DownlinkCapacity) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *DownlinkCapacity) GetValue() uint32 {
-	if m != nil {
-		return m.Value
+func (x *DownlinkCapacity) GetValue() uint32 {
+	if x != nil {
+		return x.Value
 	}
 	return 0
 }
 
 type WriteBuffer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Buffer size in bytes.
-	Size                 uint32   `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Size uint32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
 }
 
-func (m *WriteBuffer) Reset()         { *m = WriteBuffer{} }
-func (m *WriteBuffer) String() string { return proto.CompactTextString(m) }
-func (*WriteBuffer) ProtoMessage()    {}
-func (*WriteBuffer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{4}
+func (x *WriteBuffer) Reset() {
+	*x = WriteBuffer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *WriteBuffer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_WriteBuffer.Unmarshal(m, b)
-}
-func (m *WriteBuffer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_WriteBuffer.Marshal(b, m, deterministic)
+func (x *WriteBuffer) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *WriteBuffer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_WriteBuffer.Merge(m, src)
-}
-func (m *WriteBuffer) XXX_Size() int {
-	return xxx_messageInfo_WriteBuffer.Size(m)
-}
-func (m *WriteBuffer) XXX_DiscardUnknown() {
-	xxx_messageInfo_WriteBuffer.DiscardUnknown(m)
+
+func (*WriteBuffer) ProtoMessage() {}
+
+func (x *WriteBuffer) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_WriteBuffer proto.InternalMessageInfo
+// Deprecated: Use WriteBuffer.ProtoReflect.Descriptor instead.
+func (*WriteBuffer) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *WriteBuffer) GetSize() uint32 {
-	if m != nil {
-		return m.Size
+func (x *WriteBuffer) GetSize() uint32 {
+	if x != nil {
+		return x.Size
 	}
 	return 0
 }
 
 type ReadBuffer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Buffer size in bytes.
-	Size                 uint32   `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Size uint32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
 }
 
-func (m *ReadBuffer) Reset()         { *m = ReadBuffer{} }
-func (m *ReadBuffer) String() string { return proto.CompactTextString(m) }
-func (*ReadBuffer) ProtoMessage()    {}
-func (*ReadBuffer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{5}
+func (x *ReadBuffer) Reset() {
+	*x = ReadBuffer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *ReadBuffer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ReadBuffer.Unmarshal(m, b)
-}
-func (m *ReadBuffer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ReadBuffer.Marshal(b, m, deterministic)
-}
-func (m *ReadBuffer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ReadBuffer.Merge(m, src)
+func (x *ReadBuffer) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ReadBuffer) XXX_Size() int {
-	return xxx_messageInfo_ReadBuffer.Size(m)
-}
-func (m *ReadBuffer) XXX_DiscardUnknown() {
-	xxx_messageInfo_ReadBuffer.DiscardUnknown(m)
+
+func (*ReadBuffer) ProtoMessage() {}
+
+func (x *ReadBuffer) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ReadBuffer proto.InternalMessageInfo
+// Deprecated: Use ReadBuffer.ProtoReflect.Descriptor instead.
+func (*ReadBuffer) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{5}
+}
 
-func (m *ReadBuffer) GetSize() uint32 {
-	if m != nil {
-		return m.Size
+func (x *ReadBuffer) GetSize() uint32 {
+	if x != nil {
+		return x.Size
 	}
 	return 0
 }
 
 type ConnectionReuse struct {
-	Enable               bool     `protobuf:"varint,1,opt,name=enable,proto3" json:"enable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ConnectionReuse) Reset()         { *m = ConnectionReuse{} }
-func (m *ConnectionReuse) String() string { return proto.CompactTextString(m) }
-func (*ConnectionReuse) ProtoMessage()    {}
-func (*ConnectionReuse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{6}
+	Enable bool `protobuf:"varint,1,opt,name=enable,proto3" json:"enable,omitempty"`
 }
 
-func (m *ConnectionReuse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConnectionReuse.Unmarshal(m, b)
-}
-func (m *ConnectionReuse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConnectionReuse.Marshal(b, m, deterministic)
-}
-func (m *ConnectionReuse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConnectionReuse.Merge(m, src)
+func (x *ConnectionReuse) Reset() {
+	*x = ConnectionReuse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ConnectionReuse) XXX_Size() int {
-	return xxx_messageInfo_ConnectionReuse.Size(m)
+
+func (x *ConnectionReuse) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ConnectionReuse) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConnectionReuse.DiscardUnknown(m)
+
+func (*ConnectionReuse) ProtoMessage() {}
+
+func (x *ConnectionReuse) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ConnectionReuse proto.InternalMessageInfo
+// Deprecated: Use ConnectionReuse.ProtoReflect.Descriptor instead.
+func (*ConnectionReuse) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{6}
+}
 
-func (m *ConnectionReuse) GetEnable() bool {
-	if m != nil {
-		return m.Enable
+func (x *ConnectionReuse) GetEnable() bool {
+	if x != nil {
+		return x.Enable
 	}
 	return false
 }
 
 type Config struct {
-	Mtu                  *MTU                 `protobuf:"bytes,1,opt,name=mtu,proto3" json:"mtu,omitempty"`
-	Tti                  *TTI                 `protobuf:"bytes,2,opt,name=tti,proto3" json:"tti,omitempty"`
-	UplinkCapacity       *UplinkCapacity      `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity,proto3" json:"uplink_capacity,omitempty"`
-	DownlinkCapacity     *DownlinkCapacity    `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity,proto3" json:"downlink_capacity,omitempty"`
-	Congestion           bool                 `protobuf:"varint,5,opt,name=congestion,proto3" json:"congestion,omitempty"`
-	WriteBuffer          *WriteBuffer         `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer,proto3" json:"write_buffer,omitempty"`
-	ReadBuffer           *ReadBuffer          `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer,proto3" json:"read_buffer,omitempty"`
-	HeaderConfig         *serial.TypedMessage `protobuf:"bytes,8,opt,name=header_config,json=headerConfig,proto3" json:"header_config,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3746d5d763e81577, []int{7}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Mtu              *MTU                 `protobuf:"bytes,1,opt,name=mtu,proto3" json:"mtu,omitempty"`
+	Tti              *TTI                 `protobuf:"bytes,2,opt,name=tti,proto3" json:"tti,omitempty"`
+	UplinkCapacity   *UplinkCapacity      `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity,proto3" json:"uplink_capacity,omitempty"`
+	DownlinkCapacity *DownlinkCapacity    `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity,proto3" json:"downlink_capacity,omitempty"`
+	Congestion       bool                 `protobuf:"varint,5,opt,name=congestion,proto3" json:"congestion,omitempty"`
+	WriteBuffer      *WriteBuffer         `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer,proto3" json:"write_buffer,omitempty"`
+	ReadBuffer       *ReadBuffer          `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer,proto3" json:"read_buffer,omitempty"`
+	HeaderConfig     *serial.TypedMessage `protobuf:"bytes,8,opt,name=header_config,json=headerConfig,proto3" json:"header_config,omitempty"`
+}
+
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP(), []int{7}
+}
 
-func (m *Config) GetMtu() *MTU {
-	if m != nil {
-		return m.Mtu
+func (x *Config) GetMtu() *MTU {
+	if x != nil {
+		return x.Mtu
 	}
 	return nil
 }
 
-func (m *Config) GetTti() *TTI {
-	if m != nil {
-		return m.Tti
+func (x *Config) GetTti() *TTI {
+	if x != nil {
+		return x.Tti
 	}
 	return nil
 }
 
-func (m *Config) GetUplinkCapacity() *UplinkCapacity {
-	if m != nil {
-		return m.UplinkCapacity
+func (x *Config) GetUplinkCapacity() *UplinkCapacity {
+	if x != nil {
+		return x.UplinkCapacity
 	}
 	return nil
 }
 
-func (m *Config) GetDownlinkCapacity() *DownlinkCapacity {
-	if m != nil {
-		return m.DownlinkCapacity
+func (x *Config) GetDownlinkCapacity() *DownlinkCapacity {
+	if x != nil {
+		return x.DownlinkCapacity
 	}
 	return nil
 }
 
-func (m *Config) GetCongestion() bool {
-	if m != nil {
-		return m.Congestion
+func (x *Config) GetCongestion() bool {
+	if x != nil {
+		return x.Congestion
 	}
 	return false
 }
 
-func (m *Config) GetWriteBuffer() *WriteBuffer {
-	if m != nil {
-		return m.WriteBuffer
+func (x *Config) GetWriteBuffer() *WriteBuffer {
+	if x != nil {
+		return x.WriteBuffer
 	}
 	return nil
 }
 
-func (m *Config) GetReadBuffer() *ReadBuffer {
-	if m != nil {
-		return m.ReadBuffer
+func (x *Config) GetReadBuffer() *ReadBuffer {
+	if x != nil {
+		return x.ReadBuffer
 	}
 	return nil
 }
 
-func (m *Config) GetHeaderConfig() *serial.TypedMessage {
-	if m != nil {
-		return m.HeaderConfig
+func (x *Config) GetHeaderConfig() *serial.TypedMessage {
+	if x != nil {
+		return x.HeaderConfig
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*MTU)(nil), "v2ray.core.transport.internet.kcp.MTU")
-	proto.RegisterType((*TTI)(nil), "v2ray.core.transport.internet.kcp.TTI")
-	proto.RegisterType((*UplinkCapacity)(nil), "v2ray.core.transport.internet.kcp.UplinkCapacity")
-	proto.RegisterType((*DownlinkCapacity)(nil), "v2ray.core.transport.internet.kcp.DownlinkCapacity")
-	proto.RegisterType((*WriteBuffer)(nil), "v2ray.core.transport.internet.kcp.WriteBuffer")
-	proto.RegisterType((*ReadBuffer)(nil), "v2ray.core.transport.internet.kcp.ReadBuffer")
-	proto.RegisterType((*ConnectionReuse)(nil), "v2ray.core.transport.internet.kcp.ConnectionReuse")
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.kcp.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/kcp/config.proto", fileDescriptor_3746d5d763e81577)
-}
-
-var fileDescriptor_3746d5d763e81577 = []byte{
-	// 471 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x5f, 0x6f, 0xd3, 0x3e,
-	0x14, 0x55, 0xd7, 0xae, 0xbf, 0xfe, 0x6e, 0xf7, 0xa7, 0x44, 0x08, 0x45, 0x20, 0xa1, 0xb5, 0x12,
-	0xd3, 0x78, 0xc0, 0x81, 0xee, 0x85, 0xe7, 0x95, 0x97, 0x32, 0x15, 0x81, 0x95, 0x82, 0xb4, 0x97,
-	0xe2, 0x3a, 0xb7, 0xc5, 0x6a, 0x63, 0x5b, 0x8e, 0xb3, 0xaa, 0x7c, 0x24, 0x3e, 0x0d, 0x1f, 0x09,
-	0xc5, 0x6e, 0xd6, 0xae, 0x68, 0x2c, 0x6f, 0x71, 0xee, 0x39, 0xc7, 0xd6, 0x39, 0xf7, 0x40, 0xff,
-	0xb6, 0x6f, 0xd8, 0x9a, 0x70, 0x95, 0x46, 0x5c, 0x19, 0x8c, 0xac, 0x61, 0x32, 0xd3, 0xca, 0xd8,
-	0x48, 0x48, 0x8b, 0x46, 0xa2, 0x8d, 0x16, 0x5c, 0x47, 0x5c, 0xc9, 0x99, 0x98, 0x13, 0x6d, 0x94,
-	0x55, 0x41, 0xb7, 0xe4, 0x18, 0x24, 0x77, 0x78, 0x52, 0xe2, 0xc9, 0x82, 0xeb, 0xe7, 0x6f, 0xf7,
-	0x64, 0xb9, 0x4a, 0x53, 0x25, 0xa3, 0x0c, 0x8d, 0x60, 0xcb, 0xc8, 0xae, 0x35, 0x26, 0x93, 0x14,
-	0xb3, 0x8c, 0xcd, 0xd1, 0x8b, 0xf6, 0x5e, 0x40, 0x7d, 0x14, 0x8f, 0x83, 0xa7, 0x70, 0x78, 0xcb,
-	0x96, 0x39, 0x86, 0xb5, 0xb3, 0xda, 0xc5, 0x31, 0xf5, 0x87, 0x62, 0x18, 0xc7, 0xc3, 0x07, 0x86,
-	0xe7, 0x70, 0x32, 0xd6, 0x4b, 0x21, 0x17, 0x03, 0xa6, 0x19, 0x17, 0x76, 0xfd, 0x00, 0xee, 0x02,
-	0x3a, 0x1f, 0xd4, 0x4a, 0x56, 0x40, 0x76, 0xa1, 0xfd, 0xcd, 0x08, 0x8b, 0x57, 0xf9, 0x6c, 0x86,
-	0x26, 0x08, 0xa0, 0x91, 0x89, 0x9f, 0x25, 0xc6, 0x7d, 0xf7, 0xce, 0x00, 0x28, 0xb2, 0xe4, 0x1f,
-	0x88, 0xd7, 0x70, 0x3a, 0x50, 0x52, 0x22, 0xb7, 0x42, 0x49, 0x8a, 0x79, 0x86, 0xc1, 0x33, 0x68,
-	0xa2, 0x64, 0xd3, 0xa5, 0x07, 0xb6, 0xe8, 0xe6, 0xd4, 0xfb, 0xdd, 0x80, 0xe6, 0xc0, 0x39, 0x1c,
-	0xbc, 0x87, 0x7a, 0x6a, 0x73, 0x37, 0x6f, 0xf7, 0xcf, 0xc9, 0xa3, 0x4e, 0x93, 0x51, 0x3c, 0xa6,
-	0x05, 0xa5, 0x60, 0x5a, 0x2b, 0xc2, 0x83, 0xca, 0xcc, 0x38, 0x1e, 0xd2, 0x82, 0x12, 0xdc, 0xc0,
-	0x69, 0xee, 0x0c, 0x9c, 0xf0, 0x8d, 0x2f, 0x61, 0xdd, 0xa9, 0xbc, 0xab, 0xa0, 0x72, 0xdf, 0x7a,
-	0x7a, 0x92, 0xdf, 0x8f, 0xe2, 0x3b, 0x3c, 0x49, 0x36, 0xa6, 0x6f, 0xd5, 0x1b, 0x4e, 0xfd, 0xb2,
-	0x82, 0xfa, 0x7e, 0x60, 0xb4, 0x93, 0xec, 0x47, 0xf8, 0x12, 0x80, 0x2b, 0x39, 0xc7, 0xac, 0xf0,
-	0x39, 0x3c, 0x74, 0xc6, 0xee, 0xfc, 0x09, 0xbe, 0xc0, 0xd1, 0xaa, 0x08, 0x73, 0x32, 0x75, 0x59,
-	0x85, 0x4d, 0x77, 0x39, 0xa9, 0x70, 0xf9, 0xce, 0x0e, 0xd0, 0xf6, 0x6a, 0x67, 0x21, 0x3e, 0x41,
-	0xdb, 0x20, 0x4b, 0x4a, 0xc5, 0xff, 0x9c, 0xe2, 0x9b, 0x0a, 0x8a, 0xdb, 0x95, 0xa1, 0x60, 0xb6,
-	0xeb, 0x73, 0x0d, 0xc7, 0x3f, 0x90, 0x25, 0x68, 0x26, 0xbe, 0x67, 0x61, 0xeb, 0xef, 0x10, 0x7d,
-	0x83, 0x88, 0x6f, 0x10, 0x89, 0x8b, 0x06, 0x8d, 0x7c, 0x81, 0xe8, 0x91, 0x27, 0xfb, 0x0d, 0xfa,
-	0xd8, 0x68, 0xfd, 0xdf, 0x81, 0x2b, 0x0a, 0xaf, 0xb8, 0x4a, 0x1f, 0x7f, 0xd2, 0xe7, 0xda, 0x4d,
-	0x7d, 0xc1, 0xf5, 0xaf, 0x83, 0xee, 0xd7, 0x3e, 0x65, 0x6b, 0x32, 0x28, 0xa0, 0xf1, 0x1d, 0x74,
-	0x58, 0x42, 0xaf, 0xb9, 0x9e, 0x36, 0x5d, 0x53, 0x2f, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x54,
-	0xdd, 0xba, 0xf9, 0x34, 0x04, 0x00, 0x00,
+var File_v2ray_com_core_transport_internet_kcp_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_kcp_config_proto_rawDesc = []byte{
+	0x0a, 0x32, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x63, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73,
+	0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1b, 0x0a, 0x03, 0x4d, 0x54, 0x55,
+	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1b, 0x0a, 0x03, 0x54, 0x54, 0x49, 0x12, 0x14, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70,
+	0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x28, 0x0a, 0x10, 0x44,
+	0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12,
+	0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x21, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75,
+	0x66, 0x66, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x20, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64,
+	0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x0a, 0x0f, 0x43, 0x6f,
+	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x75, 0x73, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65,
+	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xd0, 0x04, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x12, 0x38, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63,
+	0x70, 0x2e, 0x4d, 0x54, 0x55, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x38, 0x0a, 0x03, 0x74, 0x74,
+	0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x54, 0x54, 0x49, 0x52,
+	0x03, 0x74, 0x74, 0x69, 0x12, 0x5a, 0x0a, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63,
+	0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63,
+	0x70, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
+	0x52, 0x0e, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
+	0x12, 0x60, 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x61, 0x70,
+	0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32,
+	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e,
+	0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
+	0x52, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69,
+	0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x66,
+	0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x57, 0x72, 0x69,
+	0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42,
+	0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75,
+	0x66, 0x66, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x52,
+	0x65, 0x61, 0x64, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x42,
+	0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x42, 0x52, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e,
+	0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63,
+	0x70, 0x50, 0x01, 0x5a, 0x03, 0x6b, 0x63, 0x70, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52, 0x61, 0x79,
+	0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x4b, 0x63, 0x70, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescData = file_v2ray_com_core_transport_internet_kcp_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_kcp_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
+var file_v2ray_com_core_transport_internet_kcp_config_proto_goTypes = []interface{}{
+	(*MTU)(nil),                 // 0: v2ray.core.transport.internet.kcp.MTU
+	(*TTI)(nil),                 // 1: v2ray.core.transport.internet.kcp.TTI
+	(*UplinkCapacity)(nil),      // 2: v2ray.core.transport.internet.kcp.UplinkCapacity
+	(*DownlinkCapacity)(nil),    // 3: v2ray.core.transport.internet.kcp.DownlinkCapacity
+	(*WriteBuffer)(nil),         // 4: v2ray.core.transport.internet.kcp.WriteBuffer
+	(*ReadBuffer)(nil),          // 5: v2ray.core.transport.internet.kcp.ReadBuffer
+	(*ConnectionReuse)(nil),     // 6: v2ray.core.transport.internet.kcp.ConnectionReuse
+	(*Config)(nil),              // 7: v2ray.core.transport.internet.kcp.Config
+	(*serial.TypedMessage)(nil), // 8: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_transport_internet_kcp_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.transport.internet.kcp.Config.mtu:type_name -> v2ray.core.transport.internet.kcp.MTU
+	1, // 1: v2ray.core.transport.internet.kcp.Config.tti:type_name -> v2ray.core.transport.internet.kcp.TTI
+	2, // 2: v2ray.core.transport.internet.kcp.Config.uplink_capacity:type_name -> v2ray.core.transport.internet.kcp.UplinkCapacity
+	3, // 3: v2ray.core.transport.internet.kcp.Config.downlink_capacity:type_name -> v2ray.core.transport.internet.kcp.DownlinkCapacity
+	4, // 4: v2ray.core.transport.internet.kcp.Config.write_buffer:type_name -> v2ray.core.transport.internet.kcp.WriteBuffer
+	5, // 5: v2ray.core.transport.internet.kcp.Config.read_buffer:type_name -> v2ray.core.transport.internet.kcp.ReadBuffer
+	8, // 6: v2ray.core.transport.internet.kcp.Config.header_config:type_name -> v2ray.core.common.serial.TypedMessage
+	7, // [7:7] is the sub-list for method output_type
+	7, // [7:7] is the sub-list for method input_type
+	7, // [7:7] is the sub-list for extension type_name
+	7, // [7:7] is the sub-list for extension extendee
+	0, // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_transport_internet_kcp_config_proto_init() }
+func file_v2ray_com_core_transport_internet_kcp_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_kcp_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MTU); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TTI); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UplinkCapacity); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DownlinkCapacity); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteBuffer); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadBuffer); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ConnectionReuse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_kcp_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   8,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_kcp_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_kcp_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_kcp_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_kcp_config_proto = out.File
+	file_v2ray_com_core_transport_internet_kcp_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_kcp_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_kcp_config_proto_depIdxs = nil
 }

+ 149 - 68
transport/internet/quic/config.pb.go

@@ -1,104 +1,185 @@
 package quic
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	protocol "v2ray.com/core/common/protocol"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	Key                  string                   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	Security             *protocol.SecurityConfig `protobuf:"bytes,2,opt,name=security,proto3" json:"security,omitempty"`
-	Header               *serial.TypedMessage     `protobuf:"bytes,3,opt,name=header,proto3" json:"header,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_462e2eb906061b36, []int{0}
+	Key      string                   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Security *protocol.SecurityConfig `protobuf:"bytes,2,opt,name=security,proto3" json:"security,omitempty"`
+	Header   *serial.TypedMessage     `protobuf:"bytes,3,opt,name=header,proto3" json:"header,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_quic_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_quic_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_quic_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetKey() string {
-	if m != nil {
-		return m.Key
+func (x *Config) GetKey() string {
+	if x != nil {
+		return x.Key
 	}
 	return ""
 }
 
-func (m *Config) GetSecurity() *protocol.SecurityConfig {
-	if m != nil {
-		return m.Security
+func (x *Config) GetSecurity() *protocol.SecurityConfig {
+	if x != nil {
+		return x.Security
 	}
 	return nil
 }
 
-func (m *Config) GetHeader() *serial.TypedMessage {
-	if m != nil {
-		return m.Header
+func (x *Config) GetHeader() *serial.TypedMessage {
+	if x != nil {
+		return x.Header
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.quic.Config")
+var File_v2ray_com_core_transport_internet_quic_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_quic_config_proto_rawDesc = []byte{
+	0x0a, 0x33, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x71, 0x75, 0x69, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x6e, 0x65, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x01, 0x0a, 0x06, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69,
+	0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
+	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3e,
+	0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26,
+	0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x55,
+	0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x50, 0x01, 0x5a, 0x04, 0x71, 0x75, 0x69, 0x63,
+	0xaa, 0x02, 0x22, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+	0x2e, 0x51, 0x75, 0x69, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_quic_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_quic_config_proto_rawDescData = file_v2ray_com_core_transport_internet_quic_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_quic_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_quic_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_quic_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_quic_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_quic_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/quic/config.proto", fileDescriptor_462e2eb906061b36)
+var file_v2ray_com_core_transport_internet_quic_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_quic_config_proto_goTypes = []interface{}{
+	(*Config)(nil),                  // 0: v2ray.core.transport.internet.quic.Config
+	(*protocol.SecurityConfig)(nil), // 1: v2ray.core.common.protocol.SecurityConfig
+	(*serial.TypedMessage)(nil),     // 2: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_transport_internet_quic_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.transport.internet.quic.Config.security:type_name -> v2ray.core.common.protocol.SecurityConfig
+	2, // 1: v2ray.core.transport.internet.quic.Config.header:type_name -> v2ray.core.common.serial.TypedMessage
+	2, // [2:2] is the sub-list for method output_type
+	2, // [2:2] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
 }
 
-var fileDescriptor_462e2eb906061b36 = []byte{
-	// 269 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4b, 0xc3, 0x30,
-	0x14, 0xc6, 0xe9, 0x26, 0x45, 0xe3, 0x45, 0x7a, 0x2a, 0x3b, 0x8d, 0x1e, 0xc6, 0x10, 0x79, 0x91,
-	0xee, 0xee, 0xc1, 0x81, 0xe0, 0x41, 0xd0, 0x3a, 0x3d, 0x78, 0x91, 0x98, 0x3d, 0x67, 0x70, 0xed,
-	0xab, 0x2f, 0xa9, 0xd0, 0x7f, 0xc7, 0xa3, 0x7f, 0xa5, 0xa4, 0x59, 0x8b, 0xc8, 0xc0, 0x53, 0x0b,
-	0xf9, 0x7e, 0xbf, 0x7c, 0x5f, 0xc4, 0xe2, 0x33, 0x67, 0xd5, 0x82, 0xa6, 0x52, 0x6a, 0x62, 0x94,
-	0x8e, 0x55, 0x65, 0x6b, 0x62, 0x27, 0x4d, 0xe5, 0x90, 0x2b, 0x74, 0xf2, 0xa3, 0x31, 0x5a, 0x6a,
-	0xaa, 0x5e, 0xcd, 0x06, 0x6a, 0x26, 0x47, 0x49, 0xd6, 0x43, 0x8c, 0x30, 0x00, 0xd0, 0x03, 0xe0,
-	0x81, 0xc9, 0xf9, 0x1f, 0xb1, 0xa6, 0xb2, 0xa4, 0x4a, 0x5a, 0x64, 0xa3, 0xb6, 0xd2, 0xb5, 0x35,
-	0xae, 0x9f, 0x4b, 0xb4, 0x56, 0x6d, 0x30, 0x58, 0x27, 0x67, 0xfb, 0x89, 0xee, 0x50, 0xd3, 0x56,
-	0xbe, 0xa1, 0x5a, 0x23, 0xdb, 0x90, 0xce, 0xbe, 0x22, 0x11, 0x2f, 0xbb, 0x52, 0xc9, 0x89, 0x18,
-	0xbf, 0x63, 0x9b, 0x46, 0xd3, 0x68, 0x7e, 0x54, 0xf8, 0xdf, 0xe4, 0x4a, 0x1c, 0x5a, 0xd4, 0x0d,
-	0x1b, 0xd7, 0xa6, 0xa3, 0x69, 0x34, 0x3f, 0xce, 0x4f, 0xe1, 0x57, 0xe7, 0x60, 0x86, 0xde, 0x0c,
-	0xf7, 0xbb, 0x6c, 0xf0, 0x15, 0x03, 0x9b, 0x5c, 0x88, 0x38, 0xdc, 0x9a, 0x8e, 0x3b, 0xcb, 0x6c,
-	0x8f, 0x25, 0x2c, 0x82, 0x95, 0x5f, 0x74, 0x13, 0x06, 0x15, 0x3b, 0xea, 0xf2, 0x41, 0xcc, 0x34,
-	0x95, 0xf0, 0xff, 0x73, 0xdd, 0x46, 0x4f, 0x07, 0xfe, 0xfb, 0x3d, 0xca, 0x1e, 0xf3, 0x42, 0xb5,
-	0xb0, 0xf4, 0xe1, 0xd5, 0x10, 0xbe, 0xee, 0xc3, 0x77, 0x8d, 0xd1, 0x2f, 0x71, 0xd7, 0x7c, 0xf1,
-	0x13, 0x00, 0x00, 0xff, 0xff, 0xd0, 0x05, 0x0f, 0xf6, 0xbd, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_quic_config_proto_init() }
+func file_v2ray_com_core_transport_internet_quic_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_quic_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_quic_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_quic_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_quic_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_quic_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_quic_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_quic_config_proto = out.File
+	file_v2ray_com_core_transport_internet_quic_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_quic_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_quic_config_proto_depIdxs = nil
 }

+ 132 - 57
transport/internet/tcp/config.pb.go

@@ -1,84 +1,159 @@
 package tcp
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 	serial "v2ray.com/core/common/serial"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	HeaderSettings       *serial.TypedMessage `protobuf:"bytes,2,opt,name=header_settings,json=headerSettings,proto3" json:"header_settings,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_eb6d289fc61edd40, []int{0}
+	HeaderSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=header_settings,json=headerSettings,proto3" json:"header_settings,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_tcp_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_tcp_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Config) GetHeaderSettings() *serial.TypedMessage {
-	if m != nil {
-		return m.HeaderSettings
+func (x *Config) GetHeaderSettings() *serial.TypedMessage {
+	if x != nil {
+		return x.HeaderSettings
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.tcp.Config")
+var File_v2ray_com_core_transport_internet_tcp_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_tcp_config_proto_rawDesc = []byte{
+	0x0a, 0x32, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x74, 0x63, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x1a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73,
+	0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5f, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65,
+	0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76,
+	0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x42, 0x52, 0x0a, 0x25, 0x63, 0x6f,
+	0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e,
+	0x74, 0x63, 0x70, 0x50, 0x01, 0x5a, 0x03, 0x74, 0x63, 0x70, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52,
+	0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescData = file_v2ray_com_core_transport_internet_tcp_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_tcp_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/tcp/config.proto", fileDescriptor_eb6d289fc61edd40)
+var file_v2ray_com_core_transport_internet_tcp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_tcp_config_proto_goTypes = []interface{}{
+	(*Config)(nil),              // 0: v2ray.core.transport.internet.tcp.Config
+	(*serial.TypedMessage)(nil), // 1: v2ray.core.common.serial.TypedMessage
+}
+var file_v2ray_com_core_transport_internet_tcp_config_proto_depIdxs = []int32{
+	1, // 0: v2ray.core.transport.internet.tcp.Config.header_settings:type_name -> v2ray.core.common.serial.TypedMessage
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
-var fileDescriptor_eb6d289fc61edd40 = []byte{
-	// 223 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8e, 0xc1, 0x4a, 0xc4, 0x30,
-	0x10, 0x86, 0x69, 0x95, 0x45, 0x2a, 0xa8, 0xec, 0x49, 0x3c, 0xb9, 0x82, 0xe2, 0x69, 0x22, 0xf1,
-	0x0d, 0xdc, 0x93, 0x82, 0x28, 0xb5, 0x78, 0xf0, 0x52, 0xe2, 0xec, 0x58, 0x03, 0x26, 0x13, 0x26,
-	0x83, 0xd0, 0x57, 0xf2, 0x29, 0x65, 0x37, 0x76, 0x11, 0x2f, 0xde, 0xbf, 0xef, 0xfb, 0xff, 0xc6,
-	0x7e, 0x5a, 0x71, 0x23, 0x20, 0x07, 0x83, 0x2c, 0x64, 0x54, 0x5c, 0xcc, 0x89, 0x45, 0x8d, 0x8f,
-	0x4a, 0x12, 0x49, 0x8d, 0x62, 0x32, 0xc8, 0xf1, 0xcd, 0x0f, 0x90, 0x84, 0x95, 0xe7, 0x8b, 0xc9,
-	0x11, 0x82, 0x2d, 0x0f, 0x13, 0x0f, 0x8a, 0xe9, 0xe4, 0xea, 0x4f, 0x16, 0x39, 0x04, 0x8e, 0x26,
-	0x93, 0x78, 0xf7, 0x61, 0x74, 0x4c, 0xb4, 0xea, 0x03, 0xe5, 0xec, 0x06, 0x2a, 0xd1, 0xb3, 0xbe,
-	0x99, 0x2d, 0x37, 0x23, 0xf3, 0x87, 0xe6, 0xf0, 0x9d, 0xdc, 0x8a, 0xa4, 0xcf, 0xa4, 0xea, 0xe3,
-	0x90, 0x8f, 0xeb, 0xd3, 0xea, 0x72, 0xdf, 0x5e, 0xc0, 0xaf, 0xe1, 0x52, 0x84, 0x52, 0x84, 0x6e,
-	0x5d, 0xbc, 0x2f, 0xc1, 0xf6, 0xa0, 0xe8, 0x4f, 0x3f, 0xf6, 0xdd, 0xee, 0x5e, 0x75, 0x54, 0xdf,
-	0xb4, 0xcd, 0x39, 0x72, 0x80, 0x7f, 0xbf, 0x3f, 0x56, 0x2f, 0x3b, 0x8a, 0xe9, 0xab, 0x5e, 0x3c,
-	0xdb, 0xd6, 0x8d, 0xb0, 0x5c, 0xa3, 0xdd, 0x16, 0xbd, 0x9d, 0xd0, 0x0e, 0xd3, 0xeb, 0x6c, 0xf3,
-	0xfd, 0xfa, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x15, 0xf9, 0x1f, 0xa0, 0x46, 0x01, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_tcp_config_proto_init() }
+func file_v2ray_com_core_transport_internet_tcp_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_tcp_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_tcp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_tcp_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_tcp_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_tcp_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_tcp_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_tcp_config_proto = out.File
+	file_v2ray_com_core_transport_internet_tcp_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_tcp_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_tcp_config_proto_depIdxs = nil
 }

+ 270 - 139
transport/internet/tls/config.pb.go

@@ -1,21 +1,23 @@
 package tls
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Certificate_Usage int32
 
@@ -25,84 +27,117 @@ const (
 	Certificate_AUTHORITY_ISSUE  Certificate_Usage = 2
 )
 
-var Certificate_Usage_name = map[int32]string{
-	0: "ENCIPHERMENT",
-	1: "AUTHORITY_VERIFY",
-	2: "AUTHORITY_ISSUE",
-}
+// Enum value maps for Certificate_Usage.
+var (
+	Certificate_Usage_name = map[int32]string{
+		0: "ENCIPHERMENT",
+		1: "AUTHORITY_VERIFY",
+		2: "AUTHORITY_ISSUE",
+	}
+	Certificate_Usage_value = map[string]int32{
+		"ENCIPHERMENT":     0,
+		"AUTHORITY_VERIFY": 1,
+		"AUTHORITY_ISSUE":  2,
+	}
+)
 
-var Certificate_Usage_value = map[string]int32{
-	"ENCIPHERMENT":     0,
-	"AUTHORITY_VERIFY": 1,
-	"AUTHORITY_ISSUE":  2,
+func (x Certificate_Usage) Enum() *Certificate_Usage {
+	p := new(Certificate_Usage)
+	*p = x
+	return p
 }
 
 func (x Certificate_Usage) String() string {
-	return proto.EnumName(Certificate_Usage_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Certificate_Usage) Descriptor() protoreflect.EnumDescriptor {
+	return file_v2ray_com_core_transport_internet_tls_config_proto_enumTypes[0].Descriptor()
+}
+
+func (Certificate_Usage) Type() protoreflect.EnumType {
+	return &file_v2ray_com_core_transport_internet_tls_config_proto_enumTypes[0]
+}
+
+func (x Certificate_Usage) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
+// Deprecated: Use Certificate_Usage.Descriptor instead.
 func (Certificate_Usage) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_42ed70cad60a2736, []int{0, 0}
+	return file_v2ray_com_core_transport_internet_tls_config_proto_rawDescGZIP(), []int{0, 0}
 }
 
 type Certificate struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// TLS certificate in x509 format.
 	Certificate []byte `protobuf:"bytes,1,opt,name=Certificate,proto3" json:"Certificate,omitempty"`
 	// TLS key in x509 format.
-	Key                  []byte            `protobuf:"bytes,2,opt,name=Key,proto3" json:"Key,omitempty"`
-	Usage                Certificate_Usage `protobuf:"varint,3,opt,name=usage,proto3,enum=v2ray.core.transport.internet.tls.Certificate_Usage" json:"usage,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
+	Key   []byte            `protobuf:"bytes,2,opt,name=Key,proto3" json:"Key,omitempty"`
+	Usage Certificate_Usage `protobuf:"varint,3,opt,name=usage,proto3,enum=v2ray.core.transport.internet.tls.Certificate_Usage" json:"usage,omitempty"`
 }
 
-func (m *Certificate) Reset()         { *m = Certificate{} }
-func (m *Certificate) String() string { return proto.CompactTextString(m) }
-func (*Certificate) ProtoMessage()    {}
-func (*Certificate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_42ed70cad60a2736, []int{0}
+func (x *Certificate) Reset() {
+	*x = Certificate{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Certificate) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Certificate.Unmarshal(m, b)
-}
-func (m *Certificate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Certificate.Marshal(b, m, deterministic)
-}
-func (m *Certificate) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Certificate.Merge(m, src)
-}
-func (m *Certificate) XXX_Size() int {
-	return xxx_messageInfo_Certificate.Size(m)
+func (x *Certificate) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Certificate) XXX_DiscardUnknown() {
-	xxx_messageInfo_Certificate.DiscardUnknown(m)
+
+func (*Certificate) ProtoMessage() {}
+
+func (x *Certificate) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Certificate proto.InternalMessageInfo
+// Deprecated: Use Certificate.ProtoReflect.Descriptor instead.
+func (*Certificate) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_tls_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Certificate) GetCertificate() []byte {
-	if m != nil {
-		return m.Certificate
+func (x *Certificate) GetCertificate() []byte {
+	if x != nil {
+		return x.Certificate
 	}
 	return nil
 }
 
-func (m *Certificate) GetKey() []byte {
-	if m != nil {
-		return m.Key
+func (x *Certificate) GetKey() []byte {
+	if x != nil {
+		return x.Key
 	}
 	return nil
 }
 
-func (m *Certificate) GetUsage() Certificate_Usage {
-	if m != nil {
-		return m.Usage
+func (x *Certificate) GetUsage() Certificate_Usage {
+	if x != nil {
+		return x.Usage
 	}
 	return Certificate_ENCIPHERMENT
 }
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Whether or not to allow self-signed certificates.
 	AllowInsecure bool `protobuf:"varint,1,opt,name=allow_insecure,json=allowInsecure,proto3" json:"allow_insecure,omitempty"`
 	// Whether or not to allow insecure cipher suites.
@@ -116,124 +151,220 @@ type Config struct {
 	// Whether or not to disable session (ticket) resumption.
 	DisableSessionResumption bool `protobuf:"varint,6,opt,name=disable_session_resumption,json=disableSessionResumption,proto3" json:"disable_session_resumption,omitempty"`
 	// If true, root certificates on the system will not be loaded for verification.
-	DisableSystemRoot    bool     `protobuf:"varint,7,opt,name=disable_system_root,json=disableSystemRoot,proto3" json:"disable_system_root,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	DisableSystemRoot bool `protobuf:"varint,7,opt,name=disable_system_root,json=disableSystemRoot,proto3" json:"disable_system_root,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_42ed70cad60a2736, []int{1}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_tls_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Config) GetAllowInsecure() bool {
-	if m != nil {
-		return m.AllowInsecure
+func (x *Config) GetAllowInsecure() bool {
+	if x != nil {
+		return x.AllowInsecure
 	}
 	return false
 }
 
-func (m *Config) GetAllowInsecureCiphers() bool {
-	if m != nil {
-		return m.AllowInsecureCiphers
+func (x *Config) GetAllowInsecureCiphers() bool {
+	if x != nil {
+		return x.AllowInsecureCiphers
 	}
 	return false
 }
 
-func (m *Config) GetCertificate() []*Certificate {
-	if m != nil {
-		return m.Certificate
+func (x *Config) GetCertificate() []*Certificate {
+	if x != nil {
+		return x.Certificate
 	}
 	return nil
 }
 
-func (m *Config) GetServerName() string {
-	if m != nil {
-		return m.ServerName
+func (x *Config) GetServerName() string {
+	if x != nil {
+		return x.ServerName
 	}
 	return ""
 }
 
-func (m *Config) GetNextProtocol() []string {
-	if m != nil {
-		return m.NextProtocol
+func (x *Config) GetNextProtocol() []string {
+	if x != nil {
+		return x.NextProtocol
 	}
 	return nil
 }
 
-func (m *Config) GetDisableSessionResumption() bool {
-	if m != nil {
-		return m.DisableSessionResumption
+func (x *Config) GetDisableSessionResumption() bool {
+	if x != nil {
+		return x.DisableSessionResumption
 	}
 	return false
 }
 
-func (m *Config) GetDisableSystemRoot() bool {
-	if m != nil {
-		return m.DisableSystemRoot
+func (x *Config) GetDisableSystemRoot() bool {
+	if x != nil {
+		return x.DisableSystemRoot
 	}
 	return false
 }
 
-func init() {
-	proto.RegisterEnum("v2ray.core.transport.internet.tls.Certificate_Usage", Certificate_Usage_name, Certificate_Usage_value)
-	proto.RegisterType((*Certificate)(nil), "v2ray.core.transport.internet.tls.Certificate")
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.tls.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/tls/config.proto", fileDescriptor_42ed70cad60a2736)
-}
-
-var fileDescriptor_42ed70cad60a2736 = []byte{
-	// 435 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0xd1, 0x6e, 0xd3, 0x30,
-	0x14, 0x86, 0x49, 0x43, 0x0b, 0x3b, 0xed, 0x46, 0xf0, 0x26, 0x14, 0x71, 0x43, 0x56, 0x34, 0xa9,
-	0x57, 0x8e, 0x14, 0x76, 0xc9, 0x0d, 0x84, 0xa0, 0x05, 0x44, 0xa9, 0xdc, 0x74, 0xd2, 0xb8, 0x89,
-	0x32, 0x73, 0x36, 0x2c, 0x25, 0x76, 0x65, 0xbb, 0x83, 0xbe, 0x12, 0xaf, 0xc3, 0x63, 0xf0, 0x12,
-	0xa8, 0x4e, 0x5b, 0xda, 0xab, 0x69, 0x77, 0x39, 0xff, 0xff, 0xfd, 0x27, 0xfa, 0x8f, 0x21, 0xb9,
-	0x4b, 0x74, 0xb5, 0xa4, 0x5c, 0x35, 0x31, 0x57, 0x1a, 0x63, 0xab, 0x2b, 0x69, 0xe6, 0x4a, 0xdb,
-	0x58, 0x48, 0x8b, 0x5a, 0xa2, 0x8d, 0x6d, 0x6d, 0x62, 0xae, 0xe4, 0x8d, 0xb8, 0xa5, 0x73, 0xad,
-	0xac, 0x22, 0xa7, 0x9b, 0x8c, 0x46, 0xba, 0xe5, 0xe9, 0x86, 0xa7, 0xb6, 0x36, 0xc3, 0x3f, 0x1e,
-	0xf4, 0x53, 0xd4, 0x56, 0xdc, 0x08, 0x5e, 0x59, 0x24, 0xd1, 0xde, 0x18, 0x7a, 0x91, 0x37, 0x1a,
-	0xb0, 0x3d, 0x22, 0x00, 0xff, 0x33, 0x2e, 0xc3, 0x8e, 0x73, 0x56, 0x9f, 0xe4, 0x13, 0x74, 0x17,
-	0xa6, 0xba, 0xc5, 0xd0, 0x8f, 0xbc, 0xd1, 0x51, 0x72, 0x4e, 0xef, 0xfd, 0x2d, 0xdd, 0x59, 0x48,
-	0x67, 0xab, 0x2c, 0x6b, 0x57, 0x0c, 0x3f, 0x40, 0xd7, 0xcd, 0x24, 0x80, 0x41, 0x36, 0x4e, 0xf3,
-	0xc9, 0x45, 0xc6, 0xbe, 0x64, 0xe3, 0x22, 0x78, 0x44, 0x4e, 0x20, 0x78, 0x37, 0x2b, 0x2e, 0xbe,
-	0xb2, 0xbc, 0xb8, 0x2a, 0x2f, 0x33, 0x96, 0x7f, 0xbc, 0x0a, 0x3c, 0x72, 0x0c, 0xcf, 0xfe, 0xab,
-	0xf9, 0x74, 0x3a, 0xcb, 0x82, 0xce, 0xf0, 0x6f, 0x07, 0x7a, 0xa9, 0xbb, 0x04, 0x39, 0x83, 0xa3,
-	0xaa, 0xae, 0xd5, 0xcf, 0x52, 0x48, 0x83, 0x7c, 0xa1, 0xdb, 0x4e, 0x4f, 0xd9, 0xa1, 0x53, 0xf3,
-	0xb5, 0x48, 0xce, 0xe1, 0xc5, 0x3e, 0x56, 0x72, 0x31, 0xff, 0x81, 0xda, 0x84, 0x5d, 0x87, 0x9f,
-	0xec, 0xe1, 0x69, 0xeb, 0x91, 0x09, 0xf4, 0xf9, 0xce, 0xb5, 0x3a, 0x91, 0x3f, 0xea, 0x27, 0xf4,
-	0x61, 0xfd, 0xd9, 0xee, 0x0a, 0xf2, 0x0a, 0xfa, 0x06, 0xf5, 0x1d, 0xea, 0x52, 0x56, 0x4d, 0x7b,
-	0xd1, 0x03, 0x06, 0xad, 0x34, 0xae, 0x1a, 0x24, 0xaf, 0xe1, 0x50, 0xe2, 0x2f, 0x5b, 0xba, 0x17,
-	0xe6, 0xaa, 0x0e, 0x1f, 0x47, 0xfe, 0xe8, 0x80, 0x0d, 0x56, 0xe2, 0x64, 0xad, 0x91, 0xb7, 0xf0,
-	0xf2, 0xbb, 0x30, 0xd5, 0x75, 0x8d, 0xa5, 0x41, 0x63, 0x84, 0x92, 0xa5, 0x46, 0xb3, 0x68, 0xe6,
-	0x56, 0x28, 0x19, 0xf6, 0x5c, 0xa3, 0x70, 0x4d, 0x4c, 0x5b, 0x80, 0x6d, 0x7d, 0x42, 0xe1, 0x78,
-	0x9b, 0x5e, 0x1a, 0x8b, 0x4d, 0xa9, 0x95, 0xb2, 0xe1, 0x13, 0x17, 0x7b, 0xbe, 0x89, 0x39, 0x87,
-	0x29, 0x65, 0xdf, 0x33, 0x38, 0xe3, 0xaa, 0xb9, 0xbf, 0xf5, 0xc4, 0xfb, 0xe6, 0xdb, 0xda, 0xfc,
-	0xee, 0x9c, 0x5e, 0x26, 0xac, 0x5a, 0xd2, 0x74, 0x85, 0x16, 0x5b, 0x34, 0xdf, 0xa0, 0x45, 0x6d,
-	0xae, 0x7b, 0xae, 0xdf, 0x9b, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x58, 0x74, 0x54, 0xf7,
-	0x02, 0x00, 0x00,
+var File_v2ray_com_core_transport_internet_tls_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_tls_config_proto_rawDesc = []byte{
+	0x0a, 0x32, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x22, 0xd3, 0x01, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74,
+	0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69,
+	0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x43, 0x65,
+	0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x75,
+	0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43,
+	0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65,
+	0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x22, 0x44, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65,
+	0x12, 0x10, 0x0a, 0x0c, 0x45, 0x4e, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x4d, 0x45, 0x4e, 0x54,
+	0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f,
+	0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x55, 0x54, 0x48,
+	0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x02, 0x22, 0xeb, 0x02,
+	0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f,
+	0x77, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12,
+	0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72,
+	0x65, 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, 0x69,
+	0x70, 0x68, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
+	0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72,
+	0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43,
+	0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74,
+	0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74,
+	0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x0c, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x3c, 0x0a,
+	0x1a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f,
+	0x6e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x64,
+	0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x6f,
+	0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
+	0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x42, 0x52, 0x0a, 0x25, 0x63,
+	0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+	0x2e, 0x74, 0x6c, 0x73, 0x50, 0x01, 0x5a, 0x03, 0x74, 0x6c, 0x73, 0xaa, 0x02, 0x21, 0x56, 0x32,
+	0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x6c, 0x73, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_tls_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_tls_config_proto_rawDescData = file_v2ray_com_core_transport_internet_tls_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_tls_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_tls_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_tls_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_tls_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_tls_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_transport_internet_tls_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_v2ray_com_core_transport_internet_tls_config_proto_goTypes = []interface{}{
+	(Certificate_Usage)(0), // 0: v2ray.core.transport.internet.tls.Certificate.Usage
+	(*Certificate)(nil),    // 1: v2ray.core.transport.internet.tls.Certificate
+	(*Config)(nil),         // 2: v2ray.core.transport.internet.tls.Config
+}
+var file_v2ray_com_core_transport_internet_tls_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.transport.internet.tls.Certificate.usage:type_name -> v2ray.core.transport.internet.tls.Certificate.Usage
+	1, // 1: v2ray.core.transport.internet.tls.Config.certificate:type_name -> v2ray.core.transport.internet.tls.Certificate
+	2, // [2:2] is the sub-list for method output_type
+	2, // [2:2] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_transport_internet_tls_config_proto_init() }
+func file_v2ray_com_core_transport_internet_tls_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_tls_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Certificate); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_tls_config_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_tls_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_tls_config_proto_depIdxs,
+		EnumInfos:         file_v2ray_com_core_transport_internet_tls_config_proto_enumTypes,
+		MessageInfos:      file_v2ray_com_core_transport_internet_tls_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_tls_config_proto = out.File
+	file_v2ray_com_core_transport_internet_tls_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_tls_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_tls_config_proto_depIdxs = nil
 }

+ 114 - 46
transport/internet/udp/config.pb.go

@@ -1,70 +1,138 @@
 package udp
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Config struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_24b1bb4dd7adcb36, []int{0}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_udp_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_udp_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_udp_config_proto_rawDescGZIP(), []int{0}
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+var File_v2ray_com_core_transport_internet_udp_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_udp_config_proto_rawDesc = []byte{
+	0x0a, 0x32, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x75, 0x64, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x75, 0x64, 0x70, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x42, 0x52, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x75, 0x64, 0x70, 0x50, 0x01, 0x5a, 0x03, 0x75, 0x64,
+	0x70, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+	0x74, 0x2e, 0x55, 0x64, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+var (
+	file_v2ray_com_core_transport_internet_udp_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_udp_config_proto_rawDescData = file_v2ray_com_core_transport_internet_udp_config_proto_rawDesc
+)
 
-func init() {
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.udp.Config")
+func file_v2ray_com_core_transport_internet_udp_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_udp_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_udp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_udp_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_udp_config_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/udp/config.proto", fileDescriptor_24b1bb4dd7adcb36)
+var file_v2ray_com_core_transport_internet_udp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_v2ray_com_core_transport_internet_udp_config_proto_goTypes = []interface{}{
+	(*Config)(nil), // 0: v2ray.core.transport.internet.udp.Config
+}
+var file_v2ray_com_core_transport_internet_udp_config_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
 }
 
-var fileDescriptor_24b1bb4dd7adcb36 = []byte{
-	// 143 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x2a, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0x2f, 0x4d,
-	0x29, 0xd0, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x52,
-	0x84, 0xe9, 0x29, 0x4a, 0xd5, 0x83, 0xab, 0xd7, 0x83, 0xa9, 0xd7, 0x2b, 0x4d, 0x29, 0x50, 0xe2,
-	0xe0, 0x62, 0x73, 0x06, 0x6b, 0x71, 0x0a, 0xe2, 0x52, 0x4d, 0xce, 0xcf, 0xd5, 0x23, 0xa8, 0x25,
-	0x80, 0x31, 0x8a, 0xb9, 0x34, 0xa5, 0x60, 0x15, 0x93, 0x62, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e,
-	0x33, 0x48, 0x69, 0x08, 0x5c, 0xa9, 0x27, 0x4c, 0x69, 0x68, 0x4a, 0x41, 0x12, 0x1b, 0xd8, 0x1d,
-	0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xca, 0x60, 0x88, 0xfb, 0xbd, 0x00, 0x00, 0x00,
+func init() { file_v2ray_com_core_transport_internet_udp_config_proto_init() }
+func file_v2ray_com_core_transport_internet_udp_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_udp_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_udp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_udp_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_udp_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_udp_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_udp_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_udp_config_proto = out.File
+	file_v2ray_com_core_transport_internet_udp_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_udp_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_udp_config_proto_depIdxs = nil
 }

+ 192 - 97
transport/internet/websocket/config.pb.go

@@ -1,141 +1,236 @@
 package websocket
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type Header struct {
-	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Header) Reset()         { *m = Header{} }
-func (m *Header) String() string { return proto.CompactTextString(m) }
-func (*Header) ProtoMessage()    {}
-func (*Header) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c4869c9c0fc9b72f, []int{0}
+	Key   string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *Header) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Header.Unmarshal(m, b)
-}
-func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Header.Marshal(b, m, deterministic)
-}
-func (m *Header) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Header.Merge(m, src)
+func (x *Header) Reset() {
+	*x = Header{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Header) XXX_Size() int {
-	return xxx_messageInfo_Header.Size(m)
+
+func (x *Header) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Header) XXX_DiscardUnknown() {
-	xxx_messageInfo_Header.DiscardUnknown(m)
+
+func (*Header) ProtoMessage() {}
+
+func (x *Header) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Header proto.InternalMessageInfo
+// Deprecated: Use Header.ProtoReflect.Descriptor instead.
+func (*Header) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Header) GetKey() string {
-	if m != nil {
-		return m.Key
+func (x *Header) GetKey() string {
+	if x != nil {
+		return x.Key
 	}
 	return ""
 }
 
-func (m *Header) GetValue() string {
-	if m != nil {
-		return m.Value
+func (x *Header) GetValue() string {
+	if x != nil {
+		return x.Value
 	}
 	return ""
 }
 
 type Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// URL path to the WebSocket service. Empty value means root(/).
-	Path                 string    `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
-	Header               []*Header `protobuf:"bytes,3,rep,name=header,proto3" json:"header,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
+	Path   string    `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
+	Header []*Header `protobuf:"bytes,3,rep,name=header,proto3" json:"header,omitempty"`
 }
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c4869c9c0fc9b72f, []int{1}
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Config) GetPath() string {
-	if m != nil {
-		return m.Path
+func (x *Config) GetPath() string {
+	if x != nil {
+		return x.Path
 	}
 	return ""
 }
 
-func (m *Config) GetHeader() []*Header {
-	if m != nil {
-		return m.Header
+func (x *Config) GetHeader() []*Header {
+	if x != nil {
+		return x.Header
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*Header)(nil), "v2ray.core.transport.internet.websocket.Header")
-	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.websocket.Config")
-}
-
-func init() {
-	proto.RegisterFile("v2ray.com/core/transport/internet/websocket/config.proto", fileDescriptor_c4869c9c0fc9b72f)
-}
-
-var fileDescriptor_c4869c9c0fc9b72f = []byte{
-	// 229 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x28, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b,
-	0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0x2f, 0x4f,
-	0x4d, 0x2a, 0xce, 0x4f, 0xce, 0x4e, 0x2d, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b,
-	0x28, 0xca, 0x2f, 0xc9, 0x17, 0x52, 0x87, 0xe9, 0x2c, 0x4a, 0xd5, 0x83, 0xeb, 0xd2, 0x83, 0xe9,
-	0xd2, 0x83, 0xeb, 0x52, 0x32, 0xe0, 0x62, 0xf3, 0x48, 0x4d, 0x4c, 0x49, 0x2d, 0x12, 0x12, 0xe0,
-	0x62, 0xce, 0x4e, 0xad, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0x31, 0x85, 0x44, 0xb8,
-	0x58, 0xcb, 0x12, 0x73, 0x4a, 0x53, 0x25, 0x98, 0xc0, 0x62, 0x10, 0x8e, 0x52, 0x36, 0x17, 0x9b,
-	0x33, 0xd8, 0x2a, 0x21, 0x21, 0x2e, 0x96, 0x82, 0xc4, 0x92, 0x0c, 0xa8, 0x34, 0x98, 0x2d, 0xe4,
-	0xce, 0xc5, 0x96, 0x01, 0x36, 0x4f, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x5f, 0x8f, 0x48,
-	0x97, 0xe8, 0x41, 0x9c, 0x11, 0x04, 0xd5, 0xee, 0xc5, 0xc2, 0xc1, 0x28, 0xc0, 0xe4, 0x94, 0xc2,
-	0xa5, 0x9d, 0x9c, 0x9f, 0x4b, 0xac, 0x19, 0x01, 0x8c, 0x51, 0x9c, 0x70, 0xce, 0x2a, 0x26, 0xf5,
-	0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0xb6, 0x10, 0xb8, 0x36, 0x4f, 0x98, 0xb6, 0x70,
-	0x98, 0xca, 0x24, 0x36, 0x70, 0xa0, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x7e, 0x60,
-	0xf9, 0x70, 0x01, 0x00, 0x00,
+var File_v2ray_com_core_transport_internet_websocket_config_proto protoreflect.FileDescriptor
+
+var file_v2ray_com_core_transport_internet_websocket_config_proto_rawDesc = []byte{
+	0x0a, 0x38, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65,
+	0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2f, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x27, 0x76, 0x32, 0x72, 0x61,
+	0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
+	0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63,
+	0x6b, 0x65, 0x74, 0x22, 0x30, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a,
+	0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
+	0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x6b, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
+	0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,
+	0x61, 0x74, 0x68, 0x12, 0x47, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x6e, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x48, 0x65,
+	0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x01,
+	0x10, 0x02, 0x42, 0x64, 0x0a, 0x2b, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65,
+	0x74, 0x50, 0x01, 0x5a, 0x09, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0xaa, 0x02,
+	0x27, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x57,
+	0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescOnce sync.Once
+	file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescData = file_v2ray_com_core_transport_internet_websocket_config_proto_rawDesc
+)
+
+func file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescGZIP() []byte {
+	file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescOnce.Do(func() {
+		file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescData)
+	})
+	return file_v2ray_com_core_transport_internet_websocket_config_proto_rawDescData
+}
+
+var file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_v2ray_com_core_transport_internet_websocket_config_proto_goTypes = []interface{}{
+	(*Header)(nil), // 0: v2ray.core.transport.internet.websocket.Header
+	(*Config)(nil), // 1: v2ray.core.transport.internet.websocket.Config
+}
+var file_v2ray_com_core_transport_internet_websocket_config_proto_depIdxs = []int32{
+	0, // 0: v2ray.core.transport.internet.websocket.Config.header:type_name -> v2ray.core.transport.internet.websocket.Header
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_v2ray_com_core_transport_internet_websocket_config_proto_init() }
+func file_v2ray_com_core_transport_internet_websocket_config_proto_init() {
+	if File_v2ray_com_core_transport_internet_websocket_config_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Header); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_v2ray_com_core_transport_internet_websocket_config_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_v2ray_com_core_transport_internet_websocket_config_proto_goTypes,
+		DependencyIndexes: file_v2ray_com_core_transport_internet_websocket_config_proto_depIdxs,
+		MessageInfos:      file_v2ray_com_core_transport_internet_websocket_config_proto_msgTypes,
+	}.Build()
+	File_v2ray_com_core_transport_internet_websocket_config_proto = out.File
+	file_v2ray_com_core_transport_internet_websocket_config_proto_rawDesc = nil
+	file_v2ray_com_core_transport_internet_websocket_config_proto_goTypes = nil
+	file_v2ray_com_core_transport_internet_websocket_config_proto_depIdxs = nil
 }

Some files were not shown because too many files changed in this diff