| 
					
				 | 
			
			
				@@ -22,6 +22,7 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"v2ray.com/core/testing/servers/tcp" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"v2ray.com/core/testing/servers/udp" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"v2ray.com/core/transport/internet" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"v2ray.com/core/transport/internet/kcp" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	. "v2ray.com/ext/assert" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -795,6 +796,175 @@ func TestVMessKCP(t *testing.T) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	CloseAllServers(servers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func TestVMessKCPLarge(t *testing.T) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	assert := With(t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	tcpServer := tcp.Server{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MsgProcessor: xor, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	dest, err := tcpServer.Start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	assert(err, IsNil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer tcpServer.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	userID := protocol.NewID(uuid.New()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	serverPort := udp.PickPort() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	serverConfig := &core.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		App: []*serial.TypedMessage{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			serial.ToTypedMessage(&log.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ErrorLogLevel: clog.Severity_Debug, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ErrorLogType:  log.LogType_Console, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Inbound: []*core.InboundHandlerConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					PortRange: net.SinglePortRange(serverPort), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Listen:    net.NewIPOrDomain(net.LocalHostIP), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					StreamSettings: &internet.StreamConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Protocol: internet.TransportProtocol_MKCP, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						TransportSettings: []*internet.TransportConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								Protocol: internet.TransportProtocol_MKCP, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								Settings: serial.ToTypedMessage(&kcp.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									ReadBuffer: &kcp.ReadBuffer{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Size: 4096, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									WriteBuffer: &kcp.WriteBuffer{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Size: 4096, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									UplinkCapacity: &kcp.UplinkCapacity{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Value: 20, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									DownlinkCapacity: &kcp.DownlinkCapacity{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Value: 20, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ProxySettings: serial.ToTypedMessage(&inbound.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					User: []*protocol.User{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Account: serial.ToTypedMessage(&vmess.Account{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								Id:      userID.String(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								AlterId: 64, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Outbound: []*core.OutboundHandlerConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ProxySettings: serial.ToTypedMessage(&freedom.Config{}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	clientPort := tcp.PickPort() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	clientConfig := &core.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		App: []*serial.TypedMessage{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			serial.ToTypedMessage(&log.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ErrorLogLevel: clog.Severity_Debug, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ErrorLogType:  log.LogType_Console, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Inbound: []*core.InboundHandlerConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					PortRange: net.SinglePortRange(clientPort), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Listen:    net.NewIPOrDomain(net.LocalHostIP), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Address: net.NewIPOrDomain(dest.Address), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Port:    uint32(dest.Port), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					NetworkList: &net.NetworkList{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Network: []net.Network{net.Network_TCP}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Outbound: []*core.OutboundHandlerConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ProxySettings: serial.ToTypedMessage(&outbound.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Receiver: []*protocol.ServerEndpoint{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Address: net.NewIPOrDomain(net.LocalHostIP), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Port:    uint32(serverPort), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							User: []*protocol.User{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									Account: serial.ToTypedMessage(&vmess.Account{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Id:      userID.String(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										AlterId: 64, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										SecuritySettings: &protocol.SecurityConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+											Type: protocol.SecurityType_AES128_GCM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					StreamSettings: &internet.StreamConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Protocol: internet.TransportProtocol_MKCP, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						TransportSettings: []*internet.TransportConfig{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								Protocol: internet.TransportProtocol_MKCP, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								Settings: serial.ToTypedMessage(&kcp.Config{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									ReadBuffer: &kcp.ReadBuffer{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Size: 4096, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									WriteBuffer: &kcp.WriteBuffer{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Size: 4096, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									UplinkCapacity: &kcp.UplinkCapacity{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Value: 20, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									DownlinkCapacity: &kcp.DownlinkCapacity{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+										Value: 20, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	servers, err := InitializeServerConfigs(serverConfig, clientConfig) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	assert(err, IsNil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var wg sync.WaitGroup 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i := 0; i < 2; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		wg.Add(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				IP:   []byte{127, 0, 0, 1}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Port: int(clientPort), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			assert(err, IsNil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			payload := make([]byte, 10240*1024) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			rand.Read(payload) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			nBytes, err := conn.Write(payload) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			assert(err, IsNil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			assert(nBytes, Equals, len(payload)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			response := readFrom(conn, time.Minute*10, 10240*1024) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			assert(response, Equals, xor(payload)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			assert(conn.Close(), IsNil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			wg.Done() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	wg.Wait() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	CloseAllServers(servers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func TestVMessIPv6(t *testing.T) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	t.SkipNow() // No IPv6 on travis-ci. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	assert := With(t) 
			 |