blob: 109472b13613a53fc170f92965817ba672363893 [file] [log] [blame]
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001/*
2 * Copyright 2004 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "p2p/base/portallocator.h"
12#include "rtc_base/checks.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000013
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000014namespace cricket {
15
16PortAllocatorSession::PortAllocatorSession(const std::string& content_name,
17 int component,
18 const std::string& ice_ufrag,
19 const std::string& ice_pwd,
Peter Boström0c4e06b2015-10-07 12:23:21 +020020 uint32_t flags)
Taylor Brandstettera1c30352016-05-13 08:15:11 -070021 : flags_(flags),
deadbeefc55fb302016-05-12 12:51:38 -070022 generation_(0),
Taylor Brandstettera1c30352016-05-13 08:15:11 -070023 content_name_(content_name),
24 component_(component),
deadbeefcbecd352015-09-23 11:50:27 -070025 ice_ufrag_(ice_ufrag),
26 ice_pwd_(ice_pwd) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -070027 // Pooled sessions are allowed to be created with empty content name,
28 // component, ufrag and password.
29 RTC_DCHECK(ice_ufrag.empty() == ice_pwd.empty());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000030}
31
deadbeef6de92f92016-12-12 18:49:32 -080032bool PortAllocator::SetConfiguration(
Taylor Brandstettera1c30352016-05-13 08:15:11 -070033 const ServerAddresses& stun_servers,
34 const std::vector<RelayServerConfig>& turn_servers,
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -070035 int candidate_pool_size,
Jonas Orelandbdcee282017-10-10 14:01:40 +020036 bool prune_turn_ports,
37 webrtc::TurnCustomizer* turn_customizer) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -070038 bool ice_servers_changed =
39 (stun_servers != stun_servers_ || turn_servers != turn_servers_);
40 stun_servers_ = stun_servers;
41 turn_servers_ = turn_servers;
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -070042 prune_turn_ports_ = prune_turn_ports;
Taylor Brandstettera1c30352016-05-13 08:15:11 -070043
deadbeef42a42632017-03-10 15:18:00 -080044 if (candidate_pool_frozen_) {
45 if (candidate_pool_size != candidate_pool_size_) {
46 LOG(LS_ERROR) << "Trying to change candidate pool size after pool was "
47 << "frozen.";
48 return false;
49 }
50 return true;
deadbeef6de92f92016-12-12 18:49:32 -080051 }
deadbeef42a42632017-03-10 15:18:00 -080052
deadbeef6de92f92016-12-12 18:49:32 -080053 if (candidate_pool_size < 0) {
54 LOG(LS_ERROR) << "Can't set negative pool size.";
55 return false;
56 }
deadbeef6de92f92016-12-12 18:49:32 -080057
deadbeef42a42632017-03-10 15:18:00 -080058 candidate_pool_size_ = candidate_pool_size;
deadbeef6de92f92016-12-12 18:49:32 -080059
Taylor Brandstettera1c30352016-05-13 08:15:11 -070060 // If ICE servers changed, throw away any existing pooled sessions and create
61 // new ones.
62 if (ice_servers_changed) {
63 pooled_sessions_.clear();
Taylor Brandstettera1c30352016-05-13 08:15:11 -070064 }
65
Jonas Orelandbdcee282017-10-10 14:01:40 +020066 turn_customizer_ = turn_customizer;
67
deadbeef42a42632017-03-10 15:18:00 -080068 // If |candidate_pool_size_| is less than the number of pooled sessions, get
69 // rid of the extras.
70 while (candidate_pool_size_ < static_cast<int>(pooled_sessions_.size())) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -070071 pooled_sessions_.front().reset(nullptr);
72 pooled_sessions_.pop_front();
Taylor Brandstettera1c30352016-05-13 08:15:11 -070073 }
deadbeef6de92f92016-12-12 18:49:32 -080074
deadbeef42a42632017-03-10 15:18:00 -080075 // If |candidate_pool_size_| is greater than the number of pooled sessions,
deadbeef6de92f92016-12-12 18:49:32 -080076 // create new sessions.
deadbeef42a42632017-03-10 15:18:00 -080077 while (static_cast<int>(pooled_sessions_.size()) < candidate_pool_size_) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -070078 PortAllocatorSession* pooled_session = CreateSessionInternal("", 0, "", "");
79 pooled_session->StartGettingPorts();
80 pooled_sessions_.push_back(
81 std::unique_ptr<PortAllocatorSession>(pooled_session));
Taylor Brandstettera1c30352016-05-13 08:15:11 -070082 }
deadbeef6de92f92016-12-12 18:49:32 -080083 return true;
Taylor Brandstettera1c30352016-05-13 08:15:11 -070084}
85
86std::unique_ptr<PortAllocatorSession> PortAllocator::CreateSession(
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000087 const std::string& content_name,
88 int component,
89 const std::string& ice_ufrag,
90 const std::string& ice_pwd) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -070091 auto session = std::unique_ptr<PortAllocatorSession>(
Taylor Brandstettera1c30352016-05-13 08:15:11 -070092 CreateSessionInternal(content_name, component, ice_ufrag, ice_pwd));
Taylor Brandstetter417eebe2016-05-23 16:02:19 -070093 session->SetCandidateFilter(candidate_filter());
94 return session;
Taylor Brandstettera1c30352016-05-13 08:15:11 -070095}
96
97std::unique_ptr<PortAllocatorSession> PortAllocator::TakePooledSession(
98 const std::string& content_name,
99 int component,
100 const std::string& ice_ufrag,
101 const std::string& ice_pwd) {
102 RTC_DCHECK(!ice_ufrag.empty());
103 RTC_DCHECK(!ice_pwd.empty());
104 if (pooled_sessions_.empty()) {
105 return nullptr;
106 }
107 std::unique_ptr<PortAllocatorSession> ret =
108 std::move(pooled_sessions_.front());
109 ret->SetIceParameters(content_name, component, ice_ufrag, ice_pwd);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700110 // According to JSEP, a pooled session should filter candidates only after
111 // it's taken out of the pool.
112 ret->SetCandidateFilter(candidate_filter());
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700113 pooled_sessions_.pop_front();
114 return ret;
115}
116
117const PortAllocatorSession* PortAllocator::GetPooledSession() const {
118 if (pooled_sessions_.empty()) {
119 return nullptr;
120 }
121 return pooled_sessions_.front().get();
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000122}
123
deadbeef42a42632017-03-10 15:18:00 -0800124void PortAllocator::FreezeCandidatePool() {
125 candidate_pool_frozen_ = true;
126}
127
128void PortAllocator::DiscardCandidatePool() {
129 pooled_sessions_.clear();
130}
131
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000132} // namespace cricket