@@ -47,12 +47,6 @@ type UDPConnMetrics interface {
47
47
// Max UDP buffer size for the server code.
48
48
const serverUDPBufferSize = 64 * 1024
49
49
50
- var bufferPool = sync.Pool {
51
- New : func () interface {} {
52
- return make ([]byte , serverUDPBufferSize )
53
- },
54
- }
55
-
56
50
// Wrapper for slog.Debug during UDP proxying.
57
51
func debugUDP (l * slog.Logger , template string , cipherID string , attr slog.Attr ) {
58
52
// This is an optimization to reduce unnecessary allocations due to an interaction
@@ -91,6 +85,7 @@ func findAccessKeyUDP(clientIP netip.Addr, dst, src []byte, cipherList CipherLis
91
85
92
86
type packetHandler struct {
93
87
logger * slog.Logger
88
+ bufferPool sync.Pool
94
89
natTimeout time.Duration
95
90
ciphers CipherList
96
91
ssm ShadowsocksConnMetrics
@@ -102,8 +97,14 @@ func NewPacketHandler(natTimeout time.Duration, cipherList CipherList, ssMetrics
102
97
if ssMetrics == nil {
103
98
ssMetrics = & NoOpShadowsocksConnMetrics {}
104
99
}
100
+ bufferPool := sync.Pool {
101
+ New : func () interface {} {
102
+ return make ([]byte , serverUDPBufferSize )
103
+ },
104
+ }
105
105
return & packetHandler {
106
106
logger : noopLogger (),
107
+ bufferPool : bufferPool ,
107
108
natTimeout : natTimeout ,
108
109
ciphers : cipherList ,
109
110
ssm : ssMetrics ,
@@ -138,9 +139,8 @@ type PacketHandleFunc func(conn net.Conn)
138
139
func PacketServe (clientConn net.PacketConn , handle PacketHandleFunc , metrics NATMetrics ) {
139
140
nm := newNATmap ()
140
141
defer nm .Close ()
142
+ buffer := make ([]byte , serverUDPBufferSize )
141
143
for {
142
- buffer := bufferPool .Get ().([]byte )
143
- defer bufferPool .Put (buffer )
144
144
n , addr , err := clientConn .ReadFrom (buffer )
145
145
if err != nil {
146
146
if errors .Is (err , net .ErrClosed ) {
@@ -210,10 +210,15 @@ func (h *packetHandler) Handle(clientConn net.Conn, connMetrics UDPConnMetrics)
210
210
return
211
211
}
212
212
213
+ cipherBuf := h .bufferPool .Get ().([]byte )
214
+ textBuf := h .bufferPool .Get ().([]byte )
215
+ defer func () {
216
+ h .bufferPool .Put (cipherBuf )
217
+ h .bufferPool .Put (textBuf )
218
+ }()
219
+
213
220
var cryptoKey * shadowsocks.EncryptionKey
214
221
var proxyTargetBytes int
215
- cipherBuf := make ([]byte , serverUDPBufferSize )
216
- textBuf := make ([]byte , serverUDPBufferSize )
217
222
for {
218
223
clientProxyBytes , err := clientConn .Read (cipherBuf )
219
224
if errors .Is (err , net .ErrClosed ) {
0 commit comments