Ver Fonte

rollback gitignore change

Darien Raymond há 9 anos atrás
pai
commit
20fe6d10a4
41 ficheiros alterados com 4664 adições e 5 exclusões
  1. 0 2
      .gitignore
  2. 56 0
      app/dispatcher/config.pb.go
  3. 87 0
      app/dns/config.pb.go
  4. 66 0
      app/proxyman/config.pb.go
  5. 284 0
      app/router/config.pb.go
  6. 243 0
      app/web/config.pb.go
  7. 126 0
      common/crypto/internal/chacha_core.generated.go
  8. 167 0
      common/log/config.pb.go
  9. 170 0
      common/net/address.pb.go
  10. 71 0
      common/net/destination.pb.go
  11. 90 0
      common/net/network.pb.go
  12. 60 0
      common/net/port.pb.go
  13. 88 0
      common/protocol/command.pb.go
  14. 91 0
      common/protocol/headers.pb.go
  15. 73 0
      common/protocol/server_spec.pb.go
  16. 72 0
      common/protocol/user.pb.go
  17. 77 0
      common/serial/typed_message.pb.go
  18. 391 0
      config.pb.go
  19. 90 0
      proxy/blackhole/config.pb.go
  20. 108 0
      proxy/dokodemo/config.pb.go
  21. 99 0
      proxy/freedom/config.pb.go
  22. 78 0
      proxy/http/config.pb.go
  23. 201 0
      proxy/shadowsocks/config.pb.go
  24. 184 0
      proxy/socks/config.pb.go
  25. 91 0
      proxy/vmess/account.pb.go
  26. 135 0
      proxy/vmess/inbound/config.pb.go
  27. 70 0
      proxy/vmess/outbound/config.pb.go
  28. 0 0
      tools/geoip/geoip.generated.go
  29. 0 2
      tools/geoip/geoip.go
  30. 66 0
      tools/geoip/geoip.pb.go
  31. 1 1
      tools/geoip/geoip_gen.go
  32. 69 0
      transport/config.pb.go
  33. 151 0
      transport/internet/config.pb.go
  34. 265 0
      transport/internet/headers/http/config.pb.go
  35. 59 0
      transport/internet/headers/noop/config.pb.go
  36. 114 0
      transport/internet/headers/srtp/config.pb.go
  37. 69 0
      transport/internet/headers/utp/config.pb.go
  38. 283 0
      transport/internet/kcp/config.pb.go
  39. 100 0
      transport/internet/tcp/config.pb.go
  40. 119 0
      transport/internet/tls/config.pb.go
  41. 100 0
      transport/internet/websocket/config.pb.go

+ 0 - 2
.gitignore

@@ -1,2 +0,0 @@
-*.generated.go
-*.pb.go

+ 56 - 0
app/dispatcher/config.pb.go

@@ -0,0 +1,56 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/app/dispatcher/config.proto
+// DO NOT EDIT!
+
+/*
+Package dispatcher is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/app/dispatcher/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package dispatcher
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+}
+
+func (m *Config) Reset()                    { *m = Config{} }
+func (m *Config) String() string            { return proto.CompactTextString(m) }
+func (*Config) ProtoMessage()               {}
+func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.app.dispatcher.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/app/dispatcher/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 134 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0xe2, 0xe0, 0x62, 0x73, 0x06, 0x2b, 0x75, 0x0a, 0xe1, 0x92, 0x4d, 0xce,
+	0xcf, 0xd5, 0xc3, 0xa9, 0xd4, 0x89, 0x1b, 0xa2, 0x30, 0x00, 0x64, 0x64, 0x14, 0x17, 0x42, 0x62,
+	0x15, 0x93, 0x64, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33, 0x48, 0x93, 0x63, 0x41, 0x81, 0x9e,
+	0x0b, 0x5c, 0x2e, 0x89, 0x0d, 0xec, 0x02, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60, 0xf8,
+	0x2f, 0x3b, 0xaf, 0x00, 0x00, 0x00,
+}

+ 87 - 0
app/dns/config.pb.go

@@ -0,0 +1,87 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/app/dns/config.proto
+// DO NOT EDIT!
+
+/*
+Package dns is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/app/dns/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package dns
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_net "v2ray.com/core/common/net"
+import v2ray_core_common_net2 "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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+	// 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 []*v2ray_core_common_net2.Endpoint `protobuf:"bytes,1,rep,name=NameServers" json:"NameServers,omitempty"`
+	// Static hosts. Domain to IP.
+	Hosts map[string]*v2ray_core_common_net.IPOrDomain `protobuf:"bytes,2,rep,name=Hosts" json:"Hosts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
+}
+
+func (m *Config) Reset()                    { *m = Config{} }
+func (m *Config) String() string            { return proto.CompactTextString(m) }
+func (*Config) ProtoMessage()               {}
+func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *Config) GetNameServers() []*v2ray_core_common_net2.Endpoint {
+	if m != nil {
+		return m.NameServers
+	}
+	return nil
+}
+
+func (m *Config) GetHosts() map[string]*v2ray_core_common_net.IPOrDomain {
+	if m != nil {
+		return m.Hosts
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.app.dns.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/app/dns/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 290 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x90, 0xcd, 0x4a, 0x03, 0x31,
+	0x10, 0x80, 0xd9, 0x2d, 0x2d, 0x98, 0xbd, 0x48, 0x0e, 0xb2, 0xf4, 0x62, 0x55, 0xc4, 0x82, 0x30,
+	0x81, 0xf5, 0xa0, 0xe8, 0x41, 0xfa, 0x07, 0x7a, 0xd1, 0xb2, 0x82, 0x07, 0x3d, 0xc5, 0x4d, 0x94,
+	0x45, 0x33, 0x13, 0x92, 0x58, 0xd8, 0x57, 0xf2, 0xbd, 0x7c, 0x0f, 0xd9, 0x0d, 0x62, 0x51, 0x7b,
+	0x0b, 0xe1, 0xfb, 0x32, 0x5f, 0x86, 0x1d, 0xac, 0x0a, 0x27, 0x1b, 0xa8, 0xc8, 0x88, 0x8a, 0x9c,
+	0x16, 0xd2, 0x5a, 0xa1, 0xd0, 0x8b, 0x8a, 0xf0, 0xb9, 0x7e, 0x01, 0xeb, 0x28, 0x10, 0xe7, 0xdf,
+	0x90, 0xd3, 0x20, 0xad, 0x05, 0x85, 0x7e, 0x78, 0xf4, 0x4b, 0xac, 0xc8, 0x18, 0x42, 0x81, 0x3a,
+	0x08, 0xa9, 0x94, 0xd3, 0xde, 0x47, 0x79, 0x78, 0xbc, 0x19, 0x54, 0xda, 0x87, 0x1a, 0x65, 0xa8,
+	0x09, 0x23, 0xbc, 0xff, 0x99, 0xb0, 0xc1, 0xac, 0x1b, 0xcd, 0x27, 0x2c, 0xbb, 0x91, 0x46, 0xdf,
+	0x69, 0xb7, 0xd2, 0xce, 0xe7, 0xc9, 0xa8, 0x37, 0xce, 0x8a, 0x5d, 0x58, 0x4b, 0x89, 0x2f, 0x01,
+	0xea, 0x00, 0x0b, 0x54, 0x96, 0x6a, 0x0c, 0xe5, 0xba, 0xc3, 0x2f, 0x58, 0xff, 0x8a, 0x7c, 0xf0,
+	0x79, 0xda, 0xc9, 0x87, 0xf0, 0xf7, 0x1f, 0x10, 0xa7, 0x41, 0xc7, 0x2d, 0x30, 0xb8, 0xa6, 0x8c,
+	0xce, 0xf0, 0x91, 0xb1, 0x9f, 0x4b, 0xbe, 0xcd, 0x7a, 0xaf, 0xba, 0xc9, 0x93, 0x51, 0x32, 0xde,
+	0x2a, 0xdb, 0x23, 0x3f, 0x65, 0xfd, 0x95, 0x7c, 0x7b, 0xd7, 0x79, 0x3a, 0x4a, 0xc6, 0x59, 0xb1,
+	0xb7, 0xa1, 0xec, 0x7a, 0x79, 0xeb, 0xe6, 0x64, 0x64, 0x8d, 0x65, 0xe4, 0xcf, 0xd3, 0xb3, 0x64,
+	0x7a, 0xc9, 0x76, 0x2a, 0x32, 0xff, 0xf4, 0x4c, 0xb3, 0x18, 0xb4, 0x6c, 0xd7, 0xf1, 0xd0, 0x53,
+	0xe8, 0x3f, 0x52, 0x7e, 0x5f, 0x94, 0xb2, 0x81, 0x59, 0x8b, 0x4d, 0xac, 0x85, 0x39, 0xfa, 0xa7,
+	0x41, 0xb7, 0xaf, 0x93, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x18, 0xf5, 0xa2, 0xc0, 0x01,
+	0x00, 0x00,
+}

+ 66 - 0
app/proxyman/config.pb.go

@@ -0,0 +1,66 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/app/proxyman/config.proto
+// DO NOT EDIT!
+
+/*
+Package proxyman is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/app/proxyman/config.proto
+
+It has these top-level messages:
+	InboundConfig
+	OutboundConfig
+*/
+package proxyman
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type InboundConfig struct {
+}
+
+func (m *InboundConfig) Reset()                    { *m = InboundConfig{} }
+func (m *InboundConfig) String() string            { return proto.CompactTextString(m) }
+func (*InboundConfig) ProtoMessage()               {}
+func (*InboundConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type OutboundConfig struct {
+}
+
+func (m *OutboundConfig) Reset()                    { *m = OutboundConfig{} }
+func (m *OutboundConfig) String() string            { return proto.CompactTextString(m) }
+func (*OutboundConfig) ProtoMessage()               {}
+func (*OutboundConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func init() {
+	proto.RegisterType((*InboundConfig)(nil), "v2ray.core.app.proxyman.InboundConfig")
+	proto.RegisterType((*OutboundConfig)(nil), "v2ray.core.app.proxyman.OutboundConfig")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/app/proxyman/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 129 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0x28, 0x33, 0x2a, 0x4a,
+	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0x2c, 0x28, 0xd0, 0x2f,
+	0x28, 0xca, 0xaf, 0xa8, 0xcc, 0x4d, 0xcc, 0xd3, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b,
+	0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x87, 0xa9, 0x2c, 0x4a, 0xd5, 0x4b, 0x2c, 0x28, 0xd0, 0x83,
+	0xa9, 0x52, 0xe2, 0xe7, 0xe2, 0xf5, 0xcc, 0x4b, 0xca, 0x2f, 0xcd, 0x4b, 0x71, 0x06, 0xab, 0x57,
+	0x12, 0xe0, 0xe2, 0xf3, 0x2f, 0x2d, 0x41, 0x12, 0x71, 0x32, 0xe1, 0x92, 0x4e, 0xce, 0xcf, 0xd5,
+	0xc3, 0x61, 0x82, 0x13, 0x37, 0x44, 0x59, 0x00, 0xc8, 0x9e, 0x28, 0x0e, 0x98, 0x70, 0x12, 0x1b,
+	0xd8, 0x62, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x41, 0x39, 0xa0, 0x25, 0xa4, 0x00, 0x00,
+	0x00,
+}

+ 284 - 0
app/router/config.pb.go

@@ -0,0 +1,284 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/app/router/config.proto
+// DO NOT EDIT!
+
+/*
+Package router is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/app/router/config.proto
+
+It has these top-level messages:
+	Domain
+	CIDR
+	RoutingRule
+	Config
+*/
+package router
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_net "v2ray.com/core/common/net"
+import v2ray_core_common_net1 "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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Type of domain value.
+type Domain_Type int32
+
+const (
+	// The value is used as is.
+	Domain_Plain Domain_Type = 0
+	// The value is used as a regular expression.
+	Domain_Regex Domain_Type = 1
+)
+
+var Domain_Type_name = map[int32]string{
+	0: "Plain",
+	1: "Regex",
+}
+var Domain_Type_value = map[string]int32{
+	"Plain": 0,
+	"Regex": 1,
+}
+
+func (x Domain_Type) String() string {
+	return proto.EnumName(Domain_Type_name, int32(x))
+}
+func (Domain_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} }
+
+type Config_DomainStrategy int32
+
+const (
+	// Use domain as is.
+	Config_AsIs Config_DomainStrategy = 0
+	// Always resolve IP for domains.
+	Config_UseIp Config_DomainStrategy = 1
+	// Resolve to IP if the domain doesn't match any rules.
+	Config_IpIfNonMatch Config_DomainStrategy = 2
+)
+
+var Config_DomainStrategy_name = map[int32]string{
+	0: "AsIs",
+	1: "UseIp",
+	2: "IpIfNonMatch",
+}
+var Config_DomainStrategy_value = map[string]int32{
+	"AsIs":         0,
+	"UseIp":        1,
+	"IpIfNonMatch": 2,
+}
+
+func (x Config_DomainStrategy) String() string {
+	return proto.EnumName(Config_DomainStrategy_name, int32(x))
+}
+func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} }
+
+// Domain for routing decision.
+type Domain struct {
+	// Domain matching type.
+	Type Domain_Type `protobuf:"varint,1,opt,name=type,enum=v2ray.core.app.router.Domain_Type" json:"type,omitempty"`
+	// Domain value.
+	Value string `protobuf:"bytes,2,opt,name=value" json:"value,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 fileDescriptor0, []int{0} }
+
+func (m *Domain) GetType() Domain_Type {
+	if m != nil {
+		return m.Type
+	}
+	return Domain_Plain
+}
+
+func (m *Domain) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+// 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" json:"prefix,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 fileDescriptor0, []int{1} }
+
+func (m *CIDR) GetIp() []byte {
+	if m != nil {
+		return m.Ip
+	}
+	return nil
+}
+
+func (m *CIDR) GetPrefix() uint32 {
+	if m != nil {
+		return m.Prefix
+	}
+	return 0
+}
+
+type RoutingRule struct {
+	Tag         string                              `protobuf:"bytes,1,opt,name=tag" json:"tag,omitempty"`
+	Domain      []*Domain                           `protobuf:"bytes,2,rep,name=domain" json:"domain,omitempty"`
+	Cidr        []*CIDR                             `protobuf:"bytes,3,rep,name=cidr" json:"cidr,omitempty"`
+	PortRange   *v2ray_core_common_net.PortRange    `protobuf:"bytes,4,opt,name=port_range,json=portRange" json:"port_range,omitempty"`
+	NetworkList *v2ray_core_common_net1.NetworkList `protobuf:"bytes,5,opt,name=network_list,json=networkList" json:"network_list,omitempty"`
+	SourceCidr  []*CIDR                             `protobuf:"bytes,6,rep,name=source_cidr,json=sourceCidr" json:"source_cidr,omitempty"`
+	UserEmail   []string                            `protobuf:"bytes,7,rep,name=user_email,json=userEmail" json:"user_email,omitempty"`
+	InboundTag  []string                            `protobuf:"bytes,8,rep,name=inbound_tag,json=inboundTag" json:"inbound_tag,omitempty"`
+}
+
+func (m *RoutingRule) Reset()                    { *m = RoutingRule{} }
+func (m *RoutingRule) String() string            { return proto.CompactTextString(m) }
+func (*RoutingRule) ProtoMessage()               {}
+func (*RoutingRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+
+func (m *RoutingRule) GetTag() string {
+	if m != nil {
+		return m.Tag
+	}
+	return ""
+}
+
+func (m *RoutingRule) GetDomain() []*Domain {
+	if m != nil {
+		return m.Domain
+	}
+	return nil
+}
+
+func (m *RoutingRule) GetCidr() []*CIDR {
+	if m != nil {
+		return m.Cidr
+	}
+	return nil
+}
+
+func (m *RoutingRule) GetPortRange() *v2ray_core_common_net.PortRange {
+	if m != nil {
+		return m.PortRange
+	}
+	return nil
+}
+
+func (m *RoutingRule) GetNetworkList() *v2ray_core_common_net1.NetworkList {
+	if m != nil {
+		return m.NetworkList
+	}
+	return nil
+}
+
+func (m *RoutingRule) GetSourceCidr() []*CIDR {
+	if m != nil {
+		return m.SourceCidr
+	}
+	return nil
+}
+
+func (m *RoutingRule) GetUserEmail() []string {
+	if m != nil {
+		return m.UserEmail
+	}
+	return nil
+}
+
+func (m *RoutingRule) GetInboundTag() []string {
+	if m != nil {
+		return m.InboundTag
+	}
+	return nil
+}
+
+type Config struct {
+	DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,enum=v2ray.core.app.router.Config_DomainStrategy" json:"domain_strategy,omitempty"`
+	Rule           []*RoutingRule        `protobuf:"bytes,2,rep,name=rule" json:"rule,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 fileDescriptor0, []int{3} }
+
+func (m *Config) GetDomainStrategy() Config_DomainStrategy {
+	if m != nil {
+		return m.DomainStrategy
+	}
+	return Config_AsIs
+}
+
+func (m *Config) GetRule() []*RoutingRule {
+	if m != nil {
+		return m.Rule
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Domain)(nil), "v2ray.core.app.router.Domain")
+	proto.RegisterType((*CIDR)(nil), "v2ray.core.app.router.CIDR")
+	proto.RegisterType((*RoutingRule)(nil), "v2ray.core.app.router.RoutingRule")
+	proto.RegisterType((*Config)(nil), "v2ray.core.app.router.Config")
+	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)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/app/router/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 538 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x93, 0xd1, 0x6e, 0xd3, 0x3e,
+	0x14, 0xc6, 0xff, 0x69, 0xb3, 0xfc, 0x97, 0x93, 0x51, 0x22, 0x8b, 0xa1, 0x30, 0x98, 0x88, 0x22,
+	0x04, 0xbd, 0x40, 0x89, 0x54, 0x04, 0xdc, 0x20, 0xa1, 0xad, 0x9b, 0x44, 0x25, 0x98, 0x26, 0xb3,
+	0x71, 0xc1, 0x4d, 0xe4, 0xa5, 0x5e, 0xb0, 0x48, 0x6c, 0xcb, 0x71, 0xc6, 0xfa, 0x10, 0xbc, 0x08,
+	0x4f, 0xc3, 0x23, 0x21, 0xdb, 0x99, 0xd8, 0xd0, 0x0a, 0x77, 0x3e, 0xa7, 0xbf, 0xef, 0xf8, 0xeb,
+	0xf1, 0x17, 0x78, 0x7a, 0x31, 0x53, 0x64, 0x95, 0x57, 0xa2, 0x2d, 0x2a, 0xa1, 0x68, 0x41, 0xa4,
+	0x2c, 0x94, 0xe8, 0x35, 0x55, 0x45, 0x25, 0xf8, 0x39, 0xab, 0x73, 0xa9, 0x84, 0x16, 0x68, 0xfb,
+	0x8a, 0x53, 0x34, 0x27, 0x52, 0xe6, 0x8e, 0xd9, 0x79, 0xf2, 0x87, 0xbc, 0x12, 0x6d, 0x2b, 0x78,
+	0xc1, 0xa9, 0x2e, 0xa4, 0x50, 0xda, 0x89, 0x77, 0x9e, 0xad, 0xa7, 0x38, 0xd5, 0xdf, 0x84, 0xfa,
+	0xea, 0xc0, 0x4c, 0x43, 0x70, 0x20, 0x5a, 0xc2, 0x38, 0x7a, 0x05, 0xbe, 0x5e, 0x49, 0x9a, 0x78,
+	0xa9, 0x37, 0x9d, 0xcc, 0xb2, 0xfc, 0xd6, 0xeb, 0x73, 0x07, 0xe7, 0x27, 0x2b, 0x49, 0xb1, 0xe5,
+	0xd1, 0x3d, 0xd8, 0xb8, 0x20, 0x4d, 0x4f, 0x93, 0x51, 0xea, 0x4d, 0x43, 0xec, 0x8a, 0xec, 0x11,
+	0xf8, 0x86, 0x41, 0x21, 0x6c, 0x1c, 0x37, 0x84, 0xf1, 0xf8, 0x3f, 0x73, 0xc4, 0xb4, 0xa6, 0x97,
+	0xb1, 0x97, 0xe5, 0xe0, 0xcf, 0x17, 0x07, 0x18, 0x4d, 0x60, 0xc4, 0xa4, 0xbd, 0x71, 0x0b, 0x8f,
+	0x98, 0x44, 0xf7, 0x21, 0x90, 0x8a, 0x9e, 0xb3, 0x4b, 0x3b, 0xec, 0x0e, 0x1e, 0xaa, 0xec, 0xfb,
+	0x18, 0x22, 0x2c, 0x7a, 0xcd, 0x78, 0x8d, 0xfb, 0x86, 0xa2, 0x18, 0xc6, 0x9a, 0xd4, 0x56, 0x18,
+	0x62, 0x73, 0x44, 0x2f, 0x21, 0x58, 0x5a, 0x6b, 0xc9, 0x28, 0x1d, 0x4f, 0xa3, 0xd9, 0xee, 0x5f,
+	0xfd, 0xe3, 0x01, 0x46, 0x05, 0xf8, 0x15, 0x5b, 0xaa, 0x64, 0x6c, 0x45, 0x0f, 0xd7, 0x88, 0x8c,
+	0x57, 0x6c, 0x41, 0xf4, 0x16, 0xc0, 0xac, 0xb9, 0x54, 0x84, 0xd7, 0x34, 0xf1, 0x53, 0x6f, 0x1a,
+	0xcd, 0xd2, 0xeb, 0x32, 0xb7, 0xe9, 0x9c, 0x53, 0x9d, 0x1f, 0x0b, 0xa5, 0xb1, 0xe1, 0x70, 0x28,
+	0xaf, 0x8e, 0xe8, 0x10, 0xb6, 0x86, 0x17, 0x28, 0x1b, 0xd6, 0xe9, 0x64, 0xc3, 0x8e, 0xc8, 0xd6,
+	0x8c, 0x38, 0x72, 0xe8, 0x7b, 0xd6, 0x69, 0x1c, 0xf1, 0xdf, 0x05, 0x7a, 0x03, 0x51, 0x27, 0x7a,
+	0x55, 0xd1, 0xd2, 0xfa, 0x0f, 0xfe, 0xed, 0x1f, 0x1c, 0x3f, 0x37, 0xff, 0x62, 0x17, 0xa0, 0xef,
+	0xa8, 0x2a, 0x69, 0x4b, 0x58, 0x93, 0xfc, 0x9f, 0x8e, 0xa7, 0x21, 0x0e, 0x4d, 0xe7, 0xd0, 0x34,
+	0xd0, 0x63, 0x88, 0x18, 0x3f, 0x13, 0x3d, 0x5f, 0x96, 0x66, 0xcd, 0x9b, 0xf6, 0x77, 0x18, 0x5a,
+	0x27, 0xa4, 0xce, 0x7e, 0x7a, 0x10, 0xcc, 0x6d, 0x58, 0xd1, 0x29, 0xdc, 0x75, 0xbb, 0x2c, 0x3b,
+	0xad, 0x88, 0xa6, 0xf5, 0x6a, 0x48, 0xd0, 0xf3, 0x75, 0x66, 0x5c, 0xc8, 0xdd, 0x43, 0x7c, 0x1c,
+	0x34, 0x78, 0xb2, 0xbc, 0x51, 0x9b, 0x34, 0xaa, 0xbe, 0xa1, 0xc3, 0x6b, 0xae, 0x4b, 0xe3, 0xb5,
+	0x4c, 0x60, 0xcb, 0x67, 0xaf, 0x61, 0x72, 0x73, 0x32, 0xda, 0x04, 0x7f, 0xaf, 0x5b, 0x74, 0x2e,
+	0x80, 0xa7, 0x1d, 0x5d, 0xc8, 0xd8, 0x43, 0x31, 0x6c, 0x2d, 0xe4, 0xe2, 0xfc, 0x48, 0xf0, 0x0f,
+	0x44, 0x57, 0x5f, 0xe2, 0xd1, 0xfe, 0x3b, 0x78, 0x50, 0x89, 0xf6, 0xf6, 0x7b, 0xf6, 0x23, 0x67,
+	0xfa, 0xd8, 0x7c, 0x32, 0x9f, 0x03, 0xd7, 0xfc, 0x31, 0xda, 0xfe, 0x34, 0xc3, 0x64, 0x95, 0xcf,
+	0x0d, 0xbc, 0x27, 0xa5, 0x75, 0x43, 0xd5, 0x59, 0x60, 0xbf, 0xac, 0x17, 0xbf, 0x02, 0x00, 0x00,
+	0xff, 0xff, 0x27, 0x56, 0x8a, 0x08, 0xe9, 0x03, 0x00, 0x00,
+}

+ 243 - 0
app/web/config.pb.go

@@ -0,0 +1,243 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/app/web/config.proto
+// DO NOT EDIT!
+
+/*
+Package web is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/app/web/config.proto
+
+It has these top-level messages:
+	FileServer
+	Server
+	Config
+*/
+package web
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type FileServer struct {
+	Entry []*FileServer_Entry `protobuf:"bytes,1,rep,name=entry" json:"entry,omitempty"`
+}
+
+func (m *FileServer) Reset()                    { *m = FileServer{} }
+func (m *FileServer) String() string            { return proto.CompactTextString(m) }
+func (*FileServer) ProtoMessage()               {}
+func (*FileServer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *FileServer) GetEntry() []*FileServer_Entry {
+	if m != nil {
+		return m.Entry
+	}
+	return nil
+}
+
+type FileServer_Entry struct {
+	// Types that are valid to be assigned to FileOrDir:
+	//	*FileServer_Entry_File
+	//	*FileServer_Entry_Directory
+	FileOrDir isFileServer_Entry_FileOrDir `protobuf_oneof:"FileOrDir"`
+	Path      string                       `protobuf:"bytes,3,opt,name=path" json:"path,omitempty"`
+}
+
+func (m *FileServer_Entry) Reset()                    { *m = FileServer_Entry{} }
+func (m *FileServer_Entry) String() string            { return proto.CompactTextString(m) }
+func (*FileServer_Entry) ProtoMessage()               {}
+func (*FileServer_Entry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} }
+
+type isFileServer_Entry_FileOrDir interface {
+	isFileServer_Entry_FileOrDir()
+}
+
+type FileServer_Entry_File struct {
+	File string `protobuf:"bytes,1,opt,name=File,oneof"`
+}
+type FileServer_Entry_Directory struct {
+	Directory string `protobuf:"bytes,2,opt,name=Directory,oneof"`
+}
+
+func (*FileServer_Entry_File) isFileServer_Entry_FileOrDir()      {}
+func (*FileServer_Entry_Directory) isFileServer_Entry_FileOrDir() {}
+
+func (m *FileServer_Entry) GetFileOrDir() isFileServer_Entry_FileOrDir {
+	if m != nil {
+		return m.FileOrDir
+	}
+	return nil
+}
+
+func (m *FileServer_Entry) GetFile() string {
+	if x, ok := m.GetFileOrDir().(*FileServer_Entry_File); ok {
+		return x.File
+	}
+	return ""
+}
+
+func (m *FileServer_Entry) GetDirectory() string {
+	if x, ok := m.GetFileOrDir().(*FileServer_Entry_Directory); ok {
+		return x.Directory
+	}
+	return ""
+}
+
+func (m *FileServer_Entry) GetPath() string {
+	if m != nil {
+		return m.Path
+	}
+	return ""
+}
+
+// XXX_OneofFuncs is for the internal use of the proto package.
+func (*FileServer_Entry) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
+	return _FileServer_Entry_OneofMarshaler, _FileServer_Entry_OneofUnmarshaler, _FileServer_Entry_OneofSizer, []interface{}{
+		(*FileServer_Entry_File)(nil),
+		(*FileServer_Entry_Directory)(nil),
+	}
+}
+
+func _FileServer_Entry_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
+	m := msg.(*FileServer_Entry)
+	// FileOrDir
+	switch x := m.FileOrDir.(type) {
+	case *FileServer_Entry_File:
+		b.EncodeVarint(1<<3 | proto.WireBytes)
+		b.EncodeStringBytes(x.File)
+	case *FileServer_Entry_Directory:
+		b.EncodeVarint(2<<3 | proto.WireBytes)
+		b.EncodeStringBytes(x.Directory)
+	case nil:
+	default:
+		return fmt.Errorf("FileServer_Entry.FileOrDir has unexpected type %T", x)
+	}
+	return nil
+}
+
+func _FileServer_Entry_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
+	m := msg.(*FileServer_Entry)
+	switch tag {
+	case 1: // FileOrDir.File
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeStringBytes()
+		m.FileOrDir = &FileServer_Entry_File{x}
+		return true, err
+	case 2: // FileOrDir.Directory
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeStringBytes()
+		m.FileOrDir = &FileServer_Entry_Directory{x}
+		return true, err
+	default:
+		return false, nil
+	}
+}
+
+func _FileServer_Entry_OneofSizer(msg proto.Message) (n int) {
+	m := msg.(*FileServer_Entry)
+	// FileOrDir
+	switch x := m.FileOrDir.(type) {
+	case *FileServer_Entry_File:
+		n += proto.SizeVarint(1<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(len(x.File)))
+		n += len(x.File)
+	case *FileServer_Entry_Directory:
+		n += proto.SizeVarint(2<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(len(x.Directory)))
+		n += len(x.Directory)
+	case nil:
+	default:
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
+	}
+	return n
+}
+
+type Server struct {
+	Domain   []string                               `protobuf:"bytes,1,rep,name=domain" json:"domain,omitempty"`
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
+}
+
+func (m *Server) Reset()                    { *m = Server{} }
+func (m *Server) String() string            { return proto.CompactTextString(m) }
+func (*Server) ProtoMessage()               {}
+func (*Server) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func (m *Server) GetDomain() []string {
+	if m != nil {
+		return m.Domain
+	}
+	return nil
+}
+
+func (m *Server) GetSettings() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Settings
+	}
+	return nil
+}
+
+type Config struct {
+	Server []*Server `protobuf:"bytes,1,rep,name=server" 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 fileDescriptor0, []int{2} }
+
+func (m *Config) GetServer() []*Server {
+	if m != nil {
+		return m.Server
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*FileServer)(nil), "v2ray.core.app.web.FileServer")
+	proto.RegisterType((*FileServer_Entry)(nil), "v2ray.core.app.web.FileServer.Entry")
+	proto.RegisterType((*Server)(nil), "v2ray.core.app.web.Server")
+	proto.RegisterType((*Config)(nil), "v2ray.core.app.web.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/app/web/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4a, 0xc3, 0x40,
+	0x10, 0x87, 0x4d, 0xff, 0x04, 0x33, 0xb9, 0x2d, 0x52, 0x42, 0x0f, 0x52, 0xaa, 0x48, 0x4f, 0x1b,
+	0x89, 0x37, 0x11, 0xc4, 0xb4, 0x8a, 0x17, 0x51, 0xa2, 0x28, 0x78, 0x50, 0x36, 0xe9, 0x58, 0x17,
+	0x9a, 0xec, 0xb2, 0x59, 0x5a, 0xf2, 0x46, 0xe2, 0x53, 0xca, 0xee, 0x46, 0x2b, 0xda, 0x5b, 0x26,
+	0xf3, 0xfd, 0x66, 0x26, 0x5f, 0xe0, 0x60, 0x95, 0x28, 0xd6, 0xd0, 0x42, 0x94, 0x71, 0x21, 0x14,
+	0xc6, 0x4c, 0xca, 0x78, 0x8d, 0x79, 0x5c, 0x88, 0xea, 0x8d, 0x2f, 0xa8, 0x54, 0x42, 0x0b, 0x42,
+	0xbe, 0x21, 0x85, 0x94, 0x49, 0x49, 0xd7, 0x98, 0x0f, 0x8f, 0xff, 0x04, 0x0b, 0x51, 0x96, 0xa2,
+	0x8a, 0x6b, 0x54, 0x9c, 0x2d, 0x63, 0xdd, 0x48, 0x9c, 0xbf, 0x96, 0x58, 0xd7, 0x6c, 0x81, 0x6e,
+	0xca, 0xf8, 0xc3, 0x03, 0xb8, 0xe2, 0x4b, 0xbc, 0x47, 0xb5, 0x42, 0x45, 0x4e, 0xa1, 0x8f, 0x95,
+	0x56, 0x4d, 0xe4, 0x8d, 0xba, 0x93, 0x30, 0x39, 0xa4, 0xff, 0x97, 0xd0, 0x0d, 0x4e, 0x2f, 0x0d,
+	0x9b, 0xb9, 0xc8, 0xf0, 0x05, 0xfa, 0xb6, 0x26, 0x7b, 0xd0, 0x33, 0x4c, 0xe4, 0x8d, 0xbc, 0x49,
+	0x70, 0xbd, 0x93, 0xd9, 0x8a, 0xec, 0x43, 0x30, 0xe3, 0x0a, 0x0b, 0x2d, 0x54, 0x13, 0x75, 0xda,
+	0xd6, 0xe6, 0x15, 0x21, 0xd0, 0x93, 0x4c, 0xbf, 0x47, 0x5d, 0xd3, 0xca, 0xec, 0x73, 0x1a, 0x42,
+	0x60, 0xb2, 0xb7, 0x6a, 0xc6, 0xd5, 0x78, 0x0e, 0x7e, 0x7b, 0xe5, 0x00, 0xfc, 0xb9, 0x28, 0x19,
+	0xaf, 0xec, 0x99, 0x41, 0xd6, 0x56, 0x24, 0x85, 0xdd, 0x1a, 0xb5, 0xe6, 0xd5, 0xa2, 0xb6, 0x1b,
+	0xc2, 0xe4, 0xe8, 0xf7, 0x07, 0x38, 0x1b, 0xd4, 0xd9, 0xa0, 0x0f, 0xc6, 0xc6, 0x8d, 0x93, 0x91,
+	0xfd, 0xe4, 0xc6, 0x67, 0xe0, 0x4f, 0xad, 0x66, 0x92, 0x80, 0x5f, 0xdb, 0x7d, 0xad, 0x8c, 0xe1,
+	0x36, 0x19, 0xee, 0xa2, 0xac, 0x25, 0xd3, 0x73, 0x18, 0x14, 0xa2, 0xdc, 0x02, 0xa6, 0xa1, 0x9b,
+	0x7a, 0x67, 0xac, 0x3f, 0x77, 0xd7, 0x98, 0x7f, 0x76, 0xc8, 0x63, 0x92, 0xb1, 0x86, 0x4e, 0x0d,
+	0x76, 0x21, 0x25, 0x7d, 0xc2, 0x3c, 0xf7, 0xed, 0x6f, 0x39, 0xf9, 0x0a, 0x00, 0x00, 0xff, 0xff,
+	0xc9, 0x59, 0x48, 0x03, 0x03, 0x02, 0x00, 0x00,
+}

