Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: webrtc/p2p/base/portallocator.h

Issue 1956453003: Relanding: Implement RTCConfiguration.iceCandidatePoolSize. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing uninitialized variable (noticed by msan) Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/port_unittest.cc ('k') | webrtc/p2p/base/portallocator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #ifndef WEBRTC_P2P_BASE_PORTALLOCATOR_H_ 11 #ifndef WEBRTC_P2P_BASE_PORTALLOCATOR_H_
12 #define WEBRTC_P2P_BASE_PORTALLOCATOR_H_ 12 #define WEBRTC_P2P_BASE_PORTALLOCATOR_H_
13 13
14 #include <deque>
15 #include <memory>
14 #include <string> 16 #include <string>
15 #include <vector> 17 #include <vector>
16 18
17 #include "webrtc/p2p/base/port.h" 19 #include "webrtc/p2p/base/port.h"
18 #include "webrtc/p2p/base/portinterface.h" 20 #include "webrtc/p2p/base/portinterface.h"
19 #include "webrtc/base/helpers.h" 21 #include "webrtc/base/helpers.h"
20 #include "webrtc/base/proxyinfo.h" 22 #include "webrtc/base/proxyinfo.h"
21 #include "webrtc/base/sigslot.h" 23 #include "webrtc/base/sigslot.h"
24 #include "webrtc/base/thread.h"
22 25
23 namespace cricket { 26 namespace cricket {
24 27
25 // PortAllocator is responsible for allocating Port types for a given 28 // PortAllocator is responsible for allocating Port types for a given
26 // P2PSocket. It also handles port freeing. 29 // P2PSocket. It also handles port freeing.
27 // 30 //
28 // Clients can override this class to control port allocation, including 31 // Clients can override this class to control port allocation, including
29 // what kinds of ports are allocated. 32 // what kinds of ports are allocated.
30 33
31 enum { 34 enum {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 CF_RELAY = 0x4, 78 CF_RELAY = 0x4,
76 CF_ALL = 0x7, 79 CF_ALL = 0x7,
77 }; 80 };
78 81
79 // TODO(deadbeef): Rename to TurnCredentials (and username to ufrag). 82 // TODO(deadbeef): Rename to TurnCredentials (and username to ufrag).
80 struct RelayCredentials { 83 struct RelayCredentials {
81 RelayCredentials() {} 84 RelayCredentials() {}
82 RelayCredentials(const std::string& username, const std::string& password) 85 RelayCredentials(const std::string& username, const std::string& password)
83 : username(username), password(password) {} 86 : username(username), password(password) {}
84 87
88 bool operator==(const RelayCredentials& o) const {
89 return username == o.username && password == o.password;
90 }
91 bool operator!=(const RelayCredentials& o) const { return !(*this == o); }
92
85 std::string username; 93 std::string username;
86 std::string password; 94 std::string password;
87 }; 95 };
88 96
89 typedef std::vector<ProtocolAddress> PortList; 97 typedef std::vector<ProtocolAddress> PortList;
90 // TODO(deadbeef): Rename to TurnServerConfig. 98 // TODO(deadbeef): Rename to TurnServerConfig.
91 struct RelayServerConfig { 99 struct RelayServerConfig {
92 RelayServerConfig(RelayType type) : type(type), priority(0) {} 100 RelayServerConfig(RelayType type) : type(type) {}
93 101
94 RelayServerConfig(const std::string& address, 102 RelayServerConfig(const std::string& address,
95 int port, 103 int port,
96 const std::string& username, 104 const std::string& username,
97 const std::string& password, 105 const std::string& password,
98 ProtocolType proto, 106 ProtocolType proto,
99 bool secure) 107 bool secure)
100 : type(RELAY_TURN), credentials(username, password) { 108 : type(RELAY_TURN), credentials(username, password) {
101 ports.push_back( 109 ports.push_back(
102 ProtocolAddress(rtc::SocketAddress(address, port), proto, secure)); 110 ProtocolAddress(rtc::SocketAddress(address, port), proto, secure));
103 } 111 }
104 112
113 bool operator==(const RelayServerConfig& o) const {
114 return type == o.type && ports == o.ports && credentials == o.credentials &&
115 priority == o.priority;
116 }
117 bool operator!=(const RelayServerConfig& o) const { return !(*this == o); }
118
105 RelayType type; 119 RelayType type;
106 PortList ports; 120 PortList ports;
107 RelayCredentials credentials; 121 RelayCredentials credentials;
108 int priority; 122 int priority = 0;
109 }; 123 };
110 124
111 class PortAllocatorSession : public sigslot::has_slots<> { 125 class PortAllocatorSession : public sigslot::has_slots<> {
112 public: 126 public:
113 // Content name passed in mostly for logging and debugging. 127 // Content name passed in mostly for logging and debugging.
114 PortAllocatorSession(const std::string& content_name, 128 PortAllocatorSession(const std::string& content_name,
115 int component, 129 int component,
116 const std::string& ice_ufrag, 130 const std::string& ice_ufrag,
117 const std::string& ice_pwd, 131 const std::string& ice_pwd,
118 uint32_t flags); 132 uint32_t flags);
119 133
120 // Subclasses should clean up any ports created. 134 // Subclasses should clean up any ports created.
121 virtual ~PortAllocatorSession() {} 135 virtual ~PortAllocatorSession() {}
122 136
123 uint32_t flags() const { return flags_; } 137 uint32_t flags() const { return flags_; }
124 void set_flags(uint32_t flags) { flags_ = flags; } 138 void set_flags(uint32_t flags) { flags_ = flags; }
125 std::string content_name() const { return content_name_; } 139 std::string content_name() const { return content_name_; }
126 int component() const { return component_; } 140 int component() const { return component_; }
141 const std::string& ice_ufrag() const { return ice_ufrag_; }
142 const std::string& ice_pwd() const { return ice_pwd_; }
143 bool pooled() const { return ice_ufrag_.empty(); }
127 144
128 // Starts gathering STUN and Relay configurations. 145 // Starts gathering STUN and Relay configurations.
129 virtual void StartGettingPorts() = 0; 146 virtual void StartGettingPorts() = 0;
130 virtual void StopGettingPorts() = 0; 147 virtual void StopGettingPorts() = 0;
131 // Only stop the existing gathering process but may start new ones if needed. 148 // Only stop the existing gathering process but may start new ones if needed.
132 virtual void ClearGettingPorts() = 0; 149 virtual void ClearGettingPorts() = 0;
133 // Whether the process of getting ports has been stopped. 150 // Whether the process of getting ports has been stopped.
134 virtual bool IsGettingPorts() = 0; 151 virtual bool IsGettingPorts() = 0;
135 152
153 // Another way of getting the information provided by the signals below.
154 //
155 // Ports and candidates are not guaranteed to be in the same order as the
156 // signals were emitted in.
157 virtual std::vector<PortInterface*> ReadyPorts() const = 0;
158 virtual std::vector<Candidate> ReadyCandidates() const = 0;
159 virtual bool CandidatesAllocationDone() const = 0;
160
136 sigslot::signal2<PortAllocatorSession*, PortInterface*> SignalPortReady; 161 sigslot::signal2<PortAllocatorSession*, PortInterface*> SignalPortReady;
137 sigslot::signal2<PortAllocatorSession*, 162 sigslot::signal2<PortAllocatorSession*,
138 const std::vector<Candidate>&> SignalCandidatesReady; 163 const std::vector<Candidate>&> SignalCandidatesReady;
139 sigslot::signal1<PortAllocatorSession*> SignalCandidatesAllocationDone; 164 sigslot::signal1<PortAllocatorSession*> SignalCandidatesAllocationDone;
140 165
141 virtual uint32_t generation() { return generation_; } 166 virtual uint32_t generation() { return generation_; }
142 virtual void set_generation(uint32_t generation) { generation_ = generation; } 167 virtual void set_generation(uint32_t generation) { generation_ = generation; }
143 sigslot::signal1<PortAllocatorSession*> SignalDestroyed; 168 sigslot::signal1<PortAllocatorSession*> SignalDestroyed;
144 169
145 const std::string& ice_ufrag() const { return ice_ufrag_; } 170 protected:
146 const std::string& ice_pwd() const { return ice_pwd_; } 171 // This method is called when a pooled session (which doesn't have these
172 // properties initially) is returned by PortAllocator::TakePooledSession,
173 // and the content name, component, and ICE ufrag/pwd are updated.
174 //
175 // A subclass may need to override this method to perform additional actions,
176 // such as applying the updated information to ports and candidates.
177 virtual void UpdateIceParametersInternal() {}
147 178
148 protected:
149 // TODO(deadbeef): Get rid of these when everyone switches to ice_ufrag and 179 // TODO(deadbeef): Get rid of these when everyone switches to ice_ufrag and
150 // ice_pwd. 180 // ice_pwd.
151 const std::string& username() const { return ice_ufrag_; } 181 const std::string& username() const { return ice_ufrag_; }
152 const std::string& password() const { return ice_pwd_; } 182 const std::string& password() const { return ice_pwd_; }
153 183
184 private:
185 void SetIceParameters(const std::string& content_name,
186 int component,
187 const std::string& ice_ufrag,
188 const std::string& ice_pwd) {
189 content_name_ = content_name;
190 component_ = component;
191 ice_ufrag_ = ice_ufrag;
192 ice_pwd_ = ice_pwd;
193 UpdateIceParametersInternal();
194 }
195
196 uint32_t flags_;
197 uint32_t generation_;
154 std::string content_name_; 198 std::string content_name_;
155 int component_; 199 int component_;
156
157 private:
158 uint32_t flags_;
159 uint32_t generation_;
160 std::string ice_ufrag_; 200 std::string ice_ufrag_;
161 std::string ice_pwd_; 201 std::string ice_pwd_;
202
203 // SetIceParameters is an implementation detail which only PortAllocator
204 // should be able to call.
205 friend class PortAllocator;
162 }; 206 };
163 207
208 // Note that this class should only be used on one thread.
209 // This includes calling the destructor.
164 class PortAllocator : public sigslot::has_slots<> { 210 class PortAllocator : public sigslot::has_slots<> {
165 public: 211 public:
166 PortAllocator() : 212 PortAllocator() :
167 flags_(kDefaultPortAllocatorFlags), 213 flags_(kDefaultPortAllocatorFlags),
168 min_port_(0), 214 min_port_(0),
169 max_port_(0), 215 max_port_(0),
170 step_delay_(kDefaultStepDelay), 216 step_delay_(kDefaultStepDelay),
171 allow_tcp_listen_(true), 217 allow_tcp_listen_(true),
172 candidate_filter_(CF_ALL) { 218 candidate_filter_(CF_ALL) {
173 // This will allow us to have old behavior on non webrtc clients. 219 // This will allow us to have old behavior on non webrtc clients.
174 } 220 }
175 virtual ~PortAllocator() {} 221 virtual ~PortAllocator() {}
176 222
177 // Set STUN and TURN servers to be used in future sessions. 223 // Set STUN and TURN servers to be used in future sessions, and set
178 virtual void SetIceServers( 224 // candidate pool size, as described in JSEP.
179 const ServerAddresses& stun_servers, 225 //
180 const std::vector<RelayServerConfig>& turn_servers) = 0; 226 // If the servers are changing and the candidate pool size is nonzero,
227 // existing pooled sessions will be destroyed and new ones created.
228 //
229 // If the servers are not changing but the candidate pool size is,
230 // pooled sessions will be either created or destroyed as necessary.
231 void SetConfiguration(const ServerAddresses& stun_servers,
232 const std::vector<RelayServerConfig>& turn_servers,
233 int candidate_pool_size);
234
235 const ServerAddresses& stun_servers() const { return stun_servers_; }
236
237 const std::vector<RelayServerConfig>& turn_servers() const {
238 return turn_servers_;
239 }
240
241 int candidate_pool_size() const { return target_pooled_session_count_; }
181 242
182 // Sets the network types to ignore. 243 // Sets the network types to ignore.
183 // Values are defined by the AdapterType enum. 244 // Values are defined by the AdapterType enum.
184 // For instance, calling this with 245 // For instance, calling this with
185 // ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK will ignore Ethernet and 246 // ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK will ignore Ethernet and
186 // loopback interfaces. 247 // loopback interfaces.
187 virtual void SetNetworkIgnoreMask(int network_ignore_mask) = 0; 248 virtual void SetNetworkIgnoreMask(int network_ignore_mask) = 0;
188 249
189 PortAllocatorSession* CreateSession( 250 std::unique_ptr<PortAllocatorSession> CreateSession(
190 const std::string& sid, 251 const std::string& sid,
191 const std::string& content_name, 252 const std::string& content_name,
192 int component, 253 int component,
193 const std::string& ice_ufrag, 254 const std::string& ice_ufrag,
194 const std::string& ice_pwd); 255 const std::string& ice_pwd);
195 256
257 // Get an available pooled session and set the transport information on it.
258 //
259 // Caller takes ownership of the returned session.
260 //
261 // If no pooled sessions are available, returns null.
262 std::unique_ptr<PortAllocatorSession> TakePooledSession(
263 const std::string& content_name,
264 int component,
265 const std::string& ice_ufrag,
266 const std::string& ice_pwd);
267
268 // Returns the next session that would be returned by TakePooledSession.
269 const PortAllocatorSession* GetPooledSession() const;
270
196 uint32_t flags() const { return flags_; } 271 uint32_t flags() const { return flags_; }
197 void set_flags(uint32_t flags) { flags_ = flags; } 272 void set_flags(uint32_t flags) { flags_ = flags; }
198 273
199 const std::string& user_agent() const { return agent_; } 274 const std::string& user_agent() const { return agent_; }
200 const rtc::ProxyInfo& proxy() const { return proxy_; } 275 const rtc::ProxyInfo& proxy() const { return proxy_; }
201 void set_proxy(const std::string& agent, const rtc::ProxyInfo& proxy) { 276 void set_proxy(const std::string& agent, const rtc::ProxyInfo& proxy) {
202 agent_ = agent; 277 agent_ = agent;
203 proxy_ = proxy; 278 proxy_ = proxy;
204 } 279 }
205 280
(...skipping 12 matching lines...) Expand all
218 293
219 uint32_t step_delay() const { return step_delay_; } 294 uint32_t step_delay() const { return step_delay_; }
220 void set_step_delay(uint32_t delay) { step_delay_ = delay; } 295 void set_step_delay(uint32_t delay) { step_delay_ = delay; }
221 296
222 bool allow_tcp_listen() const { return allow_tcp_listen_; } 297 bool allow_tcp_listen() const { return allow_tcp_listen_; }
223 void set_allow_tcp_listen(bool allow_tcp_listen) { 298 void set_allow_tcp_listen(bool allow_tcp_listen) {
224 allow_tcp_listen_ = allow_tcp_listen; 299 allow_tcp_listen_ = allow_tcp_listen;
225 } 300 }
226 301
227 uint32_t candidate_filter() { return candidate_filter_; } 302 uint32_t candidate_filter() { return candidate_filter_; }
228 bool set_candidate_filter(uint32_t filter) { 303 void set_candidate_filter(uint32_t filter) {
229 // TODO(mallinath) - Do transition check? 304 // TODO(mallinath) - Do transition check?
230 candidate_filter_ = filter; 305 candidate_filter_ = filter;
231 return true;
232 } 306 }
233 307
234 // Gets/Sets the Origin value used for WebRTC STUN requests. 308 // Gets/Sets the Origin value used for WebRTC STUN requests.
235 const std::string& origin() const { return origin_; } 309 const std::string& origin() const { return origin_; }
236 void set_origin(const std::string& origin) { origin_ = origin; } 310 void set_origin(const std::string& origin) { origin_ = origin; }
237 311
238 protected: 312 protected:
239 virtual PortAllocatorSession* CreateSessionInternal( 313 virtual PortAllocatorSession* CreateSessionInternal(
240 const std::string& content_name, 314 const std::string& content_name,
241 int component, 315 int component,
242 const std::string& ice_ufrag, 316 const std::string& ice_ufrag,
243 const std::string& ice_pwd) = 0; 317 const std::string& ice_pwd) = 0;
244 318
245 uint32_t flags_; 319 uint32_t flags_;
246 std::string agent_; 320 std::string agent_;
247 rtc::ProxyInfo proxy_; 321 rtc::ProxyInfo proxy_;
248 int min_port_; 322 int min_port_;
249 int max_port_; 323 int max_port_;
250 uint32_t step_delay_; 324 uint32_t step_delay_;
251 bool allow_tcp_listen_; 325 bool allow_tcp_listen_;
252 uint32_t candidate_filter_; 326 uint32_t candidate_filter_;
253 std::string origin_; 327 std::string origin_;
328
329 private:
330 ServerAddresses stun_servers_;
331 std::vector<RelayServerConfig> turn_servers_;
332 // The last size passed into SetConfiguration.
333 int target_pooled_session_count_ = 0;
334 // This variable represents the total number of pooled sessions
335 // both owned by this class and taken by TakePooledSession.
336 int allocated_pooled_session_count_ = 0;
337 std::deque<std::unique_ptr<PortAllocatorSession>> pooled_sessions_;
254 }; 338 };
255 339
256 } // namespace cricket 340 } // namespace cricket
257 341
258 #endif // WEBRTC_P2P_BASE_PORTALLOCATOR_H_ 342 #endif // WEBRTC_P2P_BASE_PORTALLOCATOR_H_
OLDNEW
« no previous file with comments | « webrtc/p2p/base/port_unittest.cc ('k') | webrtc/p2p/base/portallocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698