1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-27 01:45:23 +00:00

separate network and transport protocol

This commit is contained in:
Darien Raymond 2017-01-12 12:54:34 +01:00
parent f9b3a1446a
commit d24fe9dbfb
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
41 changed files with 261 additions and 321 deletions

View File

@ -26,7 +26,7 @@ func TestProxyDial(t *testing.T) {
common.Must(outboundManager.SetHandler("tag", freedom.New(&freedom.Config{}, space, &proxy.OutboundHandlerMeta{ common.Must(outboundManager.SetHandler("tag", freedom.New(&freedom.Config{}, space, &proxy.OutboundHandlerMeta{
Tag: "tag", Tag: "tag",
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}, },
}))) })))
@ -49,7 +49,7 @@ func TestProxyDial(t *testing.T) {
conn, err := proxy.Dial(v2net.LocalHostIP, dest, internet.DialerOptions{ conn, err := proxy.Dial(v2net.LocalHostIP, dest, internet.DialerOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}, },
Proxy: &internet.ProxyConfig{ Proxy: &internet.ProxyConfig{
Tag: "tag", Tag: "tag",

View File

@ -13,10 +13,6 @@ func ParseNetwork(nwStr string) Network {
return Network_TCP return Network_TCP
case "udp": case "udp":
return Network_UDP return Network_UDP
case "kcp":
return Network_KCP
case "ws":
return Network_WebSocket
default: default:
return Network_Unknown return Network_Unknown
} }
@ -32,7 +28,7 @@ func (v Network) SystemString() string {
switch v { switch v {
case Network_TCP: case Network_TCP:
return "tcp" return "tcp"
case Network_UDP, Network_KCP: case Network_UDP:
return "udp" return "udp"
default: default:
return "unknown" return "unknown"
@ -45,10 +41,6 @@ func (v Network) URLPrefix() string {
return "tcp" return "tcp"
case Network_UDP: case Network_UDP:
return "udp" return "udp"
case Network_KCP:
return "kcp"
case Network_WebSocket:
return "ws"
default: default:
return "unknown" return "unknown"
} }

View File

@ -16,10 +16,8 @@ const (
// Native TCP provided by system. // Native TCP provided by system.
Network_RawTCP Network = 1 Network_RawTCP Network = 1
// V2Ray specific TCP. // V2Ray specific TCP.
Network_TCP Network = 2 Network_TCP Network = 2
Network_UDP Network = 3 Network_UDP Network = 3
Network_KCP Network = 4
Network_WebSocket Network = 5
) )
var Network_name = map[int32]string{ var Network_name = map[int32]string{
@ -27,16 +25,12 @@ var Network_name = map[int32]string{
1: "RawTCP", 1: "RawTCP",
2: "TCP", 2: "TCP",
3: "UDP", 3: "UDP",
4: "KCP",
5: "WebSocket",
} }
var Network_value = map[string]int32{ var Network_value = map[string]int32{
"Unknown": 0, "Unknown": 0,
"RawTCP": 1, "RawTCP": 1,
"TCP": 2, "TCP": 2,
"UDP": 3, "UDP": 3,
"KCP": 4,
"WebSocket": 5,
} }
func (x Network) String() string { func (x Network) String() string {
@ -68,20 +62,18 @@ func init() {
func init() { proto.RegisterFile("v2ray.com/core/common/net/network.proto", fileDescriptor2) } func init() { proto.RegisterFile("v2ray.com/core/common/net/network.proto", fileDescriptor2) }
var fileDescriptor2 = []byte{ var fileDescriptor2 = []byte{
// 225 bytes of a gzipped FileDescriptorProto // 203 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x2f, 0x33, 0x2a, 0x4a, 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, 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, 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, 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, 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, 0x46, 0x05, 0x66, 0x0d, 0x3e, 0x23, 0x39, 0x3d, 0xac, 0xfa, 0xf4, 0xa0, 0x9a, 0x82, 0x60, 0xca,
0xb5, 0x02, 0xb8, 0xd8, 0xa1, 0x62, 0x42, 0xdc, 0x5c, 0xec, 0xa1, 0x79, 0xd9, 0x79, 0xf9, 0xe5, 0xb5, 0x2c, 0xb8, 0xd8, 0xa1, 0x62, 0x42, 0xdc, 0x5c, 0xec, 0xa1, 0x79, 0xd9, 0x79, 0xf9, 0xe5,
0x79, 0x02, 0x0c, 0x42, 0x7c, 0x5c, 0x6c, 0x41, 0x89, 0xe5, 0x21, 0xce, 0x01, 0x02, 0x8c, 0x52, 0x79, 0x02, 0x0c, 0x42, 0x7c, 0x5c, 0x6c, 0x41, 0x89, 0xe5, 0x21, 0xce, 0x01, 0x02, 0x8c, 0x52,
0x4c, 0x1c, 0x8c, 0x42, 0xec, 0x5c, 0xcc, 0x20, 0x0e, 0x13, 0x88, 0x11, 0xea, 0x12, 0x20, 0xc0, 0x4c, 0x1c, 0x8c, 0x42, 0xec, 0x5c, 0xcc, 0x20, 0x0e, 0x13, 0x88, 0x11, 0xea, 0x12, 0x20, 0xc0,
0x0c, 0x62, 0x78, 0x3b, 0x07, 0x08, 0xb0, 0x08, 0xf1, 0x72, 0x71, 0x86, 0xa7, 0x26, 0x05, 0xe7, 0xec, 0xe4, 0xc6, 0x25, 0x99, 0x9c, 0x9f, 0x8b, 0xdd, 0x1e, 0x27, 0x1e, 0xa8, 0xa1, 0x01, 0x20,
0x27, 0x67, 0xa7, 0x96, 0x08, 0xb0, 0x3a, 0xb9, 0x71, 0x49, 0x26, 0xe7, 0xe7, 0x62, 0xb7, 0xdf, 0x4f, 0x44, 0x31, 0xe7, 0xa5, 0x96, 0xac, 0x62, 0x12, 0x0d, 0x33, 0x0a, 0x4a, 0xac, 0xd4, 0x73,
0x89, 0x07, 0x6a, 0x59, 0x00, 0xc8, 0x73, 0x51, 0xcc, 0x79, 0xa9, 0x25, 0xab, 0x98, 0x44, 0xc3, 0x06, 0x29, 0x75, 0x86, 0x28, 0xf5, 0x4b, 0x2d, 0x49, 0x62, 0x03, 0x7b, 0xd4, 0x18, 0x10, 0x00,
0x8c, 0x82, 0x12, 0x2b, 0xf5, 0x9c, 0x41, 0x4a, 0x9d, 0x21, 0x4a, 0xfd, 0x52, 0x4b, 0x92, 0xd8, 0x00, 0xff, 0xff, 0x3c, 0x17, 0x32, 0x51, 0x13, 0x01, 0x00, 0x00,
0xc0, 0x01, 0x60, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x45, 0xf9, 0x86, 0x63, 0x2b, 0x01, 0x00,
0x00,
} }

View File

@ -16,12 +16,8 @@ enum Network {
TCP = 2; TCP = 2;
UDP = 3; UDP = 3;
KCP = 4;
WebSocket = 5;
} }
message NetworkList { message NetworkList {
repeated Network network = 1; repeated Network network = 1;
} }

View File

@ -3,7 +3,7 @@ package protocol
import proto "github.com/golang/protobuf/proto" import proto "github.com/golang/protobuf/proto"
import fmt "fmt" import fmt "fmt"
import math "math" import math "math"
import v2ray_core_common_net1 "v2ray.com/core/common/net" import v2ray_core_common_net "v2ray.com/core/common/net"
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal var _ = proto.Marshal
@ -11,9 +11,9 @@ var _ = fmt.Errorf
var _ = math.Inf var _ = math.Inf
type ServerEndpoint struct { type ServerEndpoint struct {
Address *v2ray_core_common_net1.IPOrDomain `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` 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"` Port uint32 `protobuf:"varint,2,opt,name=port" json:"port,omitempty"`
User []*User `protobuf:"bytes,3,rep,name=user" json:"user,omitempty"` User []*User `protobuf:"bytes,3,rep,name=user" json:"user,omitempty"`
} }
func (m *ServerEndpoint) Reset() { *m = ServerEndpoint{} } func (m *ServerEndpoint) Reset() { *m = ServerEndpoint{} }
@ -21,7 +21,7 @@ func (m *ServerEndpoint) String() string { return proto.CompactTextSt
func (*ServerEndpoint) ProtoMessage() {} func (*ServerEndpoint) ProtoMessage() {}
func (*ServerEndpoint) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} } func (*ServerEndpoint) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} }
func (m *ServerEndpoint) GetAddress() *v2ray_core_common_net1.IPOrDomain { func (m *ServerEndpoint) GetAddress() *v2ray_core_common_net.IPOrDomain {
if m != nil { if m != nil {
return m.Address return m.Address
} }

View File

@ -41,13 +41,6 @@ func (v *Handler) Dispatch(destination v2net.Destination, ray ray.OutboundRay) {
// Factory is an utility for creating blackhole handlers. // Factory is an utility for creating blackhole handlers.
type Factory struct{} type Factory struct{}
// StreamCapability implements OutboundHandlerFactory.StreamCapability().
func (v *Factory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
// Create implements OutboundHandlerFactory.Create(). // Create implements OutboundHandlerFactory.Create().
func (v *Factory) Create(space app.Space, config interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) { func (v *Factory) Create(space app.Space, config interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) {
return New(space, config.(*Config), meta) return New(space, config.(*Config), meta)

View File

@ -1,16 +1,11 @@
package proxy package proxy
import ( import "v2ray.com/core/app"
"v2ray.com/core/app"
v2net "v2ray.com/core/common/net"
)
type InboundHandlerFactory interface { type InboundHandlerFactory interface {
StreamCapability() v2net.NetworkList
Create(space app.Space, config interface{}, meta *InboundHandlerMeta) (InboundHandler, error) Create(space app.Space, config interface{}, meta *InboundHandlerMeta) (InboundHandler, error)
} }
type OutboundHandlerFactory interface { type OutboundHandlerFactory interface {
StreamCapability() v2net.NetworkList
Create(space app.Space, config interface{}, meta *OutboundHandlerMeta) (OutboundHandler, error) Create(space app.Space, config interface{}, meta *OutboundHandlerMeta) (OutboundHandler, error)
} }

View File

@ -207,12 +207,6 @@ func (v *DokodemoDoor) HandleTCPConnection(conn internet.Connection) {
type Factory struct{} type Factory struct{}
func (v *Factory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) { func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
return NewDokodemoDoor(rawConfig.(*Config), space, meta), nil return NewDokodemoDoor(rawConfig.(*Config), space, meta), nil
} }

View File

@ -49,7 +49,7 @@ func TestDokodemoTCP(t *testing.T) {
&proxy.OutboundHandlerMeta{ &proxy.OutboundHandlerMeta{
Address: v2net.LocalHostIP, Address: v2net.LocalHostIP,
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}, },
})) }))
@ -65,7 +65,7 @@ func TestDokodemoTCP(t *testing.T) {
Address: v2net.LocalHostIP, Address: v2net.LocalHostIP,
Port: port, Port: port,
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}}) }})
defer dokodemo.Close() defer dokodemo.Close()
@ -121,7 +121,7 @@ func TestDokodemoUDP(t *testing.T) {
&proxy.OutboundHandlerMeta{ &proxy.OutboundHandlerMeta{
Address: v2net.AnyIP, Address: v2net.AnyIP,
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}})) }}))
data2Send := "Data to be sent to remote." data2Send := "Data to be sent to remote."
@ -136,7 +136,7 @@ func TestDokodemoUDP(t *testing.T) {
Address: v2net.LocalHostIP, Address: v2net.LocalHostIP,
Port: port, Port: port,
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}}) }})
defer dokodemo.Close() defer dokodemo.Close()

View File

@ -130,12 +130,6 @@ func (v *Handler) Dispatch(destination v2net.Destination, ray ray.OutboundRay) {
type Factory struct{} type Factory struct{}
func (v *Factory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
func (v *Factory) Create(space app.Space, config interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) { func (v *Factory) Create(space app.Space, config interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) {
return New(config.(*Config), space, meta), nil return New(config.(*Config), space, meta), nil
} }

View File

@ -43,7 +43,7 @@ func TestSinglePacket(t *testing.T) {
&proxy.OutboundHandlerMeta{ &proxy.OutboundHandlerMeta{
Address: v2net.AnyIP, Address: v2net.AnyIP,
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}, },
}) })
assert.Error(space.Initialize()).IsNil() assert.Error(space.Initialize()).IsNil()
@ -83,7 +83,7 @@ func TestIPResolution(t *testing.T) {
&proxy.OutboundHandlerMeta{ &proxy.OutboundHandlerMeta{
Address: v2net.AnyIP, Address: v2net.AnyIP,
StreamSettings: &internet.StreamConfig{ StreamSettings: &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
}, },
}) })

View File

@ -4,8 +4,6 @@ import (
"v2ray.com/core/app" "v2ray.com/core/app"
"v2ray.com/core/common" "v2ray.com/core/common"
"v2ray.com/core/common/errors" "v2ray.com/core/common/errors"
v2net "v2ray.com/core/common/net"
"v2ray.com/core/transport/internet"
) )
var ( var (
@ -34,18 +32,6 @@ func CreateInboundHandler(name string, space app.Space, config interface{}, meta
if !found { if !found {
return nil, errors.New("Proxy: Unknown inbound name: " + name) return nil, errors.New("Proxy: Unknown inbound name: " + name)
} }
if meta.StreamSettings == nil {
meta.StreamSettings = &internet.StreamConfig{
Network: creator.StreamCapability().Get(0),
}
} else if meta.StreamSettings.Network == v2net.Network_Unknown {
meta.StreamSettings.Network = creator.StreamCapability().Get(0)
} else {
if !creator.StreamCapability().HasNetwork(meta.StreamSettings.Network) {
return nil, errors.New("Proxy: Invalid network: " + meta.StreamSettings.Network.String())
}
}
return creator.Create(space, config, meta) return creator.Create(space, config, meta)
} }
@ -54,17 +40,6 @@ func CreateOutboundHandler(name string, space app.Space, config interface{}, met
if !found { if !found {
return nil, errors.New("Proxy: Unknown outbound name: " + name) return nil, errors.New("Proxy: Unknown outbound name: " + name)
} }
if meta.StreamSettings == nil {
meta.StreamSettings = &internet.StreamConfig{
Network: creator.StreamCapability().Get(0),
}
} else if meta.StreamSettings.Network == v2net.Network_Unknown {
meta.StreamSettings.Network = creator.StreamCapability().Get(0)
} else {
if !creator.StreamCapability().HasNetwork(meta.StreamSettings.Network) {
return nil, errors.New("Proxy: Invalid network: " + meta.StreamSettings.Network.String())
}
}
return creator.Create(space, config, meta) return creator.Create(space, config, meta)
} }

View File