+ 126 - 0
common/crypto/internal/chacha_core.generated.go

@@ -0,0 +1,126 @@
+// GENERATED CODE. DO NOT MODIFY!
+package internal
+
+import "encoding/binary"
+
+
+func ChaCha20Block(s *[16]uint32, out []byte, rounds int) {
+  var x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15 = s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]
+	for i := 0; i < rounds; i+=2 {
+    var x uint32
+    
+x0+=x4
+x=x12^x0
+x12=(x << 16) | (x >> (32 - 16))
+x8+=x12
+x=x4^x8
+x4=(x << 12) | (x >> (32 - 12))
+x0+=x4
+x=x12^x0
+x12=(x << 8) | (x >> (32 - 8))
+x8+=x12
+x=x4^x8
+x4=(x << 7) | (x >> (32 - 7))
+x1+=x5
+x=x13^x1
+x13=(x << 16) | (x >> (32 - 16))
+x9+=x13
+x=x5^x9
+x5=(x << 12) | (x >> (32 - 12))
+x1+=x5
+x=x13^x1
+x13=(x << 8) | (x >> (32 - 8))
+x9+=x13
+x=x5^x9
+x5=(x << 7) | (x >> (32 - 7))
+x2+=x6
+x=x14^x2
+x14=(x << 16) | (x >> (32 - 16))
+x10+=x14
+x=x6^x10
+x6=(x << 12) | (x >> (32 - 12))
+x2+=x6
+x=x14^x2
+x14=(x << 8) | (x >> (32 - 8))
+x10+=x14
+x=x6^x10
+x6=(x << 7) | (x >> (32 - 7))
+x3+=x7
+x=x15^x3
+x15=(x << 16) | (x >> (32 - 16))
+x11+=x15
+x=x7^x11
+x7=(x << 12) | (x >> (32 - 12))
+x3+=x7
+x=x15^x3
+x15=(x << 8) | (x >> (32 - 8))
+x11+=x15
+x=x7^x11
+x7=(x << 7) | (x >> (32 - 7))
+x0+=x5
+x=x15^x0
+x15=(x << 16) | (x >> (32 - 16))
+x10+=x15
+x=x5^x10
+x5=(x << 12) | (x >> (32 - 12))
+x0+=x5
+x=x15^x0
+x15=(x << 8) | (x >> (32 - 8))
+x10+=x15
+x=x5^x10
+x5=(x << 7) | (x >> (32 - 7))
+x1+=x6
+x=x12^x1
+x12=(x << 16) | (x >> (32 - 16))
+x11+=x12
+x=x6^x11
+x6=(x << 12) | (x >> (32 - 12))
+x1+=x6
+x=x12^x1
+x12=(x << 8) | (x >> (32 - 8))
+x11+=x12
+x=x6^x11
+x6=(x << 7) | (x >> (32 - 7))
+x2+=x7
+x=x13^x2
+x13=(x << 16) | (x >> (32 - 16))
+x8+=x13
+x=x7^x8
+x7=(x << 12) | (x >> (32 - 12))
+x2+=x7
+x=x13^x2
+x13=(x << 8) | (x >> (32 - 8))
+x8+=x13
+x=x7^x8
+x7=(x << 7) | (x >> (32 - 7))
+x3+=x4
+x=x14^x3
+x14=(x << 16) | (x >> (32 - 16))
+x9+=x14
+x=x4^x9
+x4=(x << 12) | (x >> (32 - 12))
+x3+=x4
+x=x14^x3
+x14=(x << 8) | (x >> (32 - 8))
+x9+=x14
+x=x4^x9
+x4=(x << 7) | (x >> (32 - 7))
+}
+binary.LittleEndian.PutUint32(out[0:4], s[0]+x0)
+binary.LittleEndian.PutUint32(out[4:8], s[1]+x1)
+binary.LittleEndian.PutUint32(out[8:12], s[2]+x2)
+binary.LittleEndian.PutUint32(out[12:16], s[3]+x3)
+binary.LittleEndian.PutUint32(out[16:20], s[4]+x4)
+binary.LittleEndian.PutUint32(out[20:24], s[5]+x5)
+binary.LittleEndian.PutUint32(out[24:28], s[6]+x6)
+binary.LittleEndian.PutUint32(out[28:32], s[7]+x7)
+binary.LittleEndian.PutUint32(out[32:36], s[8]+x8)
+binary.LittleEndian.PutUint32(out[36:40], s[9]+x9)
+binary.LittleEndian.PutUint32(out[40:44], s[10]+x10)
+binary.LittleEndian.PutUint32(out[44:48], s[11]+x11)
+binary.LittleEndian.PutUint32(out[48:52], s[12]+x12)
+binary.LittleEndian.PutUint32(out[52:56], s[13]+x13)
+binary.LittleEndian.PutUint32(out[56:60], s[14]+x14)
+binary.LittleEndian.PutUint32(out[60:64], s[15]+x15)
+}
+

+ 167 - 0
common/log/config.pb.go

@@ -0,0 +1,167 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/log/config.proto
+// DO NOT EDIT!
+
+/*
+Package log is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/common/log/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package log
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type LogType int32
+
+const (
+	LogType_None    LogType = 0
+	LogType_Console LogType = 1
+	LogType_File    LogType = 2
+	LogType_Event   LogType = 3
+)
+
+var LogType_name = map[int32]string{
+	0: "None",
+	1: "Console",
+	2: "File",
+	3: "Event",
+}
+var LogType_value = map[string]int32{
+	"None":    0,
+	"Console": 1,
+	"File":    2,
+	"Event":   3,
+}
+
+func (x LogType) String() string {
+	return proto.EnumName(LogType_name, int32(x))
+}
+func (LogType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type LogLevel int32
+
+const (
+	LogLevel_Disabled LogLevel = 0
+	LogLevel_Error    LogLevel = 1
+	LogLevel_Warning  LogLevel = 2
+	LogLevel_Info     LogLevel = 3
+	LogLevel_Debug    LogLevel = 4
+)
+
+var LogLevel_name = map[int32]string{
+	0: "Disabled",
+	1: "Error",
+	2: "Warning",
+	3: "Info",
+	4: "Debug",
+}
+var LogLevel_value = map[string]int32{
+	"Disabled": 0,
+	"Error":    1,
+	"Warning":  2,
+	"Info":     3,
+	"Debug":    4,
+}
+
+func (x LogLevel) String() string {
+	return proto.EnumName(LogLevel_name, int32(x))
+}
+func (LogLevel) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+type Config struct {
+	ErrorLogType  LogType  `protobuf:"varint,1,opt,name=error_log_type,json=errorLogType,enum=v2ray.core.common.log.LogType" json:"error_log_type,omitempty"`
+	ErrorLogLevel LogLevel `protobuf:"varint,2,opt,name=error_log_level,json=errorLogLevel,enum=v2ray.core.common.log.LogLevel" json:"error_log_level,omitempty"`
+	ErrorLogPath  string   `protobuf:"bytes,3,opt,name=error_log_path,json=errorLogPath" json:"error_log_path,omitempty"`
+	AccessLogType LogType  `protobuf:"varint,4,opt,name=access_log_type,json=accessLogType,enum=v2ray.core.common.log.LogType" json:"access_log_type,omitempty"`
+	AccessLogPath string   `protobuf:"bytes,5,opt,name=access_log_path,json=accessLogPath" json:"access_log_path,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetErrorLogType() LogType {
+	if m != nil {
+		return m.ErrorLogType
+	}
+	return LogType_None
+}
+
+func (m *Config) GetErrorLogLevel() LogLevel {
+	if m != nil {
+		return m.ErrorLogLevel
+	}
+	return LogLevel_Disabled
+}
+
+func (m *Config) GetErrorLogPath() string {
+	if m != nil {
+		return m.ErrorLogPath
+	}
+	return ""
+}
+
+func (m *Config) GetAccessLogType() LogType {
+	if m != nil {
+		return m.AccessLogType
+	}
+	return LogType_None
+}
+
+func (m *Config) GetAccessLogPath() string {
+	if m != nil {
+		return m.AccessLogPath
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.common.log.Config")
+	proto.RegisterEnum("v2ray.core.common.log.LogType", LogType_name, LogType_value)
+	proto.RegisterEnum("v2ray.core.common.log.LogLevel", LogLevel_name, LogLevel_value)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/log/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 322 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x91, 0x6d, 0x4b, 0xf3, 0x30,
+	0x14, 0x86, 0xd7, 0x76, 0xaf, 0xd9, 0x5b, 0x08, 0x3c, 0xb0, 0xe7, 0x8b, 0x0e, 0x91, 0x31, 0x06,
+	0xb6, 0x30, 0xf1, 0x0f, 0xec, 0x4d, 0x84, 0x21, 0x63, 0x08, 0x82, 0x5f, 0x46, 0x17, 0xcf, 0xb2,
+	0x42, 0x9a, 0x53, 0xd2, 0x3a, 0xd8, 0x8f, 0xf2, 0x3f, 0x4a, 0x32, 0x6b, 0x15, 0x26, 0xf8, 0x31,
+	0xe1, 0x3a, 0xd7, 0x7d, 0x1f, 0x0e, 0x19, 0x1c, 0xc6, 0x3a, 0x3c, 0xfa, 0x1c, 0xe3, 0x80, 0xa3,
+	0x86, 0x80, 0x63, 0x1c, 0xa3, 0x0a, 0x24, 0x8a, 0x80, 0xa3, 0xda, 0x45, 0xc2, 0x4f, 0x34, 0x66,
+	0xc8, 0xfe, 0xe5, 0x9c, 0x06, 0xff, 0xc4, 0xf8, 0x12, 0xc5, 0xd5, 0xbb, 0x4b, 0xaa, 0x53, 0xcb,
+	0xb1, 0x19, 0xe9, 0x80, 0xd6, 0xa8, 0x37, 0x12, 0xc5, 0x26, 0x3b, 0x26, 0xd0, 0x73, 0xfa, 0xce,
+	0xb0, 0x33, 0xbe, 0xf0, 0xcf, 0x8e, 0xfa, 0x4b, 0x14, 0x4f, 0xc7, 0x04, 0xd6, 0x2d, 0x3b, 0xf5,
+	0xf9, 0x62, 0xf7, 0xa4, 0x5b, 0x58, 0x24, 0x1c, 0x40, 0xf6, 0x5c, 0xab, 0xb9, 0xfc, 0x5d, 0xb3,
+	0x34, 0xd8, 0xba, 0x9d, 0x7b, 0xec, 0x93, 0x5d, 0x7f, 0xaf, 0x93, 0x84, 0xd9, 0xbe, 0xe7, 0xf5,
+	0x9d, 0x61, 0xa3, 0x88, 0x5b, 0x85, 0xd9, 0x9e, 0x2d, 0x48, 0x37, 0xe4, 0x1c, 0xd2, 0xb4, 0x68,
+	0x5d, 0xfe, 0x53, 0xeb, 0xf6, 0x69, 0x2c, 0xaf, 0x3d, 0xf8, 0xe1, 0xb1, 0x71, 0x15, 0x1b, 0x57,
+	0x70, 0x26, 0x6f, 0x74, 0x47, 0x6a, 0xf9, 0x48, 0x9d, 0x94, 0x1f, 0x51, 0x01, 0x2d, 0xb1, 0x26,
+	0xa9, 0x4d, 0x51, 0xa5, 0x28, 0x81, 0x3a, 0xe6, 0x7b, 0x11, 0x49, 0xa0, 0x2e, 0x6b, 0x90, 0xca,
+	0xfc, 0x00, 0x2a, 0xa3, 0xde, 0x68, 0x4e, 0xea, 0x5f, 0x8b, 0xb5, 0x48, 0x7d, 0x16, 0xa5, 0xe1,
+	0x56, 0xc2, 0x2b, 0x2d, 0x59, 0xc8, 0x2c, 0x44, 0x1d, 0xa3, 0x79, 0x0e, 0xb5, 0x8a, 0x94, 0xa0,
+	0xae, 0xd1, 0x3c, 0xa8, 0x1d, 0x52, 0xcf, 0x10, 0x33, 0xd8, 0xbe, 0x09, 0x5a, 0x9e, 0xdc, 0x90,
+	0xff, 0x1c, 0xe3, 0xf3, 0x9b, 0x4d, 0x9a, 0xa7, 0x3b, 0xae, 0xcc, 0xb9, 0x5f, 0x3c, 0x89, 0x62,
+	0x5b, 0xb5, 0xa7, 0xbf, 0xfd, 0x08, 0x00, 0x00, 0xff, 0xff, 0x11, 0x55, 0x7e, 0x04, 0x24, 0x02,
+	0x00, 0x00,
+}

+ 170 - 0
common/net/address.pb.go

@@ -0,0 +1,170 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/net/address.proto
+// DO NOT EDIT!
+
+/*
+Package net is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/common/net/address.proto
+	v2ray.com/core/common/net/destination.proto
+	v2ray.com/core/common/net/network.proto
+	v2ray.com/core/common/net/port.proto
+
+It has these top-level messages:
+	IPOrDomain
+	Endpoint
+	NetworkList
+	PortRange
+*/
+package net
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type IPOrDomain struct {
+	// Types that are valid to be assigned to Address:
+	//	*IPOrDomain_Ip
+	//	*IPOrDomain_Domain
+	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 fileDescriptor0, []int{0} }
+
+type isIPOrDomain_Address interface {
+	isIPOrDomain_Address()
+}
+
+type IPOrDomain_Ip struct {
+	Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3,oneof"`
+}
+type IPOrDomain_Domain struct {
+	Domain string `protobuf:"bytes,2,opt,name=domain,oneof"`
+}
+
+func (*IPOrDomain_Ip) isIPOrDomain_Address()     {}
+func (*IPOrDomain_Domain) isIPOrDomain_Address() {}
+
+func (m *IPOrDomain) GetAddress() isIPOrDomain_Address {
+	if m != nil {
+		return m.Address
+	}
+	return nil
+}
+
+func (m *IPOrDomain) GetIp() []byte {
+	if x, ok := m.GetAddress().(*IPOrDomain_Ip); ok {
+		return x.Ip
+	}
+	return nil
+}
+
+func (m *IPOrDomain) GetDomain() string {
+	if x, ok := m.GetAddress().(*IPOrDomain_Domain); ok {
+		return x.Domain
+	}
+	return ""
+}
+
+// XXX_OneofFuncs is for the internal use of the proto package.
+func (*IPOrDomain) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
+	return _IPOrDomain_OneofMarshaler, _IPOrDomain_OneofUnmarshaler, _IPOrDomain_OneofSizer, []interface{}{
+		(*IPOrDomain_Ip)(nil),
+		(*IPOrDomain_Domain)(nil),
+	}
+}
+
+func _IPOrDomain_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
+	m := msg.(*IPOrDomain)
+	// address
+	switch x := m.Address.(type) {
+	case *IPOrDomain_Ip:
+		b.EncodeVarint(1<<3 | proto.WireBytes)
+		b.EncodeRawBytes(x.Ip)
+	case *IPOrDomain_Domain:
+		b.EncodeVarint(2<<3 | proto.WireBytes)
+		b.EncodeStringBytes(x.Domain)
+	case nil:
+	default:
+		return fmt.Errorf("IPOrDomain.Address has unexpected type %T", x)
+	}
+	return nil
+}
+
+func _IPOrDomain_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
+	m := msg.(*IPOrDomain)
+	switch tag {
+	case 1: // address.ip
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeRawBytes(true)
+		m.Address = &IPOrDomain_Ip{x}
+		return true, err
+	case 2: // address.domain
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeStringBytes()
+		m.Address = &IPOrDomain_Domain{x}
+		return true, err
+	default:
+		return false, nil
+	}
+}
+
+func _IPOrDomain_OneofSizer(msg proto.Message) (n int) {
+	m := msg.(*IPOrDomain)
+	// address
+	switch x := m.Address.(type) {
+	case *IPOrDomain_Ip:
+		n += proto.SizeVarint(1<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(len(x.Ip)))
+		n += len(x.Ip)
+	case *IPOrDomain_Domain:
+		n += proto.SizeVarint(2<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(len(x.Domain)))
+		n += len(x.Domain)
+	case nil:
+	default:
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
+	}
+	return n
+}
+
+func init() {
+	proto.RegisterType((*IPOrDomain)(nil), "v2ray.core.common.net.IPOrDomain")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/net/address.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 181 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0xdc, 0xb8, 0x24, 0x93, 0xf3, 0x73, 0xf5,
+	0xb0, 0xda, 0xe0, 0xc4, 0xe3, 0x08, 0x51, 0x15, 0x00, 0x72, 0x46, 0x14, 0x73, 0x5e, 0x6a, 0xc9,
+	0x2a, 0x26, 0xd1, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0x52, 0x67, 0x88, 0x52, 0xbf,
+	0xd4, 0x92, 0x24, 0x36, 0xb0, 0x53, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x88, 0x8a, 0x6d,
+	0x70, 0xd5, 0x00, 0x00, 0x00,
+}

