|  | @@ -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)
 | 
	
		
			
				|  |  | +}
 |