-
Notifications
You must be signed in to change notification settings - Fork 204
Expand file tree
/
Copy pathcandidate_relay.go
More file actions
128 lines (110 loc) · 2.95 KB
/
candidate_relay.go
File metadata and controls
128 lines (110 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// SPDX-FileCopyrightText: 2026 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT
package ice
import (
"net"
"net/netip"
)
const (
// These preference values come from libwebrtc
//nolint:lll
// https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/p2p/base/p2p_constants.h;l=126;drc=bf712ec1a13783224debb691ba88ad5c15b93194
preferenceRelayTLS = 0
preferenceRelayTCP = 1
preferenceRelayDTLS = 2
preferenceRelayUDP = 3
)
// CandidateRelay ...
type CandidateRelay struct {
candidateBase
relayProtocol string
onClose func() error
}
// CandidateRelayConfig is the config required to create a new CandidateRelay.
type CandidateRelayConfig struct {
CandidateID string
Network string
Address string
Port int
Component uint16
Priority uint32
Foundation string
RelAddr string
RelPort int
RelayProtocol string
OnClose func() error
}
// NewCandidateRelay creates a new relay candidate.
func NewCandidateRelay(config *CandidateRelayConfig) (*CandidateRelay, error) {
candidateID := config.CandidateID
if candidateID == "" {
candidateID = globalCandidateIDGenerator.Generate()
}
ipAddr, err := netip.ParseAddr(config.Address)
if err != nil {
return nil, err
}
networkType, err := determineNetworkType(config.Network, ipAddr)
if err != nil {
return nil, err
}
return &CandidateRelay{
candidateBase: candidateBase{
id: candidateID,
networkType: networkType,
candidateType: CandidateTypeRelay,
address: config.Address,
port: config.Port,
resolvedAddr: &net.UDPAddr{
IP: ipAddr.AsSlice(),
Port: config.Port,
Zone: ipAddr.Zone(),
},
component: config.Component,
foundationOverride: config.Foundation,
priorityOverride: config.Priority,
relatedAddress: &CandidateRelatedAddress{
Address: config.RelAddr,
Port: config.RelPort,
},
relayLocalPreference: relayProtocolPreference(config.RelayProtocol),
},
relayProtocol: config.RelayProtocol,
onClose: config.OnClose,
}, nil
}
// RelayProtocol returns the protocol used between the endpoint and the relay server.
func (c *CandidateRelay) RelayProtocol() string {
return c.relayProtocol
}
func (c *CandidateRelay) close() error {
err := c.candidateBase.close()
if c.onClose != nil {
err = c.onClose()
c.onClose = nil
}
return err
}
func (c *CandidateRelay) copy() (Candidate, error) {
cc, err := c.candidateBase.copy()
if err != nil {
return nil, err
}
if ccr, ok := cc.(*CandidateRelay); ok {
ccr.relayProtocol = c.relayProtocol
}
return cc, nil
}
// relayProtocolPreference returns the preference for the relay protocol.
func relayProtocolPreference(relayProtocol string) uint16 {
switch relayProtocol {
case relayProtocolTLS:
return preferenceRelayTLS
case tcp:
return preferenceRelayTCP
case relayProtocolDTLS:
return preferenceRelayDTLS
default:
return preferenceRelayUDP
}
}