From 361b29a525b9648931a2afa182b79e9d6285784c Mon Sep 17 00:00:00 2001 From: hexiang Date: Tue, 16 Nov 2021 11:47:43 +0800 Subject: [PATCH] Update UDPMux to listen on all interfaces Before we would only listen on the first --- gather.go | 77 ++++++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/gather.go b/gather.go index 6a6588a..e248c08 100644 --- a/gather.go +++ b/gather.go @@ -229,57 +229,52 @@ func (a *Agent) gatherCandidatesLocalUDPMux(ctx context.Context) error { return errUDPMuxDisabled } - // find the IP address to advertise localIPs, err := localInterfaces(a.net, a.interfaceFilter, []NetworkType{NetworkTypeUDP4}) - if err != nil { + switch { + case err != nil: return err - } - - var candidateIP net.IP - if a.extIPMapper != nil && a.extIPMapper.candidateType == CandidateTypeHost { - for _, ip := range localIPs { - if candidateIP, err = a.extIPMapper.findExternalIP(ip.String()); err == nil { - // ok with first mapped IP - break - } else { - a.log.Warnf("1:1 NAT mapping is enabled but no external IP is found for %s", ip.String()) - } - } - } - - if candidateIP == nil && len(localIPs) > 0 { - candidateIP = localIPs[0] - } - if candidateIP == nil { + case len(localIPs) == 0: return errCandidateIPNotFound } - conn, err := a.udpMux.GetConn(a.localUfrag) - if err != nil { - return err - } - port := conn.LocalAddr().(*net.UDPAddr).Port + for _, candidateIP := range localIPs { + if a.extIPMapper != nil && a.extIPMapper.candidateType == CandidateTypeHost { + if mappedIP, err := a.extIPMapper.findExternalIP(candidateIP.String()); err != nil { + a.log.Warnf("1:1 NAT mapping is enabled but no external IP is found for %s", candidateIP.String()) + continue + } else { + candidateIP = mappedIP + } + } - hostConfig := CandidateHostConfig{ - Network: udp, - Address: candidateIP.String(), - Port: port, - Component: ComponentRTP, - } + conn, err := a.udpMux.GetConn(a.localUfrag) + if err != nil { + return err + } + port := conn.LocalAddr().(*net.UDPAddr).Port - c, err := NewCandidateHost(&hostConfig) - if err != nil { - closeConnAndLog(conn, a.log, fmt.Sprintf("Failed to create host mux candidate: %s %d: %v\n", candidateIP, port, err)) - // already logged error - return nil - } + hostConfig := CandidateHostConfig{ + Network: udp, + Address: candidateIP.String(), + Port: port, + Component: ComponentRTP, + } - if err := a.addCandidate(ctx, c, conn); err != nil { - if closeErr := c.close(); closeErr != nil { - a.log.Warnf("Failed to close candidate: %v", closeErr) + c, err := NewCandidateHost(&hostConfig) + if err != nil { + closeConnAndLog(conn, a.log, fmt.Sprintf("Failed to create host mux candidate: %s %d: %v\n", candidateIP, port, err)) + // already logged error + return nil + } + + if err := a.addCandidate(ctx, c, conn); err != nil { + if closeErr := c.close(); closeErr != nil { + a.log.Warnf("Failed to close candidate: %v", closeErr) + } + return err } - return err } + return nil }