From 98036c59c1c5bdb5ffbdb27ff4a1e84259be9b6c Mon Sep 17 00:00:00 2001 From: Jonas Licht Date: Wed, 19 Nov 2025 10:28:51 +0100 Subject: [PATCH] transport_tcp: add read and write deadline --- fakes/tcp_conn.go | 9 +++++++++ sip/transport_tcp.go | 11 +++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fakes/tcp_conn.go b/fakes/tcp_conn.go index 6dff5e4..69d21cc 100644 --- a/fakes/tcp_conn.go +++ b/fakes/tcp_conn.go @@ -5,6 +5,7 @@ import ( "net" "sync" "testing" + "time" ) type TCPConn struct { @@ -51,6 +52,14 @@ func (c *TCPConn) Close() error { return nil } +func (c *TCPConn) SetReadDeadline(time.Time) error { + return nil +} + +func (c *TCPConn) SetWriteDeadline(time.Time) error { + return nil +} + func (c *TCPConn) TestReadConn(t testing.TB) []byte { buffer := make([]byte, 65355) // var buffer [65355]byte diff --git a/sip/transport_tcp.go b/sip/transport_tcp.go index f9abcea..3fcb23a 100644 --- a/sip/transport_tcp.go +++ b/sip/transport_tcp.go @@ -8,6 +8,7 @@ import ( "io" "log/slog" "net" + "os" "sync" "time" ) @@ -160,7 +161,7 @@ func (t *TransportTCP) readConnection(conn *TCPConnection, laddr string, raddr s for { num, err := conn.Read(buf) - if err != nil { + if err != nil && !errors.Is(err, os.ErrDeadlineExceeded) { if errors.Is(err, net.ErrClosed) || errors.Is(err, io.EOF) { t.log.Debug("connection was closed", "error", err) return @@ -184,7 +185,7 @@ func (t *TransportTCP) readConnection(conn *TCPConnection, laddr string, raddr s t.log.Debug("Keep alive CRLF received") if datalen == 4 { // 2 CRLF is ping - if _, err := conn.Write(data[:2]); err != nil { + if _, err := conn.Write(data[:2]); err != nil && !errors.Is(err, os.ErrDeadlineExceeded) { t.log.Error("Failed to pong keep alive", "error", err) return } @@ -261,6 +262,9 @@ func (c *TCPConnection) TryClose() (int, error) { func (c *TCPConnection) Read(b []byte) (n int, err error) { // Some debug hook. TODO move to proper way + if err := c.Conn.SetReadDeadline(time.Now().Add(time.Millisecond * 500)); err != nil { + slog.Warn("Failed to set read deadline", "ip", c.LocalAddr().String(), "dst", c.RemoteAddr().String(), "error", err) + } n, err = c.Conn.Read(b) if SIPDebug { logSIPRead("TCP", c.Conn.LocalAddr().String(), c.Conn.RemoteAddr().String(), b[:n]) @@ -270,6 +274,9 @@ func (c *TCPConnection) Read(b []byte) (n int, err error) { func (c *TCPConnection) Write(b []byte) (n int, err error) { // Some debug hook. TODO move to proper way + if err := c.Conn.SetWriteDeadline(time.Now().Add(time.Millisecond * 500)); err != nil { + slog.Warn("Failed to set write deadline", "ip", c.LocalAddr().String(), "dst", c.RemoteAddr().String(), "error", err) + } n, err = c.Conn.Write(b) if SIPDebug { logSIPWrite("TCP", c.Conn.LocalAddr().String(), c.Conn.RemoteAddr().String(), b[:n])