+ 71 - 0
common/net/destination.pb.go

@@ -0,0 +1,71 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/net/destination.proto
+// DO NOT EDIT!
+
+package net
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+type Endpoint struct {
+	Network Network     `protobuf:"varint,1,opt,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
+	Address *IPOrDomain `protobuf:"bytes,2,opt,name=address" json:"address,omitempty"`
+	Port    uint32      `protobuf:"varint,3,opt,name=port" json:"port,omitempty"`
+}
+
+func (m *Endpoint) Reset()                    { *m = Endpoint{} }
+func (m *Endpoint) String() string            { return proto.CompactTextString(m) }
+func (*Endpoint) ProtoMessage()               {}
+func (*Endpoint) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} }
+
+func (m *Endpoint) GetNetwork() Network {
+	if m != nil {
+		return m.Network
+	}
+	return Network_Unknown
+}
+
+func (m *Endpoint) GetAddress() *IPOrDomain {
+	if m != nil {
+		return m.Address
+	}
+	return nil
+}
+
+func (m *Endpoint) GetPort() uint32 {
+	if m != nil {
+		return m.Port
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterType((*Endpoint)(nil), "v2ray.core.common.net.Endpoint")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/net/destination.proto", fileDescriptor1) }
+
+var fileDescriptor1 = []byte{
+	// 237 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x2f, 0x2e, 0xc9, 0xe4, 0xfc, 0x5c, 0xec, 0x86, 0x38, 0x09, 0xb8, 0x20, 0x02, 0x2c,
+	0x00, 0xe4, 0x8d, 0x28, 0xe6, 0xbc, 0xd4, 0x92, 0x55, 0x4c, 0xa2, 0x61, 0x46, 0x41, 0x89, 0x95,
+	0x7a, 0xce, 0x20, 0xe5, 0xce, 0x10, 0xe5, 0x7e, 0xa9, 0x25, 0x49, 0x6c, 0x60, 0xaf, 0x1a, 0x03,
+	0x02, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x3a, 0x5c, 0x8c, 0x82, 0x01, 0x00, 0x00,
+}

+ 90 - 0
common/net/network.pb.go

@@ -0,0 +1,90 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/net/network.proto
+// DO NOT EDIT!
+
+package net
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+type Network int32
+
+const (
+	Network_Unknown Network = 0
+	// Native TCP provided by system.
+	Network_RawTCP Network = 1
+	// V2Ray specific TCP.
+	Network_TCP       Network = 2
+	Network_UDP       Network = 3
+	Network_KCP       Network = 4
+	Network_WebSocket Network = 5
+)
+
+var Network_name = map[int32]string{
+	0: "Unknown",
+	1: "RawTCP",
+	2: "TCP",
+	3: "UDP",
+	4: "KCP",
+	5: "WebSocket",
+}
+var Network_value = map[string]int32{
+	"Unknown":   0,
+	"RawTCP":    1,
+	"TCP":       2,
+	"UDP":       3,
+	"KCP":       4,
+	"WebSocket": 5,
+}
+
+func (x Network) String() string {
+	return proto.EnumName(Network_name, int32(x))
+}
+func (Network) EnumDescriptor() ([]byte, []int) { return fileDescriptor2, []int{0} }
+
+type NetworkList struct {
+	Network []Network `protobuf:"varint,1,rep,packed,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
+}
+
+func (m *NetworkList) Reset()                    { *m = NetworkList{} }
+func (m *NetworkList) String() string            { return proto.CompactTextString(m) }
+func (*NetworkList) ProtoMessage()               {}
+func (*NetworkList) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} }
+
+func (m *NetworkList) GetNetwork() []Network {
+	if m != nil {
+		return m.Network
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*NetworkList)(nil), "v2ray.core.common.net.NetworkList")
+	proto.RegisterEnum("v2ray.core.common.net.Network", Network_name, Network_value)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/net/network.proto", fileDescriptor2) }
+
+var fileDescriptor2 = []byte{
+	// 221 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x7c, 0xb8, 0xd8, 0xa1, 0x62, 0x42, 0xdc, 0x5c, 0xec, 0xa1, 0x79, 0xd9, 0x79, 0xf9, 0xe5,
+	0x79, 0x02, 0x0c, 0x42, 0x5c, 0x5c, 0x6c, 0x41, 0x89, 0xe5, 0x21, 0xce, 0x01, 0x02, 0x8c, 0x42,
+	0xec, 0x5c, 0xcc, 0x20, 0x06, 0x13, 0x88, 0x11, 0xea, 0x12, 0x20, 0xc0, 0x0c, 0x62, 0x78, 0x3b,
+	0x07, 0x08, 0xb0, 0x08, 0xf1, 0x72, 0x71, 0x86, 0xa7, 0x26, 0x05, 0xe7, 0x27, 0x67, 0xa7, 0x96,
+	0x08, 0xb0, 0x3a, 0xb9, 0x71, 0x49, 0x26, 0xe7, 0xe7, 0x62, 0xb7, 0xdb, 0x89, 0x07, 0x6a, 0x51,
+	0x00, 0xc8, 0x63, 0x51, 0xcc, 0x79, 0xa9, 0x25, 0xab, 0x98, 0x44, 0xc3, 0x8c, 0x82, 0x12, 0x2b,
+	0xf5, 0x9c, 0x41, 0x4a, 0x9d, 0x21, 0x4a, 0xfd, 0x52, 0x4b, 0x92, 0xd8, 0xc0, 0x9e, 0x37, 0x06,
+	0x04, 0x00, 0x00, 0xff, 0xff, 0x18, 0xab, 0xfe, 0x3a, 0x27, 0x01, 0x00, 0x00,
+}

+ 60 - 0
common/net/port.pb.go

@@ -0,0 +1,60 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/net/port.proto
+// DO NOT EDIT!
+
+package net
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// PortRange represents a range of ports.
+type PortRange struct {
+	From uint32 `protobuf:"varint,1,opt,name=From" json:"From,omitempty"`
+	To   uint32 `protobuf:"varint,2,opt,name=To" 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 fileDescriptor3, []int{0} }
+
+func (m *PortRange) GetFrom() uint32 {
+	if m != nil {
+		return m.From
+	}
+	return 0
+}
+
+func (m *PortRange) GetTo() uint32 {
+	if m != nil {
+		return m.To
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterType((*PortRange)(nil), "v2ray.core.common.net.PortRange")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/net/port.proto", fileDescriptor3) }
+
+var fileDescriptor3 = []byte{
+	// 163 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x4e, 0xce, 0x5c, 0x92, 0xc9, 0xf9, 0xb9, 0x7a,
+	0x58, 0x4d, 0x73, 0x02, 0x9b, 0x15, 0x00, 0xb2, 0x2f, 0x8a, 0x39, 0x2f, 0xb5, 0x64, 0x15, 0x93,
+	0x68, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33, 0x48, 0x9d, 0x33, 0x44, 0x9d, 0x5f, 0x6a, 0x49,
+	0x12, 0x1b, 0xd8, 0x4d, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x35, 0xed, 0x95, 0xd7, 0xbb,
+	0x00, 0x00, 0x00,
+}

+ 88 - 0
common/protocol/command.pb.go

@@ -0,0 +1,88 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/protocol/command.proto
+// DO NOT EDIT!
+
+/*
+Package protocol is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/common/protocol/command.proto
+	v2ray.com/core/common/protocol/headers.proto
+	v2ray.com/core/common/protocol/server_spec.proto
+	v2ray.com/core/common/protocol/user.proto
+
+It has these top-level messages:
+	AlternativeOutboundConfig
+	SecurityConfig
+	ServerEndpoint
+	User
+*/
+package protocol
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
+import v2ray_core_transport_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type AlternativeOutboundConfig struct {
+	Settings       *v2ray_core_common_serial.TypedMessage      `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
+	StreamSettings *v2ray_core_transport_internet.StreamConfig `protobuf:"bytes,3,opt,name=stream_settings,json=streamSettings" json:"stream_settings,omitempty"`
+}
+
+func (m *AlternativeOutboundConfig) Reset()                    { *m = AlternativeOutboundConfig{} }
+func (m *AlternativeOutboundConfig) String() string            { return proto.CompactTextString(m) }
+func (*AlternativeOutboundConfig) ProtoMessage()               {}
+func (*AlternativeOutboundConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *AlternativeOutboundConfig) GetSettings() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Settings
+	}
+	return nil
+}
+
+func (m *AlternativeOutboundConfig) GetStreamSettings() *v2ray_core_transport_internet.StreamConfig {
+	if m != nil {
+		return m.StreamSettings
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AlternativeOutboundConfig)(nil), "v2ray.core.common.protocol.AlternativeOutboundConfig")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/protocol/command.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 266 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x90, 0xc1, 0x4a, 0xc4, 0x30,
+	0x10, 0x86, 0xa9, 0x82, 0x2c, 0x55, 0x14, 0x7a, 0xd2, 0x1e, 0x44, 0x3c, 0x88, 0xa0, 0x4c, 0xa4,
+	0x3e, 0x81, 0xed, 0x59, 0x5c, 0xba, 0xab, 0x07, 0x2f, 0x4b, 0x36, 0x1d, 0x4b, 0xa1, 0xc9, 0x94,
+	0x64, 0x76, 0xa1, 0xaf, 0xe4, 0xdd, 0xf7, 0x93, 0x26, 0xdb, 0x22, 0xea, 0x1e, 0xf3, 0xe7, 0xff,
+	0x3f, 0x3e, 0x26, 0xbe, 0xdf, 0x66, 0x56, 0xf6, 0xa0, 0x48, 0x0b, 0x45, 0x16, 0x85, 0x22, 0xad,
+	0xc9, 0x88, 0xce, 0x12, 0x93, 0xa2, 0xd6, 0xbf, 0xa5, 0xa9, 0xc0, 0x07, 0x49, 0x3a, 0xb6, 0x2d,
+	0x42, 0x68, 0xc2, 0xd8, 0x4c, 0x1f, 0xfe, 0x27, 0x39, 0xb4, 0x8d, 0x6c, 0x05, 0xf7, 0x1d, 0x56,
+	0x2b, 0x8d, 0xce, 0xc9, 0x1a, 0xc3, 0x28, 0x85, 0x5f, 0x0b, 0xb6, 0xd2, 0xb8, 0x8e, 0x2c, 0x8b,
+	0xc6, 0x30, 0x5a, 0x83, 0x2c, 0x14, 0x99, 0x8f, 0xa6, 0x0e, 0xfd, 0xeb, 0xaf, 0x28, 0xbe, 0x78,
+	0x6a, 0x87, 0x1f, 0xc9, 0xcd, 0x16, 0x5f, 0x36, 0xbc, 0xa6, 0x8d, 0xa9, 0x0a, 0xdf, 0x49, 0xf2,
+	0x78, 0xe6, 0x90, 0xb9, 0x31, 0xb5, 0x3b, 0x8f, 0xae, 0xa2, 0xdb, 0xe3, 0xec, 0x06, 0xfe, 0xea,
+	0x06, 0x1d, 0x58, 0x0e, 0x3a, 0xcf, 0xc1, 0xa6, 0x9c, 0x76, 0xc9, 0x32, 0x3e, 0x73, 0x6c, 0x51,
+	0xea, 0xd5, 0x84, 0x3a, 0xf4, 0xa8, 0xbb, 0x9f, 0xa8, 0xc9, 0x13, 0x46, 0x4f, 0x58, 0xf8, 0x55,
+	0x30, 0x29, 0x4f, 0x03, 0x63, 0xb1, 0x43, 0xe4, 0xaf, 0xf1, 0xa5, 0x22, 0x0d, 0xfb, 0x6f, 0x97,
+	0x9f, 0x14, 0xe1, 0xcc, 0xf3, 0x21, 0x78, 0x9f, 0x8d, 0xf9, 0xe7, 0x41, 0xfa, 0x96, 0x95, 0xb2,
+	0x87, 0x62, 0x18, 0x15, 0x61, 0x34, 0xdf, 0x7d, 0xae, 0x8f, 0x7c, 0xed, 0xf1, 0x3b, 0x00, 0x00,
+	0xff, 0xff, 0xea, 0x88, 0xd0, 0xa5, 0xc3, 0x01, 0x00, 0x00,
+}

+ 91 - 0
common/protocol/headers.pb.go

@@ -0,0 +1,91 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/protocol/headers.proto
+// DO NOT EDIT!
+
+package protocol
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+type SecurityType int32
+
+const (
+	SecurityType_UNKNOWN           SecurityType = 0
+	SecurityType_LEGACY            SecurityType = 1
+	SecurityType_AUTO              SecurityType = 2
+	SecurityType_AES128_GCM        SecurityType = 3
+	SecurityType_CHACHA20_POLY1305 SecurityType = 4
+	SecurityType_NONE              SecurityType = 5
+)
+
+var SecurityType_name = map[int32]string{
+	0: "UNKNOWN",
+	1: "LEGACY",
+	2: "AUTO",
+	3: "AES128_GCM",
+	4: "CHACHA20_POLY1305",
+	5: "NONE",
+}
+var SecurityType_value = map[string]int32{
+	"UNKNOWN":           0,
+	"LEGACY":            1,
+	"AUTO":              2,
+	"AES128_GCM":        3,
+	"CHACHA20_POLY1305": 4,
+	"NONE":              5,
+}
+
+func (x SecurityType) String() string {
+	return proto.EnumName(SecurityType_name, int32(x))
+}
+func (SecurityType) EnumDescriptor() ([]byte, []int) { return fileDescriptor1, []int{0} }
+
+type SecurityConfig struct {
+	Type SecurityType `protobuf:"varint,1,opt,name=type,enum=v2ray.core.common.protocol.SecurityType" json:"type,omitempty"`
+}
+
+func (m *SecurityConfig) Reset()                    { *m = SecurityConfig{} }
+func (m *SecurityConfig) String() string            { return proto.CompactTextString(m) }
+func (*SecurityConfig) ProtoMessage()               {}
+func (*SecurityConfig) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} }
+
+func (m *SecurityConfig) GetType() SecurityType {
+	if m != nil {
+		return m.Type
+	}
+	return SecurityType_UNKNOWN
+}
+
+func init() {
+	proto.RegisterType((*SecurityConfig)(nil), "v2ray.core.common.protocol.SecurityConfig")
+	proto.RegisterEnum("v2ray.core.common.protocol.SecurityType", SecurityType_name, SecurityType_value)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/protocol/headers.proto", fileDescriptor1) }
+
+var fileDescriptor1 = []byte{
+	// 259 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x14, 0xca, 0x25, 0x97, 0x9c, 0x9f, 0x8b,
+	0xc7, 0x61, 0x4e, 0x3c, 0x1e, 0x90, 0x00, 0x08, 0x00, 0x09, 0x44, 0x71, 0xc0, 0xc4, 0x57, 0x31,
+	0x49, 0x85, 0x19, 0x05, 0x25, 0x56, 0xea, 0x39, 0x83, 0x34, 0x39, 0x43, 0x34, 0x05, 0x40, 0x25,
+	0x93, 0xd8, 0xc0, 0xca, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xc5, 0x09, 0x7c, 0x5d,
+	0x01, 0x00, 0x00,
+}

+ 73 - 0
common/protocol/server_spec.pb.go

@@ -0,0 +1,73 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/protocol/server_spec.proto
+// DO NOT EDIT!
+
+package protocol
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_net1 "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
+
+type ServerEndpoint struct {
+	Address *v2ray_core_common_net1.IPOrDomain `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"`
+	Port    uint32                             `protobuf:"varint,2,opt,name=port" json:"port,omitempty"`
+	User    []*User                            `protobuf:"bytes,3,rep,name=user" json:"user,omitempty"`
+}
+
+func (m *ServerEndpoint) Reset()                    { *m = ServerEndpoint{} }
+func (m *ServerEndpoint) String() string            { return proto.CompactTextString(m) }
+func (*ServerEndpoint) ProtoMessage()               {}
+func (*ServerEndpoint) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} }
+
+func (m *ServerEndpoint) GetAddress() *v2ray_core_common_net1.IPOrDomain {
+	if m != nil {
+		return m.Address
+	}
+	return nil
+}
+
+func (m *ServerEndpoint) GetPort() uint32 {
+	if m != nil {
+		return m.Port
+	}
+	return 0
+}
+
+func (m *ServerEndpoint) GetUser() []*User {
+	if m != nil {
+		return m.User
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ServerEndpoint)(nil), "v2ray.core.common.protocol.ServerEndpoint")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/protocol/server_spec.proto", fileDescriptor2) }
+
+var fileDescriptor2 = []byte{
+	// 251 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x8f, 0x3f, 0x4f, 0xf3, 0x30,
+	0x10, 0xc6, 0x95, 0xb6, 0x7a, 0x5f, 0xe4, 0x0a, 0x90, 0x3c, 0x45, 0x19, 0x50, 0x60, 0x21, 0x2c,
+	0x67, 0x14, 0xd8, 0xd8, 0x5a, 0x18, 0x98, 0x88, 0x52, 0x81, 0x10, 0x0b, 0x0a, 0xce, 0x0d, 0x95,
+	0xb0, 0xcf, 0x3a, 0x9b, 0x4a, 0xfd, 0x24, 0x7c, 0x07, 0x3e, 0x25, 0x8a, 0xdd, 0x4c, 0xfc, 0xdb,
+	0xac, 0xbb, 0xdf, 0xef, 0x9e, 0xc7, 0xe2, 0x7c, 0x53, 0x73, 0xb7, 0x05, 0x4d, 0x46, 0x69, 0x62,
+	0x54, 0x9a, 0x8c, 0x21, 0xab, 0x1c, 0x53, 0x20, 0x4d, 0xaf, 0xca, 0x23, 0x6f, 0x90, 0x9f, 0xbd,
+	0x43, 0x0d, 0x71, 0x28, 0x8b, 0xd1, 0x60, 0x84, 0x44, 0xc3, 0x48, 0x17, 0xa7, 0xdf, 0x5f, 0xb3,
+	0x18, 0x54, 0xd7, 0xf7, 0x8c, 0xde, 0x27, 0xb6, 0x38, 0xfb, 0x23, 0xf6, 0xcd, 0x23, 0x27, 0xf4,
+	0xe4, 0x3d, 0x13, 0x07, 0xab, 0xd8, 0xe2, 0xc6, 0xf6, 0x8e, 0xd6, 0x36, 0xc8, 0x2b, 0xf1, 0x7f,
+	0x77, 0x2e, 0xcf, 0xca, 0xac, 0x9a, 0xd7, 0xc7, 0xf0, 0xb5, 0x94, 0xc5, 0x00, 0xb7, 0xcd, 0x1d,
+	0x5f, 0x93, 0xe9, 0xd6, 0xb6, 0x1d, 0x0d, 0x29, 0xc5, 0xcc, 0x11, 0x87, 0x7c, 0x52, 0x66, 0xd5,
+	0x7e, 0x1b, 0xdf, 0xf2, 0x52, 0xcc, 0x86, 0xc4, 0x7c, 0x5a, 0x4e, 0xab, 0x79, 0x5d, 0xc2, 0xcf,
+	0x5f, 0x84, 0x7b, 0x8f, 0xdc, 0x46, 0x7a, 0xf1, 0x28, 0x8e, 0x34, 0x99, 0x5f, 0xe0, 0xc5, 0x61,
+	0x2a, 0xbe, 0x72, 0xa8, 0x9b, 0x61, 0xf6, 0xb4, 0x37, 0xae, 0x3e, 0x26, 0xc5, 0x43, 0xdd, 0x76,
+	0x5b, 0x58, 0x0e, 0xde, 0x32, 0x79, 0xcd, 0x6e, 0xf9, 0xf2, 0x2f, 0x62, 0x17, 0x9f, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0x90, 0x81, 0xc4, 0x33, 0x9e, 0x01, 0x00, 0x00,
+}

+ 72 - 0
common/protocol/user.pb.go

@@ -0,0 +1,72 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/protocol/user.proto
+// DO NOT EDIT!
+
+package protocol
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+type User struct {
+	Level uint32 `protobuf:"varint,1,opt,name=level" json:"level,omitempty"`
+	Email string `protobuf:"bytes,2,opt,name=email" json:"email,omitempty"`
+	// Protocol specific account information.
+	Account *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,3,opt,name=account" 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 fileDescriptor3, []int{0} }
+
+func (m *User) GetLevel() uint32 {
+	if m != nil {
+		return m.Level
+	}
+	return 0
+}
+
+func (m *User) GetEmail() string {
+	if m != nil {
+		return m.Email
+	}
+	return ""
+}
+
+func (m *User) GetAccount() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Account
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*User)(nil), "v2ray.core.common.protocol.User")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/protocol/user.proto", fileDescriptor3) }
+
+var fileDescriptor3 = []byte{
+	// 222 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x8f, 0xcf, 0x4a, 0xc4, 0x30,
+	0x10, 0xc6, 0xc9, 0xfa, 0x77, 0x23, 0x5e, 0x8a, 0x87, 0xd2, 0x83, 0x14, 0x0f, 0x52, 0x2f, 0x13,
+	0xa9, 0x2f, 0x20, 0xbb, 0x67, 0xa1, 0x04, 0xf5, 0xe0, 0x45, 0x62, 0x1c, 0xa4, 0x90, 0x74, 0x4a,
+	0x92, 0x16, 0xfa, 0x4a, 0x3e, 0xa5, 0xa4, 0x31, 0x27, 0xdd, 0xe3, 0x37, 0xf9, 0xfd, 0xf2, 0xcd,
+	0xf0, 0xbb, 0xb9, 0x75, 0x6a, 0x01, 0x4d, 0x56, 0x68, 0x72, 0x28, 0x34, 0x59, 0x4b, 0x83, 0x18,
+	0x1d, 0x05, 0xd2, 0x64, 0xc4, 0xe4, 0xd1, 0xc1, 0x9a, 0x8a, 0x2a, 0xa3, 0x0e, 0x21, 0x61, 0x90,
+	0xb1, 0xea, 0xfe, 0xff, 0x6f, 0x3c, 0xba, 0x5e, 0x19, 0x11, 0x96, 0x11, 0x3f, 0xdf, 0x2d, 0x7a,
+	0xaf, 0xbe, 0x30, 0x49, 0x37, 0x81, 0x1f, 0xbf, 0x78, 0x74, 0xc5, 0x15, 0x3f, 0x31, 0x38, 0xa3,
+	0x29, 0x59, 0xcd, 0x9a, 0x4b, 0x99, 0x42, 0x9c, 0xa2, 0x55, 0xbd, 0x29, 0x37, 0x35, 0x6b, 0xb6,
+	0x32, 0x85, 0xe2, 0x91, 0x9f, 0x29, 0xad, 0x69, 0x1a, 0x42, 0x79, 0x54, 0xb3, 0xe6, 0xa2, 0xbd,
+	0x85, 0xbf, 0x3b, 0xa5, 0x4e, 0x78, 0x8e, 0x9d, 0x4f, 0xa9, 0x52, 0x66, 0x6d, 0x27, 0xf9, 0xb5,
+	0x26, 0x0b, 0x87, 0x2f, 0xd9, 0x6d, 0xe3, 0x56, 0x5d, 0x4c, 0x6f, 0xe7, 0x79, 0xf8, 0xbd, 0xa9,
+	0x5e, 0x5b, 0xa9, 0x16, 0xd8, 0x47, 0x63, 0x9f, 0x8c, 0xee, 0xf7, 0xf1, 0xe3, 0x74, 0xc5, 0x1e,
+	0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x5d, 0xb5, 0xb7, 0x4b, 0x01, 0x00, 0x00,
+}

+ 77 - 0
common/serial/typed_message.pb.go

@@ -0,0 +1,77 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/serial/typed_message.proto
+// DO NOT EDIT!
+
+/*
+Package serial is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/common/serial/typed_message.proto
+
+It has these top-level messages:
+	TypedMessage
+*/
+package serial
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Serialized proto message along with its type name.
+type TypedMessage struct {
+	// The name of the message type, retrieved from protobuf API.
+	Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
+	// Serialized proto message.
+	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 fileDescriptor0, []int{0} }
+
+func (m *TypedMessage) GetType() string {
+	if m != nil {
+		return m.Type
+	}
+	return ""
+}
+
+func (m *TypedMessage) GetValue() []byte {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*TypedMessage)(nil), "v2ray.core.common.serial.TypedMessage")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/serial/typed_message.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 174 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x21, 0x5c, 0x32, 0xc9, 0xf9, 0xb9, 0x7a, 0xb8, 0x4c, 0x76, 0x12, 0x44,
+	0x36, 0x37, 0x00, 0xe4, 0x8c, 0x28, 0x36, 0x88, 0xd4, 0x2a, 0x26, 0x89, 0x30, 0xa3, 0xa0, 0xc4,
+	0x4a, 0x3d, 0x67, 0x90, 0x2e, 0x67, 0x88, 0xae, 0x60, 0xb0, 0x54, 0x12, 0x1b, 0xd8, 0xc1, 0xc6,
+	0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x15, 0xc3, 0xe2, 0xe4, 0x00, 0x00, 0x00,
+}

