Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions active_tcp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ func TestActiveTCPCandidateDoesNotPairWithUnrelatedRemote(t *testing.T) {
_, port, _, err := parseAddr(listener.Addr())
require.NoError(t, err)
passives = append(passives, mustCandidateHost(t, &CandidateHostConfig{
Network: "tcp4", Address: "127.0.0.1", Port: port, Component: ComponentRTP, TCPType: TCPTypePassive,
Network: "tcp4", Address: "127.0.0.1", Port: port, Component: ComponentRTP, Extensions: []CandidateExtension{{"tcptype", TCPTypePassive.String()}},
}))
}
peerReflexive, err := NewCandidatePeerReflexive(&CandidatePeerReflexiveConfig{
Expand All @@ -472,10 +472,10 @@ func TestActiveTCPCandidateDoesNotPairWithUnrelatedRemote(t *testing.T) {
unrelated := []Candidate{
peerReflexive,
mustCandidateHost(t, &CandidateHostConfig{
Network: "tcp4", Address: "127.0.0.1", Port: 9, Component: ComponentRTP, TCPType: TCPTypeSimultaneousOpen,
Network: "tcp4", Address: "127.0.0.1", Port: 9, Component: ComponentRTP, Extensions: []CandidateExtension{{"tcptype", TCPTypeSimultaneousOpen.String()}},
}),
mustCandidateHost(t, &CandidateHostConfig{
Network: "tcp4", Address: "127.0.0.2", Port: passives[0].Port(), Component: ComponentRTP, TCPType: TCPTypeSimultaneousOpen,
Network: "tcp4", Address: "127.0.0.2", Port: passives[0].Port(), Component: ComponentRTP, Extensions: []CandidateExtension{{"tcptype", TCPTypeSimultaneousOpen.String()}},
}),
}

Expand Down Expand Up @@ -513,7 +513,7 @@ func TestActiveTCPCandidateMarksLinkLocalAsLocationTracked(t *testing.T) {

remote, err := NewCandidateHost(&CandidateHostConfig{
Network: NetworkTypeTCP6.String(), Address: "2001:db8::1", Port: 9000,
Component: ComponentRTP, TCPType: TCPTypePassive,
Component: ComponentRTP, Extensions: []CandidateExtension{{"tcptype", TCPTypePassive.String()}},
})
require.NoError(t, err)

Expand Down
4 changes: 1 addition & 3 deletions agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -1039,7 +1039,7 @@ func (a *Agent) addRemotePassiveTCPCandidate(remoteCandidate Candidate) {
Address: localIPs[i].addr.String(),
Port: tcpAddr.Port,
Component: ComponentRTP,
TCPType: TCPTypeActive,
Extensions: []CandidateExtension{{"tcptype", TCPTypeActive.String()}},
IsLocationTracked: shouldFilterLocationTrackedIP(localIPs[i].addr),
})
if err != nil {
Expand Down Expand Up @@ -1874,8 +1874,6 @@ func (a *Agent) handleInboundRequest(
Address: canonicalAddr(remote.Addr()).String(),
Port: int(remote.Port()),
Component: local.Component(),
RelAddr: "",
RelPort: 0,
}

// A peer-reflexive candidate SHOULD take its priority from the PRIORITY
Expand Down
44 changes: 23 additions & 21 deletions agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ func TestHandlePeerReflexive(t *testing.T) { //nolint:cyclop,maintidx
pair.consentStartedAt = time.Now()
agent.revokeConsent(pair)

srflx, err := NewCandidateServerReflexive(&CandidateServerReflexiveConfig{Network: "udp", Address: "172.17.0.3", Port: 999, Component: 1, RelAddr: "0.0.0.0", RelPort: 0})
srflx, err := NewCandidateServerReflexive(&CandidateServerReflexiveConfig{Network: "udp", Address: "172.17.0.3", Port: 999, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "0.0.0.0"}, {Key: "rport", Value: "0"}}})
require.NoError(t, err)
agent.addRemoteCandidate(srflx) // nolint:contextcheck

Expand Down Expand Up @@ -541,7 +541,7 @@ func TestHandlePeerReflexive(t *testing.T) { //nolint:cyclop,maintidx
local.addRemoteCandidateCache(prflx, remote)
oldPriority := pair.priority()

relay, err := NewCandidateRelay(&CandidateRelayConfig{Network: "udp", Address: "172.17.0.3", Port: 999, Component: 1, RelAddr: "0.0.0.0", RelPort: 0})
relay, err := NewCandidateRelay(&CandidateRelayConfig{Network: "udp", Address: "172.17.0.3", Port: 999, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "0.0.0.0"}, {Key: "rport", Value: "0"}}})
require.NoError(t, err)
agent.addRemoteCandidate(relay) // nolint:contextcheck

Expand Down Expand Up @@ -1371,15 +1371,15 @@ func TestCandidatePairsStats(t *testing.T) { //nolint:cyclop,gocyclo
hostLocal, err := NewCandidateHost(hostConfig)
require.NoError(t, err)

relayConfig := &CandidateRelayConfig{Network: "udp", Address: "1.2.3.4", Port: 2340, Component: 1, RelAddr: "4.3.2.1", RelPort: 43210}
relayConfig := &CandidateRelayConfig{Network: "udp", Address: "1.2.3.4", Port: 2340, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43210"}}}
relayRemote, err := NewCandidateRelay(relayConfig)
require.NoError(t, err)

srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, RelAddr: "4.3.2.1", RelPort: 43212}
srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43212"}}}
srflxRemote, err := NewCandidateServerReflexive(srflxConfig)
require.NoError(t, err)

prflxConfig := &CandidatePeerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19217, Component: 1, RelAddr: "4.3.2.1", RelPort: 43211}
prflxConfig := &CandidatePeerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19217, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43211"}}}
prflxRemote, err := NewCandidatePeerReflexive(prflxConfig)
require.NoError(t, err)

Expand Down Expand Up @@ -1471,7 +1471,7 @@ func TestSelectedCandidatePairStats(t *testing.T) { //nolint:cyclop
hostLocal, err := NewCandidateHost(hostConfig)
require.NoError(t, err)

srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, RelAddr: "4.3.2.1", RelPort: 43212}
srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43212"}}}
srflxRemote, err := NewCandidateServerReflexive(srflxConfig)
require.NoError(t, err)

Expand Down Expand Up @@ -1528,7 +1528,7 @@ func TestLocalCandidateStats(t *testing.T) { //nolint:cyclop
hostLocal, err := NewCandidateHost(hostConfig)
require.NoError(t, err)

srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "192.168.1.1", Port: 19217, Component: 1, RelAddr: "4.3.2.1", RelPort: 43212}
srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "192.168.1.1", Port: 19217, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43212"}}}
srflxLocal, err := NewCandidateServerReflexive(srflxConfig)
require.NoError(t, err)

Expand Down Expand Up @@ -1572,15 +1572,15 @@ func TestRemoteCandidateStats(t *testing.T) { //nolint:cyclop
require.NoError(t, agent.Close())
}()

relayConfig := &CandidateRelayConfig{Network: "udp", Address: "1.2.3.4", Port: 12340, Component: 1, RelAddr: "4.3.2.1", RelPort: 43210}
relayConfig := &CandidateRelayConfig{Network: "udp", Address: "1.2.3.4", Port: 12340, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43210"}}}
relayRemote, err := NewCandidateRelay(relayConfig)
require.NoError(t, err)

srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, RelAddr: "4.3.2.1", RelPort: 43212}
srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43212"}}}
srflxRemote, err := NewCandidateServerReflexive(srflxConfig)
require.NoError(t, err)

prflxConfig := &CandidatePeerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19217, Component: 1, RelAddr: "4.3.2.1", RelPort: 43211}
prflxConfig := &CandidatePeerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19217, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43211"}}}
prflxRemote, err := NewCandidatePeerReflexive(prflxConfig)
require.NoError(t, err)

Expand Down Expand Up @@ -3131,10 +3131,10 @@ func TestAutomaticRenominationRelayToDirect(t *testing.T) {
defer agent.Close() //nolint:errcheck

// Create relay pair
localRelay, err := NewCandidateRelay(&CandidateRelayConfig{Network: "udp", Address: "10.0.0.1", Port: 30000, Component: 1, RelAddr: "192.168.1.1", RelPort: 10000})
localRelay, err := NewCandidateRelay(&CandidateRelayConfig{Network: "udp", Address: "10.0.0.1", Port: 30000, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "192.168.1.1"}, {Key: "rport", Value: "10000"}}})
require.NoError(t, err)

