Files
ice/candidate_relay.go
Steffen Vogel bce6de3c84 Implement copy() for CandidateRelay
Relay candidates have an additional field "relayProtocol"
which is not marshaled and hence not copied by the
candidateBase's copy() method.

This change is required to properly expose the relay
protocol for via the agents GetSelectedCandidatePair()
function as it internally copies the candidates.
2022-11-14 16:01:28 +02:00

95 lines
2.1 KiB
Go

package ice
import (
"net"
)
// 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()
}
ip := net.ParseIP(config.Address)
if ip == nil {
return nil, ErrAddressParseFailed
}
networkType, err := determineNetworkType(config.Network, ip)
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: ip, Port: config.Port},
component: config.Component,
foundationOverride: config.Foundation,
priorityOverride: config.Priority,
relatedAddress: &CandidateRelatedAddress{
Address: config.RelAddr,
Port: config.RelPort,
},
},
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
}