| 
					
				 | 
			
			
				@@ -6,6 +6,7 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	v2net "github.com/v2ray/v2ray-core/common/net" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"github.com/v2ray/v2ray-core/proxy" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/v2ray/v2ray-core/transport" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -62,3 +63,46 @@ func DialWithoutCache(src v2net.Address, dest v2net.Destination) (net.Conn, erro 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return dialer.Dial(dest.Network().String(), dest.NetAddr()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func Dial3(src v2net.Address, dest v2net.Destination, proxyMeta proxy.InboundHandlerMeta) (*Connection, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if proxyMeta.KcpSupported && transport.IsKcpEnabled() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		DialKCP3(src, dest, proxyMeta) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Dial(src, dest) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func DialWithoutCache3(src v2net.Address, dest v2net.Destination, proxyMeta proxy.InboundHandlerMeta) (net.Conn, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if proxyMeta.KcpSupported && transport.IsKcpEnabled() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return DialWithoutCache(src, dest) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func DialKCP3(src v2net.Address, dest v2net.Destination, proxyMeta proxy.InboundHandlerMeta) (*Connection, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if src == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		src = v2net.AnyIP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	id := src.String() + "-" + dest.NetAddr() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var conn net.Conn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if dest.IsTCP() && transport.IsConnectionReusable() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		conn = globalCache.Get(id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if conn == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		conn, err = DialWithoutCache3(src, dest, proxyMeta) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return &Connection{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		dest:     id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		conn:     conn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		listener: globalCache, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/*DialKCPWithoutCache Dial KCP connection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+This Dialer will ignore src this is a restriction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+due to github.com/xtaci/kcp-go.DialWithOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func DialKCPWithoutCache(src v2net.Address, dest v2net.Destination) (net.Conn, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return DialKCP(dest) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |