summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/webrtc/v3/dtlsrole.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pion/webrtc/v3/dtlsrole.go')
-rw-r--r--vendor/github.com/pion/webrtc/v3/dtlsrole.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/vendor/github.com/pion/webrtc/v3/dtlsrole.go b/vendor/github.com/pion/webrtc/v3/dtlsrole.go
new file mode 100644
index 0000000..6e67f60
--- /dev/null
+++ b/vendor/github.com/pion/webrtc/v3/dtlsrole.go
@@ -0,0 +1,92 @@
+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)
+ }
+}