1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
- // SPDX-License-Identifier: MIT
- package webrtc
- import (
- "github.com/pion/sdp/v3"
- )
- // DTLSRole indicates the role of the DTLS transport.
- type DTLSRole byte
- const (
- // DTLSRoleAuto defines the DTLS role is determined based on
- // the resolved ICE role: the ICE controlled role acts as the DTLS
- // client and the ICE controlling role acts as the DTLS server.
- DTLSRoleAuto DTLSRole = iota + 1
- // DTLSRoleClient defines the DTLS client role.
- DTLSRoleClient
- // DTLSRoleServer defines the DTLS server role.
- DTLSRoleServer
- )
- const (
- // https://tools.ietf.org/html/rfc5763
- /*
- The answerer MUST use either a
- setup attribute value of setup:active or setup:passive. Note that
- if the answerer uses setup:passive, then the DTLS handshake will
- not begin until the answerer is received, which adds additional
- latency. setup:active allows the answer and the DTLS handshake to
- occur in parallel. Thus, setup:active is RECOMMENDED.
- */
- defaultDtlsRoleAnswer = DTLSRoleClient
- /*
- The endpoint that is the offerer MUST use the setup attribute
- value of setup:actpass and be prepared to receive a client_hello
- before it receives the answer.
- */
- defaultDtlsRoleOffer = DTLSRoleAuto
- )
- func (r DTLSRole) String() string {
- switch r {
- case DTLSRoleAuto:
- return "auto"
- case DTLSRoleClient:
- return "client"
- case DTLSRoleServer:
- return "server"
- default:
- return unknownStr
- }
- }
- // Iterate a SessionDescription from a remote to determine if an explicit
- // role can been determined from it. The decision is made from the first role we we parse.
- // If no role can be found we return DTLSRoleAuto
- func dtlsRoleFromRemoteSDP(sessionDescription *sdp.SessionDescription) DTLSRole {
- if sessionDescription == nil {
- return DTLSRoleAuto
- }
- for _, mediaSection := range sessionDescription.MediaDescriptions {
- for _, attribute := range mediaSection.Attributes {
- if attribute.Key == "setup" {
- switch attribute.Value {
- case sdp.ConnectionRoleActive.String():
- return DTLSRoleClient
- case sdp.ConnectionRolePassive.String():
- return DTLSRoleServer
- default:
- return DTLSRoleAuto
- }
- }
- }
- }
- return DTLSRoleAuto
- }
- func connectionRoleFromDtlsRole(d DTLSRole) sdp.ConnectionRole {
- switch d {
- case DTLSRoleClient:
- return sdp.ConnectionRoleActive
- case DTLSRoleServer:
- return sdp.ConnectionRolePassive
- case DTLSRoleAuto:
- return sdp.ConnectionRoleActpass
- default:
- return sdp.ConnectionRole(0)
- }
- }
|