@ -288,13 +288,6 @@ func (v *Server) handlePlainHTTP(request *http.Request, session *proxy.SessionIn
// ServerFactory is a InboundHandlerFactory. // ServerFactory is a InboundHandlerFactory.
type ServerFactory struct{} type ServerFactory struct{}
// StreamCapability implements InboundHandlerFactory.StreamCapability().
func (v *ServerFactory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
// Create implements InboundHandlerFactory.Create(). // Create implements InboundHandlerFactory.Create().
func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) { func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
return NewServer(rawConfig.(*ServerConfig), space, meta), nil return NewServer(rawConfig.(*ServerConfig), space, meta), nil

View File

@ -167,13 +167,6 @@ func (v *Client) Dispatch(destination v2net.Destination, ray ray.OutboundRay) {
// ClientFactory is a OutboundHandlerFactory. // ClientFactory is a OutboundHandlerFactory.
type ClientFactory struct{} type ClientFactory struct{}
// StreamCapability implements OutboundHandlerFactory.StreamCapability().
func (ClientFactory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
// Create implements OutboundHandlerFactory.Create(). // Create implements OutboundHandlerFactory.Create().
func (ClientFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) { func (ClientFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) {
return NewClient(rawConfig.(*ClientConfig), space, meta) return NewClient(rawConfig.(*ClientConfig), space, meta)

View File

@ -218,12 +218,6 @@ func (v *Server) handleConnection(conn internet.Connection) {
type ServerFactory struct{} type ServerFactory struct{}
func (v *ServerFactory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) { func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
return NewServer(rawConfig.(*ServerConfig), space, meta) return NewServer(rawConfig.(*ServerConfig), space, meta)
} }

View File

@ -114,12 +114,6 @@ func (c *Client) Dispatch(destination net.Destination, ray ray.OutboundRay) {
type ClientFactory struct{} type ClientFactory struct{}
func (ClientFactory) StreamCapability() net.NetworkList {
return net.NetworkList{
Network: []net.Network{net.Network_TCP},
}
}
func (ClientFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) { func (ClientFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) {
return NewClient(rawConfig.(*ClientConfig), space, meta) return NewClient(rawConfig.(*ClientConfig), space, meta)
} }

View File

@ -183,12 +183,6 @@ func (v *Server) transport(reader io.Reader, writer io.Writer, session *proxy.Se
type ServerFactory struct{} type ServerFactory struct{}
func (v *ServerFactory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP},
}
}
func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) { func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
return NewServer(rawConfig.(*ServerConfig), space, meta), nil return NewServer(rawConfig.(*ServerConfig), space, meta), nil
} }

View File

@ -253,12 +253,6 @@ func (v *VMessInboundHandler) HandleConnection(connection internet.Connection) {
type Factory struct{} type Factory struct{}
func (v *Factory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP, v2net.Network_KCP, v2net.Network_WebSocket},
}
}
func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) { func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
config := rawConfig.(*Config) config := rawConfig.(*Config)

View File

@ -145,12 +145,6 @@ func (v *VMessOutboundHandler) Dispatch(target v2net.Destination, outboundRay ra
// Factory is a proxy factory for VMess outbound. // Factory is a proxy factory for VMess outbound.
type Factory struct{} type Factory struct{}
func (v *Factory) StreamCapability() v2net.NetworkList {
return v2net.NetworkList{
Network: []v2net.Network{v2net.Network_TCP, v2net.Network_KCP, v2net.Network_WebSocket},
}
}
func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) { func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) {
vOutConfig := rawConfig.(*Config) vOutConfig := rawConfig.(*Config)

View File

@ -2,7 +2,6 @@ package conf
import ( import (
"v2ray.com/core/common/errors" "v2ray.com/core/common/errors"
v2net "v2ray.com/core/common/net"
"v2ray.com/core/transport" "v2ray.com/core/transport"
"v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet"
) )
@ -21,8 +20,8 @@ func (v *TransportConfig) Build() (*transport.Config, error) {
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Failed to build TCP config.") return nil, errors.Base(err).Message("Failed to build TCP config.")
} }
config.NetworkSettings = append(config.NetworkSettings, &internet.NetworkSettings{ config.TransportSettings = append(config.TransportSettings, &internet.TransportSettings{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
Settings: ts, Settings: ts,
}) })
} }
@ -32,8 +31,8 @@ func (v *TransportConfig) Build() (*transport.Config, error) {
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Failed to build mKCP config.") return nil, errors.Base(err).Message("Failed to build mKCP config.")
} }
config.NetworkSettings = append(config.NetworkSettings, &internet.NetworkSettings{ config.TransportSettings = append(config.TransportSettings, &internet.TransportSettings{
Network: v2net.Network_KCP, Protocol: internet.TransportProtocol_MKCP,
Settings: ts, Settings: ts,
}) })
} }
@ -43,8 +42,8 @@ func (v *TransportConfig) Build() (*transport.Config, error) {
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Failed to build WebSocket config.") return nil, errors.Base(err).Message("Failed to build WebSocket config.")
} }
config.NetworkSettings = append(config.NetworkSettings, &internet.NetworkSettings{ config.TransportSettings = append(config.TransportSettings, &internet.TransportSettings{
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: ts, Settings: ts,
}) })
} }

View File

@ -6,7 +6,6 @@ import (
"strings" "strings"
"v2ray.com/core/common/errors" "v2ray.com/core/common/errors"
v2net "v2ray.com/core/common/net"
"v2ray.com/core/common/serial" "v2ray.com/core/common/serial"
"v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet"
"v2ray.com/core/transport/internet/kcp" "v2ray.com/core/transport/internet/kcp"
@ -175,21 +174,40 @@ func (v *TLSConfig) Build() (*serial.TypedMessage, error) {
return serial.ToTypedMessage(config), nil return serial.ToTypedMessage(config), nil
} }
type TransportProtocol string
func (p TransportProtocol) Build() (internet.TransportProtocol, error) {
switch strings.ToLower(string(p)) {
case "tcp":
return internet.TransportProtocol_TCP, nil
case "kcp", "mkcp":
return internet.TransportProtocol_MKCP, nil
case "ws", "websocket":
return internet.TransportProtocol_WebSocket, nil
default:
return internet.TransportProtocol_TCP, errors.New("Config: unknown transport protocol: ", p)
}
}
type StreamConfig struct { type StreamConfig struct {
Network *Network `json:"network"` Network *TransportProtocol `json:"network"`
Security string `json:"security"` Security string `json:"security"`
TLSSettings *TLSConfig `json:"tlsSettings"` TLSSettings *TLSConfig `json:"tlsSettings"`
TCPSettings *TCPConfig `json:"tcpSettings"` TCPSettings *TCPConfig `json:"tcpSettings"`
KCPSettings *KCPConfig `json:"kcpSettings"` KCPSettings *KCPConfig `json:"kcpSettings"`
WSSettings *WebSocketConfig `json:"wsSettings"` WSSettings *WebSocketConfig `json:"wsSettings"`
} }
func (v *StreamConfig) Build() (*internet.StreamConfig, error) { func (v *StreamConfig) Build() (*internet.StreamConfig, error) {
config := &internet.StreamConfig{ config := &internet.StreamConfig{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
} }
if v.Network != nil { if v.Network != nil {
config.Network = (*v.Network).Build() protocol, err := (*v.Network).Build()
if err != nil {
return nil, err
}
config.Protocol = protocol
} }
if strings.ToLower(v.Security) == "tls" { if strings.ToLower(v.Security) == "tls" {
tlsSettings := v.TLSSettings tlsSettings := v.TLSSettings
@ -208,8 +226,8 @@ func (v *StreamConfig) Build() (*internet.StreamConfig, error) {
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Failed to build TCP config.") return nil, errors.Base(err).Message("Failed to build TCP config.")
} }
config.NetworkSettings = append(config.NetworkSettings, &internet.NetworkSettings{ config.TransportSettings = append(config.TransportSettings, &internet.TransportSettings{
Network: v2net.Network_TCP, Protocol: internet.TransportProtocol_TCP,
Settings: ts, Settings: ts,
}) })
} }
@ -218,8 +236,8 @@ func (v *StreamConfig) Build() (*internet.StreamConfig, error) {
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Failed to build mKCP config.") return nil, errors.Base(err).Message("Failed to build mKCP config.")
} }
config.NetworkSettings = append(config.NetworkSettings, &internet.NetworkSettings{ config.TransportSettings = append(config.TransportSettings, &internet.TransportSettings{
Network: v2net.Network_KCP, Protocol: internet.TransportProtocol_MKCP,
Settings: ts, Settings: ts,
}) })
} }
@ -228,8 +246,8 @@ func (v *StreamConfig) Build() (*internet.StreamConfig, error) {
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Failed to build WebSocket config.") return nil, errors.Base(err).Message("Failed to build WebSocket config.")
} }
config.NetworkSettings = append(config.NetworkSettings, &internet.NetworkSettings{ config.TransportSettings = append(config.TransportSettings, &internet.TransportSettings{
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: ts, Settings: ts,
}) })
} }

