tunnel: reduce per-frame allocations in hot path

- TAP→server: write buf[:n] directly instead of copy to new slice
- Keepalive: reuse fixed buffer instead of allocating every 3s

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Git Sagar 2026-06-06 17:20:24 +05:30
parent 3feb93e679
commit b2ef8bc1bf

View file

@ -142,9 +142,7 @@ func (t *Tunnel) Bridge(tapRead func(buf []byte) (int, error), tapWrite func(buf
errCh <- fmt.Errorf("read from tap: %w", err) errCh <- fmt.Errorf("read from tap: %w", err)
return return
} }
frame := make([]byte, n) if err := t.WriteFrames([][]byte{buf[:n]}); err != nil {
copy(frame, buf[:n])
if err := t.WriteFrames([][]byte{frame}); err != nil {
errCh <- fmt.Errorf("write to server: %w", err) errCh <- fmt.Errorf("write to server: %w", err)
return return
} }
@ -162,6 +160,7 @@ func (t *Tunnel) StartKeepalive() {
ticker := time.NewTicker(keepAliveInterval) ticker := time.NewTicker(keepAliveInterval)
defer ticker.Stop() defer ticker.Stop()
rng := rand.New(rand.NewSource(time.Now().UnixNano())) rng := rand.New(rand.NewSource(time.Now().UnixNano()))
randBuf := make([]byte, maxKeepaliveSize)
for { for {
select { select {
case <-t.stopCh: case <-t.stopCh:
@ -174,9 +173,8 @@ func (t *Tunnel) StartKeepalive() {
if err := binary.Write(t.sess.Conn, binary.BigEndian, size); err != nil { if err := binary.Write(t.sess.Conn, binary.BigEndian, size); err != nil {
return return
} }
randData := make([]byte, size) rng.Read(randBuf[:size])
rng.Read(randData) if _, err := t.sess.Conn.Write(randBuf[:size]); err != nil {
if _, err := t.sess.Conn.Write(randData); err != nil {
return return
} }
} }