From fc41e14bf3c8bd50aae0ebc4c74b239cd6a979ce Mon Sep 17 00:00:00 2001 From: David Zhao Date: Mon, 7 Jun 2021 16:11:48 -0700 Subject: [PATCH] detect UDP buffer size w/o using original conn. if we get FD on the mux connection, the connection will be set to blocking mode and then hang when stopping --- pkg/rtc/config.go | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/pkg/rtc/config.go b/pkg/rtc/config.go index 381e729d8..ab71d0464 100644 --- a/pkg/rtc/config.go +++ b/pkg/rtc/config.go @@ -89,20 +89,15 @@ func NewWebRTCConfig(conf *config.RTCConfig, externalIP string) (*WebRTCConfig, UDPConn: udpMuxConn, }) s.SetICEUDPMux(udpMux) - - fd, err := udpMuxConn.File() + val, err := checkUDPReadBuffer() if err == nil { - value, err := syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) - if err == nil { - if value < minUDPBufferSize { - logger.Warnw("UDP receive buffer is too small for a production set-up", nil, - "current", value, - "suggested", minUDPBufferSize) - } else { - logger.Debugw("UDP receive buffer size", "current", value) - } + if val < minUDPBufferSize { + logger.Warnw("UDP receive buffer is too small for a production set-up", nil, + "current", val, + "suggested", minUDPBufferSize) + } else { + logger.Debugw("UDP receive buffer size", "current", val) } - _ = fd.Close() } } else if conf.ICEPortRangeStart != 0 && conf.ICEPortRangeEnd != 0 { if err := s.SetEphemeralUDPPortRange(uint16(conf.ICEPortRangeStart), uint16(conf.ICEPortRangeEnd)); err != nil { @@ -145,3 +140,19 @@ func NewWebRTCConfig(conf *config.RTCConfig, externalIP string) (*WebRTCConfig, TCPMuxListener: tcpListener, }, nil } + +func checkUDPReadBuffer() (int, error) { + conn, err := net.ListenUDP("udp4", nil) + if err != nil { + return 0, err + } + defer func() { _ = conn.Close() }() + _ = conn.SetReadBuffer(minUDPBufferSize) + fd, err := conn.File() + if err != nil { + return 0, nil + } + defer func() { _ = fd.Close() }() + + return syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) +}