View File

@ -5,11 +5,11 @@ import (
) )
// Apply applies this Config. // Apply applies this Config.
func (v *Config) Apply() error { func (c *Config) Apply() error {
if v == nil { if c == nil {
return nil return nil
} }
if err := internet.ApplyGlobalNetworkSettings(v.NetworkSettings); err != nil { if err := internet.ApplyGlobalTransportSettings(c.TransportSettings); err != nil {
return err return err
} }
return nil return nil

View File

@ -18,7 +18,7 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
// Global transport settings. This affects all type of connections that go through V2Ray. // Global transport settings. This affects all type of connections that go through V2Ray.
type Config struct { type Config struct {
NetworkSettings []*v2ray_core_transport_internet.NetworkSettings `protobuf:"bytes,1,rep,name=network_settings,json=networkSettings" json:"network_settings,omitempty"` TransportSettings []*v2ray_core_transport_internet.TransportSettings `protobuf:"bytes,1,rep,name=transport_settings,json=transportSettings" json:"transport_settings,omitempty"`
} }
func (m *Config) Reset() { *m = Config{} } func (m *Config) Reset() { *m = Config{} }
@ -26,9 +26,9 @@ func (m *Config) String() string { return proto.CompactTextString(m)
func (*Config) ProtoMessage() {} func (*Config) ProtoMessage() {}
func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *Config) GetNetworkSettings() []*v2ray_core_transport_internet.NetworkSettings { func (m *Config) GetTransportSettings() []*v2ray_core_transport_internet.TransportSettings {
if m != nil { if m != nil {
return m.NetworkSettings return m.TransportSettings
} }
return nil return nil
} }
@ -40,17 +40,16 @@ func init() {
func init() { proto.RegisterFile("v2ray.com/core/transport/config.proto", fileDescriptor0) } func init() { proto.RegisterFile("v2ray.com/core/transport/config.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 180 bytes of a gzipped FileDescriptorProto // 174 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x33, 0x2a, 0x4a, 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, 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, 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, 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, 0xaf, 0x24, 0xb5, 0x28, 0x2f, 0x15, 0xd5, 0x14, 0xa5, 0x4c, 0x2e, 0x36, 0x67, 0x30, 0x5f, 0x28,
0x92, 0x4b, 0x20, 0x2f, 0xb5, 0xa4, 0x3c, 0xbf, 0x28, 0x3b, 0xbe, 0x38, 0xb5, 0xa4, 0x24, 0x33, 0x9e, 0x4b, 0x08, 0xae, 0x38, 0xbe, 0x38, 0xb5, 0xa4, 0x24, 0x33, 0x2f, 0xbd, 0x58, 0x82, 0x51,
0x2f, 0xbd, 0x58, 0x82, 0x51, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x4f, 0x0f, 0x9b, 0x55, 0x7a, 0x30, 0x81, 0x59, 0x83, 0xdb, 0xc8, 0x40, 0x0f, 0x9b, 0x65, 0x7a, 0x30, 0x23, 0xf5, 0x42, 0x60, 0x42,
0x03, 0xf5, 0xfc, 0x20, 0xda, 0x82, 0xa1, 0xba, 0x82, 0xf8, 0xf3, 0x50, 0x05, 0x9c, 0x3c, 0xb9, 0xc1, 0x50, 0x7d, 0x41, 0x82, 0x25, 0xe8, 0x42, 0x4e, 0x9e, 0x5c, 0x12, 0xc9, 0xf9, 0xb9, 0x58,
0x24, 0x92, 0xf3, 0x73, 0xb1, 0x9a, 0xe2, 0xc4, 0x0d, 0xb1, 0x3e, 0x00, 0xe4, 0x9a, 0x28, 0x4e, 0x4d, 0x72, 0xe2, 0x86, 0x38, 0x22, 0x00, 0xe4, 0xa6, 0x28, 0x4e, 0xb8, 0xf8, 0x2a, 0x26, 0x91,
0xb8, 0xf8, 0x2a, 0x26, 0x91, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0xf2, 0x10, 0x98, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0x72, 0xb8, 0x2d, 0x49, 0x6c, 0x60, 0xc7, 0x1b,
0x70, 0x12, 0x1b, 0xd8, 0xd9, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xde, 0xf9, 0x7b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x4b, 0xd3, 0xcc, 0x90, 0x2b, 0x01, 0x00, 0x00,
0x25, 0x01, 0x00, 0x00,
} }

View File

@ -10,5 +10,5 @@ import "v2ray.com/core/transport/internet/config.proto";
// Global transport settings. This affects all type of connections that go through V2Ray. // Global transport settings. This affects all type of connections that go through V2Ray.
message Config { message Config {
repeated v2ray.core.transport.internet.NetworkSettings network_settings = 1; repeated v2ray.core.transport.internet.TransportSettings transport_settings = 1;
} }

View File

@ -2,52 +2,58 @@ package internet
import ( import (
"v2ray.com/core/common/errors" "v2ray.com/core/common/errors"
"v2ray.com/core/common/log"
v2net "v2ray.com/core/common/net"
"v2ray.com/core/common/serial" "v2ray.com/core/common/serial"
) )
type ConfigCreator func() interface{} type ConfigCreator func() interface{}
var ( var (
globalNetworkConfigCreatorCache = make(map[v2net.Network]ConfigCreator) globalTransportConfigCreatorCache = make(map[TransportProtocol]ConfigCreator)
globalTransportSettings []*TransportSettings
globalNetworkSettings []*NetworkSettings
ErrUnconfiguredNetwork = errors.New("Network config creator not set.")
) )
func RegisterNetworkConfigCreator(network v2net.Network, creator ConfigCreator) error { func RegisterProtocolConfigCreator(protocol TransportProtocol, creator ConfigCreator) error {
// TODO: check duplicate // TODO: check duplicate
globalNetworkConfigCreatorCache[network] = creator globalTransportConfigCreatorCache[protocol] = creator
return nil return nil
} }
func CreateNetworkConfig(network v2net.Network) (interface{}, error) { func CreateTransportConfig(protocol TransportProtocol) (interface{}, error) {
creator, ok := globalNetworkConfigCreatorCache[network] creator, ok := globalTransportConfigCreatorCache[protocol]
if !ok { if !ok {
log.Warning("Internet: Network config creator not found: ", network) return nil, errors.New("Internet: Unknown transport protocol: ", protocol)
return nil, ErrUnconfiguredNetwork
} }
return creator(), nil return creator(), nil
} }
func (v *NetworkSettings) GetTypedSettings() (interface{}, error) { func (v *TransportSettings) GetTypedSettings() (interface{}, error) {
return v.Settings.GetInstance() return v.Settings.GetInstance()
} }
func (v *StreamConfig) GetEffectiveNetworkSettings() (interface{}, error) { func (v *StreamConfig) GetEffectiveProtocol() TransportProtocol {
for _, settings := range v.NetworkSettings { if v == nil {
if settings.Network == v.Network { return TransportProtocol_TCP
}
return v.Protocol
}
func (v *StreamConfig) GetEffectiveTransportSettings() (interface{}, error) {
protocol := v.GetEffectiveProtocol()
if v != nil {
for _, settings := range v.TransportSettings {
if settings.Protocol == protocol {
return settings.GetTypedSettings()
}
}
}
for _, settings := range globalTransportSettings {
if settings.Protocol == protocol {
return settings.GetTypedSettings() return settings.GetTypedSettings()
} }
} }
for _, settings := range globalNetworkSettings { return CreateTransportConfig(protocol)
if settings.Network == v.Network {
return settings.GetTypedSettings()
}
}
return CreateNetworkConfig(v.Network)
} }
func (v *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) { func (v *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) {
@ -63,8 +69,8 @@ func (v *StreamConfig) HasSecuritySettings() bool {
return len(v.SecurityType) > 0 return len(v.SecurityType) > 0
} }
func ApplyGlobalNetworkSettings(settings []*NetworkSettings) error { func ApplyGlobalTransportSettings(settings []*TransportSettings) error {
globalNetworkSettings = settings globalTransportSettings = settings
return nil return nil
} }

View File

@ -3,7 +3,6 @@ package internet
import proto "github.com/golang/protobuf/proto" import proto "github.com/golang/protobuf/proto"
import fmt "fmt" import fmt "fmt"
import math "math" import math "math"
import v2ray_core_common_net "v2ray.com/core/common/net"
import v2ray_core_common_serial "v2ray.com/core/common/serial" import v2ray_core_common_serial "v2ray.com/core/common/serial"
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -17,26 +16,53 @@ var _ = math.Inf
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type NetworkSettings struct { type TransportProtocol int32
const (
TransportProtocol_TCP TransportProtocol = 0
TransportProtocol_UDP TransportProtocol = 1
TransportProtocol_MKCP TransportProtocol = 2
TransportProtocol_WebSocket TransportProtocol = 3
)
var TransportProtocol_name = map[int32]string{
0: "TCP",
1: "UDP",
2: "MKCP",
3: "WebSocket",
}
var TransportProtocol_value = map[string]int32{
"TCP": 0,
"UDP": 1,
"MKCP": 2,
"WebSocket": 3,
}
func (x TransportProtocol) String() string {
return proto.EnumName(TransportProtocol_name, int32(x))
}
func (TransportProtocol) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
type TransportSettings struct {
// Type of network that this settings supports. // 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"` Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"`
// Specific settings. // Specific settings.
Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"` Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
} }
func (m *NetworkSettings) Reset() { *m = NetworkSettings{} } func (m *TransportSettings) Reset() { *m = TransportSettings{} }
func (m *NetworkSettings) String() string { return proto.CompactTextString(m) } func (m *TransportSettings) String() string { return proto.CompactTextString(m) }
func (*NetworkSettings) ProtoMessage() {} func (*TransportSettings) ProtoMessage() {}
func (*NetworkSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } func (*TransportSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *NetworkSettings) GetNetwork() v2ray_core_common_net.Network { func (m *TransportSettings) GetProtocol() TransportProtocol {
if m != nil { if m != nil {
return m.Network return m.Protocol
} }
return v2ray_core_common_net.Network_Unknown return TransportProtocol_TCP
} }
func (m *NetworkSettings) GetSettings() *v2ray_core_common_serial.TypedMessage { func (m *TransportSettings) GetSettings() *v2ray_core_common_serial.TypedMessage {
if m != nil { if m != nil {
return m.Settings return m.Settings
} }
@ -45,8 +71,8 @@ func (m *NetworkSettings) GetSettings() *v2ray_core_common_serial.TypedMessage {
type StreamConfig struct { type StreamConfig struct {
// Effective network. // Effective network.
Network v2ray_core_common_net.Network `protobuf:"varint,1,opt,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"` Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"`
NetworkSettings []*NetworkSettings `protobuf:"bytes,2,rep,name=network_settings,json=networkSettings" json:"network_settings,omitempty"` TransportSettings []*TransportSettings `protobuf:"bytes,2,rep,name=transport_settings,json=transportSettings" json:"transport_settings,omitempty"`
// Type of security. Must be a message name of the settings proto. // 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"` 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"` SecuritySettings []*v2ray_core_common_serial.TypedMessage `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings" json:"security_settings,omitempty"`
@ -57,16 +83,16 @@ func (m *StreamConfig) String() string { return proto.CompactTextStri
func (*StreamConfig) ProtoMessage() {} func (*StreamConfig) ProtoMessage() {}
func (*StreamConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } func (*StreamConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (m *StreamConfig) GetNetwork() v2ray_core_common_net.Network { func (m *StreamConfig) GetProtocol() TransportProtocol {
if m != nil { if m != nil {
return m.Network return m.Protocol
} }
return v2ray_core_common_net.Network_Unknown return TransportProtocol_TCP
} }
func (m *StreamConfig) GetNetworkSettings() []*NetworkSettings { func (m *StreamConfig) GetTransportSettings() []*TransportSettings {
if m != nil { if m != nil {
return m.NetworkSettings return m.TransportSettings
} }
return nil return nil
} }
@ -102,35 +128,38 @@ func (m *ProxyConfig) GetTag() string {
} }
func init() { func init() {
proto.RegisterType((*NetworkSettings)(nil), "v2ray.core.transport.internet.NetworkSettings") proto.RegisterType((*TransportSettings)(nil), "v2ray.core.transport.internet.TransportSettings")
proto.RegisterType((*StreamConfig)(nil), "v2ray.core.transport.internet.StreamConfig") proto.RegisterType((*StreamConfig)(nil), "v2ray.core.transport.internet.StreamConfig")
proto.RegisterType((*ProxyConfig)(nil), "v2ray.core.transport.internet.ProxyConfig") proto.RegisterType((*ProxyConfig)(nil), "v2ray.core.transport.internet.ProxyConfig")
proto.RegisterEnum("v2ray.core.transport.internet.TransportProtocol", TransportProtocol_name, TransportProtocol_value)
} }
func init() { proto.RegisterFile("v2ray.com/core/transport/internet/config.proto", fileDescriptor0) } func init() { proto.RegisterFile("v2ray.com/core/transport/internet/config.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 344 bytes of a gzipped FileDescriptorProto // 372 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x92, 0xcf, 0x4a, 0xc3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x92, 0x4f, 0x4b, 0xf3, 0x40,
0x10, 0xc6, 0x49, 0x2b, 0xda, 0x6e, 0xab, 0xad, 0x39, 0x95, 0x42, 0xb5, 0x56, 0xd0, 0x9c, 0x26, 0x10, 0xc6, 0xdf, 0x24, 0xe5, 0x35, 0x9d, 0xb6, 0x92, 0xee, 0xa9, 0x08, 0xc5, 0x5a, 0x41, 0x82,
0x12, 0x2f, 0x9e, 0xdb, 0x93, 0x87, 0x8a, 0xa4, 0x45, 0xd0, 0x4b, 0x59, 0xe3, 0x18, 0x82, 0x66, 0x87, 0x4d, 0x89, 0x77, 0x0f, 0x8d, 0x17, 0xd1, 0x42, 0x48, 0xaa, 0x82, 0x97, 0x90, 0xae, 0x6b,
0xb7, 0xec, 0x8e, 0x7f, 0xf2, 0x14, 0x3e, 0x81, 0x2f, 0xe0, 0x53, 0x4a, 0x92, 0xdd, 0x50, 0x4a, 0x08, 0x36, 0xd9, 0xb2, 0x59, 0xc5, 0x7c, 0x20, 0x2f, 0x7e, 0x01, 0xbf, 0x9e, 0xe4, 0xcf, 0x2e,
0x29, 0x82, 0xb7, 0x21, 0xf9, 0xe6, 0xcb, 0x6f, 0x7e, 0x84, 0xc1, 0x7b, 0xa0, 0x78, 0x06, 0x91, 0x45, 0xa1, 0xf4, 0xe0, 0x6d, 0xc8, 0x3c, 0xf3, 0x9b, 0x27, 0xcf, 0x2c, 0xe0, 0x37, 0x97, 0xc7,
0x4c, 0xfd, 0x48, 0x2a, 0xf4, 0x49, 0x71, 0xa1, 0x97, 0x52, 0x91, 0x9f, 0x08, 0x42, 0x25, 0x90, 0x25, 0x26, 0x2c, 0x73, 0x08, 0xe3, 0xd4, 0x11, 0x3c, 0xce, 0x8b, 0x0d, 0xe3, 0xc2, 0x49, 0x73,
0xfc, 0x48, 0x8a, 0xe7, 0x24, 0x86, 0xa5, 0x92, 0x24, 0xdd, 0x81, 0xcd, 0x2b, 0x84, 0x2a, 0x0b, 0x41, 0x79, 0x4e, 0x85, 0x43, 0x58, 0xfe, 0x9c, 0x26, 0x78, 0xc3, 0x99, 0x60, 0x68, 0x2c, 0xf5,
0x36, 0xdb, 0x3f, 0x5f, 0xab, 0x8b, 0x64, 0x9a, 0x4a, 0xe1, 0xe7, 0x35, 0x02, 0xe9, 0x43, 0xaa, 0x9c, 0x62, 0xa5, 0xc5, 0x52, 0x7b, 0x34, 0xfb, 0x81, 0x23, 0x2c, 0xcb, 0x58, 0xee, 0x14, 0x94,
0x97, 0xb2, 0xa7, 0x7f, 0xb1, 0x39, 0xa8, 0x51, 0x25, 0xfc, 0xd5, 0xa7, 0x6c, 0x89, 0x4f, 0x8b, 0xa7, 0xf1, 0xda, 0x11, 0xe5, 0x86, 0x3e, 0x45, 0x19, 0x2d, 0x8a, 0x38, 0xa1, 0x0d, 0x70, 0xfa,
0x14, 0xb5, 0xe6, 0x31, 0x96, 0x1b, 0xa3, 0x2f, 0x87, 0x75, 0x6e, 0xca, 0x8e, 0x19, 0x12, 0x25, 0xa1, 0xc1, 0x70, 0x29, 0x41, 0x21, 0x15, 0x22, 0xcd, 0x93, 0x02, 0xdd, 0x82, 0x59, 0xb7, 0x09,
0x22, 0xd6, 0xee, 0x15, 0xdb, 0x33, 0xb5, 0x3d, 0x67, 0xe8, 0x78, 0x07, 0xc1, 0x11, 0xac, 0xf0, 0x5b, 0x8f, 0xb4, 0x89, 0x66, 0x1f, 0xba, 0x33, 0xbc, 0x73, 0x33, 0x56, 0x0c, 0xbf, 0x9d, 0x0b,
0x95, 0x9d, 0x20, 0x90, 0xc0, 0x2c, 0x86, 0x36, 0xee, 0x8e, 0x59, 0x43, 0x9b, 0x96, 0x5e, 0x6d, 0x14, 0x01, 0xcd, 0xc1, 0x2c, 0x5a, 0xf2, 0x48, 0x9f, 0x68, 0x76, 0xcf, 0x3d, 0xdb, 0xa6, 0x35,
0xe8, 0x78, 0xad, 0xe0, 0x6c, 0xc3, 0x6a, 0x89, 0x03, 0xf3, 0x1c, 0x67, 0x5a, 0xd2, 0x84, 0xd5, 0x26, 0x71, 0x63, 0x12, 0x2f, 0x2b, 0x93, 0x8b, 0xc6, 0x63, 0xa0, 0xe6, 0xa6, 0x5f, 0x3a, 0xf4,
0xde, 0xe8, 0xbb, 0xc6, 0xda, 0x33, 0x52, 0xc8, 0xd3, 0x49, 0xa1, 0xe8, 0x1f, 0x38, 0xf7, 0xac, 0x43, 0xc1, 0x69, 0x9c, 0x79, 0x75, 0x1e, 0x7f, 0x6c, 0x31, 0x02, 0xa4, 0x26, 0xa2, 0x2d, 0xb3,
0x6b, 0xc6, 0xc5, 0x0a, 0x56, 0xdd, 0x6b, 0x05, 0x00, 0x5b, 0x8d, 0xc3, 0x9a, 0x92, 0xb0, 0x23, 0x86, 0xdd, 0xdb, 0x9f, 0x2b, 0xe3, 0x0b, 0x86, 0xe2, 0x57, 0xa2, 0xa7, 0x30, 0x28, 0x28, 0x79,
0xd6, 0x1c, 0x9d, 0xb2, 0x7d, 0x8d, 0xd1, 0x9b, 0x4a, 0x28, 0x5b, 0xe4, 0x5e, 0x7b, 0xf5, 0xa1, 0xe5, 0xa9, 0x28, 0xa3, 0xea, 0x0e, 0x23, 0x63, 0xa2, 0xd9, 0xdd, 0xa0, 0x2f, 0x3f, 0x56, 0xbf,
0xe3, 0x35, 0xc3, 0xb6, 0x7d, 0x98, 0x1f, 0xe7, 0xce, 0xd8, 0x61, 0x15, 0xaa, 0x00, 0x76, 0x0a, 0x8d, 0x42, 0x18, 0x2a, 0x91, 0x32, 0xd1, 0xa9, 0x4d, 0xec, 0x9b, 0x98, 0x25, 0x01, 0x72, 0xf3,
0x80, 0xbf, 0x7a, 0xe9, 0xda, 0x02, 0xfb, 0xe5, 0xd1, 0x31, 0x6b, 0xdd, 0x2a, 0xf9, 0x99, 0x19, 0xf4, 0x18, 0x7a, 0x3e, 0x67, 0xef, 0x65, 0x9b, 0x9b, 0x05, 0x86, 0x88, 0x93, 0x3a, 0xb2, 0x6e,
0x3b, 0x5d, 0x56, 0x27, 0x1e, 0x17, 0x66, 0x9a, 0x61, 0x3e, 0x8e, 0xa7, 0xec, 0x24, 0x92, 0xe9, 0x50, 0x95, 0xe7, 0x97, 0x5b, 0x2f, 0x40, 0x46, 0x83, 0x0e, 0xc0, 0x58, 0x7a, 0xbe, 0xf5, 0xaf,
0xf6, 0x03, 0x1f, 0x1a, 0x76, 0xfa, 0xa9, 0x0d, 0xee, 0x82, 0x90, 0x67, 0x30, 0xc9, 0x93, 0xf3, 0x2a, 0xee, 0xae, 0x7c, 0x4b, 0x43, 0x26, 0x74, 0x16, 0x37, 0x9e, 0x6f, 0xe9, 0x68, 0x00, 0xdd,
0x2a, 0x79, 0x6d, 0xde, 0x3f, 0xee, 0x16, 0x3f, 0xca, 0xe5, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0xba, 0x0a, 0x19, 0x79, 0xa1, 0xc2, 0x32, 0xe6, 0x0b, 0x38, 0x21, 0x2c, 0xdb, 0x1d, 0xd2,
0x5e, 0x2e, 0x73, 0x09, 0xd4, 0x02, 0x00, 0x00, 0xa3, 0x29, 0xab, 0x4f, 0x7d, 0x7c, 0xef, 0x06, 0x71, 0x89, 0xbd, 0x4a, 0xa9, 0x16, 0xe3, 0xeb,
0xb6, 0xbf, 0xfa, 0x5f, 0x1f, 0xe5, 0xe2, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xca, 0x28, 0x5d, 0x77,
0x1b, 0x03, 0x00, 0x00,
} }

View File

@ -5,12 +5,18 @@ option csharp_namespace = "V2Ray.Core.Transport.Internet";
option go_package = "internet"; option go_package = "internet";
option java_package = "com.v2ray.core.transport.internet"; option java_package = "com.v2ray.core.transport.internet";
import "v2ray.com/core/common/net/network.proto";
import "v2ray.com/core/common/serial/typed_message.proto"; import "v2ray.com/core/common/serial/typed_message.proto";
message NetworkSettings { enum TransportProtocol {
TCP = 0;
UDP = 1;
MKCP = 2;
WebSocket = 3;
}
message TransportSettings {
// Type of network that this settings supports. // Type of network that this settings supports.
v2ray.core.common.net.Network network = 1; TransportProtocol protocol = 1;
// Specific settings. // Specific settings.
v2ray.core.common.serial.TypedMessage settings = 2; v2ray.core.common.serial.TypedMessage settings = 2;
@ -18,9 +24,9 @@ message NetworkSettings {
message StreamConfig { message StreamConfig {
// Effective network. // Effective network.
v2ray.core.common.net.Network network = 1; TransportProtocol protocol = 1;
repeated NetworkSettings network_settings = 2; repeated TransportSettings transport_settings = 2;
// Type of security. Must be a message name of the settings proto. // Type of security. Must be a message name of the settings proto.
string security_type = 3; string security_type = 3;
@ -30,4 +36,4 @@ message StreamConfig {
message ProxyConfig { message ProxyConfig {
string tag = 1; string tag = 1;
} }

View File

@ -8,10 +8,6 @@ import (
v2net "v2ray.com/core/common/net" v2net "v2ray.com/core/common/net"
) )
var (
ErrUnsupportedStreamType = errors.New("Unsupported stream type.")
)
type DialerOptions struct { type DialerOptions struct {
Stream *StreamConfig Stream *StreamConfig
Proxy *ProxyConfig Proxy *ProxyConfig
@ -20,16 +16,16 @@ type DialerOptions struct {
type Dialer func(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error) type Dialer func(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error)
var ( var (
networkDialerCache = make(map[v2net.Network]Dialer) transportDialerCache = make(map[TransportProtocol]Dialer)
ProxyDialer Dialer ProxyDialer Dialer
) )
func RegisterNetworkDialer(network v2net.Network, dialer Dialer) error { func RegisterTransportDialer(protocol TransportProtocol, dialer Dialer) error {
if _, found := networkDialerCache[network]; found { if _, found := transportDialerCache[protocol]; found {
return errors.New("Internet|Dialer: ", network, " dialer already registered.") return errors.New("Internet|Dialer: ", protocol, " dialer already registered.")
} }
networkDialerCache[network] = dialer transportDialerCache[protocol] = dialer
return nil return nil
} }
@ -40,14 +36,15 @@ func Dial(src v2net.Address, dest v2net.Destination, options DialerOptions) (Con
} }
if dest.Network == v2net.Network_TCP { if dest.Network == v2net.Network_TCP {
dialer := networkDialerCache[options.Stream.Network] protocol := options.Stream.GetEffectiveProtocol()
dialer := transportDialerCache[protocol]
if dialer == nil { if dialer == nil {
return nil, errors.New("Internet|Dialer: ", options.Stream.Network, " dialer not registered.") return nil, errors.New("Internet|Dialer: ", options.Stream.Protocol, " dialer not registered.")
} }
return dialer(src, dest, options) return dialer(src, dest, options)
} }
udpDialer := networkDialerCache[v2net.Network_UDP] udpDialer := transportDialerCache[TransportProtocol_UDP]
if udpDialer == nil { if udpDialer == nil {
return nil, errors.New("Internet|Dialer: UDP dialer not registered.") return nil, errors.New("Internet|Dialer: UDP dialer not registered.")
} }

View File

@ -3,7 +3,7 @@ package kcp
import ( import (
"crypto/cipher" "crypto/cipher"
v2net "v2ray.com/core/common/net" "v2ray.com/core/common"
"v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet"
) )
@ -104,7 +104,7 @@ func (v *Config) IsConnectionReuse() bool {
} }
func init() { func init() {
internet.RegisterNetworkConfigCreator(v2net.Network_KCP, func() interface{} { common.Must(internet.RegisterProtocolConfigCreator(internet.TransportProtocol_MKCP, func() interface{} {
return new(Config) return new(Config)
}) }))
} }

View File

@ -129,7 +129,7 @@ func DialKCP(src v2net.Address, dest v2net.Destination, options internet.DialerO
conn = c conn = c
} }
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
log.Error("KCP|Dialer: Failed to get KCP settings: ", err) log.Error("KCP|Dialer: Failed to get KCP settings: ", err)
return nil, err return nil, err
@ -173,5 +173,5 @@ func DialKCP(src v2net.Address, dest v2net.Destination, options internet.DialerO
} }
func init() { func init() {
common.Must(internet.RegisterNetworkDialer(v2net.Network_KCP, DialKCP)) common.Must(internet.RegisterTransportDialer(internet.TransportProtocol_MKCP, DialKCP))
} }

View File

@ -20,10 +20,10 @@ func TestDialAndListen(t *testing.T) {
listerner, err := NewListener(v2net.LocalHostIP, v2net.Port(0), internet.ListenOptions{ listerner, err := NewListener(v2net.LocalHostIP, v2net.Port(0), internet.ListenOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_KCP, Protocol: internet.TransportProtocol_MKCP,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_KCP, Protocol: internet.TransportProtocol_MKCP,
Settings: serial.ToTypedMessage(&Config{}), Settings: serial.ToTypedMessage(&Config{}),
}, },
}, },
@ -59,10 +59,10 @@ func TestDialAndListen(t *testing.T) {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
clientConn, err := DialKCP(v2net.LocalHostIP, v2net.UDPDestination(v2net.LocalHostIP, port), internet.DialerOptions{ clientConn, err := DialKCP(v2net.LocalHostIP, v2net.UDPDestination(v2net.LocalHostIP, port), internet.DialerOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_KCP, Protocol: internet.TransportProtocol_MKCP,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_KCP, Protocol: internet.TransportProtocol_MKCP,
Settings: serial.ToTypedMessage(&Config{}), Settings: serial.ToTypedMessage(&Config{}),
}, },
}, },

View File

@ -93,7 +93,7 @@ type Listener struct {
} }
func NewListener(address v2net.Address, port v2net.Port, options internet.ListenOptions) (*Listener, error) { func NewListener(address v2net.Address, port v2net.Port, options internet.ListenOptions) (*Listener, error) {
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
log.Error("KCP|Listener: Failed to get KCP settings: ", err) log.Error("KCP|Listener: Failed to get KCP settings: ", err)
return nil, err return nil, err
@ -298,5 +298,5 @@ func ListenKCP(address v2net.Address, port v2net.Port, options internet.ListenOp
} }
func init() { func init() {
common.Must(internet.RegisterNetworkListener(v2net.Network_KCP, ListenKCP)) common.Must(internet.RegisterTransportListener(internet.TransportProtocol_MKCP, ListenKCP))
} }

View File

@ -1,7 +1,7 @@
package tcp package tcp
import ( import (
v2net "v2ray.com/core/common/net" "v2ray.com/core/common"
"v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet"
) )
@ -13,7 +13,7 @@ func (v *Config) IsConnectionReuse() bool {
} }
func init() { func init() {
internet.RegisterNetworkConfigCreator(v2net.Network_TCP, func() interface{} { common.Must(internet.RegisterProtocolConfigCreator(internet.TransportProtocol_TCP, func() interface{} {
return new(Config) return new(Config)
}) }))
} }

View File

@ -22,7 +22,7 @@ func Dial(src v2net.Address, dest v2net.Destination, options internet.DialerOpti
if src == nil { if src == nil {
src = v2net.AnyIP src = v2net.AnyIP
} }
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -70,5 +70,5 @@ func Dial(src v2net.Address, dest v2net.Destination, options internet.DialerOpti
} }
func init() { func init() {
common.Must(internet.RegisterNetworkDialer(v2net.Network_TCP, Dial)) common.Must(internet.RegisterTransportDialer(internet.TransportProtocol_TCP, Dial))
} }

View File

@ -42,7 +42,7 @@ func ListenTCP(address v2net.Address, port v2net.Port, options internet.ListenOp
if err != nil { if err != nil {
return nil, err return nil, err
} }
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -159,5 +159,5 @@ func (v *TCPListener) Close() error {
} }
func init() { func init() {
common.Must(internet.RegisterNetworkListener(v2net.Network_TCP, ListenTCP)) common.Must(internet.RegisterTransportListener(internet.TransportProtocol_TCP, ListenTCP))
} }

View File

@ -11,16 +11,14 @@ import (
) )
var ( var (
ErrClosedConnection = errors.New("Connection already closed.") transportListenerCache = make(map[TransportProtocol]ListenFunc)
networkListenerCache = make(map[v2net.Network]ListenFunc)
) )
func RegisterNetworkListener(network v2net.Network, listener ListenFunc) error { func RegisterTransportListener(protocol TransportProtocol, listener ListenFunc) error {
if _, found := networkListenerCache[network]; found { if _, found := transportListenerCache[protocol]; found {
return errors.New("Internet|TCPHub: ", network, " listener already registered.") return errors.New("Internet|TCPHub: ", protocol, " listener already registered.")
} }
networkListenerCache[network] = listener transportListenerCache[protocol] = listener
return nil return nil
} }
@ -46,13 +44,14 @@ func ListenTCP(address v2net.Address, port v2net.Port, callback ConnectionHandle
options := ListenOptions{ options := ListenOptions{
Stream: settings, Stream: settings,
} }
listenFunc := networkListenerCache[settings.Network] protocol := settings.GetEffectiveProtocol()
listenFunc := transportListenerCache[protocol]
if listenFunc == nil { if listenFunc == nil {
return nil, errors.New("Internet|TCPHub: ", settings.Network, " listener not registered.") return nil, errors.New("Internet|TCPHub: ", protocol, " listener not registered.")
} }
listener, err := listenFunc(address, port, options) listener, err := listenFunc(address, port, options)
if err != nil { if err != nil {
return nil, errors.Base(err).Message("Interent|TCPHub: Failed to listen: ") return nil, errors.Base(err).Message("Interent|TCPHub: Failed to listen on address: ", address, ":", port)
} }
hub := &TCPHub{ hub := &TCPHub{

View File

@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
common.Must(internet.RegisterNetworkDialer(v2net.Network_UDP, common.Must(internet.RegisterTransportDialer(internet.TransportProtocol_UDP,
func(src v2net.Address, dest v2net.Destination, options internet.DialerOptions) (internet.Connection, error) { func(src v2net.Address, dest v2net.Destination, options internet.DialerOptions) (internet.Connection, error) {
conn, err := internet.DialSystem(src, dest) conn, err := internet.DialSystem(src, dest)
if err != nil { if err != nil {

View File

@ -1,7 +1,7 @@
package websocket package websocket
import ( import (
v2net "v2ray.com/core/common/net" "v2ray.com/core/common"
"v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet"
) )
@ -13,7 +13,7 @@ func (c *Config) IsConnectionReuse() bool {
} }
func init() { func init() {
internet.RegisterNetworkConfigCreator(v2net.Network_WebSocket, func() interface{} { common.Must(internet.RegisterProtocolConfigCreator(internet.TransportProtocol_WebSocket, func() interface{} {
return new(Config) return new(Config)
}) }))
} }

View File

@ -22,7 +22,7 @@ func Dial(src v2net.Address, dest v2net.Destination, options internet.DialerOpti
if src == nil { if src == nil {
src = v2net.AnyIP src = v2net.AnyIP
} }
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -48,11 +48,11 @@ func Dial(src v2net.Address, dest v2net.Destination, options internet.DialerOpti
} }
func init() { func init() {
common.Must(internet.RegisterNetworkDialer(v2net.Network_WebSocket, Dial)) common.Must(internet.RegisterTransportDialer(internet.TransportProtocol_WebSocket, Dial))
} }
func wsDial(src v2net.Address, dest v2net.Destination, options internet.DialerOptions) (*wsconn, error) { func wsDial(src v2net.Address, dest v2net.Destination, options internet.DialerOptions) (*wsconn, error) {
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -38,7 +38,7 @@ type WSListener struct {
} }
func ListenWS(address v2net.Address, port v2net.Port, options internet.ListenOptions) (internet.Listener, error) { func ListenWS(address v2net.Address, port v2net.Port, options internet.ListenOptions) (internet.Listener, error) {
networkSettings, err := options.Stream.GetEffectiveNetworkSettings() networkSettings, err := options.Stream.GetEffectiveTransportSettings()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -199,5 +199,5 @@ func (v *WSListener) Close() error {
} }
func init() { func init() {
common.Must(internet.RegisterNetworkListener(v2net.Network_WebSocket, ListenWS)) common.Must(internet.RegisterTransportListener(internet.TransportProtocol_WebSocket, ListenWS))
} }

View File

@ -21,10 +21,10 @@ func Test_listenWSAndDial(t *testing.T) {
assert := assert.On(t) assert := assert.On(t)
listen, err := ListenWS(v2net.DomainAddress("localhost"), 13146, internet.ListenOptions{ listen, err := ListenWS(v2net.DomainAddress("localhost"), 13146, internet.ListenOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: serial.ToTypedMessage(&Config{ Settings: serial.ToTypedMessage(&Config{
Path: "ws", Path: "ws",
}), }),
@ -58,10 +58,10 @@ func Test_listenWSAndDial(t *testing.T) {
}() }()
conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{ conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: serial.ToTypedMessage(&Config{ Settings: serial.ToTypedMessage(&Config{
Path: "ws", Path: "ws",
}), }),
@ -82,10 +82,10 @@ func Test_listenWSAndDial(t *testing.T) {
<-time.After(time.Second * 5) <-time.After(time.Second * 5)
conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{ conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: serial.ToTypedMessage(&Config{ Settings: serial.ToTypedMessage(&Config{
Path: "ws", Path: "ws",
}), }),
@ -103,10 +103,10 @@ func Test_listenWSAndDial(t *testing.T) {
<-time.After(time.Second * 15) <-time.After(time.Second * 15)
conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{ conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: serial.ToTypedMessage(&Config{ Settings: serial.ToTypedMessage(&Config{
Path: "ws", Path: "ws",
}), }),
@ -145,10 +145,10 @@ func Test_listenWSAndDial_TLS(t *testing.T) {
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
SecurityType: serial.GetMessageType(new(v2tls.Config)), SecurityType: serial.GetMessageType(new(v2tls.Config)),
SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)}, SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)},
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: serial.ToTypedMessage(&Config{ Settings: serial.ToTypedMessage(&Config{
Path: "wss", Path: "wss",
ConnectionReuse: &ConnectionReuse{ ConnectionReuse: &ConnectionReuse{
@ -170,10 +170,10 @@ func Test_listenWSAndDial_TLS(t *testing.T) {
Stream: &internet.StreamConfig{ Stream: &internet.StreamConfig{
SecurityType: serial.GetMessageType(new(v2tls.Config)), SecurityType: serial.GetMessageType(new(v2tls.Config)),
SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)}, SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)},
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
NetworkSettings: []*internet.NetworkSettings{ TransportSettings: []*internet.TransportSettings{
{ {
Network: v2net.Network_WebSocket, Protocol: internet.TransportProtocol_WebSocket,
Settings: serial.ToTypedMessage(&Config{ Settings: serial.ToTypedMessage(&Config{
Path: "wss", Path: "wss",
ConnectionReuse: &ConnectionReuse{ ConnectionReuse: &ConnectionReuse{