remoteRelay, err := NewCandidateRelay(&CandidateRelayConfig{Network: "udp", Address: "10.0.0.2", Port: 40000, Component: 1, RelAddr: "192.168.1.2", RelPort: 20000})
remoteRelay, err := NewCandidateRelay(&CandidateRelayConfig{Network: "udp", Address: "10.0.0.2", Port: 40000, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "192.168.1.2"}, {Key: "rport", Value: "20000"}}})
require.NoError(t, err)

relayPair := newCandidatePair(localRelay, remoteRelay, true)
Expand Down Expand Up @@ -3213,7 +3213,7 @@ func TestAddRemoteCandidateIndependentFromTURNTransportSelection(t *testing.T) {
require.NoError(t, agent.Close())
}()

cand, err := NewCandidateRelay(&CandidateRelayConfig{Network: udp, Address: "198.51.100.2", Port: 5000, Component: ComponentRTP, RelAddr: "192.0.2.10", RelPort: 4000})
cand, err := NewCandidateRelay(&CandidateRelayConfig{Network: udp, Address: "198.51.100.2", Port: 5000, Component: ComponentRTP, Extensions: []CandidateExtension{{Key: "raddr", Value: "192.0.2.10"}, {Key: "rport", Value: "4000"}}})
require.NoError(t, err)

