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