1/* 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#ifndef WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_ 12#define WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_ 13 14#include <algorithm> 15#include <string> 16#include <vector> 17 18#include "webrtc/p2p/base/candidate.h" 19#include "webrtc/p2p/base/constants.h" 20#include "webrtc/base/scoped_ptr.h" 21#include "webrtc/base/sslfingerprint.h" 22 23namespace cricket { 24 25// SEC_ENABLED and SEC_REQUIRED should only be used if the session 26// was negotiated over TLS, to protect the inline crypto material 27// exchange. 28// SEC_DISABLED: No crypto in outgoing offer, ignore any supplied crypto. 29// SEC_ENABLED: Crypto in outgoing offer and answer (if supplied in offer). 30// SEC_REQUIRED: Crypto in outgoing offer and answer. Fail any offer with absent 31// or unsupported crypto. 32enum SecurePolicy { 33 SEC_DISABLED, 34 SEC_ENABLED, 35 SEC_REQUIRED 36}; 37 38// Whether our side of the call is driving the negotiation, or the other side. 39enum IceRole { 40 ICEROLE_CONTROLLING = 0, 41 ICEROLE_CONTROLLED, 42 ICEROLE_UNKNOWN 43}; 44 45// ICE RFC 5245 implementation type. 46enum IceMode { 47 ICEMODE_FULL, // As defined in http://tools.ietf.org/html/rfc5245#section-4.1 48 ICEMODE_LITE // As defined in http://tools.ietf.org/html/rfc5245#section-4.2 49}; 50 51// RFC 4145 - http://tools.ietf.org/html/rfc4145#section-4 52// 'active': The endpoint will initiate an outgoing connection. 53// 'passive': The endpoint will accept an incoming connection. 54// 'actpass': The endpoint is willing to accept an incoming 55// connection or to initiate an outgoing connection. 56enum ConnectionRole { 57 CONNECTIONROLE_NONE = 0, 58 CONNECTIONROLE_ACTIVE, 59 CONNECTIONROLE_PASSIVE, 60 CONNECTIONROLE_ACTPASS, 61 CONNECTIONROLE_HOLDCONN, 62}; 63 64extern const char CONNECTIONROLE_ACTIVE_STR[]; 65extern const char CONNECTIONROLE_PASSIVE_STR[]; 66extern const char CONNECTIONROLE_ACTPASS_STR[]; 67extern const char CONNECTIONROLE_HOLDCONN_STR[]; 68 69bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role); 70bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str); 71 72typedef std::vector<Candidate> Candidates; 73 74struct TransportDescription { 75 TransportDescription() 76 : ice_mode(ICEMODE_FULL), 77 connection_role(CONNECTIONROLE_NONE) {} 78 79 TransportDescription(const std::vector<std::string>& transport_options, 80 const std::string& ice_ufrag, 81 const std::string& ice_pwd, 82 IceMode ice_mode, 83 ConnectionRole role, 84 const rtc::SSLFingerprint* identity_fingerprint, 85 const Candidates& candidates) 86 : transport_options(transport_options), 87 ice_ufrag(ice_ufrag), 88 ice_pwd(ice_pwd), 89 ice_mode(ice_mode), 90 connection_role(role), 91 identity_fingerprint(CopyFingerprint(identity_fingerprint)), 92 candidates(candidates) {} 93 TransportDescription(const std::string& ice_ufrag, 94 const std::string& ice_pwd) 95 : ice_ufrag(ice_ufrag), 96 ice_pwd(ice_pwd), 97 ice_mode(ICEMODE_FULL), 98 connection_role(CONNECTIONROLE_NONE) {} 99 TransportDescription(const TransportDescription& from) 100 : transport_options(from.transport_options), 101 ice_ufrag(from.ice_ufrag), 102 ice_pwd(from.ice_pwd), 103 ice_mode(from.ice_mode), 104 connection_role(from.connection_role), 105 identity_fingerprint(CopyFingerprint(from.identity_fingerprint.get())), 106 candidates(from.candidates) {} 107 108 TransportDescription& operator=(const TransportDescription& from) { 109 // Self-assignment 110 if (this == &from) 111 return *this; 112 113 transport_options = from.transport_options; 114 ice_ufrag = from.ice_ufrag; 115 ice_pwd = from.ice_pwd; 116 ice_mode = from.ice_mode; 117 connection_role = from.connection_role; 118 119 identity_fingerprint.reset(CopyFingerprint( 120 from.identity_fingerprint.get())); 121 candidates = from.candidates; 122 return *this; 123 } 124 125 bool HasOption(const std::string& option) const { 126 return (std::find(transport_options.begin(), transport_options.end(), 127 option) != transport_options.end()); 128 } 129 void AddOption(const std::string& option) { 130 transport_options.push_back(option); 131 } 132 bool secure() const { return identity_fingerprint != NULL; } 133 134 static rtc::SSLFingerprint* CopyFingerprint( 135 const rtc::SSLFingerprint* from) { 136 if (!from) 137 return NULL; 138 139 return new rtc::SSLFingerprint(*from); 140 } 141 142 std::vector<std::string> transport_options; 143 std::string ice_ufrag; 144 std::string ice_pwd; 145 IceMode ice_mode; 146 ConnectionRole connection_role; 147 148 rtc::scoped_ptr<rtc::SSLFingerprint> identity_fingerprint; 149 Candidates candidates; 150}; 151 152} // namespace cricket 153 154#endif // WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_ 155