From b045b26f17c642275e9454f5e928714a6b0ba9ab Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Sun, 10 May 2026 14:01:53 -0400 Subject: [PATCH] webrtc: BuildICEConfig uses NAT1To1IPs list, falls back to PublicIP (issue #20) --- core/webrtc/ice.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/core/webrtc/ice.go b/core/webrtc/ice.go index a728055..aed6b49 100644 --- a/core/webrtc/ice.go +++ b/core/webrtc/ice.go @@ -8,8 +8,14 @@ import ( // PeerConnection needs: a webrtc.Configuration (with ICE servers) and a // SettingEngine (with NAT1To1 and port range tuning). // +// NAT1To1 IP resolution order: +// 1. NAT1To1IPs — the full list is passed directly to Pion when non-empty. +// 2. PublicIP — promoted to a single-element NAT1To1IPs list for backward +// compatibility with configs that only set PublicIP. +// 3. Neither set — STUN-only mode; no host candidates are injected. +// // The returned *SettingEngine may be nil if no engine-level tuning is -// required (i.e. PublicIP unset and UDPPortRange at defaults). Callers +// required (i.e. no NAT1To1 IPs and UDPPortRange at defaults). Callers // should only pass it to webrtc.NewAPI when non-nil. func BuildICEConfig(c Config) (webrtc.Configuration, *webrtc.SettingEngine, error) { if err := c.Validate(); err != nil { @@ -25,11 +31,20 @@ func BuildICEConfig(c Config) (webrtc.Configuration, *webrtc.SettingEngine, erro }) } + // Build the effective NAT1To1 IP list. + // Prefer the explicit NAT1To1IPs slice; fall back to PublicIP as a + // single-element list so that legacy configs (PublicIP only) continue + // to work without operator changes. + nat1to1 := c.NAT1To1IPs + if len(nat1to1) == 0 && c.PublicIP != "" { + nat1to1 = []string{c.PublicIP} + } + var se *webrtc.SettingEngine - if c.PublicIP != "" || c.UDPPortRange.Low > 0 { + if len(nat1to1) > 0 || c.UDPPortRange.Low > 0 { engine := webrtc.SettingEngine{} - if c.PublicIP != "" { - engine.SetNAT1To1IPs([]string{c.PublicIP}, webrtc.ICECandidateTypeHost) + if len(nat1to1) > 0 { + engine.SetNAT1To1IPs(nat1to1, webrtc.ICECandidateTypeHost) } // Constrain the ephemeral UDP range Pion allocates for ICE candidates. // Note: this is a separate concern from our FFmpeg→Source UDP ports;