From 57720ede6d07ab81c60da139bd0f5c02dc2df432 Mon Sep 17 00:00:00 2001 From: Sander Bruens Date: Thu, 14 Nov 2024 15:18:46 -0500 Subject: [PATCH] add `packetConn` constructor for re-use in `outline-ss-server` (#300) * Add a constructor for `packetConn` so it can be re-used in `outline-ss-server`. * Add a comment to `NewPacketConn`. --- transport/shadowsocks/packet_listener.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/transport/shadowsocks/packet_listener.go b/transport/shadowsocks/packet_listener.go index 08da1a54..e1ece175 100644 --- a/transport/shadowsocks/packet_listener.go +++ b/transport/shadowsocks/packet_listener.go @@ -54,8 +54,7 @@ func (c *packetListener) ListenPacket(ctx context.Context) (net.PacketConn, erro if err != nil { return nil, fmt.Errorf("could not connect to endpoint: %w", err) } - conn := packetConn{Conn: proxyConn, key: c.key} - return &conn, nil + return NewPacketConn(proxyConn, c.key), nil } type packetConn struct { @@ -65,6 +64,15 @@ type packetConn struct { var _ net.PacketConn = (*packetConn)(nil) +// NewPacketConn wraps a [net.Conn] and returns a [net.PacketConn] that encrypts/decrypts +// packets before writing/reading them to/from the underlying connection using the provided +// encryption key. +// +// Closing the returned [net.PacketConn] will also close the underlying [net.Conn]. +func NewPacketConn(conn net.Conn, key *EncryptionKey) net.PacketConn { + return &packetConn{Conn: conn, key: key} +} + // WriteTo encrypts `b` and writes to `addr` through the proxy. func (c *packetConn) WriteTo(b []byte, addr net.Addr) (int, error) { socksTargetAddr := socks.ParseAddr(addr.String())