From 4b171b849f50b333956ebd48b5b3afd6359c3c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Tue, 5 Dec 2023 01:25:17 +0100 Subject: [PATCH] Make ephemeral udp ports configurable --- main.go | 2 ++ ministream.toml | 13 ++++++++++++- server/config.go | 30 ++++++++++++++++++++++++++++-- server/server.go | 2 +- server/stream.go | 16 ++++++++++++---- 5 files changed, 55 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 04fd1f9..654bb34 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "log/slog" "net/http" "os" @@ -33,6 +34,7 @@ func main() { srv := server.NewServer(cfg) srv.Addr = cfg.HTTP.ListenAddr + slog.Info("Starting HTTP-server", "addr", srv.Addr, "cfg", cfg) if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { return err } diff --git a/ministream.toml b/ministream.toml index 80b7322..798956c 100644 --- a/ministream.toml +++ b/ministream.toml @@ -7,4 +7,15 @@ SiteName = "stream.example.org" # HTTPListenAddr is which port the HTTP server will listen on. # Default: ":8080" # Env: MINISTREAM_HTTP_LISTENADDR -HTTPListenAddr = ":8080" +ListenAddr = ":8080" + +[WebRTC] +# UDPMin is the minimum used for ephemeral ports. +# Default: 50000 +# Env: MINISTREAM_WEBRTC_UDPMIN +UDPMin = 50000 + +# UDPMax is the maximum used for ephemeral ports. +# Default: 50050 +# Env: MINISTREAM_WEBRTC_UDPMAX +UDPMAX = 50050 diff --git a/server/config.go b/server/config.go index a10c7c6..017f4c9 100644 --- a/server/config.go +++ b/server/config.go @@ -3,25 +3,36 @@ package server import ( "io" "os" + "strconv" "github.com/pelletier/go-toml/v2" ) type Config struct { - SiteName string `toml:"siteName"` - HTTP ConfigHTTP `toml:"http"` + SiteName string `toml:"siteName"` + HTTP ConfigHTTP `toml:"http"` + WebRTC ConfigWebRTC `toml:"WebRTC"` } type ConfigHTTP struct { ListenAddr string `json:"ListenAddr" toml:"ListenAddr"` } +type ConfigWebRTC struct { + UDPMin int `toml:"UDPMin"` + UDPMax int `toml:"UDPMax"` +} + func DefaultConfig() *Config { return &Config{ SiteName: "ministream", HTTP: ConfigHTTP{ ListenAddr: ":8080", }, + WebRTC: ConfigWebRTC{ + UDPMin: 50000, + UDPMax: 50050, + }, } } @@ -33,6 +44,21 @@ func (c *Config) OverrideFromEnv() { if httpAddr, ok := os.LookupEnv("MINISTREAM_HTTP_LISTENADDR"); ok { c.HTTP.ListenAddr = httpAddr } + + if value, ok := os.LookupEnv("MINISTREAM_WEBRTC_UDPMIN"); ok { + min, err := strconv.Atoi(value) + if err != nil { + panic("MINISTREAM_WEBRTC_UDPMIN is invalid") + } + c.WebRTC.UDPMin = min + } + if value, ok := os.LookupEnv("MINISTREAM_WEBRTC_UDPMAX"); ok { + max, err := strconv.Atoi(value) + if err != nil { + panic("MINISTREAM_WEBRTC_UDPMAX is invalid") + } + c.WebRTC.UDPMin = max + } } func ConfigFromReader(r io.Reader) (*Config, error) { diff --git a/server/server.go b/server/server.go index f1608fe..653af4e 100644 --- a/server/server.go +++ b/server/server.go @@ -26,7 +26,7 @@ type Server struct { func NewServer(config *Config) *Server { srv := &Server{ - streams: NewStreamStore(), + streams: NewStreamStore(config), config: config, } diff --git a/server/stream.go b/server/stream.go index 5a2957a..6337791 100644 --- a/server/stream.go +++ b/server/stream.go @@ -19,20 +19,24 @@ import ( var ErrNoSuchStream error = fmt.Errorf("no such stream") type StreamStore struct { - Streams map[string]*Stream + Streams map[string]*Stream + + config *Config webRTCConfig webrtc.Configuration mu sync.Mutex } -func NewStreamStore() *StreamStore { +func NewStreamStore(config *Config) *StreamStore { s := &StreamStore{ Streams: make(map[string]*Stream), + config: config, } return s } type Stream struct { + store *StreamStore peerConnection *webrtc.PeerConnection peerConnectionStats map[string]*stats.Stats peerConnectionStatsMu sync.Mutex @@ -96,7 +100,10 @@ func (s *Stream) AddListener(sd *webrtc.SessionDescription) (*webrtc.SessionDesc //i.Add(statsInterceptorFactory) se := webrtc.SettingEngine{} - _ = se.SetEphemeralUDPPortRange(50000, 50050) + _ = se.SetEphemeralUDPPortRange( + uint16(s.store.config.WebRTC.UDPMin), + uint16(s.store.config.WebRTC.UDPMax), + ) webRTCConfig := webrtc.Configuration{ ICEServers: []webrtc.ICEServer{ @@ -179,6 +186,7 @@ func (s *StreamStore) Add(streamKey string, sd *webrtc.SessionDescription) (*web go func() { stream := &Stream{ + store: s, lastUpdate: time.Now(), peerConnectionStats: make(map[string]*stats.Stats), } @@ -226,7 +234,7 @@ func (s *StreamStore) Add(streamKey string, sd *webrtc.SessionDescription) (*web }, } se := webrtc.SettingEngine{} - _ = se.SetEphemeralUDPPortRange(50000, 50050) + _ = se.SetEphemeralUDPPortRange(uint16(s.config.WebRTC.UDPMin), uint16(s.config.WebRTC.UDPMax)) // se.BufferFactory = func(packetType packetio.BufferPacketType, ssrc uint32) io.ReadWriteCloser { // buf := packetio.NewBuffer()