• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * libjingle
3  * Copyright 2012, The Libjingle Authors.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  *  1. Redistributions of source code must retain the above copyright notice,
9  *     this list of conditions and the following disclaimer.
10  *  2. Redistributions in binary form must reproduce the above copyright notice,
11  *     this list of conditions and the following disclaimer in the documentation
12  *     and/or other materials provided with the distribution.
13  *  3. The name of the author may not be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef TALK_P2P_BASE_TRANSPORTDESCRIPTION_H_
29 #define TALK_P2P_BASE_TRANSPORTDESCRIPTION_H_
30 
31 #include <algorithm>
32 #include <string>
33 #include <vector>
34 
35 #include "talk/p2p/base/candidate.h"
36 #include "talk/p2p/base/constants.h"
37 #include "webrtc/base/scoped_ptr.h"
38 #include "webrtc/base/sslfingerprint.h"
39 
40 namespace cricket {
41 
42 // SEC_ENABLED and SEC_REQUIRED should only be used if the session
43 // was negotiated over TLS, to protect the inline crypto material
44 // exchange.
45 // SEC_DISABLED: No crypto in outgoing offer, ignore any supplied crypto.
46 // SEC_ENABLED:  Crypto in outgoing offer and answer (if supplied in offer).
47 // SEC_REQUIRED: Crypto in outgoing offer and answer. Fail any offer with absent
48 //               or unsupported crypto.
49 enum SecurePolicy {
50   SEC_DISABLED,
51   SEC_ENABLED,
52   SEC_REQUIRED
53 };
54 
55 // The transport protocol we've elected to use.
56 enum TransportProtocol {
57   ICEPROTO_GOOGLE,  // Google version of ICE protocol.
58   ICEPROTO_HYBRID,  // ICE, but can fall back to the Google version.
59   ICEPROTO_RFC5245  // Standard RFC 5245 version of ICE.
60 };
61 // The old name for TransportProtocol.
62 // TODO(juberti): remove this.
63 typedef TransportProtocol IceProtocolType;
64 
65 // Whether our side of the call is driving the negotiation, or the other side.
66 enum IceRole {
67   ICEROLE_CONTROLLING = 0,
68   ICEROLE_CONTROLLED,
69   ICEROLE_UNKNOWN
70 };
71 
72 // ICE RFC 5245 implementation type.
73 enum IceMode {
74   ICEMODE_FULL,  // As defined in http://tools.ietf.org/html/rfc5245#section-4.1
75   ICEMODE_LITE   // As defined in http://tools.ietf.org/html/rfc5245#section-4.2
76 };
77 
78 // RFC 4145 - http://tools.ietf.org/html/rfc4145#section-4
79 // 'active':  The endpoint will initiate an outgoing connection.
80 // 'passive': The endpoint will accept an incoming connection.
81 // 'actpass': The endpoint is willing to accept an incoming
82 //            connection or to initiate an outgoing connection.
83 enum ConnectionRole {
84   CONNECTIONROLE_NONE = 0,
85   CONNECTIONROLE_ACTIVE,
86   CONNECTIONROLE_PASSIVE,
87   CONNECTIONROLE_ACTPASS,
88   CONNECTIONROLE_HOLDCONN,
89 };
90 
91 extern const char CONNECTIONROLE_ACTIVE_STR[];
92 extern const char CONNECTIONROLE_PASSIVE_STR[];
93 extern const char CONNECTIONROLE_ACTPASS_STR[];
94 extern const char CONNECTIONROLE_HOLDCONN_STR[];
95 
96 bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role);
97 bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str);
98 
99 typedef std::vector<Candidate> Candidates;
100 
101 struct TransportDescription {
TransportDescriptionTransportDescription102   TransportDescription()
103       : ice_mode(ICEMODE_FULL),
104         connection_role(CONNECTIONROLE_NONE) {}
105 
TransportDescriptionTransportDescription106   TransportDescription(const std::string& transport_type,
107                        const std::vector<std::string>& transport_options,
108                        const std::string& ice_ufrag,
109                        const std::string& ice_pwd,
110                        IceMode ice_mode,
111                        ConnectionRole role,
112                        const rtc::SSLFingerprint* identity_fingerprint,
113                        const Candidates& candidates)
114       : transport_type(transport_type),
115         transport_options(transport_options),
116         ice_ufrag(ice_ufrag),
117         ice_pwd(ice_pwd),
118         ice_mode(ice_mode),
119         connection_role(role),
120         identity_fingerprint(CopyFingerprint(identity_fingerprint)),
121         candidates(candidates) {}
TransportDescriptionTransportDescription122   TransportDescription(const std::string& transport_type,
123                        const std::string& ice_ufrag,
124                        const std::string& ice_pwd)
125       : transport_type(transport_type),
126         ice_ufrag(ice_ufrag),
127         ice_pwd(ice_pwd),
128         ice_mode(ICEMODE_FULL),
129         connection_role(CONNECTIONROLE_NONE) {}
TransportDescriptionTransportDescription130   TransportDescription(const TransportDescription& from)
131       : transport_type(from.transport_type),
132         transport_options(from.transport_options),
133         ice_ufrag(from.ice_ufrag),
134         ice_pwd(from.ice_pwd),
135         ice_mode(from.ice_mode),
136         connection_role(from.connection_role),
137         identity_fingerprint(CopyFingerprint(from.identity_fingerprint.get())),
138         candidates(from.candidates) {}
139 
140   TransportDescription& operator=(const TransportDescription& from) {
141     // Self-assignment
142     if (this == &from)
143       return *this;
144 
145     transport_type = from.transport_type;
146     transport_options = from.transport_options;
147     ice_ufrag = from.ice_ufrag;
148     ice_pwd = from.ice_pwd;
149     ice_mode = from.ice_mode;
150     connection_role = from.connection_role;
151 
152     identity_fingerprint.reset(CopyFingerprint(
153         from.identity_fingerprint.get()));
154     candidates = from.candidates;
155     return *this;
156   }
157 
HasOptionTransportDescription158   bool HasOption(const std::string& option) const {
159     return (std::find(transport_options.begin(), transport_options.end(),
160                       option) != transport_options.end());
161   }
AddOptionTransportDescription162   void AddOption(const std::string& option) {
163     transport_options.push_back(option);
164   }
secureTransportDescription165   bool secure() const { return identity_fingerprint != NULL; }
166 
CopyFingerprintTransportDescription167   static rtc::SSLFingerprint* CopyFingerprint(
168       const rtc::SSLFingerprint* from) {
169     if (!from)
170       return NULL;
171 
172     return new rtc::SSLFingerprint(*from);
173   }
174 
175   std::string transport_type;  // xmlns of <transport>
176   std::vector<std::string> transport_options;
177   std::string ice_ufrag;
178   std::string ice_pwd;
179   IceMode ice_mode;
180   ConnectionRole connection_role;
181 
182   rtc::scoped_ptr<rtc::SSLFingerprint> identity_fingerprint;
183   Candidates candidates;
184 };
185 
186 }  // namespace cricket
187 
188 #endif  // TALK_P2P_BASE_TRANSPORTDESCRIPTION_H_
189