Skip to content

Commit

Permalink
Match libwebrtc's TURN protocol priority
Browse files Browse the repository at this point in the history
Today, all relay candidates from Pion have the same priority.
This PR attempts to reproduce libwebrtc's behavior, where the
TURN servers candidates priority is based on the underlying
relay protocol. UDP are preferred over TCP, which are preferred
over the TLS options.
  • Loading branch information
jmelancongen authored and Sean-Der committed Mar 20, 2024
1 parent 67cc918 commit 8680cd5
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
17 changes: 17 additions & 0 deletions candidate_relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,23 @@ func NewCandidateRelay(config *CandidateRelayConfig) (*CandidateRelay, error) {
}, nil
}

// LocalPreference returns the local preference for this candidate
func (c *CandidateRelay) LocalPreference() uint16 {
// These preference values come from libwebrtc
// https://github.com/mozilla/libwebrtc/blob/1389c76d9c79839a2ca069df1db48aa3f2e6a1ac/p2p/base/turn_port.cc#L61
var relayPreference uint16
switch c.relayProtocol {
case relayProtocolTLS, relayProtocolDTLS:
relayPreference = 2
case tcp:
relayPreference = 1
default:
relayPreference = 0
}

return c.candidateBase.LocalPreference() + relayPreference
}

// RelayProtocol returns the protocol used between the endpoint and the relay server.
func (c *CandidateRelay) RelayProtocol() string {
return c.relayProtocol
Expand Down
4 changes: 2 additions & 2 deletions gather.go
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*stun.URI) { /

relAddr = conn.LocalAddr().(*net.UDPAddr).IP.String() //nolint:forcetypeassert
relPort = conn.LocalAddr().(*net.UDPAddr).Port //nolint:forcetypeassert
relayProtocol = "dtls"
relayProtocol = relayProtocolDTLS
locConn = &fakenet.PacketConn{Conn: conn}
case url.Proto == stun.ProtoTypeTCP && url.Scheme == stun.SchemeTypeTURNS:
tcpAddr, resolvErr := a.net.ResolveTCPAddr(NetworkTypeTCP4.String(), turnServerAddr)
Expand Down Expand Up @@ -662,7 +662,7 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*stun.URI) { /

relAddr = conn.LocalAddr().(*net.TCPAddr).IP.String() //nolint:forcetypeassert
relPort = conn.LocalAddr().(*net.TCPAddr).Port //nolint:forcetypeassert
relayProtocol = "tls"
relayProtocol = relayProtocolTLS
locConn = turn.NewSTUNConn(conn)
default:
a.log.Warnf("Unable to handle URL in gatherCandidatesRelay %v", url)
Expand Down
5 changes: 5 additions & 0 deletions ice.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,8 @@ func (t GatheringState) String() string {
return ErrUnknownType.Error()
}
}

const (
relayProtocolDTLS = "dtls"
relayProtocolTLS = "tls"
)

0 comments on commit 8680cd5

Please sign in to comment.