require.NoError(t, agent.loop.Run(agent.loop, func(_ context.Context) {
Expand Down Expand Up @@ -3272,7 +3272,7 @@ func TestAddRemoteCandidateIndependentFromTURNTransportSelection(t *testing.T) {
require.NoError(t, agent.Close())
}()

cand, err := NewCandidateRelay(&CandidateRelayConfig{Network: udp, Address: "198.51.100.3", Port: 5001, Component: ComponentRTP, RelAddr: "192.0.2.11", RelPort: 4001})
cand, err := NewCandidateRelay(&CandidateRelayConfig{Network: udp, Address: "198.51.100.3", Port: 5001, Component: ComponentRTP, Extensions: []CandidateExtension{{Key: "raddr", Value: "192.0.2.11"}, {Key: "rport", Value: "4001"}}})
require.NoError(t, err)

require.NoError(t, agent.loop.Run(agent.loop, func(_ context.Context) {
Expand Down Expand Up @@ -4020,11 +4020,13 @@ func TestAddressRewriteSystem(t *testing.T) { //nolint:cyclop,maintidx
require.ElementsMatch(t, testCase.expected, addresses(candidates, CandidateTypeServerReflexive))
for _, candidate := range candidates {
require.Equal(t, CandidateTypeServerReflexive, candidate.Type())
related := candidate.RelatedAddress()
require.NotNil(t, related)
require.NotEmpty(t, related.Address)
related, ok := candidate.GetExtension("raddr")
require.True(t, ok)
require.NotEmpty(t, related.Value)
require.Positive(t, candidate.Port())
require.Equal(t, candidate.Port(), related.Port)
port, ok := candidate.GetExtension("rport")
require.True(t, ok)
require.Equal(t, strconv.Itoa(candidate.Port()), port.Value)
}
})
}
Expand Down Expand Up @@ -4383,7 +4385,7 @@ func newHostRemote(t *testing.T) *CandidateHost {
func newPrflxRemote(t *testing.T) *CandidatePeerReflexive {
t.Helper()

prflxConfig := &CandidatePeerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19217, Component: 1, RelAddr: "4.3.2.1", RelPort: 43211}
prflxConfig := &CandidatePeerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19217, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43211"}}}
prflxRemote, err := NewCandidatePeerReflexive(prflxConfig)
require.NoError(t, err)

Expand All @@ -4393,7 +4395,7 @@ func newPrflxRemote(t *testing.T) *CandidatePeerReflexive {
func newSrflxRemote(t *testing.T) *CandidateServerReflexive {
t.Helper()

srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, RelAddr: "4.3.2.1", RelPort: 43212}
srflxConfig := &CandidateServerReflexiveConfig{Network: "udp", Address: "10.10.10.2", Port: 19218, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43212"}}}
srflxRemote, err := NewCandidateServerReflexive(srflxConfig)
require.NoError(t, err)

Expand All @@ -4403,7 +4405,7 @@ func newSrflxRemote(t *testing.T) *CandidateServerReflexive {
func newRelayRemote(t *testing.T) *CandidateRelay {
t.Helper()

relayConfig := &CandidateRelayConfig{Network: "udp", Address: "1.2.3.4", Port: 12340, Component: 1, RelAddr: "4.3.2.1", RelPort: 43210}
relayConfig := &CandidateRelayConfig{Network: "udp", Address: "1.2.3.4", Port: 12340, Component: 1, Extensions: []CandidateExtension{{Key: "raddr", Value: "4.3.2.1"}, {Key: "rport", Value: "43210"}}}
relayRemote, err := NewCandidateRelay(relayConfig)
require.NoError(t, err)

Expand Down
15 changes: 9 additions & 6 deletions candidate.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,33 +49,36 @@ type Candidate interface {

Priority() uint32

// A transport address related to a
// candidate, which is useful for diagnostics and other purposes
RelatedAddress() *CandidateRelatedAddress

// Extensions returns a copy of all extension attributes associated with the ICECandidate.
// In the order of insertion, *(key value).
// Extension attributes are defined in RFC 5245, Section 15.1:
// https://datatracker.ietf.org/doc/html/rfc5245#section-15.1
//.
Extensions() []CandidateExtension
// SetExtensions replaces all extensions with a validated copy.
// It preserves order and duplicates and leaves the candidate unchanged on error.
SetExtensions([]CandidateExtension) error
// GetExtension returns the value of the extension attribute associated with the ICECandidate.
// Extension attributes are defined in RFC 5245, Section 15.1:
// https://datatracker.ietf.org/doc/html/rfc5245#section-15.1
//.
GetExtension(key string) (value CandidateExtension, ok bool)
// AddExtension adds an extension attribute to the ICECandidate.
// If an extension with the same key already exists, it will be overwritten.
// If an extension with the same key already exists, the first is overwritten.
// Extension attributes are defined in RFC 5245, Section 15.1:
AddExtension(extension CandidateExtension) error
// RemoveExtension removes an extension attribute from the ICECandidate.
// RemoveExtension removes the first extension attribute with the given key.
// Extension attributes are defined in RFC 5245, Section 15.1:
RemoveExtension(key string) (ok bool)

String() string
Type() CandidateType

// TCPType returns the TCP mode extension, or TCPTypeUnspecified if absent or unrecognized.
TCPType() TCPType

// Equal compares the transport address (including TCP type) and candidate type.
// Use DeepEqual to also compare extensions.
Equal(other Candidate) bool

// DeepEqual same as Equal, But it also compares the candidate extensions.
Expand Down
Loading
Loading