From 81a8db4b7e41bc5d57daa770932d8fac8a29301b Mon Sep 17 00:00:00 2001 From: sbruens Date: Fri, 18 Oct 2024 15:39:59 -0400 Subject: [PATCH 1/2] Add a constructor for `packetConn` so it can be re-used in `outline-ss-server`. --- transport/shadowsocks/packet_listener.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/transport/shadowsocks/packet_listener.go b/transport/shadowsocks/packet_listener.go index 548138dc..2f067e4f 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,10 @@ type packetConn struct { var _ net.PacketConn = (*packetConn)(nil) +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()) From ec75f608740b68ccf88b9098dfe7dc1bd762ea50 Mon Sep 17 00:00:00 2001 From: sbruens Date: Thu, 14 Nov 2024 13:26:16 -0500 Subject: [PATCH 2/2] Add a comment to `NewPacketConn`. --- transport/shadowsocks/packet_listener.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/transport/shadowsocks/packet_listener.go b/transport/shadowsocks/packet_listener.go index 2f067e4f..014bb400 100644 --- a/transport/shadowsocks/packet_listener.go +++ b/transport/shadowsocks/packet_listener.go @@ -64,6 +64,11 @@ 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} }