1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "pc/media_protocol_names.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <ctype.h>
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker namespace cricket {
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker // The official registry of RTP parameters is at
21*d9f75844SAndroid Build Coastguard Worker // http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xml
22*d9f75844SAndroid Build Coastguard Worker // The UDP/DTLS and TCP/DTLS prefixes are not registered there.
23*d9f75844SAndroid Build Coastguard Worker
24*d9f75844SAndroid Build Coastguard Worker // There are multiple variants of the RTP protocol stack, including
25*d9f75844SAndroid Build Coastguard Worker // UDP/TLS/RTP/SAVPF (WebRTC default), RTP/AVP, RTP/AVPF, RTP/SAVPF,
26*d9f75844SAndroid Build Coastguard Worker // TCP/DTLS/RTP/SAVPF and so on. We accept anything that has RTP/
27*d9f75844SAndroid Build Coastguard Worker // embedded in it somewhere as being an RTP protocol.
28*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolRtpPrefix[] = "RTP/";
29*d9f75844SAndroid Build Coastguard Worker
30*d9f75844SAndroid Build Coastguard Worker // Protocol names generated by WebRTC
31*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolSctp[] = "SCTP";
32*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolUdpDtlsSctp[] = "UDP/DTLS/SCTP";
33*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolDtlsSctp[] = "DTLS/SCTP";
34*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolTcpDtlsSctp[] = "TCP/DTLS/SCTP";
35*d9f75844SAndroid Build Coastguard Worker // RFC5124
36*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolDtlsSavpf[] = "UDP/TLS/RTP/SAVPF";
37*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolSavpf[] = "RTP/SAVPF";
38*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolAvpf[] = "RTP/AVPF";
39*d9f75844SAndroid Build Coastguard Worker
40*d9f75844SAndroid Build Coastguard Worker namespace {
41*d9f75844SAndroid Build Coastguard Worker
42*d9f75844SAndroid Build Coastguard Worker // Protocol names that we tolerate, but do not generate.
43*d9f75844SAndroid Build Coastguard Worker // We always generate offers with "UDP/TLS/RTP/SAVPF" when using DTLS-SRTP,
44*d9f75844SAndroid Build Coastguard Worker // but we tolerate "RTP/SAVPF" and "RTP/SAVP" and the "UDP/TLS" and "TCP/TLS"
45*d9f75844SAndroid Build Coastguard Worker // prefixes in offers we receive, for compatibility.
46*d9f75844SAndroid Build Coastguard Worker // RFC4585
47*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolSavp[] = "RTP/SAVP";
48*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolAvp[] = "RTP/AVP";
49*d9f75844SAndroid Build Coastguard Worker
50*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolTcpTlsSavpf[] = "TCP/TLS/RTP/SAVPF";
51*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolUdpTlsSavpf[] = "UDP/TLS/RTP/SAVPF";
52*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolTcpTlsSavp[] = "TCP/TLS/RTP/SAVP";
53*d9f75844SAndroid Build Coastguard Worker const char kMediaProtocolUdpTlsSavp[] = "UDP/TLS/RTP/SAVP";
54*d9f75844SAndroid Build Coastguard Worker
55*d9f75844SAndroid Build Coastguard Worker } // namespace
56*d9f75844SAndroid Build Coastguard Worker
IsDtlsSctp(absl::string_view protocol)57*d9f75844SAndroid Build Coastguard Worker bool IsDtlsSctp(absl::string_view protocol) {
58*d9f75844SAndroid Build Coastguard Worker return protocol == kMediaProtocolDtlsSctp ||
59*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolUdpDtlsSctp ||
60*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolTcpDtlsSctp;
61*d9f75844SAndroid Build Coastguard Worker }
62*d9f75844SAndroid Build Coastguard Worker
IsPlainSctp(absl::string_view protocol)63*d9f75844SAndroid Build Coastguard Worker bool IsPlainSctp(absl::string_view protocol) {
64*d9f75844SAndroid Build Coastguard Worker return protocol == kMediaProtocolSctp;
65*d9f75844SAndroid Build Coastguard Worker }
66*d9f75844SAndroid Build Coastguard Worker
IsSctpProtocol(absl::string_view protocol)67*d9f75844SAndroid Build Coastguard Worker bool IsSctpProtocol(absl::string_view protocol) {
68*d9f75844SAndroid Build Coastguard Worker return IsPlainSctp(protocol) || IsDtlsSctp(protocol);
69*d9f75844SAndroid Build Coastguard Worker }
70*d9f75844SAndroid Build Coastguard Worker
IsRtpProtocol(absl::string_view protocol)71*d9f75844SAndroid Build Coastguard Worker bool IsRtpProtocol(absl::string_view protocol) {
72*d9f75844SAndroid Build Coastguard Worker if (protocol.empty()) {
73*d9f75844SAndroid Build Coastguard Worker return true;
74*d9f75844SAndroid Build Coastguard Worker }
75*d9f75844SAndroid Build Coastguard Worker size_t pos = protocol.find(cricket::kMediaProtocolRtpPrefix);
76*d9f75844SAndroid Build Coastguard Worker if (pos == std::string::npos) {
77*d9f75844SAndroid Build Coastguard Worker return false;
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker // RTP must be at the beginning of a string or not preceded by alpha
80*d9f75844SAndroid Build Coastguard Worker if (pos == 0 || !isalpha(static_cast<unsigned char>(protocol[pos - 1]))) {
81*d9f75844SAndroid Build Coastguard Worker return true;
82*d9f75844SAndroid Build Coastguard Worker }
83*d9f75844SAndroid Build Coastguard Worker return false;
84*d9f75844SAndroid Build Coastguard Worker }
85*d9f75844SAndroid Build Coastguard Worker
86*d9f75844SAndroid Build Coastguard Worker // Note that the below functions support some protocol strings purely for
87*d9f75844SAndroid Build Coastguard Worker // legacy compatibility, as required by JSEP in Section 5.1.2, Profile Names
88*d9f75844SAndroid Build Coastguard Worker // and Interoperability.
89*d9f75844SAndroid Build Coastguard Worker
IsDtlsRtp(absl::string_view protocol)90*d9f75844SAndroid Build Coastguard Worker bool IsDtlsRtp(absl::string_view protocol) {
91*d9f75844SAndroid Build Coastguard Worker // Most-likely values first.
92*d9f75844SAndroid Build Coastguard Worker return protocol == kMediaProtocolDtlsSavpf ||
93*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolTcpTlsSavpf ||
94*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolUdpTlsSavpf ||
95*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolUdpTlsSavp ||
96*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolTcpTlsSavp;
97*d9f75844SAndroid Build Coastguard Worker }
98*d9f75844SAndroid Build Coastguard Worker
IsPlainRtp(absl::string_view protocol)99*d9f75844SAndroid Build Coastguard Worker bool IsPlainRtp(absl::string_view protocol) {
100*d9f75844SAndroid Build Coastguard Worker // Most-likely values first.
101*d9f75844SAndroid Build Coastguard Worker return protocol == kMediaProtocolSavpf || protocol == kMediaProtocolAvpf ||
102*d9f75844SAndroid Build Coastguard Worker protocol == kMediaProtocolSavp || protocol == kMediaProtocolAvp;
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker
105*d9f75844SAndroid Build Coastguard Worker } // namespace cricket
106