+ 391 - 0
config.pb.go

@@ -0,0 +1,391 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/config.proto
+// DO NOT EDIT!
+
+/*
+Package core is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/config.proto
+
+It has these top-level messages:
+	AllocationStrategyConcurrency
+	AllocationStrategyRefresh
+	AllocationStrategy
+	InboundConnectionConfig
+	OutboundConnectionConfig
+	Config
+*/
+package core
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
+import v2ray_core_common_net "v2ray.com/core/common/net"
+import v2ray_core_common_net1 "v2ray.com/core/common/net"
+import v2ray_core_common_log "v2ray.com/core/common/log"
+import v2ray_core_transport_internet "v2ray.com/core/transport/internet"
+import v2ray_core_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Configuration serialization format.
+type ConfigFormat int32
+
+const (
+	ConfigFormat_Protobuf ConfigFormat = 0
+	ConfigFormat_JSON     ConfigFormat = 1
+)
+
+var ConfigFormat_name = map[int32]string{
+	0: "Protobuf",
+	1: "JSON",
+}
+var ConfigFormat_value = map[string]int32{
+	"Protobuf": 0,
+	"JSON":     1,
+}
+
+func (x ConfigFormat) String() string {
+	return proto.EnumName(ConfigFormat_name, int32(x))
+}
+func (ConfigFormat) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type AllocationStrategy_Type int32
+
+const (
+	// Always allocate all connection handlers.
+	AllocationStrategy_Always AllocationStrategy_Type = 0
+	// Randomly allocate specific range of handlers.
+	AllocationStrategy_Random AllocationStrategy_Type = 1
+	// External. Not supported yet.
+	AllocationStrategy_External AllocationStrategy_Type = 2
+)
+
+var AllocationStrategy_Type_name = map[int32]string{
+	0: "Always",
+	1: "Random",
+	2: "External",
+}
+var AllocationStrategy_Type_value = map[string]int32{
+	"Always":   0,
+	"Random":   1,
+	"External": 2,
+}
+
+func (x AllocationStrategy_Type) String() string {
+	return proto.EnumName(AllocationStrategy_Type_name, int32(x))
+}
+func (AllocationStrategy_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} }
+
+type AllocationStrategyConcurrency struct {
+	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *AllocationStrategyConcurrency) Reset()                    { *m = AllocationStrategyConcurrency{} }
+func (m *AllocationStrategyConcurrency) String() string            { return proto.CompactTextString(m) }
+func (*AllocationStrategyConcurrency) ProtoMessage()               {}
+func (*AllocationStrategyConcurrency) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *AllocationStrategyConcurrency) GetValue() uint32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+type AllocationStrategyRefresh struct {
+	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *AllocationStrategyRefresh) Reset()                    { *m = AllocationStrategyRefresh{} }
+func (m *AllocationStrategyRefresh) String() string            { return proto.CompactTextString(m) }
+func (*AllocationStrategyRefresh) ProtoMessage()               {}
+func (*AllocationStrategyRefresh) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func (m *AllocationStrategyRefresh) GetValue() uint32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+type AllocationStrategy struct {
+	Type AllocationStrategy_Type `protobuf:"varint,1,opt,name=type,enum=v2ray.core.AllocationStrategy_Type" json:"type,omitempty"`
+	// Number of handlers (ports) running in parallel.
+	// Default value is 3 if unset.
+	Concurrency *AllocationStrategyConcurrency `protobuf:"bytes,2,opt,name=concurrency" json:"concurrency,omitempty"`
+	// Number of minutes before a handler is regenerated.
+	// Default value is 5 if unset.
+	Refresh *AllocationStrategyRefresh `protobuf:"bytes,3,opt,name=refresh" 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 fileDescriptor0, []int{2} }
+
+func (m *AllocationStrategy) GetType() AllocationStrategy_Type {
+	if m != nil {
+		return m.Type
+	}
+	return AllocationStrategy_Always
+}
+
+func (m *AllocationStrategy) GetConcurrency() *AllocationStrategyConcurrency {
+	if m != nil {
+		return m.Concurrency
+	}
+	return nil
+}
+
+func (m *AllocationStrategy) GetRefresh() *AllocationStrategyRefresh {
+	if m != nil {
+		return m.Refresh
+	}
+	return nil
+}
+
+// Config for an inbound connection handler.
+type InboundConnectionConfig struct {
+	// Protocol specific settings. Must be one of the supported protocols.
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
+	// Range of port number to run on. Both inclusive.
+	PortRange *v2ray_core_common_net.PortRange `protobuf:"bytes,2,opt,name=port_range,json=portRange" json:"port_range,omitempty"`
+	// IP address to listen on. 0.0.0.0 if unset.
+	ListenOn *v2ray_core_common_net1.IPOrDomain `protobuf:"bytes,3,opt,name=listen_on,json=listenOn" json:"listen_on,omitempty"`
+	// Tag of this handler.
+	Tag                    string                                      `protobuf:"bytes,4,opt,name=tag" json:"tag,omitempty"`
+	AllocationStrategy     *AllocationStrategy                         `protobuf:"bytes,5,opt,name=allocation_strategy,json=allocationStrategy" json:"allocation_strategy,omitempty"`
+	StreamSettings         *v2ray_core_transport_internet.StreamConfig `protobuf:"bytes,6,opt,name=stream_settings,json=streamSettings" json:"stream_settings,omitempty"`
+	AllowPassiveConnection bool                                        `protobuf:"varint,7,opt,name=allow_passive_connection,json=allowPassiveConnection" json:"allow_passive_connection,omitempty"`
+}
+
+func (m *InboundConnectionConfig) Reset()                    { *m = InboundConnectionConfig{} }
+func (m *InboundConnectionConfig) String() string            { return proto.CompactTextString(m) }
+func (*InboundConnectionConfig) ProtoMessage()               {}
+func (*InboundConnectionConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
+
+func (m *InboundConnectionConfig) GetSettings() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Settings
+	}
+	return nil
+}
+
+func (m *InboundConnectionConfig) GetPortRange() *v2ray_core_common_net.PortRange {
+	if m != nil {
+		return m.PortRange
+	}
+	return nil
+}
+
+func (m *InboundConnectionConfig) GetListenOn() *v2ray_core_common_net1.IPOrDomain {
+	if m != nil {
+		return m.ListenOn
+	}
+	return nil
+}
+
+func (m *InboundConnectionConfig) GetTag() string {
+	if m != nil {
+		return m.Tag
+	}
+	return ""
+}
+
+func (m *InboundConnectionConfig) GetAllocationStrategy() *AllocationStrategy {
+	if m != nil {
+		return m.AllocationStrategy
+	}
+	return nil
+}
+
+func (m *InboundConnectionConfig) GetStreamSettings() *v2ray_core_transport_internet.StreamConfig {
+	if m != nil {
+		return m.StreamSettings
+	}
+	return nil
+}
+
+func (m *InboundConnectionConfig) GetAllowPassiveConnection() bool {
+	if m != nil {
+		return m.AllowPassiveConnection
+	}
+	return false
+}
+
+// Config for an outbound connection handler.
+type OutboundConnectionConfig struct {
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
+	// IP address to send data through. 0.0.0.0 if unset.
+	SendThrough    *v2ray_core_common_net1.IPOrDomain          `protobuf:"bytes,2,opt,name=send_through,json=sendThrough" json:"send_through,omitempty"`
+	StreamSettings *v2ray_core_transport_internet.StreamConfig `protobuf:"bytes,3,opt,name=stream_settings,json=streamSettings" json:"stream_settings,omitempty"`
+	ProxySettings  *v2ray_core_transport_internet.ProxyConfig  `protobuf:"bytes,5,opt,name=proxy_settings,json=proxySettings" json:"proxy_settings,omitempty"`
+	Tag            string                                      `protobuf:"bytes,4,opt,name=tag" json:"tag,omitempty"`
+}
+
+func (m *OutboundConnectionConfig) Reset()                    { *m = OutboundConnectionConfig{} }
+func (m *OutboundConnectionConfig) String() string            { return proto.CompactTextString(m) }
+func (*OutboundConnectionConfig) ProtoMessage()               {}
+func (*OutboundConnectionConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
+
+func (m *OutboundConnectionConfig) GetSettings() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Settings
+	}
+	return nil
+}
+
+func (m *OutboundConnectionConfig) GetSendThrough() *v2ray_core_common_net1.IPOrDomain {
+	if m != nil {
+		return m.SendThrough
+	}
+	return nil
+}
+
+func (m *OutboundConnectionConfig) GetStreamSettings() *v2ray_core_transport_internet.StreamConfig {
+	if m != nil {
+		return m.StreamSettings
+	}
+	return nil
+}
+
+func (m *OutboundConnectionConfig) GetProxySettings() *v2ray_core_transport_internet.ProxyConfig {
+	if m != nil {
+		return m.ProxySettings
+	}
+	return nil
+}
+
+func (m *OutboundConnectionConfig) GetTag() string {
+	if m != nil {
+		return m.Tag
+	}
+	return ""
+}
+
+type Config struct {
+	// Inbound handler configurations. Must have at least one item.
+	Inbound []*InboundConnectionConfig `protobuf:"bytes,1,rep,name=inbound" json:"inbound,omitempty"`
+	// Outbound handler configurations. Must have at least one item. The first item is used as default for routing.
+	Outbound []*OutboundConnectionConfig   `protobuf:"bytes,2,rep,name=outbound" json:"outbound,omitempty"`
+	Log      *v2ray_core_common_log.Config `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"`
+	// App configuration. Must be one in the app directory.
+	App       []*v2ray_core_common_serial.TypedMessage `protobuf:"bytes,4,rep,name=app" json:"app,omitempty"`
+	Transport *v2ray_core_transport.Config             `protobuf:"bytes,5,opt,name=transport" json:"transport,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 fileDescriptor0, []int{5} }
+
+func (m *Config) GetInbound() []*InboundConnectionConfig {
+	if m != nil {
+		return m.Inbound
+	}
+	return nil
+}
+
+func (m *Config) GetOutbound() []*OutboundConnectionConfig {
+	if m != nil {
+		return m.Outbound
+	}
+	return nil
+}
+
+func (m *Config) GetLog() *v2ray_core_common_log.Config {
+	if m != nil {
+		return m.Log
+	}
+	return nil
+}
+
+func (m *Config) GetApp() []*v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.App
+	}
+	return nil
+}
+
+func (m *Config) GetTransport() *v2ray_core_transport.Config {
+	if m != nil {
+		return m.Transport
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AllocationStrategyConcurrency)(nil), "v2ray.core.AllocationStrategyConcurrency")
+	proto.RegisterType((*AllocationStrategyRefresh)(nil), "v2ray.core.AllocationStrategyRefresh")
+	proto.RegisterType((*AllocationStrategy)(nil), "v2ray.core.AllocationStrategy")
+	proto.RegisterType((*InboundConnectionConfig)(nil), "v2ray.core.InboundConnectionConfig")
+	proto.RegisterType((*OutboundConnectionConfig)(nil), "v2ray.core.OutboundConnectionConfig")
+	proto.RegisterType((*Config)(nil), "v2ray.core.Config")
+	proto.RegisterEnum("v2ray.core.ConfigFormat", ConfigFormat_name, ConfigFormat_value)
+	proto.RegisterEnum("v2ray.core.AllocationStrategy_Type", AllocationStrategy_Type_name, AllocationStrategy_Type_value)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 745 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x95, 0xd1, 0x6e, 0xd3, 0x3a,
+	0x1c, 0xc6, 0x97, 0xb6, 0xeb, 0xda, 0x7f, 0xb7, 0x9e, 0xca, 0xe7, 0xe8, 0x9c, 0x9c, 0xc1, 0x50,
+	0x29, 0xdb, 0x28, 0x03, 0xa5, 0xa3, 0x08, 0x31, 0x21, 0xc1, 0xd8, 0x3a, 0x90, 0x06, 0x82, 0x16,
+	0x77, 0xe2, 0x82, 0x9b, 0xc8, 0x4b, 0xbd, 0x2c, 0x52, 0x62, 0x47, 0xb6, 0xbb, 0x2d, 0x8f, 0xc0,
+	0xab, 0x70, 0xc5, 0xab, 0xf0, 0x04, 0xbc, 0x0a, 0x72, 0x92, 0xa6, 0x1d, 0x6d, 0xb7, 0x49, 0x88,
+	0xbb, 0x34, 0xf9, 0x7e, 0x9f, 0x9d, 0xef, 0xfb, 0xc7, 0x85, 0x5b, 0x67, 0x6d, 0x41, 0x22, 0xcb,
+	0xe1, 0x41, 0xcb, 0xe1, 0x82, 0xb6, 0x1c, 0xce, 0x4e, 0x3c, 0xd7, 0x0a, 0x05, 0x57, 0x1c, 0xc1,
+	0xe8, 0xa1, 0xa0, 0xab, 0xdb, 0x53, 0xc2, 0x20, 0xe0, 0xac, 0x25, 0xa9, 0xf0, 0x88, 0xdf, 0x52,
+	0x51, 0x48, 0x07, 0x76, 0x40, 0xa5, 0x24, 0x2e, 0x4d, 0xe8, 0xd5, 0xf5, 0xd9, 0x04, 0xa3, 0xaa,
+	0x15, 0x72, 0xa1, 0x52, 0xd5, 0xfd, 0xf9, 0x2a, 0x32, 0x18, 0x08, 0x2a, 0x65, 0x2a, 0xdc, 0x9c,
+	0x2d, 0xf4, 0xb9, 0x7b, 0x69, 0xd3, 0xab, 0xd6, 0x2f, 0x3a, 0x25, 0x08, 0x93, 0x7a, 0xc1, 0x96,
+	0xc7, 0x14, 0x15, 0xda, 0xf8, 0x92, 0x7e, 0x63, 0xae, 0x7e, 0x52, 0xd6, 0x78, 0x0a, 0x6b, 0x7b,
+	0xbe, 0xcf, 0x1d, 0xa2, 0x3c, 0xce, 0xfa, 0x4a, 0x10, 0x45, 0xdd, 0xa8, 0xc3, 0x99, 0x33, 0x14,
+	0x82, 0x32, 0x27, 0x42, 0xff, 0xc0, 0xe2, 0x19, 0xf1, 0x87, 0xd4, 0x34, 0xea, 0x46, 0x73, 0x05,
+	0x27, 0x3f, 0x1a, 0x8f, 0xe1, 0xff, 0x69, 0x0c, 0xd3, 0x13, 0x41, 0xe5, 0xe9, 0x1c, 0xe4, 0x4b,
+	0x0e, 0xd0, 0x34, 0x83, 0x9e, 0x41, 0x41, 0xa7, 0x1c, 0x6b, 0xab, 0xed, 0x7b, 0xd6, 0xb8, 0x1b,
+	0x6b, 0x5a, 0x6d, 0x1d, 0x45, 0x21, 0xc5, 0x31, 0x80, 0xde, 0x41, 0xc5, 0x19, 0xef, 0xd3, 0xcc,
+	0xd5, 0x8d, 0x66, 0xa5, 0xfd, 0xe0, 0x6a, 0x7e, 0xe2, 0xc5, 0xf0, 0x24, 0x8d, 0x76, 0x61, 0x49,
+	0x24, 0xbb, 0x37, 0xf3, 0xb1, 0xd1, 0xc6, 0xd5, 0x46, 0xe9, 0xab, 0xe2, 0x11, 0xd5, 0x78, 0x04,
+	0x05, 0xbd, 0x37, 0x04, 0x50, 0xdc, 0xf3, 0xcf, 0x49, 0x24, 0x6b, 0x0b, 0xfa, 0x1a, 0x13, 0x36,
+	0xe0, 0x41, 0xcd, 0x40, 0xcb, 0x50, 0x7a, 0x7d, 0xa1, 0x7b, 0x22, 0x7e, 0x2d, 0xd7, 0xf8, 0x9e,
+	0x87, 0xff, 0x0e, 0xd9, 0x31, 0x1f, 0xb2, 0x41, 0x87, 0x33, 0x46, 0x1d, 0xed, 0xdd, 0x89, 0x7b,
+	0x41, 0xfb, 0x50, 0x92, 0x54, 0x29, 0x8f, 0xb9, 0x32, 0x0e, 0xa5, 0xd2, 0xde, 0x9c, 0xdc, 0x4b,
+	0x32, 0x1f, 0x56, 0x32, 0xa0, 0x71, 0x1e, 0x83, 0xf7, 0xc9, 0x7c, 0xe2, 0x8c, 0x43, 0xbb, 0x00,
+	0xba, 0x6a, 0x5b, 0x10, 0xe6, 0xd2, 0x34, 0x9a, 0xfa, 0x0c, 0x17, 0x46, 0x95, 0xd5, 0xe3, 0x42,
+	0x61, 0xad, 0xc3, 0xe5, 0x70, 0x74, 0x89, 0x5e, 0x42, 0xd9, 0xf7, 0xa4, 0xa2, 0xcc, 0xe6, 0x2c,
+	0x4d, 0xe4, 0xee, 0x1c, 0xfe, 0xb0, 0xd7, 0x15, 0x07, 0x3c, 0x20, 0x1e, 0xc3, 0xa5, 0x84, 0xe9,
+	0x32, 0x54, 0x83, 0xbc, 0x22, 0xae, 0x59, 0xa8, 0x1b, 0xcd, 0x32, 0xd6, 0x97, 0xa8, 0x0b, 0x7f,
+	0x93, 0x2c, 0x46, 0x5b, 0xa6, 0x39, 0x9a, 0x8b, 0xb1, 0xf7, 0x9d, 0x6b, 0xd2, 0x46, 0x64, 0x7a,
+	0x70, 0x8e, 0xe0, 0x2f, 0xa9, 0x04, 0x25, 0x81, 0x9d, 0xc5, 0x55, 0x8c, 0xcd, 0x1e, 0x4e, 0x9a,
+	0x65, 0x63, 0x6f, 0x8d, 0x3e, 0x13, 0xab, 0x1f, 0x53, 0x49, 0xda, 0xb8, 0x9a, 0x78, 0xf4, 0x47,
+	0xc9, 0xed, 0x80, 0xa9, 0xd7, 0x3a, 0xb7, 0x43, 0x22, 0xa5, 0x77, 0x46, 0x6d, 0x27, 0xeb, 0xc7,
+	0x5c, 0xaa, 0x1b, 0xcd, 0x12, 0xfe, 0x37, 0x7e, 0xde, 0x4b, 0x1e, 0x8f, 0xdb, 0x6b, 0xfc, 0xc8,
+	0x81, 0xd9, 0x1d, 0xaa, 0x3f, 0x57, 0xea, 0x01, 0x2c, 0x4b, 0xca, 0x06, 0xb6, 0x3a, 0x15, 0x7c,
+	0xe8, 0x9e, 0xa6, 0xb5, 0xde, 0xa0, 0x96, 0x8a, 0xc6, 0x8e, 0x12, 0x6a, 0x56, 0x6c, 0xf9, 0xdf,
+	0x8f, 0xed, 0x23, 0x54, 0x43, 0xc1, 0x2f, 0xa2, 0xb1, 0x69, 0x52, 0xec, 0xd6, 0x35, 0xa6, 0x3d,
+	0x0d, 0xa5, 0x9e, 0x2b, 0xb1, 0x43, 0x66, 0x39, 0x35, 0x42, 0x8d, 0x6f, 0x39, 0x28, 0xa6, 0x79,
+	0xbe, 0x80, 0x25, 0x2f, 0xf9, 0x7e, 0x4c, 0xa3, 0x9e, 0x6f, 0x56, 0x2e, 0x1f, 0x1c, 0x73, 0x3e,
+	0x2d, 0x3c, 0x62, 0xd0, 0x2b, 0x28, 0xf1, 0xb4, 0x2a, 0x33, 0x17, 0xf3, 0xeb, 0x93, 0xfc, 0xbc,
+	0x1a, 0x71, 0x46, 0xa1, 0x16, 0xe4, 0x7d, 0xee, 0xa6, 0xd1, 0xad, 0xcd, 0xe8, 0xc0, 0xe7, 0xae,
+	0x95, 0x52, 0x5a, 0x89, 0x76, 0x20, 0x4f, 0xc2, 0xd0, 0x2c, 0xc4, 0xab, 0xdd, 0xb4, 0x7c, 0x8d,
+	0xa0, 0xe7, 0x50, 0xce, 0x92, 0x4b, 0x63, 0xbd, 0x3d, 0x3b, 0xd6, 0x74, 0xbd, 0xb1, 0x7c, 0x6b,
+	0x13, 0x96, 0x93, 0x9b, 0x6f, 0xb8, 0x08, 0x88, 0xd2, 0xc7, 0x50, 0x4f, 0x9f, 0xfb, 0xc7, 0xc3,
+	0x93, 0xda, 0x02, 0x2a, 0x41, 0xe1, 0x6d, 0xbf, 0xfb, 0xa1, 0x66, 0xec, 0x6f, 0x43, 0xd5, 0xe1,
+	0xc1, 0x84, 0xeb, 0x7e, 0x25, 0xe1, 0x62, 0xf5, 0xe7, 0x82, 0xbe, 0xf5, 0x35, 0x07, 0x9f, 0xda,
+	0x98, 0x44, 0x56, 0x87, 0x0b, 0x7a, 0x5c, 0x8c, 0xff, 0x3f, 0x9e, 0xfc, 0x0c, 0x00, 0x00, 0xff,
+	0xff, 0xff, 0x44, 0xf3, 0xc8, 0x6a, 0x07, 0x00, 0x00,
+}

+ 90 - 0
proxy/blackhole/config.pb.go

@@ -0,0 +1,90 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/blackhole/config.proto
+// DO NOT EDIT!
+
+/*
+Package blackhole is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/blackhole/config.proto
+
+It has these top-level messages:
+	NoneResponse
+	HTTPResponse
+	Config
+*/
+package blackhole
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type NoneResponse struct {
+}
+
+func (m *NoneResponse) Reset()                    { *m = NoneResponse{} }
+func (m *NoneResponse) String() string            { return proto.CompactTextString(m) }
+func (*NoneResponse) ProtoMessage()               {}
+func (*NoneResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type HTTPResponse struct {
+}
+
+func (m *HTTPResponse) Reset()                    { *m = HTTPResponse{} }
+func (m *HTTPResponse) String() string            { return proto.CompactTextString(m) }
+func (*HTTPResponse) ProtoMessage()               {}
+func (*HTTPResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+type Config struct {
+	Response *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,1,opt,name=response" 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 fileDescriptor0, []int{2} }
+
+func (m *Config) GetResponse() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Response
+	}
+	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", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 223 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x42, 0xb9, 0xe4, 0x92, 0xf3, 0x73, 0xf5, 0x70, 0xfb, 0xc0, 0x89,
+	0x1b, 0x62, 0x5b, 0x00, 0xc8, 0x71, 0x51, 0x9c, 0x70, 0xf1, 0x55, 0x4c, 0x52, 0x61, 0x46, 0x41,
+	0x89, 0x95, 0x7a, 0xce, 0x20, 0x4d, 0x01, 0x60, 0x4d, 0x4e, 0x30, 0xc9, 0x24, 0x36, 0xb0, 0x5f,
+	0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xca, 0x68, 0xd4, 0x4f, 0x48, 0x01, 0x00, 0x00,
+}

+ 108 - 0
proxy/dokodemo/config.pb.go

@@ -0,0 +1,108 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/dokodemo/config.proto
+// DO NOT EDIT!
+
+/*
+Package dokodemo is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/dokodemo/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package dokodemo
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_net "v2ray.com/core/common/net"
+import v2ray_core_common_net1 "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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+	Address        *v2ray_core_common_net.IPOrDomain   `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"`
+	Port           uint32                              `protobuf:"varint,2,opt,name=port" json:"port,omitempty"`
+	NetworkList    *v2ray_core_common_net1.NetworkList `protobuf:"bytes,3,opt,name=network_list,json=networkList" json:"network_list,omitempty"`
+	Timeout        uint32                              `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"`
+	FollowRedirect bool                                `protobuf:"varint,5,opt,name=follow_redirect,json=followRedirect" json:"follow_redirect,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetAddress() *v2ray_core_common_net.IPOrDomain {
+	if m != nil {
+		return m.Address
+	}
+	return nil
+}
+
+func (m *Config) GetPort() uint32 {
+	if m != nil {
+		return m.Port
+	}
+	return 0
+}
+
+func (m *Config) GetNetworkList() *v2ray_core_common_net1.NetworkList {
+	if m != nil {
+		return m.NetworkList
+	}
+	return nil
+}
+
+func (m *Config) GetTimeout() uint32 {
+	if m != nil {
+		return m.Timeout
+	}
+	return 0
+}
+
+func (m *Config) GetFollowRedirect() bool {
+	if m != nil {
+		return m.FollowRedirect
+	}
+	return false
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.dokodemo.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/dokodemo/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 293 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4b, 0xfb, 0x30,
+	0x18, 0xc7, 0xe9, 0x7e, 0xfb, 0x6d, 0x23, 0xf5, 0x0f, 0xe4, 0x94, 0x09, 0x42, 0xdd, 0x65, 0xc5,
+	0x43, 0x02, 0xf5, 0xe8, 0x6d, 0x9b, 0x07, 0x41, 0xb4, 0xe4, 0xe0, 0xc1, 0xcb, 0xa8, 0x69, 0x26,
+	0x61, 0x4d, 0x9e, 0x92, 0x46, 0x67, 0xdf, 0x92, 0x6f, 0xcb, 0x37, 0x22, 0x4b, 0x5a, 0x14, 0x61,
+	0xde, 0xfa, 0x3c, 0xfd, 0x7c, 0x3f, 0x4f, 0xf8, 0xa2, 0xcb, 0xb7, 0xcc, 0x16, 0x2d, 0x15, 0xa0,
+	0x99, 0x00, 0x2b, 0x59, 0x6d, 0xe1, 0xbd, 0x65, 0x25, 0x6c, 0xa1, 0x94, 0x1a, 0x98, 0x00, 0xb3,
+	0x51, 0x2f, 0xb4, 0xb6, 0xe0, 0x00, 0x4f, 0x7b, 0xd6, 0x4a, 0xea, 0x39, 0xda, 0x73, 0x67, 0xf3,
+	0x5f, 0x1a, 0x01, 0x5a, 0x83, 0x61, 0x46, 0x3a, 0x56, 0x94, 0xa5, 0x95, 0x4d, 0x13, 0x1c, 0x7f,
+	0x81, 0x46, 0xba, 0x1d, 0xd8, 0x6d, 0x00, 0x67, 0x9f, 0x11, 0x1a, 0x2d, 0xfd, 0x75, 0x7c, 0x8d,
+	0xc6, 0x9d, 0x84, 0x44, 0x49, 0x94, 0xc6, 0xd9, 0x05, 0xfd, 0xf1, 0x92, 0x60, 0xa0, 0x46, 0x3a,
+	0x7a, 0x9b, 0x3f, 0xd8, 0x15, 0xe8, 0x42, 0x19, 0xde, 0x27, 0x30, 0x46, 0xc3, 0x1a, 0xac, 0x23,
+	0x83, 0x24, 0x4a, 0x8f, 0xb9, 0xff, 0xc6, 0x37, 0xe8, 0xa8, 0x3b, 0xb6, 0xae, 0x54, 0xe3, 0xc8,
+	0x3f, 0x6f, 0x9d, 0x1d, 0xb0, 0xde, 0x07, 0xf4, 0x4e, 0x35, 0x8e, 0xc7, 0xe6, 0x7b, 0xc0, 0x04,
+	0x8d, 0x9d, 0xd2, 0x12, 0x5e, 0x1d, 0x19, 0x7a, 0x7b, 0x3f, 0xe2, 0x39, 0x3a, 0xdd, 0x40, 0x55,
+	0xc1, 0x6e, 0x6d, 0x65, 0xa9, 0xac, 0x14, 0x8e, 0xfc, 0x4f, 0xa2, 0x74, 0xc2, 0x4f, 0xc2, 0x9a,
+	0x77, 0xdb, 0x05, 0x47, 0xe7, 0x02, 0x34, 0x3d, 0x58, 0xec, 0x22, 0x0e, 0x1d, 0xe4, 0xfb, 0x4e,
+	0x9e, 0x26, 0xfd, 0xfa, 0x63, 0x30, 0x7d, 0xcc, 0x78, 0xd1, 0xd2, 0xe5, 0x3e, 0x92, 0xfb, 0xc8,
+	0xaa, 0xfb, 0xf7, 0x3c, 0xf2, 0x05, 0x5e, 0x7d, 0x05, 0x00, 0x00, 0xff, 0xff, 0x88, 0x4d, 0x7b,
+	0x60, 0xdb, 0x01, 0x00, 0x00,
+}

+ 99 - 0
proxy/freedom/config.pb.go

@@ -0,0 +1,99 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/freedom/config.proto
+// DO NOT EDIT!
+
+/*
+Package freedom is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/freedom/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package freedom
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config_DomainStrategy int32
+
+const (
+	Config_AS_IS  Config_DomainStrategy = 0
+	Config_USE_IP Config_DomainStrategy = 1
+)
+
+var Config_DomainStrategy_name = map[int32]string{
+	0: "AS_IS",
+	1: "USE_IP",
+}
+var Config_DomainStrategy_value = map[string]int32{
+	"AS_IS":  0,
+	"USE_IP": 1,
+}
+
+func (x Config_DomainStrategy) String() string {
+	return proto.EnumName(Config_DomainStrategy_name, int32(x))
+}
+func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} }
+
+type Config struct {
+	DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domainStrategy,enum=v2ray.core.proxy.freedom.Config_DomainStrategy" json:"domainStrategy,omitempty"`
+	Timeout        uint32                `protobuf:"varint,2,opt,name=timeout" json:"timeout,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetDomainStrategy() Config_DomainStrategy {
+	if m != nil {
+		return m.DomainStrategy
+	}
+	return Config_AS_IS
+}
+
+func (m *Config) GetTimeout() uint32 {
+	if m != nil {
+		return m.Timeout
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.freedom.Config")
+	proto.RegisterEnum("v2ray.core.proxy.freedom.Config_DomainStrategy", Config_DomainStrategy_name, Config_DomainStrategy_value)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/freedom/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 217 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0x33, 0x2a, 0x4a,
+	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x28, 0xca, 0xaf, 0xa8,
+	0xd4, 0x4f, 0x2b, 0x4a, 0x4d, 0x4d, 0x01, 0x0b, 0xe5, 0xa5, 0x65, 0xa6, 0xeb, 0x15, 0x14, 0xe5,
+	0x97, 0xe4, 0x0b, 0x49, 0xc0, 0x94, 0x16, 0xa5, 0xea, 0x81, 0x95, 0xe9, 0x41, 0x95, 0x29, 0x2d,
+	0x61, 0xe4, 0x62, 0x73, 0x06, 0x2b, 0x15, 0x0a, 0xe7, 0xe2, 0x4b, 0xc9, 0xcf, 0x4d, 0xcc, 0xcc,
+	0x0b, 0x2e, 0x29, 0x4a, 0x2c, 0x49, 0x4d, 0xaf, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x33, 0xd2,
+	0xd7, 0xc3, 0xa5, 0x5b, 0x0f, 0xa2, 0x53, 0xcf, 0x05, 0x45, 0x5b, 0x10, 0x9a, 0x31, 0x42, 0x12,
+	0x5c, 0xec, 0x25, 0x99, 0xb9, 0xa9, 0xf9, 0xa5, 0x25, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xbc, 0x41,
+	0x30, 0xae, 0x92, 0x3a, 0x17, 0x1f, 0xaa, 0x5e, 0x21, 0x4e, 0x2e, 0x56, 0xc7, 0xe0, 0x78, 0xcf,
+	0x60, 0x01, 0x06, 0x21, 0x2e, 0x2e, 0xb6, 0xd0, 0x60, 0xd7, 0x78, 0xcf, 0x00, 0x01, 0x46, 0x27,
+	0x7f, 0x2e, 0x99, 0xe4, 0xfc, 0x5c, 0x9c, 0x0e, 0x71, 0xe2, 0x86, 0xb8, 0x24, 0x00, 0xe4, 0xdb,
+	0x28, 0x76, 0xa8, 0xe8, 0x2a, 0x26, 0x89, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0x86,
+	0x00, 0xb0, 0x06, 0x37, 0x88, 0x54, 0x12, 0x1b, 0x38, 0x60, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff,
+	0xff, 0xae, 0x54, 0x8c, 0x36, 0x45, 0x01, 0x00, 0x00,
+}

+ 78 - 0
proxy/http/config.pb.go

@@ -0,0 +1,78 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/http/config.proto
+// DO NOT EDIT!
+
+/*
+Package http is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/http/config.proto
+
+It has these top-level messages:
+	ServerConfig
+	ClientConfig
+*/
+package http
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Config for HTTP proxy server.
+type ServerConfig struct {
+	Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,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 fileDescriptor0, []int{0} }
+
+func (m *ServerConfig) GetTimeout() uint32 {
+	if m != nil {
+		return m.Timeout
+	}
+	return 0
+}
+
+// ClientConfig for HTTP proxy client.
+type ClientConfig struct {
+}
+
+func (m *ClientConfig) Reset()                    { *m = ClientConfig{} }
+func (m *ClientConfig) String() string            { return proto.CompactTextString(m) }
+func (*ClientConfig) ProtoMessage()               {}
+func (*ClientConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func init() {
+	proto.RegisterType((*ServerConfig)(nil), "v2ray.core.proxy.http.ServerConfig")
+	proto.RegisterType((*ClientConfig)(nil), "v2ray.core.proxy.http.ClientConfig")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/http/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 167 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x2b, 0x33, 0x2a, 0x4a,
+	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x28, 0xca, 0xaf, 0xa8,
+	0xd4, 0xcf, 0x28, 0x29, 0x29, 0xd0, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca,
+	0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa9, 0x2b, 0x4a, 0xd5, 0x03, 0xab, 0xd1, 0x03, 0xa9, 0x51, 0xd2,
+	0xe0, 0xe2, 0x09, 0x4e, 0x2d, 0x2a, 0x4b, 0x2d, 0x72, 0x06, 0x2b, 0x16, 0x92, 0xe0, 0x62, 0x2f,
+	0xc9, 0xcc, 0x4d, 0xcd, 0x2f, 0x2d, 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0d, 0x82, 0x71, 0x95,
+	0xf8, 0xb8, 0x78, 0x9c, 0x73, 0x32, 0x53, 0xf3, 0x4a, 0x20, 0x2a, 0x9d, 0xdc, 0xb8, 0x24, 0x93,
+	0xf3, 0x73, 0xf5, 0xb0, 0x1a, 0xeb, 0xc4, 0x0d, 0x51, 0x14, 0x00, 0xb2, 0x3a, 0x8a, 0x05, 0x24,
+	0xb4, 0x8a, 0x49, 0x34, 0xcc, 0x28, 0x28, 0xb1, 0x52, 0xcf, 0x19, 0xa4, 0x34, 0x00, 0xac, 0xd4,
+	0xa3, 0xa4, 0xa4, 0x20, 0x89, 0x0d, 0xec, 0x3e, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa1,
+	0x81, 0x13, 0x9c, 0xc9, 0x00, 0x00, 0x00,
+}

+ 201 - 0
proxy/shadowsocks/config.pb.go

@@ -0,0 +1,201 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/shadowsocks/config.proto
+// DO NOT EDIT!
+
+/*
+Package shadowsocks is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/shadowsocks/config.proto
+
+It has these top-level messages:
+	Account
+	ServerConfig
+	ClientConfig
+*/
+package shadowsocks
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_protocol "v2ray.com/core/common/protocol"
+import v2ray_core_common_protocol1 "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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type CipherType int32
+
+const (
+	CipherType_UNKNOWN       CipherType = 0
+	CipherType_AES_128_CFB   CipherType = 1
+	CipherType_AES_256_CFB   CipherType = 2
+	CipherType_CHACHA20      CipherType = 3
+	CipherType_CHACHA20_IEFT CipherType = 4
+)
+
+var CipherType_name = map[int32]string{
+	0: "UNKNOWN",
+	1: "AES_128_CFB",
+	2: "AES_256_CFB",
+	3: "CHACHA20",
+	4: "CHACHA20_IEFT",
+}
+var CipherType_value = map[string]int32{
+	"UNKNOWN":       0,
+	"AES_128_CFB":   1,
+	"AES_256_CFB":   2,
+	"CHACHA20":      3,
+	"CHACHA20_IEFT": 4,
+}
+
+func (x CipherType) String() string {
+	return proto.EnumName(CipherType_name, int32(x))
+}
+func (CipherType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type Account_OneTimeAuth int32
+
+const (
+	Account_Auto     Account_OneTimeAuth = 0
+	Account_Disabled Account_OneTimeAuth = 1
+	Account_Enabled  Account_OneTimeAuth = 2
+)
+
+var Account_OneTimeAuth_name = map[int32]string{
+	0: "Auto",
+	1: "Disabled",
+	2: "Enabled",
+}
+var Account_OneTimeAuth_value = map[string]int32{
+	"Auto":     0,
+	"Disabled": 1,
+	"Enabled":  2,
+}
+
+func (x Account_OneTimeAuth) String() string {
+	return proto.EnumName(Account_OneTimeAuth_name, int32(x))
+}
+func (Account_OneTimeAuth) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} }
+
+type Account struct {
+	Password   string              `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
+	CipherType CipherType          `protobuf:"varint,2,opt,name=cipher_type,json=cipherType,enum=v2ray.core.proxy.shadowsocks.CipherType" json:"cipher_type,omitempty"`
+	Ota        Account_OneTimeAuth `protobuf:"varint,3,opt,name=ota,enum=v2ray.core.proxy.shadowsocks.Account_OneTimeAuth" json:"ota,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 fileDescriptor0, []int{0} }
+
+func (m *Account) GetPassword() string {
+	if m != nil {
+		return m.Password
+	}
+	return ""
+}
+
+func (m *Account) GetCipherType() CipherType {
+	if m != nil {
+		return m.CipherType
+	}
+	return CipherType_UNKNOWN
+}
+
+func (m *Account) GetOta() Account_OneTimeAuth {
+	if m != nil {
+		return m.Ota
+	}
+	return Account_Auto
+}
+
+type ServerConfig struct {
+	UdpEnabled bool                             `protobuf:"varint,1,opt,name=udp_enabled,json=udpEnabled" json:"udp_enabled,omitempty"`
+	User       *v2ray_core_common_protocol.User `protobuf:"bytes,2,opt,name=user" 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 fileDescriptor0, []int{1} }
+
+func (m *ServerConfig) GetUdpEnabled() bool {
+	if m != nil {
+		return m.UdpEnabled
+	}
+	return false
+}
+
+func (m *ServerConfig) GetUser() *v2ray_core_common_protocol.User {
+	if m != nil {
+		return m.User
+	}
+	return nil
+}
+
+type ClientConfig struct {
+	Server []*v2ray_core_common_protocol1.ServerEndpoint `protobuf:"bytes,1,rep,name=server" 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 fileDescriptor0, []int{2} }
+
+func (m *ClientConfig) GetServer() []*v2ray_core_common_protocol1.ServerEndpoint {
+	if m != nil {
+		return m.Server
+	}
+	return nil
+}
+
+func init() {
+	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")
+	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)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/shadowsocks/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 448 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x51, 0xdd, 0x6e, 0xd3, 0x4c,
+	0x14, 0xac, 0x93, 0xa8, 0xcd, 0x77, 0x36, 0x1f, 0x98, 0xbd, 0x8a, 0xa2, 0x4a, 0x58, 0xb9, 0x0a,
+	0x95, 0x58, 0xb7, 0xcb, 0x8f, 0xb8, 0x75, 0x4c, 0xaa, 0x56, 0x48, 0x69, 0xe5, 0xa4, 0x20, 0x01,
+	0x92, 0xe5, 0xae, 0x17, 0x62, 0x11, 0xfb, 0xac, 0x76, 0xed, 0x16, 0xbf, 0x12, 0x6f, 0xc6, 0x5b,
+	0x20, 0xaf, 0x93, 0x36, 0xe2, 0x22, 0xdc, 0xf9, 0x9c, 0x33, 0x33, 0x9e, 0x99, 0x85, 0x97, 0x77,
+	0x5c, 0x27, 0x35, 0x13, 0x98, 0xfb, 0x02, 0xb5, 0xf4, 0x95, 0xc6, 0x9f, 0xb5, 0x6f, 0x56, 0x49,
+	0x8a, 0xf7, 0x06, 0xc5, 0x0f, 0xe3, 0x0b, 0x2c, 0xbe, 0x65, 0xdf, 0x99, 0xd2, 0x58, 0x22, 0x3d,
+	0xde, 0xc2, 0xb5, 0x64, 0x16, 0xca, 0x76, 0xa0, 0xa3, 0x17, 0x7f, 0x89, 0x09, 0xcc, 0x73, 0x2c,
+	0x7c, 0x4b, 0x15, 0xb8, 0xf6, 0x2b, 0x23, 0x75, 0x2b, 0x34, 0x3a, 0xfd, 0x07, 0xd4, 0x48, 0x7d,
+	0x27, 0x75, 0x6c, 0x94, 0x14, 0x2d, 0x63, 0xfc, 0xdb, 0x81, 0xa3, 0x40, 0x08, 0xac, 0x8a, 0x92,
+	0x8e, 0xa0, 0xaf, 0x12, 0x63, 0xee, 0x51, 0xa7, 0x43, 0xc7, 0x73, 0x26, 0xff, 0x45, 0x0f, 0x33,
+	0xbd, 0x04, 0x22, 0x32, 0xb5, 0x92, 0x3a, 0x2e, 0x6b, 0x25, 0x87, 0x1d, 0xcf, 0x99, 0x3c, 0xe1,
+	0x13, 0xb6, 0xcf, 0x38, 0x0b, 0x2d, 0x61, 0x59, 0x2b, 0x19, 0x81, 0x78, 0xf8, 0xa6, 0x21, 0x74,
+	0xb1, 0x4c, 0x86, 0x5d, 0x2b, 0x71, 0xb6, 0x5f, 0x62, 0x63, 0x8d, 0x5d, 0x15, 0x72, 0x99, 0xe5,
+	0x32, 0xa8, 0xca, 0x55, 0xd4, 0xb0, 0xc7, 0x1c, 0xc8, 0xce, 0x8e, 0xf6, 0xa1, 0x17, 0x54, 0x25,
+	0xba, 0x07, 0x74, 0x00, 0xfd, 0xf7, 0x99, 0x49, 0x6e, 0xd7, 0x32, 0x75, 0x1d, 0x4a, 0xe0, 0x68,
+	0x56, 0xb4, 0x43, 0x67, 0x2c, 0x61, 0xb0, 0xb0, 0x05, 0x84, 0xb6, 0x7c, 0xfa, 0x1c, 0x48, 0x95,
+	0xaa, 0x58, 0xb6, 0x00, 0x1b, 0xb9, 0x1f, 0x41, 0x95, 0xaa, 0x0d, 0x85, 0xbe, 0x86, 0x5e, 0x53,
+	0xae, 0x4d, 0x4b, 0xb8, 0xb7, 0x6b, 0xb5, 0x6d, 0x96, 0x6d, 0x9b, 0x65, 0x37, 0x46, 0xea, 0xc8,
+	0xa2, 0xc7, 0x11, 0x0c, 0xc2, 0x75, 0x26, 0x8b, 0x72, 0xf3, 0x9b, 0x29, 0x1c, 0xb6, 0xbd, 0x0f,
+	0x1d, 0xaf, 0x3b, 0x21, 0xfc, 0x64, 0x9f, 0x4e, 0x6b, 0x70, 0x56, 0xa4, 0x0a, 0xb3, 0xa2, 0x8c,
+	0x36, 0xcc, 0x93, 0xaf, 0x00, 0x8f, 0x6d, 0x36, 0xa9, 0x6e, 0xe6, 0x1f, 0xe6, 0x57, 0x9f, 0xe6,
+	0xee, 0x01, 0x7d, 0x0a, 0x24, 0x98, 0x2d, 0xe2, 0x33, 0xfe, 0x2e, 0x0e, 0xcf, 0xa7, 0xae, 0xb3,
+	0x5d, 0xf0, 0x37, 0x6f, 0xed, 0xa2, 0xd3, 0x54, 0x12, 0x5e, 0x04, 0xe1, 0x45, 0xc0, 0x4f, 0xdd,
+	0x2e, 0x7d, 0x06, 0xff, 0x6f, 0xa7, 0xf8, 0x72, 0x76, 0xbe, 0x74, 0x7b, 0xd3, 0x2f, 0xe0, 0x09,
+	0xcc, 0xf7, 0xbe, 0xc4, 0x94, 0xb4, 0x69, 0xae, 0x1b, 0xa3, 0x9f, 0xc9, 0xce, 0xe5, 0x57, 0xe7,
+	0xf8, 0x23, 0x8f, 0x92, 0x9a, 0x85, 0x0d, 0xf1, 0xda, 0x12, 0x17, 0x8f, 0xe7, 0xdb, 0x43, 0x9b,
+	0xed, 0xd5, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0xb9, 0x5c, 0xee, 0x14, 0x03, 0x00, 0x00,
+}

+ 184 - 0
proxy/socks/config.pb.go

@@ -0,0 +1,184 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/socks/config.proto
+// DO NOT EDIT!
+
+/*
+Package socks is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/socks/config.proto
+
+It has these top-level messages:
+	Account
+	ServerConfig
+	ClientConfig
+*/
+package socks
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_net "v2ray.com/core/common/net"
+import v2ray_core_common_protocol1 "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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type AuthType int32
+
+const (
+	AuthType_NO_AUTH  AuthType = 0
+	AuthType_PASSWORD AuthType = 1
+)
+
+var AuthType_name = map[int32]string{
+	0: "NO_AUTH",
+	1: "PASSWORD",
+}
+var AuthType_value = map[string]int32{
+	"NO_AUTH":  0,
+	"PASSWORD": 1,
+}
+
+func (x AuthType) String() string {
+	return proto.EnumName(AuthType_name, int32(x))
+}
+func (AuthType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type Account struct {
+	Username string `protobuf:"bytes,1,opt,name=username" json:"username,omitempty"`
+	Password string `protobuf:"bytes,2,opt,name=password" json:"password,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 fileDescriptor0, []int{0} }
+
+func (m *Account) GetUsername() string {
+	if m != nil {
+		return m.Username
+	}
+	return ""
+}
+
+func (m *Account) GetPassword() string {
+	if m != nil {
+		return m.Password
+	}
+	return ""
+}
+
+type ServerConfig struct {
+	AuthType   AuthType                          `protobuf:"varint,1,opt,name=auth_type,json=authType,enum=v2ray.core.proxy.socks.AuthType" json:"auth_type,omitempty"`
+	Accounts   map[string]string                 `protobuf:"bytes,2,rep,name=accounts" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
+	Address    *v2ray_core_common_net.IPOrDomain `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"`
+	UdpEnabled bool                              `protobuf:"varint,4,opt,name=udp_enabled,json=udpEnabled" json:"udp_enabled,omitempty"`
+	Timeout    uint32                            `protobuf:"varint,5,opt,name=timeout" json:"timeout,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 fileDescriptor0, []int{1} }
+
+func (m *ServerConfig) GetAuthType() AuthType {
+	if m != nil {
+		return m.AuthType
+	}
+	return AuthType_NO_AUTH
+}
+
+func (m *ServerConfig) GetAccounts() map[string]string {
+	if m != nil {
+		return m.Accounts
+	}
+	return nil
+}
+
+func (m *ServerConfig) GetAddress() *v2ray_core_common_net.IPOrDomain {
+	if m != nil {
+		return m.Address
+	}
+	return nil
+}
+
+func (m *ServerConfig) GetUdpEnabled() bool {
+	if m != nil {
+		return m.UdpEnabled
+	}
+	return false
+}
+
+func (m *ServerConfig) GetTimeout() uint32 {
+	if m != nil {
+		return m.Timeout
+	}
+	return 0
+}
+
+type ClientConfig struct {
+	Server []*v2ray_core_common_protocol1.ServerEndpoint `protobuf:"bytes,1,rep,name=server" 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 fileDescriptor0, []int{2} }
+
+func (m *ClientConfig) GetServer() []*v2ray_core_common_protocol1.ServerEndpoint {
+	if m != nil {
+		return m.Server
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.socks.Account")
+	proto.RegisterType((*ServerConfig)(nil), "v2ray.core.proxy.socks.ServerConfig")
+	proto.RegisterType((*ClientConfig)(nil), "v2ray.core.proxy.socks.ClientConfig")
+	proto.RegisterEnum("v2ray.core.proxy.socks.AuthType", AuthType_name, AuthType_value)
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/socks/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 453 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x91, 0x41, 0x6f, 0xd3, 0x30,
+	0x14, 0xc7, 0x49, 0x4b, 0xd7, 0xec, 0xa5, 0x43, 0x95, 0x85, 0xa6, 0x28, 0x17, 0x42, 0x25, 0x44,
+	0xb4, 0x83, 0x83, 0xc2, 0x05, 0x31, 0x71, 0x48, 0xbb, 0x4a, 0xec, 0xb2, 0x56, 0xee, 0x00, 0x89,
+	0x4b, 0xe5, 0x39, 0x86, 0x45, 0x6b, 0xec, 0xc8, 0x76, 0x0a, 0xf9, 0x4a, 0x7c, 0x1c, 0x3e, 0x11,
+	0x4a, 0x9c, 0x4c, 0x63, 0xea, 0x6e, 0x7e, 0x7e, 0xff, 0xf7, 0xf7, 0xfb, 0xff, 0x0c, 0x6f, 0xf7,
+	0x89, 0xa2, 0x35, 0x66, 0xb2, 0x88, 0x99, 0x54, 0x3c, 0x2e, 0x95, 0xfc, 0x5d, 0xc7, 0x5a, 0xb2,
+	0x3b, 0x1d, 0x33, 0x29, 0x7e, 0xe4, 0x3f, 0x71, 0xa9, 0xa4, 0x91, 0xe8, 0xb4, 0x17, 0x2a, 0x8e,
+	0x5b, 0x11, 0x6e, 0x45, 0xc1, 0x63, 0x03, 0x26, 0x8b, 0x42, 0x8a, 0x58, 0x70, 0x13, 0xd3, 0x2c,
+	0x53, 0x5c, 0x6b, 0x6b, 0x10, 0xbc, 0x3b, 0x2c, 0x6c, 0x9b, 0x4c, 0xee, 0x62, 0xcd, 0xd5, 0x9e,
+	0xab, 0xad, 0x2e, 0x39, 0xb3, 0x13, 0xb3, 0x14, 0xc6, 0x29, 0x63, 0xb2, 0x12, 0x06, 0x05, 0xe0,
+	0x56, 0x9a, 0x2b, 0x41, 0x0b, 0xee, 0x3b, 0xa1, 0x13, 0x1d, 0x93, 0xfb, 0xba, 0xe9, 0x95, 0x54,
+	0xeb, 0x5f, 0x52, 0x65, 0xfe, 0xc0, 0xf6, 0xfa, 0x7a, 0xf6, 0x77, 0x00, 0x93, 0x4d, 0x6b, 0xbc,
+	0x68, 0xc3, 0xa0, 0x4f, 0x70, 0x4c, 0x2b, 0x73, 0xbb, 0x35, 0x75, 0x69, 0x9d, 0x5e, 0x24, 0x21,
+	0x3e, 0x1c, 0x0d, 0xa7, 0x95, 0xb9, 0xbd, 0xae, 0x4b, 0x4e, 0x5c, 0xda, 0x9d, 0xd0, 0x15, 0xb8,
+	0xd4, 0xae, 0xa4, 0xfd, 0x41, 0x38, 0x8c, 0xbc, 0x24, 0x79, 0x6a, 0xfa, 0xe1, 0xb3, 0xb8, 0xcb,
+	0xa1, 0x97, 0xc2, 0xa8, 0x9a, 0xdc, 0x7b, 0xa0, 0x73, 0x18, 0x77, 0x94, 0xfc, 0x61, 0xe8, 0x44,
+	0x5e, 0xf2, 0xfa, 0xa1, 0x9d, 0x45, 0x84, 0x05, 0x37, 0xf8, 0x72, 0xbd, 0x52, 0x17, 0xb2, 0xa0,
+	0xb9, 0x20, 0xfd, 0x04, 0x7a, 0x05, 0x5e, 0x95, 0x95, 0x5b, 0x2e, 0xe8, 0xcd, 0x8e, 0x67, 0xfe,
+	0xf3, 0xd0, 0x89, 0x5c, 0x02, 0x55, 0x56, 0x2e, 0xed, 0x0d, 0xf2, 0x61, 0x6c, 0xf2, 0x82, 0xcb,
+	0xca, 0xf8, 0xa3, 0xd0, 0x89, 0x4e, 0x48, 0x5f, 0x06, 0xe7, 0x70, 0xf2, 0xdf, 0x4a, 0x68, 0x0a,
+	0xc3, 0x3b, 0x5e, 0x77, 0x6c, 0x9b, 0x23, 0x7a, 0x09, 0xa3, 0x3d, 0xdd, 0x55, 0xbc, 0x63, 0x6a,
+	0x8b, 0x8f, 0x83, 0x0f, 0xce, 0x8c, 0xc0, 0x64, 0xb1, 0xcb, 0xb9, 0x30, 0x1d, 0xd3, 0x39, 0x1c,
+	0xd9, 0xcf, 0xf3, 0x9d, 0x16, 0xc9, 0xd9, 0x81, 0x0c, 0xfd, 0x37, 0x77, 0x58, 0x96, 0x22, 0x2b,
+	0x65, 0x2e, 0x0c, 0xe9, 0x26, 0xcf, 0xde, 0x80, 0xdb, 0xe3, 0x46, 0x1e, 0x8c, 0xaf, 0x56, 0xdb,
+	0xf4, 0xcb, 0xf5, 0xe7, 0xe9, 0x33, 0x34, 0x01, 0x77, 0x9d, 0x6e, 0x36, 0xdf, 0x56, 0xe4, 0x62,
+	0xea, 0xcc, 0x2f, 0x21, 0x60, 0xb2, 0x78, 0x02, 0xf9, 0xdc, 0xb3, 0x0b, 0xad, 0x9b, 0xb7, 0xbe,
+	0x8f, 0xda, 0xbb, 0x3f, 0x83, 0xd3, 0xaf, 0x09, 0xa1, 0x35, 0x5e, 0x34, 0xe2, 0x75, 0x2b, 0xde,
+	0x34, 0x8d, 0x9b, 0xa3, 0x76, 0xa5, 0xf7, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x8f, 0x57,
+	0x58, 0x02, 0x03, 0x00, 0x00,
+}

+ 91 - 0
proxy/vmess/account.pb.go

@@ -0,0 +1,91 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/vmess/account.proto
+// DO NOT EDIT!
+
+/*
+Package vmess is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/vmess/account.proto
+
+It has these top-level messages:
+	Account
+*/
+package vmess
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Account struct {
+	// ID of the account, in the form of an UUID, e.g., "66ad4540-b58c-4ad2-9926-ea63445a9b57".
+	Id string `protobuf:"bytes,1,opt,name=id" 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" json:"alter_id,omitempty"`
+	// Security settings. Only applies to client side.
+	SecuritySettings *v2ray_core_common_protocol.SecurityConfig `protobuf:"bytes,3,opt,name=security_settings,json=securitySettings" json:"security_settings,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 fileDescriptor0, []int{0} }
+
+func (m *Account) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
+func (m *Account) GetAlterId() uint32 {
+	if m != nil {
+		return m.AlterId
+	}
+	return 0
+}
+
+func (m *Account) GetSecuritySettings() *v2ray_core_common_protocol.SecurityConfig {
+	if m != nil {
+		return m.SecuritySettings
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Account)(nil), "v2ray.core.proxy.vmess.Account")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/vmess/account.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 250 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x6c, 0x8f, 0x4f, 0x4b, 0xc3, 0x30,
+	0x18, 0xc6, 0x49, 0x45, 0xa7, 0xf1, 0x0f, 0xda, 0xc3, 0xa8, 0x3b, 0x15, 0x4f, 0x45, 0xe4, 0x0d,
+	0xd4, 0x4f, 0xe0, 0x76, 0xd2, 0xd3, 0xe8, 0x60, 0x82, 0x97, 0x11, 0x93, 0x38, 0x03, 0x4b, 0xdf,
+	0xf1, 0x26, 0x1b, 0xf6, 0x43, 0xf8, 0x45, 0xfc, 0x94, 0xd2, 0xb4, 0x05, 0x91, 0x1d, 0x93, 0xfc,
+	0x9e, 0xdf, 0xf3, 0x84, 0x17, 0xfb, 0x92, 0x64, 0x03, 0x0a, 0x9d, 0x50, 0x48, 0x46, 0x6c, 0x09,
+	0xbf, 0x1a, 0xb1, 0x77, 0xc6, 0x7b, 0x21, 0x95, 0xc2, 0x5d, 0x1d, 0x60, 0x4b, 0x18, 0x30, 0x1d,
+	0x0f, 0x24, 0x19, 0x88, 0x14, 0x44, 0x6a, 0xf2, 0xf0, 0xcf, 0xa0, 0xd0, 0x39, 0xac, 0x45, 0x0c,
+	0x29, 0xdc, 0x88, 0x4f, 0x23, 0xb5, 0x21, 0xdf, 0x59, 0xee, 0xbe, 0x19, 0x1f, 0x3d, 0x75, 0xde,
+	0xf4, 0x8a, 0x27, 0x56, 0x67, 0x2c, 0x67, 0xc5, 0x59, 0x95, 0x58, 0x9d, 0xde, 0xf2, 0x53, 0xb9,
+	0x09, 0x86, 0x56, 0x56, 0x67, 0x49, 0xce, 0x8a, 0xcb, 0x6a, 0x14, 0xcf, 0xcf, 0x3a, 0x7d, 0xe5,
+	0x37, 0xde, 0xa8, 0x1d, 0xd9, 0xd0, 0xac, 0xbc, 0x09, 0xc1, 0xd6, 0x6b, 0x9f, 0x1d, 0xe5, 0xac,
+	0x38, 0x2f, 0xef, 0xe1, 0xcf, 0xb0, 0xae, 0x1c, 0x86, 0x72, 0x58, 0xf4, 0xa1, 0x19, 0xd6, 0x1f,
+	0x76, 0x5d, 0x5d, 0x0f, 0x92, 0x45, 0xef, 0x98, 0xbe, 0xf0, 0x89, 0x42, 0x07, 0x87, 0xff, 0x36,
+	0xbd, 0xe8, 0xa7, 0xce, 0x5b, 0xdf, 0xdb, 0x71, 0xbc, 0xfc, 0x49, 0xc6, 0xcb, 0xb2, 0x92, 0x0d,
+	0xcc, 0x5a, 0x7a, 0x1e, 0xe9, 0x65, 0xfb, 0xf0, 0x7e, 0x12, 0x6b, 0x1f, 0x7f, 0x03, 0x00, 0x00,
+	0xff, 0xff, 0x5d, 0x45, 0x43, 0x16, 0x54, 0x01, 0x00, 0x00,
+}

+ 135 - 0
proxy/vmess/inbound/config.pb.go

@@ -0,0 +1,135 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/vmess/inbound/config.proto
+// DO NOT EDIT!
+
+/*
+Package inbound is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/vmess/inbound/config.proto
+
+It has these top-level messages:
+	DetourConfig
+	DefaultConfig
+	Config
+*/
+package inbound
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type DetourConfig struct {
+	To string `protobuf:"bytes,1,opt,name=to" json:"to,omitempty"`
+}
+
+func (m *DetourConfig) Reset()                    { *m = DetourConfig{} }
+func (m *DetourConfig) String() string            { return proto.CompactTextString(m) }
+func (*DetourConfig) ProtoMessage()               {}
+func (*DetourConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *DetourConfig) GetTo() string {
+	if m != nil {
+		return m.To
+	}
+	return ""
+}
+
+type DefaultConfig struct {
+	AlterId uint32 `protobuf:"varint,1,opt,name=alter_id,json=alterId" json:"alter_id,omitempty"`
+	Level   uint32 `protobuf:"varint,2,opt,name=level" json:"level,omitempty"`
+}
+
+func (m *DefaultConfig) Reset()                    { *m = DefaultConfig{} }
+func (m *DefaultConfig) String() string            { return proto.CompactTextString(m) }
+func (*DefaultConfig) ProtoMessage()               {}
+func (*DefaultConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func (m *DefaultConfig) GetAlterId() uint32 {
+	if m != nil {
+		return m.AlterId
+	}
+	return 0
+}
+
+func (m *DefaultConfig) GetLevel() uint32 {
+	if m != nil {
+		return m.Level
+	}
+	return 0
+}
+
+type Config struct {
+	User    []*v2ray_core_common_protocol.User `protobuf:"bytes,1,rep,name=user" json:"user,omitempty"`
+	Default *DefaultConfig                     `protobuf:"bytes,2,opt,name=default" json:"default,omitempty"`
+	Detour  *DetourConfig                      `protobuf:"bytes,3,opt,name=detour" json:"detour,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 fileDescriptor0, []int{2} }
+
+func (m *Config) GetUser() []*v2ray_core_common_protocol.User {
+	if m != nil {
+		return m.User
+	}
+	return nil
+}
+
+func (m *Config) GetDefault() *DefaultConfig {
+	if m != nil {
+		return m.Default
+	}
+	return nil
+}
+
+func (m *Config) GetDetour() *DetourConfig {
+	if m != nil {
+		return m.Detour
+	}
+	return nil
+}
+
+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", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 302 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x90, 0xcf, 0x4e, 0x83, 0x40,
+	0x10, 0xc6, 0x03, 0xd5, 0xa2, 0x8b, 0xf5, 0x40, 0x3c, 0xa0, 0x07, 0x42, 0x38, 0xd5, 0x44, 0x77,
+	0x13, 0xf4, 0x01, 0x4c, 0x4b, 0x62, 0x7a, 0x6b, 0x36, 0xb1, 0x07, 0x3d, 0x18, 0xba, 0x6c, 0x0d,
+	0x09, 0x30, 0xcd, 0xb2, 0x10, 0x79, 0x25, 0xdf, 0xc5, 0x77, 0x32, 0xcc, 0x42, 0xfc, 0x73, 0xb0,
+	0xc7, 0x99, 0x7c, 0xbf, 0x6f, 0xbe, 0x6f, 0x08, 0x6b, 0x63, 0x95, 0x76, 0x54, 0x40, 0xc9, 0x04,
+	0x28, 0xc9, 0xf6, 0x0a, 0xde, 0x3b, 0xd6, 0x96, 0xb2, 0xae, 0x59, 0x5e, 0x6d, 0xa1, 0xa9, 0x32,
+	0x26, 0xa0, 0xda, 0xe5, 0x6f, 0x74, 0xaf, 0x40, 0x83, 0x17, 0x8c, 0x80, 0x92, 0x14, 0xc5, 0x14,
+	0xc5, 0x74, 0x10, 0x5f, 0x5d, 0xff, 0x31, 0x14, 0x50, 0x96, 0x50, 0x31, 0x84, 0x05, 0x14, 0xac,
+	0xa9, 0xa5, 0x32, 0x56, 0x51, 0x40, 0xce, 0x12, 0xa9, 0xa1, 0x51, 0x4b, 0x3c, 0xe0, 0x9d, 0x13,
+	0x5b, 0x83, 0x6f, 0x85, 0xd6, 0xfc, 0x94, 0xdb, 0x1a, 0xa2, 0x07, 0x32, 0x4b, 0xe4, 0x2e, 0x6d,
+	0x0a, 0x3d, 0x08, 0x2e, 0xc9, 0x49, 0x5a, 0x68, 0xa9, 0x5e, 0xf3, 0x0c, 0x65, 0x33, 0xee, 0xe0,
+	0xbc, 0xca, 0xbc, 0x0b, 0x72, 0x5c, 0xc8, 0x56, 0x16, 0xbe, 0x8d, 0x7b, 0x33, 0x44, 0x9f, 0x16,
+	0x99, 0x0e, 0xec, 0x3d, 0x39, 0xea, 0x4f, 0xfb, 0x56, 0x38, 0x99, 0xbb, 0x71, 0x48, 0x7f, 0xd4,
+	0x30, 0x11, 0xe9, 0x18, 0x91, 0x3e, 0xd5, 0x52, 0x71, 0x54, 0x7b, 0x8f, 0xc4, 0xc9, 0x4c, 0x04,
+	0x34, 0x76, 0xe3, 0x5b, 0xfa, 0x7f, 0x7f, 0xfa, 0x2b, 0x31, 0x1f, 0x69, 0x2f, 0x21, 0xd3, 0x0c,
+	0xbb, 0xfa, 0x13, 0xf4, 0xb9, 0x39, 0xec, 0xf3, 0xfd, 0x19, 0x3e, 0xb0, 0x8b, 0x17, 0x12, 0x09,
+	0x28, 0x0f, 0xa0, 0x0b, 0xd7, 0x50, 0xeb, 0xbe, 0xcf, 0xb3, 0x33, 0x6c, 0x3f, 0xec, 0x60, 0x13,
+	0xf3, 0xb4, 0xa3, 0xcb, 0x1e, 0x5b, 0x23, 0xb6, 0x41, 0x6c, 0x65, 0x04, 0xdb, 0x29, 0x3e, 0xe0,
+	0xee, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x49, 0x28, 0x20, 0xa9, 0x13, 0x02, 0x00, 0x00,
+}

+ 70 - 0
proxy/vmess/outbound/config.pb.go

@@ -0,0 +1,70 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/proxy/vmess/outbound/config.proto
+// DO NOT EDIT!
+
+/*
+Package outbound is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/proxy/vmess/outbound/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package outbound
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_protocol1 "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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+	Receiver []*v2ray_core_common_protocol1.ServerEndpoint `protobuf:"bytes,1,rep,name=Receiver" json:"Receiver,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetReceiver() []*v2ray_core_common_protocol1.ServerEndpoint {
+	if m != nil {
+		return m.Receiver
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.proxy.vmess.outbound.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/proxy/vmess/outbound/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 213 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x8e, 0xb1, 0x4a, 0xc4, 0x40,
+	0x10, 0x86, 0x51, 0xe1, 0x38, 0xf6, 0xba, 0xab, 0xc4, 0xe6, 0x44, 0x1b, 0xb1, 0x98, 0x95, 0xf8,
+	0x06, 0x77, 0x68, 0x6b, 0x88, 0x90, 0xc2, 0x42, 0x49, 0x26, 0xa3, 0x04, 0xdc, 0x9d, 0x65, 0x36,
+	0x59, 0xcc, 0x2b, 0xf9, 0x94, 0x92, 0x89, 0x2b, 0x62, 0x63, 0x3b, 0x7c, 0xdf, 0xf7, 0x8f, 0xb9,
+	0x49, 0x85, 0x34, 0x13, 0x20, 0x3b, 0x8b, 0x2c, 0x64, 0x83, 0xf0, 0xc7, 0x64, 0x93, 0xa3, 0x18,
+	0x2d, 0x8f, 0x43, 0xcb, 0xa3, 0xef, 0x2c, 0xb2, 0x7f, 0xed, 0xdf, 0x20, 0x08, 0x0f, 0xbc, 0xdd,
+	0x65, 0x43, 0x08, 0x94, 0x06, 0xa5, 0x21, 0xd3, 0x67, 0x7f, 0x93, 0xc8, 0xce, 0xb1, 0xb7, 0x6a,
+	0x23, 0xbf, 0xdb, 0x48, 0x92, 0x48, 0x5e, 0x62, 0x20, 0x5c, 0x92, 0x17, 0xa5, 0x59, 0x1d, 0x74,
+	0x62, 0x7b, 0x6f, 0xd6, 0x15, 0x21, 0xf5, 0x89, 0xe4, 0xf4, 0xe8, 0xfc, 0xe4, 0x6a, 0x53, 0x5c,
+	0xc3, 0xaf, 0xbd, 0x25, 0x05, 0x39, 0x05, 0x8f, 0x9a, 0xba, 0xf3, 0x5d, 0xe0, 0xde, 0x0f, 0xd5,
+	0x8f, 0xbb, 0x7f, 0x36, 0x97, 0xc8, 0x0e, 0xfe, 0x79, 0x75, 0xbf, 0x59, 0x66, 0xcb, 0xb9, 0xf7,
+	0xb4, 0xce, 0xe7, 0xcf, 0xe3, 0x5d, 0x5d, 0x54, 0xcd, 0x04, 0x87, 0x59, 0x2c, 0x55, 0xac, 0x55,
+	0x7c, 0xf8, 0x26, 0xda, 0x95, 0xbe, 0x70, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff, 0x51, 0x8a, 0x44,
+	0x99, 0x3f, 0x01, 0x00, 0x00,
+}

+ 0 - 0
tools/geoip/geoip_data.go → tools/geoip/geoip.generated.go


+ 0 - 2
tools/geoip/geoip.go

@@ -1,5 +1,3 @@
-// +build fullgen
-
 package geoip
 
 //go:generate go run geoip_gen.go

+ 66 - 0
tools/geoip/geoip.pb.go

@@ -0,0 +1,66 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/tools/geoip/geoip.proto
+// DO NOT EDIT!
+
+/*
+Package geoip is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/tools/geoip/geoip.proto
+
+It has these top-level messages:
+	CountryIPRange
+*/
+package geoip
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_app_router "v2ray.com/core/app/router"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type CountryIPRange struct {
+	Ips []*v2ray_core_app_router.CIDR `protobuf:"bytes,1,rep,name=ips" json:"ips,omitempty"`
+}
+
+func (m *CountryIPRange) Reset()                    { *m = CountryIPRange{} }
+func (m *CountryIPRange) String() string            { return proto.CompactTextString(m) }
+func (*CountryIPRange) ProtoMessage()               {}
+func (*CountryIPRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *CountryIPRange) GetIps() []*v2ray_core_app_router.CIDR {
+	if m != nil {
+		return m.Ips
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CountryIPRange)(nil), "v2ray.core.tools.geoip.CountryIPRange")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/tools/geoip/geoip.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 155 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x2b, 0x33, 0x2a, 0x4a,
+	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0xc9, 0xcf, 0xcf, 0x29,
+	0xd6, 0x4f, 0x4f, 0xcd, 0xcf, 0x2c, 0x80, 0x90, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x62,
+	0x30, 0x75, 0x45, 0xa9, 0x7a, 0x60, 0x35, 0x7a, 0x60, 0x59, 0x29, 0x74, 0xfd, 0x89, 0x05, 0x05,
+	0xfa, 0x45, 0xf9, 0xa5, 0x25, 0xa9, 0x45, 0xfa, 0xc9, 0xf9, 0x79, 0x69, 0x99, 0xe9, 0x10, 0xfd,
+	0x4a, 0xf6, 0x5c, 0x7c, 0xce, 0xf9, 0xa5, 0x79, 0x25, 0x45, 0x95, 0x9e, 0x01, 0x41, 0x89, 0x79,
+	0xe9, 0xa9, 0x42, 0xba, 0x5c, 0xcc, 0x99, 0x05, 0xc5, 0x12, 0x8c, 0x0a, 0xcc, 0x1a, 0xdc, 0x46,
+	0xd2, 0x7a, 0x48, 0xe6, 0x27, 0x16, 0x14, 0xe8, 0x41, 0xcc, 0xd0, 0x73, 0xf6, 0x74, 0x09, 0x0a,
+	0x02, 0xa9, 0x73, 0x62, 0x8f, 0x62, 0x05, 0xdb, 0x98, 0xc4, 0x06, 0x36, 0xd0, 0x18, 0x10, 0x00,
+	0x00, 0xff, 0xff, 0xf8, 0x02, 0xe8, 0xc0, 0xba, 0x00, 0x00, 0x00,
+}

+ 1 - 1
tools/geoip/geoip_gen.go

@@ -69,7 +69,7 @@ func main() {
 		log.Fatalf("Failed to marshal country IPs: %v", err)
 	}
 
-	file, err := os.OpenFile("geoip_data.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
+	file, err := os.OpenFile("geoip.generated.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
 	if err != nil {
 		log.Fatalf("Failed to generate geoip_data.go: %v", err)
 	}

+ 69 - 0
transport/config.pb.go

@@ -0,0 +1,69 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/config.proto
+// DO NOT EDIT!
+
+/*
+Package transport is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package transport
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_transport_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Global transport settings. This affects all type of connections that go through V2Ray.
+type Config struct {
+	NetworkSettings []*v2ray_core_transport_internet.NetworkSettings `protobuf:"bytes,1,rep,name=network_settings,json=networkSettings" json:"network_settings,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetNetworkSettings() []*v2ray_core_transport_internet.NetworkSettings {
+	if m != nil {
+		return m.NetworkSettings
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.transport.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/transport/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 180 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x64, 0x2e, 0x36, 0x67, 0x30, 0x5f, 0x28,
+	0x92, 0x4b, 0x20, 0x2f, 0xb5, 0xa4, 0x3c, 0xbf, 0x28, 0x3b, 0xbe, 0x38, 0xb5, 0xa4, 0x24, 0x33,
+	0x2f, 0xbd, 0x58, 0x82, 0x51, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x4f, 0x0f, 0x9b, 0x55, 0x7a, 0x30,
+	0x03, 0xf5, 0xfc, 0x20, 0xda, 0x82, 0xa1, 0xba, 0x82, 0xf8, 0xf3, 0x50, 0x05, 0x9c, 0x3c, 0xb9,
+	0x24, 0x92, 0xf3, 0x73, 0xb1, 0x9a, 0xe2, 0xc4, 0x0d, 0xb1, 0x3e, 0x00, 0xe4, 0x9a, 0x28, 0x4e,
+	0xb8, 0xf8, 0x2a, 0x26, 0x91, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0xf2, 0x10, 0x98,
+	0x70, 0x12, 0x1b, 0xd8, 0xd9, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xde, 0xf9, 0x7b,
+	0x25, 0x01, 0x00, 0x00,
+}

+ 151 - 0
transport/internet/config.pb.go

@@ -0,0 +1,151 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/config.proto
+// DO NOT EDIT!
+
+/*
+Package internet is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/config.proto
+
+It has these top-level messages:
+	NetworkSettings
+	StreamConfig
+	ProxyConfig
+*/
+package internet
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_net "v2ray.com/core/common/net"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type NetworkSettings struct {
+	// Type of network that this settings supports.
+	Network v2ray_core_common_net.Network `protobuf:"varint,1,opt,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
+	// Specific settings.
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
+}
+
+func (m *NetworkSettings) Reset()                    { *m = NetworkSettings{} }
+func (m *NetworkSettings) String() string            { return proto.CompactTextString(m) }
+func (*NetworkSettings) ProtoMessage()               {}
+func (*NetworkSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *NetworkSettings) GetNetwork() v2ray_core_common_net.Network {
+	if m != nil {
+		return m.Network
+	}
+	return v2ray_core_common_net.Network_Unknown
+}
+
+func (m *NetworkSettings) GetSettings() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.Settings
+	}
+	return nil
+}
+
+type StreamConfig struct {
+	// Effective network.
+	Network         v2ray_core_common_net.Network `protobuf:"varint,1,opt,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
+	NetworkSettings []*NetworkSettings            `protobuf:"bytes,2,rep,name=network_settings,json=networkSettings" json:"network_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" json:"security_type,omitempty"`
+	SecuritySettings []*v2ray_core_common_serial.TypedMessage `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings" json:"security_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 fileDescriptor0, []int{1} }
+
+func (m *StreamConfig) GetNetwork() v2ray_core_common_net.Network {
+	if m != nil {
+		return m.Network
+	}
+	return v2ray_core_common_net.Network_Unknown
+}
+
+func (m *StreamConfig) GetNetworkSettings() []*NetworkSettings {
+	if m != nil {
+		return m.NetworkSettings
+	}
+	return nil
+}
+
+func (m *StreamConfig) GetSecurityType() string {
+	if m != nil {
+		return m.SecurityType
+	}
+	return ""
+}
+
+func (m *StreamConfig) GetSecuritySettings() []*v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.SecuritySettings
+	}
+	return nil
+}
+
+type ProxyConfig struct {
+	Tag string `protobuf:"bytes,1,opt,name=tag" json:"tag,omitempty"`
+}
+
+func (m *ProxyConfig) Reset()                    { *m = ProxyConfig{} }
+func (m *ProxyConfig) String() string            { return proto.CompactTextString(m) }
+func (*ProxyConfig) ProtoMessage()               {}
+func (*ProxyConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+
+func (m *ProxyConfig) GetTag() string {
+	if m != nil {
+		return m.Tag
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*NetworkSettings)(nil), "v2ray.core.transport.internet.NetworkSettings")
+	proto.RegisterType((*StreamConfig)(nil), "v2ray.core.transport.internet.StreamConfig")
+	proto.RegisterType((*ProxyConfig)(nil), "v2ray.core.transport.internet.ProxyConfig")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/transport/internet/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 344 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x92, 0xcf, 0x4a, 0xc3, 0x40,
+	0x10, 0xc6, 0x49, 0x2b, 0xda, 0x6e, 0xab, 0xad, 0x39, 0x95, 0x42, 0xb5, 0x56, 0xd0, 0x9c, 0x26,
+	0x12, 0x2f, 0x9e, 0xdb, 0x93, 0x87, 0x8a, 0xa4, 0x45, 0xd0, 0x4b, 0x59, 0xe3, 0x18, 0x82, 0x66,
+	0xb7, 0xec, 0x8e, 0x7f, 0xf2, 0x14, 0x3e, 0x81, 0x2f, 0xe0, 0x53, 0x4a, 0x92, 0xdd, 0x50, 0x4a,
+	0x29, 0x82, 0xb7, 0x21, 0xf9, 0xe6, 0xcb, 0x6f, 0x7e, 0x84, 0xc1, 0x7b, 0xa0, 0x78, 0x06, 0x91,
+	0x4c, 0xfd, 0x48, 0x2a, 0xf4, 0x49, 0x71, 0xa1, 0x97, 0x52, 0x91, 0x9f, 0x08, 0x42, 0x25, 0x90,
+	0xfc, 0x48, 0x8a, 0xe7, 0x24, 0x86, 0xa5, 0x92, 0x24, 0xdd, 0x81, 0xcd, 0x2b, 0x84, 0x2a, 0x0b,
+	0x36, 0xdb, 0x3f, 0x5f, 0xab, 0x8b, 0x64, 0x9a, 0x4a, 0xe1, 0xe7, 0x35, 0x02, 0xe9, 0x43, 0xaa,
+	0x97, 0xb2, 0xa7, 0x7f, 0xb1, 0x39, 0xa8, 0x51, 0x25, 0xfc, 0xd5, 0xa7, 0x6c, 0x89, 0x4f, 0x8b,
+	0x14, 0xb5, 0xe6, 0x31, 0x96, 0x1b, 0xa3, 0x2f, 0x87, 0x75, 0x6e, 0xca, 0x8e, 0x19, 0x12, 0x25,
+	0x22, 0xd6, 0xee, 0x15, 0xdb, 0x33, 0xb5, 0x3d, 0x67, 0xe8, 0x78, 0x07, 0xc1, 0x11, 0xac, 0xf0,
+	0x95, 0x9d, 0x20, 0x90, 0xc0, 0x2c, 0x86, 0x36, 0xee, 0x8e, 0x59, 0x43, 0x9b, 0x96, 0x5e, 0x6d,
+	0xe8, 0x78, 0xad, 0xe0, 0x6c, 0xc3, 0x6a, 0x89, 0x03, 0xf3, 0x1c, 0x67, 0x5a, 0xd2, 0x84, 0xd5,
+	0xde, 0xe8, 0xbb, 0xc6, 0xda, 0x33, 0x52, 0xc8, 0xd3, 0x49, 0xa1, 0xe8, 0x1f, 0x38, 0xf7, 0xac,
+	0x6b, 0xc6, 0xc5, 0x0a, 0x56, 0xdd, 0x6b, 0x05, 0x00, 0x5b, 0x8d, 0xc3, 0x9a, 0x92, 0xb0, 0x23,
+	0xd6, 0x1c, 0x9d, 0xb2, 0x7d, 0x8d, 0xd1, 0x9b, 0x4a, 0x28, 0x5b, 0xe4, 0x5e, 0x7b, 0xf5, 0xa1,
+	0xe3, 0x35, 0xc3, 0xb6, 0x7d, 0x98, 0x1f, 0xe7, 0xce, 0xd8, 0x61, 0x15, 0xaa, 0x00, 0x76, 0x0a,
+	0x80, 0xbf, 0x7a, 0xe9, 0xda, 0x02, 0xfb, 0xe5, 0xd1, 0x31, 0x6b, 0xdd, 0x2a, 0xf9, 0x99, 0x19,
+	0x3b, 0x5d, 0x56, 0x27, 0x1e, 0x17, 0x66, 0x9a, 0x61, 0x3e, 0x8e, 0xa7, 0xec, 0x24, 0x92, 0xe9,
+	0xf6, 0x03, 0x1f, 0x1a, 0x76, 0xfa, 0xa9, 0x0d, 0xee, 0x82, 0x90, 0x67, 0x30, 0xc9, 0x93, 0xf3,
+	0x2a, 0x79, 0x6d, 0xde, 0x3f, 0xee, 0x16, 0x3f, 0xca, 0xe5, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x5e, 0x2e, 0x73, 0x09, 0xd4, 0x02, 0x00, 0x00,
+}

+ 265 - 0
transport/internet/headers/http/config.pb.go

@@ -0,0 +1,265 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/headers/http/config.proto
+// DO NOT EDIT!
+
+/*
+Package http is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/headers/http/config.proto
+
+It has these top-level messages:
+	Header
+	Version
+	Method
+	RequestConfig
+	Status
+	ResponseConfig
+	Config
+*/
+package http
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Header struct {
+	// "Accept", "Cookie", etc
+	Name string `protobuf:"bytes,1,opt,name=name" 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" 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 fileDescriptor0, []int{0} }
+
+func (m *Header) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Header) GetValue() []string {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// HTTP version. Default value "1.1".
+type Version struct {
+	Value string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *Version) Reset()                    { *m = Version{} }
+func (m *Version) String() string            { return proto.CompactTextString(m) }
+func (*Version) ProtoMessage()               {}
+func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func (m *Version) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+// HTTP method. Default value "GET".
+type Method struct {
+	Value string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *Method) Reset()                    { *m = Method{} }
+func (m *Method) String() string            { return proto.CompactTextString(m) }
+func (*Method) ProtoMessage()               {}
+func (*Method) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+
+func (m *Method) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+type RequestConfig struct {
+	// Full HTTP version like "1.1".
+	Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"`
+	// GET, POST, CONNECT etc
+	Method *Method `protobuf:"bytes,2,opt,name=method" json:"method,omitempty"`
+	// URI like "/login.php"
+	Uri    []string  `protobuf:"bytes,3,rep,name=uri" json:"uri,omitempty"`
+	Header []*Header `protobuf:"bytes,4,rep,name=header" 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 fileDescriptor0, []int{3} }
+
+func (m *RequestConfig) GetVersion() *Version {
+	if m != nil {
+		return m.Version
+	}
+	return nil
+}
+
+func (m *RequestConfig) GetMethod() *Method {
+	if m != nil {
+		return m.Method
+	}
+	return nil
+}
+
+func (m *RequestConfig) GetUri() []string {
+	if m != nil {
+		return m.Uri
+	}
+	return nil
+}
+
+func (m *RequestConfig) GetHeader() []*Header {
+	if m != nil {
+		return m.Header
+	}
+	return nil
+}
+
+type Status struct {
+	// Status code. Default "200".
+	Code string `protobuf:"bytes,1,opt,name=code" json:"code,omitempty"`
+	// Statue reason. Default "OK".
+	Reason string `protobuf:"bytes,2,opt,name=reason" 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 fileDescriptor0, []int{4} }
+
+func (m *Status) GetCode() string {
+	if m != nil {
+		return m.Code
+	}
+	return ""
+}
+
+func (m *Status) GetReason() string {
+	if m != nil {
+		return m.Reason
+	}
+	return ""
+}
+
+type ResponseConfig struct {
+	Version *Version  `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"`
+	Status  *Status   `protobuf:"bytes,2,opt,name=status" json:"status,omitempty"`
+	Header  []*Header `protobuf:"bytes,3,rep,name=header" json:"header,omitempty"`
+}
+
+func (m *ResponseConfig) Reset()                    { *m = ResponseConfig{} }
+func (m *ResponseConfig) String() string            { return proto.CompactTextString(m) }
+func (*ResponseConfig) ProtoMessage()               {}
+func (*ResponseConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
+
+func (m *ResponseConfig) GetVersion() *Version {
+	if m != nil {
+		return m.Version
+	}
+	return nil
+}
+
+func (m *ResponseConfig) GetStatus() *Status {
+	if m != nil {
+		return m.Status
+	}
+	return nil
+}
+
+func (m *ResponseConfig) GetHeader() []*Header {
+	if m != nil {
+		return m.Header
+	}
+	return nil
+}
+
+type Config struct {
+	// 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" 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" 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 fileDescriptor0, []int{6} }
+
+func (m *Config) GetRequest() *RequestConfig {
+	if m != nil {
+		return m.Request
+	}
+	return nil
+}
+
+func (m *Config) GetResponse() *ResponseConfig {
+	if m != nil {
+		return m.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", fileDescriptor0)
+}
+
+var fileDescriptor0 = []byte{
+	// 399 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x94, 0x4f, 0x6b, 0xdb, 0x30,
+	0x18, 0xc6, 0xb1, 0x9d, 0x39, 0xcb, 0x1b, 0x36, 0x86, 0x18, 0xc3, 0xa7, 0x2d, 0xf8, 0x14, 0x72,
+	0x90, 0xc1, 0xd9, 0x65, 0xdb, 0x2d, 0xb9, 0x64, 0x85, 0x40, 0x51, 0x4a, 0x0e, 0xbd, 0xa9, 0x8e,
+	0xda, 0x18, 0x1a, 0xc9, 0x95, 0xe4, 0x40, 0xbe, 0x41, 0x3f, 0x4b, 0xef, 0xfd, 0x6c, 0xbd, 0x16,
+	0xfd, 0xb1, 0x9b, 0x1e, 0x0a, 0x75, 0x4b, 0x6f, 0xef, 0x6b, 0xbf, 0xcf, 0x8f, 0xf7, 0x79, 0x2c,
+	0x19, 0xfe, 0xed, 0x73, 0x49, 0x0f, 0xb8, 0x10, 0xbb, 0xac, 0x10, 0x92, 0x65, 0x5a, 0x52, 0xae,
+	0x2a, 0x21, 0x75, 0x56, 0x72, 0xcd, 0x24, 0x67, 0x3a, 0xdb, 0x32, 0xba, 0x61, 0x52, 0x65, 0x5b,
+	0xad, 0xab, 0xac, 0x10, 0xfc, 0xb2, 0xbc, 0xc2, 0x95, 0x14, 0x5a, 0xa0, 0x49, 0x23, 0x96, 0x0c,
+	0xb7, 0x42, 0xdc, 0x08, 0xb1, 0x17, 0x62, 0x23, 0x4c, 0x73, 0x88, 0x17, 0xb6, 0x47, 0x08, 0x7a,
+	0x9c, 0xee, 0x58, 0x12, 0x8c, 0x82, 0xf1, 0x80, 0xd8, 0x1a, 0x7d, 0x87, 0x4f, 0x7b, 0x7a, 0x5d,
+	0xb3, 0x24, 0x1c, 0x45, 0xe3, 0x01, 0x71, 0x4d, 0xfa, 0x0b, 0xfa, 0x6b, 0x26, 0x55, 0x29, 0xf8,
+	0xd3, 0x80, 0x53, 0xf9, 0x81, 0x9f, 0x10, 0x2f, 0x99, 0xde, 0x8a, 0xcd, 0x0b, 0xef, 0x6f, 0x43,
+	0xf8, 0x42, 0xd8, 0x4d, 0xcd, 0x94, 0x9e, 0xdb, 0xc5, 0xd1, 0x12, 0xfa, 0x7b, 0x87, 0xb4, 0x93,
+	0xc3, 0x7c, 0x8a, 0x5f, 0x6f, 0x02, 0xfb, 0x6d, 0x48, 0xc3, 0x40, 0x27, 0x10, 0xef, 0xec, 0x02,
+	0x49, 0x68, 0x69, 0x79, 0x17, 0x9a, 0x5b, 0x9d, 0x78, 0x02, 0xfa, 0x06, 0x51, 0x2d, 0xcb, 0x24,
+	0xb2, 0x09, 0x98, 0xd2, 0xd0, 0x9d, 0x20, 0xe9, 0x8d, 0xa2, 0xae, 0x74, 0x97, 0x36, 0xf1, 0x84,
+	0xf4, 0x37, 0xc4, 0x2b, 0x4d, 0x75, 0xad, 0x4c, 0xfe, 0x85, 0xd8, 0xb4, 0xf9, 0x9b, 0x1a, 0xfd,
+	0x80, 0x58, 0x32, 0xaa, 0x04, 0xb7, 0x3e, 0x06, 0xc4, 0x77, 0xe9, 0x43, 0x00, 0x5f, 0x09, 0x53,
+	0x95, 0xe0, 0x8a, 0x7d, 0x58, 0x82, 0xca, 0xee, 0xf5, 0x96, 0x04, 0x9d, 0x23, 0xe2, 0x09, 0x47,
+	0x79, 0x45, 0xef, 0xce, 0xeb, 0x3e, 0x80, 0xd8, 0x3b, 0x5e, 0x41, 0x5f, 0xba, 0x43, 0xe4, 0x1d,
+	0xff, 0xe9, 0xc2, 0x7d, 0x76, 0xfe, 0x48, 0x43, 0x42, 0x6b, 0xf8, 0x2c, 0x7d, 0xb0, 0xde, 0xf9,
+	0xdf, 0x6e, 0xd4, 0xe3, 0x8f, 0x42, 0x5a, 0xd6, 0xac, 0x02, 0x73, 0x99, 0x3b, 0xa0, 0x66, 0x43,
+	0xc7, 0x38, 0x35, 0x57, 0xfa, 0xbc, 0x67, 0x1e, 0xdd, 0x85, 0x93, 0x75, 0x4e, 0xe8, 0x01, 0xcf,
+	0x8d, 0xfe, 0xac, 0xd5, 0xff, 0x6f, 0xf4, 0x0b, 0xaf, 0x5f, 0x68, 0x5d, 0x5d, 0xc4, 0xf6, 0x67,
+	0x30, 0x7d, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x30, 0x13, 0xcf, 0x4b, 0x04, 0x00, 0x00,
+}

+ 59 - 0
transport/internet/headers/noop/config.pb.go

@@ -0,0 +1,59 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/headers/noop/config.proto
+// DO NOT EDIT!
+
+/*
+Package noop is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/headers/noop/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package noop
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+}
+
+func (m *Config) Reset()                    { *m = Config{} }
+func (m *Config) String() string            { return proto.CompactTextString(m) }
+func (*Config) ProtoMessage()               {}
+func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.headers.noop.Config")
+}
+
+func init() {
+	proto.RegisterFile("v2ray.com/core/transport/internet/headers/noop/config.proto", fileDescriptor0)
+}
+
+var fileDescriptor0 = []byte{
+	// 160 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0xcf, 0x48,
+	0x4d, 0x4c, 0x49, 0x2d, 0x2a, 0xd6, 0xcf, 0xcb, 0xcf, 0x2f, 0xd0, 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, 0x83, 0x6a, 0xd4, 0x03, 0x69, 0x54, 0xe2, 0xe0, 0x62, 0x73, 0x06, 0xeb,
+	0x75, 0x2a, 0xe0, 0x02, 0x59, 0xa7, 0x47, 0xbc, 0x5e, 0x27, 0x6e, 0x88, 0xce, 0x00, 0x90, 0xa5,
+	0x51, 0x2c, 0x20, 0xa1, 0x55, 0x4c, 0x5a, 0x61, 0x46, 0x41, 0x89, 0x95, 0x7a, 0xce, 0x20, 0xfd,
+	0x21, 0x70, 0xfd, 0x9e, 0x30, 0xfd, 0x1e, 0x50, 0xfd, 0x7e, 0xf9, 0xf9, 0x05, 0x49, 0x6c, 0x60,
+	0xe7, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x89, 0x52, 0x33, 0x81, 0xed, 0x00, 0x00, 0x00,
+}

+ 114 - 0
transport/internet/headers/srtp/config.pb.go

@@ -0,0 +1,114 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/headers/srtp/config.proto
+// DO NOT EDIT!
+
+/*
+Package srtp is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/headers/srtp/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package srtp
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+	Version     uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"`
+	Padding     bool   `protobuf:"varint,2,opt,name=padding" json:"padding,omitempty"`
+	Extension   bool   `protobuf:"varint,3,opt,name=extension" json:"extension,omitempty"`
+	CsrcCount   uint32 `protobuf:"varint,4,opt,name=csrc_count,json=csrcCount" json:"csrc_count,omitempty"`
+	Marker      bool   `protobuf:"varint,5,opt,name=marker" json:"marker,omitempty"`
+	PayloadType uint32 `protobuf:"varint,6,opt,name=payload_type,json=payloadType" json:"payload_type,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetVersion() uint32 {
+	if m != nil {
+		return m.Version
+	}
+	return 0
+}
+
+func (m *Config) GetPadding() bool {
+	if m != nil {
+		return m.Padding
+	}
+	return false
+}
+
+func (m *Config) GetExtension() bool {
+	if m != nil {
+		return m.Extension
+	}
+	return false
+}
+
+func (m *Config) GetCsrcCount() uint32 {
+	if m != nil {
+		return m.CsrcCount
+	}
+	return 0
+}
+
+func (m *Config) GetMarker() bool {
+	if m != nil {
+		return m.Marker
+	}
+	return false
+}
+
+func (m *Config) GetPayloadType() uint32 {
+	if m != nil {
+		return m.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", fileDescriptor0)
+}
+
+var fileDescriptor0 = []byte{
+	// 264 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0xd0, 0xb1, 0x4f, 0x03, 0x21,
+	0x14, 0x06, 0xf0, 0x5c, 0xad, 0xa7, 0xa5, 0xba, 0x30, 0x18, 0x06, 0x4d, 0xaa, 0x53, 0xd3, 0x01,
+	0x92, 0x3a, 0xba, 0xb5, 0x8b, 0x6e, 0xe6, 0x6c, 0x1c, 0x5c, 0x1a, 0xe4, 0x9e, 0xf5, 0xa2, 0x05,
+	0xf2, 0x78, 0x36, 0xf2, 0x2f, 0x39, 0xfb, 0x07, 0x1a, 0xf0, 0xa8, 0xab, 0xe3, 0xf7, 0x91, 0x1f,
+	0xc9, 0xfb, 0xd8, 0xcd, 0x6e, 0x8e, 0x3a, 0x4a, 0xe3, 0xb6, 0xca, 0x38, 0x04, 0x45, 0xa8, 0x6d,
+	0xf0, 0x0e, 0x49, 0x75, 0x96, 0x00, 0x2d, 0x90, 0x7a, 0x05, 0xdd, 0x02, 0x06, 0x15, 0x90, 0xbc,
+	0x32, 0xce, 0xbe, 0x74, 0x1b, 0xe9, 0xd1, 0x91, 0xe3, 0xb3, 0x82, 0x11, 0xe4, 0x1e, 0xca, 0x02,
+	0x65, 0x0f, 0x65, 0x82, 0x57, 0xdf, 0x15, 0xab, 0x97, 0x19, 0x73, 0xc1, 0x8e, 0x76, 0x80, 0xa1,
+	0x73, 0x56, 0x54, 0x93, 0x6a, 0x7a, 0xda, 0x94, 0x98, 0x5e, 0xbc, 0x6e, 0xdb, 0xce, 0x6e, 0xc4,
+	0x60, 0x52, 0x4d, 0x8f, 0x9b, 0x12, 0xf9, 0x39, 0x1b, 0xc1, 0x27, 0x81, 0xcd, 0xea, 0x20, 0xbf,
+	0xfd, 0x15, 0xfc, 0x82, 0x31, 0x13, 0xd0, 0xac, 0x8d, 0xfb, 0xb0, 0x24, 0x86, 0xf9, 0xd3, 0x51,
+	0x6a, 0x96, 0xa9, 0xe0, 0x67, 0xac, 0xde, 0x6a, 0x7c, 0x03, 0x14, 0x87, 0x59, 0xf6, 0x89, 0x5f,
+	0xb2, 0x13, 0xaf, 0xe3, 0xbb, 0xd3, 0xed, 0x9a, 0xa2, 0x07, 0x51, 0x67, 0x38, 0xee, 0xbb, 0x55,
+	0xf4, 0xb0, 0xf0, 0x2c, 0x6d, 0x23, 0xff, 0x7f, 0xe8, 0x62, 0xfc, 0x7b, 0xe5, 0x7d, 0x5a, 0xe8,
+	0x69, 0x98, 0xaa, 0xaf, 0xc1, 0xec, 0x71, 0xde, 0xe8, 0x28, 0x97, 0xc9, 0xaf, 0xf6, 0xfe, 0xae,
+	0xf8, 0xdb, 0xde, 0x3f, 0x20, 0xf9, 0xe7, 0x3a, 0x6f, 0x7b, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff,
+	0xd5, 0x92, 0x8f, 0x21, 0x9a, 0x01, 0x00, 0x00,
+}

+ 69 - 0
transport/internet/headers/utp/config.pb.go

@@ -0,0 +1,69 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/headers/utp/config.proto
+// DO NOT EDIT!
+
+/*
+Package utp is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/headers/utp/config.proto
+
+It has these top-level messages:
+	Config
+*/
+package utp
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Config struct {
+	Version uint32 `protobuf:"varint,1,opt,name=version" json:"version,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 fileDescriptor0, []int{0} }
+
+func (m *Config) GetVersion() uint32 {
+	if m != nil {
+		return m.Version
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.headers.utp.Config")
+}
+
+func init() {
+	proto.RegisterFile("v2ray.com/core/transport/internet/headers/utp/config.proto", fileDescriptor0)
+}
+
+var fileDescriptor0 = []byte{
+	// 182 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 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, 0x72, 0xb9, 0x74, 0x93, 0xf3, 0x73, 0xf5, 0x88, 0x36, 0xd4, 0x89,
+	0x1b, 0x62, 0x64, 0x00, 0xc8, 0x31, 0x51, 0xcc, 0xa5, 0x25, 0x05, 0xab, 0x98, 0x34, 0xc3, 0x8c,
+	0x82, 0x12, 0x2b, 0xf5, 0x9c, 0x41, 0xba, 0x43, 0xe0, 0xba, 0x3d, 0x61, 0xba, 0x3d, 0xa0, 0xba,
+	0x43, 0x4b, 0x0a, 0x92, 0xd8, 0xc0, 0x9e, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x91, 0x1b,
+	0x92, 0x61, 0x02, 0x01, 0x00, 0x00,
+}

+ 283 - 0
transport/internet/kcp/config.pb.go

@@ -0,0 +1,283 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/kcp/config.proto
+// DO NOT EDIT!
+
+/*
+Package kcp is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/kcp/config.proto
+
+It has these top-level messages:
+	MTU
+	TTI
+	UplinkCapacity
+	DownlinkCapacity
+	WriteBuffer
+	ReadBuffer
+	ConnectionReuse
+	Config
+*/
+package kcp
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Maximum Transmission Unit, in bytes.
+type MTU struct {
+	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *MTU) Reset()                    { *m = MTU{} }
+func (m *MTU) String() string            { return proto.CompactTextString(m) }
+func (*MTU) ProtoMessage()               {}
+func (*MTU) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *MTU) GetValue() uint32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+// Transmission Time Interview, in milli-sec.
+type TTI struct {
+	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *TTI) Reset()                    { *m = TTI{} }
+func (m *TTI) String() string            { return proto.CompactTextString(m) }
+func (*TTI) ProtoMessage()               {}
+func (*TTI) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func (m *TTI) GetValue() uint32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+// Uplink capacity, in MB.
+type UplinkCapacity struct {
+	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *UplinkCapacity) Reset()                    { *m = UplinkCapacity{} }
+func (m *UplinkCapacity) String() string            { return proto.CompactTextString(m) }
+func (*UplinkCapacity) ProtoMessage()               {}
+func (*UplinkCapacity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+
+func (m *UplinkCapacity) GetValue() uint32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+// Downlink capacity, in MB.
+type DownlinkCapacity struct {
+	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
+}
+
+func (m *DownlinkCapacity) Reset()                    { *m = DownlinkCapacity{} }
+func (m *DownlinkCapacity) String() string            { return proto.CompactTextString(m) }
+func (*DownlinkCapacity) ProtoMessage()               {}
+func (*DownlinkCapacity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
+
+func (m *DownlinkCapacity) GetValue() uint32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+type WriteBuffer struct {
+	// Buffer size in bytes.
+	Size uint32 `protobuf:"varint,1,opt,name=size" 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 fileDescriptor0, []int{4} }
+
+func (m *WriteBuffer) GetSize() uint32 {
+	if m != nil {
+		return m.Size
+	}
+	return 0
+}
+
+type ReadBuffer struct {
+	// Buffer size in bytes.
+	Size uint32 `protobuf:"varint,1,opt,name=size" 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 fileDescriptor0, []int{5} }
+
+func (m *ReadBuffer) GetSize() uint32 {
+	if m != nil {
+		return m.Size
+	}
+	return 0
+}
+
+type ConnectionReuse struct {
+	Enable bool `protobuf:"varint,1,opt,name=enable" json:"enable,omitempty"`
+}
+
+func (m *ConnectionReuse) Reset()                    { *m = ConnectionReuse{} }
+func (m *ConnectionReuse) String() string            { return proto.CompactTextString(m) }
+func (*ConnectionReuse) ProtoMessage()               {}
+func (*ConnectionReuse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
+
+func (m *ConnectionReuse) GetEnable() bool {
+	if m != nil {
+		return m.Enable
+	}
+	return false
+}
+
+type Config struct {
+	Mtu              *MTU                                   `protobuf:"bytes,1,opt,name=mtu" json:"mtu,omitempty"`
+	Tti              *TTI                                   `protobuf:"bytes,2,opt,name=tti" json:"tti,omitempty"`
+	UplinkCapacity   *UplinkCapacity                        `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity" json:"uplink_capacity,omitempty"`
+	DownlinkCapacity *DownlinkCapacity                      `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity" json:"downlink_capacity,omitempty"`
+	Congestion       bool                                   `protobuf:"varint,5,opt,name=congestion" json:"congestion,omitempty"`
+	WriteBuffer      *WriteBuffer                           `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer" json:"write_buffer,omitempty"`
+	ReadBuffer       *ReadBuffer                            `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer" json:"read_buffer,omitempty"`
+	HeaderConfig     *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,8,opt,name=header_config,json=headerConfig" json:"header_config,omitempty"`
+	ConnectionReuse  *ConnectionReuse                       `protobuf:"bytes,9,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,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 fileDescriptor0, []int{7} }
+
+func (m *Config) GetMtu() *MTU {
+	if m != nil {
+		return m.Mtu
+	}
+	return nil
+}
+
+func (m *Config) GetTti() *TTI {
+	if m != nil {
+		return m.Tti
+	}
+	return nil
+}
+
+func (m *Config) GetUplinkCapacity() *UplinkCapacity {
+	if m != nil {
+		return m.UplinkCapacity
+	}
+	return nil
+}
+
+func (m *Config) GetDownlinkCapacity() *DownlinkCapacity {
+	if m != nil {
+		return m.DownlinkCapacity
+	}
+	return nil
+}
+
+func (m *Config) GetCongestion() bool {
+	if m != nil {
+		return m.Congestion
+	}
+	return false
+}
+
+func (m *Config) GetWriteBuffer() *WriteBuffer {
+	if m != nil {
+		return m.WriteBuffer
+	}
+	return nil
+}
+
+func (m *Config) GetReadBuffer() *ReadBuffer {
+	if m != nil {
+		return m.ReadBuffer
+	}
+	return nil
+}
+
+func (m *Config) GetHeaderConfig() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.HeaderConfig
+	}
+	return nil
+}
+
+func (m *Config) GetConnectionReuse() *ConnectionReuse {
+	if m != nil {
+		return m.ConnectionReuse
+	}
+	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", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 491 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x6f, 0xd3, 0x30,
+	0x18, 0xd4, 0xd6, 0xad, 0x8c, 0x2f, 0xdb, 0x5a, 0x22, 0x84, 0x22, 0x90, 0xd0, 0x5a, 0x89, 0x69,
+	0x3c, 0xe0, 0x40, 0xf6, 0xc2, 0x73, 0xcb, 0x4b, 0x35, 0x15, 0x81, 0x95, 0x82, 0x34, 0x69, 0x0a,
+	0xae, 0xf3, 0xb5, 0x44, 0x6d, 0xec, 0xc8, 0x71, 0x56, 0x95, 0xff, 0x08, 0xfe, 0x4a, 0x64, 0xa7,
+	0xe9, 0x2f, 0x34, 0x96, 0xb7, 0xd8, 0xbe, 0x3b, 0x5b, 0xf7, 0xdd, 0x05, 0x82, 0xfb, 0x40, 0xb1,
+	0x25, 0xe1, 0x32, 0xf5, 0xb9, 0x54, 0xe8, 0x6b, 0xc5, 0x44, 0x9e, 0x49, 0xa5, 0xfd, 0x44, 0x68,
+	0x54, 0x02, 0xb5, 0x3f, 0xe3, 0x99, 0xcf, 0xa5, 0x98, 0x24, 0x53, 0x92, 0x29, 0xa9, 0xa5, 0xdb,
+	0xa9, 0x38, 0x0a, 0xc9, 0x1a, 0x4f, 0x2a, 0x3c, 0x99, 0xf1, 0xec, 0xe5, 0xfb, 0x3d, 0x59, 0x2e,
+	0xd3, 0x54, 0x0a, 0x3f, 0x47, 0x95, 0xb0, 0xb9, 0xaf, 0x97, 0x19, 0xc6, 0x51, 0x8a, 0x79, 0xce,
+	0xa6, 0x58, 0x8a, 0x76, 0x5f, 0x41, 0x63, 0x18, 0x8e, 0xdc, 0xe7, 0x70, 0x7c, 0xcf, 0xe6, 0x05,
+	0x7a, 0x07, 0x17, 0x07, 0x57, 0x67, 0xb4, 0x5c, 0x98, 0xc3, 0x30, 0x1c, 0x3c, 0x70, 0x78, 0x09,
+	0xe7, 0xa3, 0x6c, 0x9e, 0x88, 0x59, 0x9f, 0x65, 0x8c, 0x27, 0x7a, 0xf9, 0x00, 0xee, 0x0a, 0xda,
+	0x9f, 0xe4, 0x42, 0xd4, 0x40, 0x76, 0xc0, 0xf9, 0xae, 0x12, 0x8d, 0xbd, 0x62, 0x32, 0x41, 0xe5,
+	0xba, 0x70, 0x94, 0x27, 0xbf, 0x2a, 0x8c, 0xfd, 0xee, 0x5e, 0x00, 0x50, 0x64, 0xf1, 0x7f, 0x10,
+	0x6f, 0xa1, 0xd5, 0x97, 0x42, 0x20, 0xd7, 0x89, 0x14, 0x14, 0x8b, 0x1c, 0xdd, 0x17, 0xd0, 0x44,
+	0xc1, 0xc6, 0xf3, 0x12, 0x78, 0x42, 0x57, 0xab, 0xee, 0xef, 0x63, 0x68, 0xf6, 0xad, 0xc3, 0xee,
+	0x47, 0x68, 0xa4, 0xba, 0xb0, 0xe7, 0x4e, 0x70, 0x49, 0x1e, 0x75, 0x9a, 0x0c, 0xc3, 0x11, 0x35,
+	0x14, 0xc3, 0xd4, 0x3a, 0xf1, 0x0e, 0x6b, 0x33, 0xc3, 0x70, 0x40, 0x0d, 0xc5, 0xbd, 0x85, 0x56,
+	0x61, 0x0d, 0x8c, 0xf8, 0xca, 0x17, 0xaf, 0x61, 0x55, 0x3e, 0xd4, 0x50, 0xd9, 0xb5, 0x9e, 0x9e,
+	0x17, 0xbb, 0xa3, 0xf8, 0x01, 0xcf, 0xe2, 0x95, 0xe9, 0x1b, 0xf5, 0x23, 0xab, 0x7e, 0x5d, 0x43,
+	0x7d, 0x7f, 0x60, 0xb4, 0x1d, 0xef, 0x8f, 0xf0, 0x35, 0x00, 0x97, 0x62, 0x8a, 0xb9, 0xf1, 0xd9,
+	0x3b, 0xb6, 0xc6, 0x6e, 0xed, 0xb8, 0x5f, 0xe1, 0x74, 0x61, 0x86, 0x19, 0x8d, 0xed, 0xac, 0xbc,
+	0xa6, 0xbd, 0x9c, 0xd4, 0xb8, 0x7c, 0x2b, 0x03, 0xd4, 0x59, 0x6c, 0x05, 0xe2, 0x33, 0x38, 0x0a,
+	0x59, 0x5c, 0x29, 0x3e, 0xb1, 0x8a, 0xef, 0x6a, 0x28, 0x6e, 0x22, 0x43, 0x41, 0x6d, 0xe2, 0x73,
+	0x03, 0x67, 0x3f, 0x91, 0xc5, 0xa8, 0xa2, 0xb2, 0x67, 0xde, 0xc9, 0xbf, 0x43, 0x2c, 0x1b, 0x44,
+	0xca, 0x06, 0x91, 0xd0, 0x34, 0x68, 0x58, 0x16, 0x88, 0x9e, 0x96, 0xe4, 0x55, 0x82, 0xee, 0xa0,
+	0xcd, 0xd7, 0xb9, 0x8b, 0x94, 0x09, 0x9e, 0xf7, 0xd4, 0xea, 0x05, 0x35, 0x5e, 0xb8, 0x17, 0x59,
+	0xda, 0xe2, 0xbb, 0x1b, 0xbd, 0x3b, 0x78, 0xc3, 0x65, 0xfa, 0xb8, 0x52, 0xcf, 0x29, 0xdf, 0xf3,
+	0xc5, 0xb4, 0xfb, 0xb6, 0x31, 0xe3, 0xd9, 0x9f, 0xc3, 0xce, 0xb7, 0x80, 0xb2, 0x25, 0xe9, 0x1b,
+	0x56, 0xb8, 0x66, 0x0d, 0x2a, 0xd6, 0x0d, 0xcf, 0xc6, 0x4d, 0xfb, 0x37, 0xb8, 0xfe, 0x1b, 0x00,
+	0x00, 0xff, 0xff, 0x77, 0xae, 0x78, 0x3a, 0x98, 0x04, 0x00, 0x00,
+}

+ 100 - 0
transport/internet/tcp/config.pb.go

@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/tcp/config.proto
+// DO NOT EDIT!
+
+/*
+Package tcp is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/tcp/config.proto
+
+It has these top-level messages:
+	ConnectionReuse
+	Config
+*/
+package tcp
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import v2ray_core_common_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
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type ConnectionReuse struct {
+	Enable bool `protobuf:"varint,1,opt,name=enable" json:"enable,omitempty"`
+}
+
+func (m *ConnectionReuse) Reset()                    { *m = ConnectionReuse{} }
+func (m *ConnectionReuse) String() string            { return proto.CompactTextString(m) }
+func (*ConnectionReuse) ProtoMessage()               {}
+func (*ConnectionReuse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *ConnectionReuse) GetEnable() bool {
+	if m != nil {
+		return m.Enable
+	}
+	return false
+}
+
+type Config struct {
+	ConnectionReuse *ConnectionReuse                       `protobuf:"bytes,1,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,omitempty"`
+	HeaderSettings  *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=header_settings,json=headerSettings" json:"header_settings,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 fileDescriptor0, []int{1} }
+
+func (m *Config) GetConnectionReuse() *ConnectionReuse {
+	if m != nil {
+		return m.ConnectionReuse
+	}
+	return nil
+}
+
+func (m *Config) GetHeaderSettings() *v2ray_core_common_serial.TypedMessage {
+	if m != nil {
+		return m.HeaderSettings
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ConnectionReuse)(nil), "v2ray.core.transport.internet.tcp.ConnectionReuse")
+	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.tcp.Config")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/transport/internet/tcp/config.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 277 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0xc3, 0x40,
+	0x10, 0x86, 0x69, 0x85, 0x22, 0x5b, 0x30, 0x92, 0x83, 0x14, 0x4f, 0xb6, 0xa0, 0xe8, 0x65, 0x57,
+	0xe2, 0x1b, 0x34, 0x27, 0x0f, 0xa2, 0xc4, 0xe0, 0x41, 0x28, 0x61, 0x3b, 0x1d, 0x63, 0xa0, 0xd9,
+	0x59, 0x76, 0x47, 0x21, 0xaf, 0xe4, 0x13, 0xf8, 0x78, 0x92, 0x6c, 0x13, 0x24, 0x97, 0x1e, 0x17,
+	0xfe, 0xef, 0xdf, 0xff, 0x1b, 0x91, 0x7c, 0x27, 0x4e, 0x37, 0x12, 0xa8, 0x56, 0x40, 0x0e, 0x15,
+	0x3b, 0x6d, 0xbc, 0x25, 0xc7, 0xaa, 0x32, 0x8c, 0xce, 0x20, 0x2b, 0x06, 0xab, 0x80, 0xcc, 0x47,
+	0x55, 0x4a, 0xeb, 0x88, 0x29, 0x5e, 0xf6, 0x8c, 0x43, 0x39, 0xe4, 0x65, 0x9f, 0x97, 0x0c, 0xf6,
+	0xf2, 0x7e, 0x54, 0x0b, 0x54, 0xd7, 0x64, 0x94, 0x47, 0x57, 0xe9, 0xbd, 0xe2, 0xc6, 0xe2, 0xae,
+	0xa8, 0xd1, 0x7b, 0x5d, 0x62, 0x28, 0x5d, 0xdd, 0x89, 0x28, 0x25, 0x63, 0x10, 0xb8, 0x22, 0x93,
+	0xe1, 0x97, 0xc7, 0xf8, 0x42, 0xcc, 0xd0, 0xe8, 0xed, 0x1e, 0x17, 0x93, 0xab, 0xc9, 0xed, 0x69,
+	0x76, 0x78, 0xad, 0x7e, 0x27, 0x62, 0x96, 0x76, 0x83, 0xe2, 0x8d, 0x38, 0x87, 0x81, 0x2a, 0x5c,
+	0x8b, 0x75, 0xe1, 0x79, 0x92, 0xc8, 0xa3, 0x2b, 0xe5, 0xe8, 0xc3, 0x2c, 0x82, 0xd1, 0x82, 0x67,
+	0x11, 0x7d, 0xa2, 0xde, 0xa1, 0x2b, 0x3c, 0x32, 0x57, 0xa6, 0xf4, 0x8b, 0x69, 0xd7, 0x7e, 0xf3,
+	0xbf, 0x3d, 0xc8, 0xc9, 0x20, 0x27, 0xf3, 0x56, 0xee, 0x29, 0xb8, 0x65, 0x67, 0x01, 0x7f, 0x3d,
+	0xd0, 0xeb, 0x8d, 0xb8, 0x06, 0xaa, 0x8f, 0x4f, 0x5b, 0xcf, 0x83, 0xe0, 0x4b, 0x7b, 0x9b, 0xf7,
+	0x13, 0x06, 0xfb, 0x33, 0x5d, 0xbe, 0x25, 0x99, 0x6e, 0x64, 0xda, 0x52, 0xf9, 0x40, 0x3d, 0xf6,
+	0x54, 0x0e, 0x76, 0x3b, 0xeb, 0x6e, 0xf9, 0xf0, 0x17, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x15, 0xa3,
+	0xb6, 0xd6, 0x01, 0x00, 0x00,
+}

+ 119 - 0
transport/internet/tls/config.pb.go

@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/tls/config.proto
+// DO NOT EDIT!
+
+/*
+Package tls is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/tls/config.proto
+
+It has these top-level messages:
+	Certificate
+	Config
+*/
+package tls
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type Certificate struct {
+	// 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"`
+}
+
+func (m *Certificate) Reset()                    { *m = Certificate{} }
+func (m *Certificate) String() string            { return proto.CompactTextString(m) }
+func (*Certificate) ProtoMessage()               {}
+func (*Certificate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *Certificate) GetCertificate() []byte {
+	if m != nil {
+		return m.Certificate
+	}
+	return nil
+}
+
+func (m *Certificate) GetKey() []byte {
+	if m != nil {
+		return m.Key
+	}
+	return nil
+}
+
+type Config struct {
+	// Whether or not to allow self-signed certificates.
+	AllowInsecure bool `protobuf:"varint,1,opt,name=allow_insecure,json=allowInsecure" json:"allow_insecure,omitempty"`
+	// List of certificates to be served on server.
+	Certificate []*Certificate `protobuf:"bytes,2,rep,name=certificate" json:"certificate,omitempty"`
+	// Override server name.
+	ServerName string `protobuf:"bytes,3,opt,name=server_name,json=serverName" json:"server_name,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 fileDescriptor0, []int{1} }
+
+func (m *Config) GetAllowInsecure() bool {
+	if m != nil {
+		return m.AllowInsecure
+	}
+	return false
+}
+
+func (m *Config) GetCertificate() []*Certificate {
+	if m != nil {
+		return m.Certificate
+	}
+	return nil
+}
+
+func (m *Config) GetServerName() string {
+	if m != nil {
+		return m.ServerName
+	}
+	return ""
+}
+
+func init() {
+	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", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 261 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4b, 0xc3, 0x30,
+	0x14, 0xc6, 0x69, 0x0b, 0x43, 0x53, 0x15, 0xe9, 0xa9, 0x37, 0xbb, 0xc1, 0xa0, 0xa7, 0x04, 0xea,
+	0x5f, 0xe0, 0x7a, 0x1a, 0x82, 0x8c, 0x30, 0x3c, 0x08, 0x32, 0x62, 0x78, 0x93, 0x40, 0x9a, 0x8c,
+	0x97, 0xe7, 0xa4, 0xff, 0x8e, 0x47, 0xff, 0x4a, 0x69, 0x6b, 0x47, 0x77, 0xda, 0x2d, 0xf9, 0xf2,
+	0xfd, 0xde, 0xf7, 0xf2, 0xb1, 0xea, 0x58, 0xa1, 0x6a, 0xb9, 0xf6, 0x8d, 0xd0, 0x1e, 0x41, 0x10,
+	0x2a, 0x17, 0x0e, 0x1e, 0x49, 0x18, 0x47, 0x80, 0x0e, 0x48, 0x90, 0x0d, 0x42, 0x7b, 0xb7, 0x37,
+	0x9f, 0xfc, 0x80, 0x9e, 0x7c, 0x36, 0x1f, 0x19, 0x04, 0x7e, 0xf2, 0xf3, 0xd1, 0xcf, 0xc9, 0x86,
+	0xc5, 0x13, 0x4b, 0x6b, 0x40, 0x32, 0x7b, 0xa3, 0x15, 0x41, 0x56, 0x9c, 0x5d, 0xf3, 0xa8, 0x88,
+	0xca, 0x1b, 0x79, 0xe6, 0xb8, 0x67, 0xc9, 0x33, 0xb4, 0x79, 0xdc, 0xbf, 0x74, 0xc7, 0xc5, 0x4f,
+	0xc4, 0x66, 0x75, 0x1f, 0x9b, 0x2d, 0xd9, 0x9d, 0xb2, 0xd6, 0x7f, 0xef, 0x8c, 0x0b, 0xa0, 0xbf,
+	0x70, 0x98, 0x70, 0x25, 0x6f, 0x7b, 0x75, 0xfd, 0x2f, 0x66, 0x1b, 0x96, 0xea, 0x49, 0x4a, 0x5c,
+	0x24, 0x65, 0x5a, 0x71, 0x7e, 0x71, 0x5b, 0x3e, 0x59, 0x44, 0x4e, 0x47, 0x64, 0x0f, 0x2c, 0x0d,
+	0x80, 0x47, 0xc0, 0x9d, 0x53, 0x0d, 0xe4, 0x49, 0x11, 0x95, 0xd7, 0x92, 0x0d, 0xd2, 0x8b, 0x6a,
+	0x60, 0xf5, 0xce, 0x96, 0xda, 0x37, 0x97, 0x23, 0x56, 0xe9, 0xf0, 0x95, 0x4d, 0x57, 0xe0, 0x5b,
+	0x42, 0x36, 0xfc, 0xc6, 0xf3, 0xd7, 0x4a, 0xaa, 0x96, 0xd7, 0x1d, 0xb5, 0x3d, 0x51, 0xeb, 0x91,
+	0xda, 0xda, 0xf0, 0x31, 0xeb, 0x0b, 0x7f, 0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xb5, 0xeb, 0x52,
+	0x64, 0xa6, 0x01, 0x00, 0x00,
+}

+ 100 - 0
transport/internet/websocket/config.pb.go

@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/transport/internet/websocket/config.proto
+// DO NOT EDIT!
+
+/*
+Package websocket is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/transport/internet/websocket/config.proto
+
+It has these top-level messages:
+	ConnectionReuse
+	Config
+*/
+package websocket
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// 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.ProtoPackageIsVersion2 // please upgrade the proto package
+
+type ConnectionReuse struct {
+	Enable bool `protobuf:"varint,1,opt,name=enable" json:"enable,omitempty"`
+}
+
+func (m *ConnectionReuse) Reset()                    { *m = ConnectionReuse{} }
+func (m *ConnectionReuse) String() string            { return proto.CompactTextString(m) }
+func (*ConnectionReuse) ProtoMessage()               {}
+func (*ConnectionReuse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *ConnectionReuse) GetEnable() bool {
+	if m != nil {
+		return m.Enable
+	}
+	return false
+}
+
+type Config struct {
+	// Whether or not to reuse WebSocket connections.
+	ConnectionReuse *ConnectionReuse `protobuf:"bytes,1,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,omitempty"`
+	// URL path to the WebSocket service. Empty value means root(/).
+	Path string `protobuf:"bytes,2,opt,name=path" json:"path,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 fileDescriptor0, []int{1} }
+
+func (m *Config) GetConnectionReuse() *ConnectionReuse {
+	if m != nil {
+		return m.ConnectionReuse
+	}
+	return nil
+}
+
+func (m *Config) GetPath() string {
+	if m != nil {
+		return m.Path
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ConnectionReuse)(nil), "v2ray.core.transport.internet.websocket.ConnectionReuse")
+	proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.websocket.Config")
+}
+
+func init() {
+	proto.RegisterFile("v2ray.com/core/transport/internet/websocket/config.proto", fileDescriptor0)
+}
+
+var fileDescriptor0 = []byte{
+	// 233 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x90, 0xb1, 0x4a, 0x03, 0x41,
+	0x10, 0x86, 0xb9, 0x20, 0x87, 0xd9, 0x14, 0x91, 0x2b, 0x24, 0x65, 0x48, 0x93, 0x88, 0xb0, 0x0b,
+	0x67, 0x93, 0x3a, 0x57, 0xd9, 0xc9, 0x22, 0x0a, 0x36, 0xb2, 0x37, 0x8c, 0x7a, 0x68, 0x66, 0x8e,
+	0xb9, 0x51, 0x49, 0xe9, 0xeb, 0xf8, 0x94, 0x72, 0x67, 0x76, 0x8b, 0x54, 0xd7, 0xed, 0x0e, 0xf3,
+	0xfd, 0xdf, 0xf0, 0x9b, 0xed, 0x57, 0x29, 0xe1, 0x60, 0x81, 0xf7, 0x0e, 0x58, 0xd0, 0xa9, 0x04,
+	0xea, 0x5a, 0x16, 0x75, 0x0d, 0x29, 0x0a, 0xa1, 0xba, 0x6f, 0xac, 0x3b, 0x86, 0x77, 0x54, 0x07,
+	0x4c, 0x2f, 0xcd, 0xab, 0x6d, 0x85, 0x95, 0x8b, 0x75, 0x24, 0x05, 0x6d, 0xa2, 0x6c, 0xa4, 0x6c,
+	0xa2, 0x56, 0x57, 0x66, 0x5e, 0x31, 0x11, 0x82, 0x36, 0x4c, 0x1e, 0x3f, 0x3b, 0x2c, 0x2e, 0x4d,
+	0x8e, 0x14, 0xea, 0x0f, 0x5c, 0x64, 0xcb, 0x6c, 0x73, 0xee, 0x8f, 0xbf, 0xd5, 0x4f, 0x66, 0xf2,
+	0x6a, 0x90, 0x14, 0x60, 0x2e, 0x20, 0x51, 0xcf, 0xd2, 0x63, 0xc3, 0xf2, 0xac, 0xdc, 0xda, 0x91,
+	0x66, 0x7b, 0xa2, 0xf5, 0x73, 0x38, 0xb9, 0xa3, 0x30, 0x67, 0x6d, 0xd0, 0xb7, 0xc5, 0x64, 0x99,
+	0x6d, 0xa6, 0x7e, 0x78, 0xef, 0xd8, 0x5c, 0x03, 0xef, 0xc7, 0x3a, 0x76, 0xb3, 0xff, 0x7b, 0xef,
+	0xfa, 0x4e, 0x9e, 0xa6, 0x69, 0xfe, 0x3b, 0x59, 0x3f, 0x94, 0x3e, 0x1c, 0x6c, 0xd5, 0x27, 0xdc,
+	0xa7, 0x84, 0xdb, 0x98, 0xf0, 0x18, 0x37, 0xeb, 0x7c, 0xe8, 0xf3, 0xe6, 0x2f, 0x00, 0x00, 0xff,
+	0xff, 0x62, 0x54, 0x39, 0x72, 0x8b, 0x01, 0x00, 0x00,
+}