diff --git a/chain/route.go b/chain/route.go index 8e1de36..2ac3876 100644 --- a/chain/route.go +++ b/chain/route.go @@ -78,7 +78,7 @@ func (*defaultRoute) Bind(ctx context.Context, network, address string, opts ... ReadQueueSize: options.UDPDataQueueSize, ReadBufferSize: options.UDPDataBufferSize, TTL: options.UDPConnTTL, - KeepAlive: true, + Keepalive: true, Logger: logger, }) return ln, err diff --git a/connector/relay/bind.go b/connector/relay/bind.go index 09a7513..248a0ab 100644 --- a/connector/relay/bind.go +++ b/connector/relay/bind.go @@ -73,7 +73,7 @@ func (c *relayConnector) bindUDP(ctx context.Context, conn net.Conn, network, ad ReadQueueSize: opts.UDPDataQueueSize, ReadBufferSize: opts.UDPDataBufferSize, TTL: opts.UDPConnTTL, - KeepAlive: true, + Keepalive: true, Logger: log, }) diff --git a/connector/socks/v5/bind.go b/connector/socks/v5/bind.go index b2e6d39..3c15898 100644 --- a/connector/socks/v5/bind.go +++ b/connector/socks/v5/bind.go @@ -87,7 +87,7 @@ func (c *socks5Connector) bindUDP(ctx context.Context, conn net.Conn, network, a ReadQueueSize: opts.UDPDataQueueSize, ReadBufferSize: opts.UDPDataBufferSize, TTL: opts.UDPConnTTL, - KeepAlive: true, + Keepalive: true, Logger: log, }) diff --git a/handler/tunnel/entrypoint.go b/handler/tunnel/entrypoint.go index 75cd9ed..17aec06 100644 --- a/handler/tunnel/entrypoint.go +++ b/handler/tunnel/entrypoint.go @@ -83,6 +83,9 @@ func (ep *entrypoint) handle(ctx context.Context, conn net.Conn) error { log.Trace(string(dump)) } + resp.ProtoMajor = req.ProtoMajor + resp.ProtoMinor = req.ProtoMinor + var tunnelID relay.TunnelID if ep.ingress != nil { if rule := ep.ingress.GetRule(ctx, req.Host); rule != nil { diff --git a/internal/net/udp/listener.go b/internal/net/udp/listener.go index affeaa4..b7c34f4 100644 --- a/internal/net/udp/listener.go +++ b/internal/net/udp/listener.go @@ -17,17 +17,16 @@ type ListenConfig struct { ReadQueueSize int ReadBufferSize int TTL time.Duration - KeepAlive bool + Keepalive bool Logger logger.Logger } type listener struct { conn net.PacketConn cqueue chan net.Conn connPool *connPool - // mux sync.Mutex - closed chan struct{} - errChan chan error - config *ListenConfig + closed chan struct{} + errChan chan error + config *ListenConfig } func NewListener(conn net.PacketConn, cfg *ListenConfig) net.Listener { @@ -42,9 +41,7 @@ func NewListener(conn net.PacketConn, cfg *ListenConfig) net.Listener { errChan: make(chan error, 1), config: cfg, } - if cfg.KeepAlive { - ln.connPool = newConnPool(cfg.TTL).WithLogger(cfg.Logger) - } + ln.connPool = newConnPool(cfg.TTL).WithLogger(cfg.Logger) go ln.listenLoop() return ln @@ -113,15 +110,12 @@ func (ln *listener) Close() error { } func (ln *listener) getConn(raddr net.Addr) *conn { - // ln.mux.Lock() - // defer ln.mux.Unlock() - c, ok := ln.connPool.Get(raddr.String()) - if ok { + if ok && !c.isClosed() { return c } - c = newConn(ln.conn, ln.Addr(), raddr, ln.config.ReadQueueSize, ln.config.KeepAlive) + c = newConn(ln.conn, ln.Addr(), raddr, ln.config.ReadQueueSize, ln.config.Keepalive) select { case ln.cqueue <- c: ln.connPool.Set(raddr.String(), c) @@ -142,17 +136,17 @@ type conn struct { idle int32 // indicate the connection is idle closed chan struct{} closeMutex sync.Mutex - keepAlive bool + keepalive bool } -func newConn(c net.PacketConn, laddr, remoteAddr net.Addr, queueSize int, keepAlive bool) *conn { +func newConn(c net.PacketConn, laddr, remoteAddr net.Addr, queueSize int, keepalive bool) *conn { return &conn{ PacketConn: c, localAddr: laddr, remoteAddr: remoteAddr, rc: make(chan []byte, queueSize), closed: make(chan struct{}), - keepAlive: keepAlive, + keepalive: keepalive, } } @@ -179,7 +173,7 @@ func (c *conn) Read(b []byte) (n int, err error) { } func (c *conn) WriteTo(b []byte, addr net.Addr) (n int, err error) { - if !c.keepAlive { + if !c.keepalive { defer c.Close() } return c.PacketConn.WriteTo(b, addr) @@ -201,6 +195,15 @@ func (c *conn) Close() error { return nil } +func (c *conn) isClosed() bool { + select { + case <-c.closed: + return true + default: + return false + } +} + func (c *conn) LocalAddr() net.Addr { return c.localAddr } diff --git a/listener/ftcp/listener.go b/listener/ftcp/listener.go index 58dc3c4..6e60e2c 100644 --- a/listener/ftcp/listener.go +++ b/listener/ftcp/listener.go @@ -64,7 +64,7 @@ func (l *ftcpListener) Init(md md.Metadata) (err error) { ReadQueueSize: l.md.readQueueSize, ReadBufferSize: l.md.readBufferSize, TTL: l.md.ttl, - KeepAlive: true, + Keepalive: true, Logger: l.logger, }) return diff --git a/listener/rudp/metadata.go b/listener/rudp/metadata.go index b4b7af0..bdc2f83 100644 --- a/listener/rudp/metadata.go +++ b/listener/rudp/metadata.go @@ -9,7 +9,7 @@ import ( const ( defaultTTL = 5 * time.Second - defaultReadBufferSize = 1024 + defaultReadBufferSize = 8192 defaultReadQueueSize = 1024 defaultBacklog = 128 ) diff --git a/listener/udp/listener.go b/listener/udp/listener.go index d74c7a1..e69a3b6 100644 --- a/listener/udp/listener.go +++ b/listener/udp/listener.go @@ -65,7 +65,7 @@ func (l *udpListener) Init(md md.Metadata) (err error) { Backlog: l.md.backlog, ReadQueueSize: l.md.readQueueSize, ReadBufferSize: l.md.readBufferSize, - KeepAlive: l.md.keepalive, + Keepalive: l.md.keepalive, TTL: l.md.ttl, Logger: l.logger, }) diff --git a/listener/udp/metadata.go b/listener/udp/metadata.go index 6cb7b30..494c9ec 100644 --- a/listener/udp/metadata.go +++ b/listener/udp/metadata.go @@ -9,7 +9,7 @@ import ( const ( defaultTTL = 5 * time.Second - defaultReadBufferSize = 1024 + defaultReadBufferSize = 8192 defaultReadQueueSize = 128 defaultBacklog = 128 )