blob: b80a23368bd5b0d0e882c718952acead60935730 [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
11#include "webrtc/p2p/base/session.h"
12
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000013#include "webrtc/base/bind.h"
14#include "webrtc/base/common.h"
15#include "webrtc/base/helpers.h"
16#include "webrtc/base/logging.h"
17#include "webrtc/base/scoped_ptr.h"
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000018#include "webrtc/base/stringencode.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000019#include "webrtc/base/sslstreamadapter.h"
deadbeef9af63f42015-09-18 12:55:56 -070020#include "webrtc/p2p/base/transport.h"
21#include "webrtc/p2p/base/transportinfo.h"
22#include "webrtc/p2p/base/transportcontroller.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000023#include "webrtc/p2p/base/constants.h"
24
25namespace cricket {
26
27using rtc::Bind;
28
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000029std::string BaseSession::StateToString(State state) {
30 switch (state) {
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000031 case STATE_INIT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000032 return "STATE_INIT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000033 case STATE_SENTINITIATE:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000034 return "STATE_SENTINITIATE";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000035 case STATE_RECEIVEDINITIATE:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000036 return "STATE_RECEIVEDINITIATE";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000037 case STATE_SENTPRACCEPT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000038 return "STATE_SENTPRACCEPT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000039 case STATE_SENTACCEPT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000040 return "STATE_SENTACCEPT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000041 case STATE_RECEIVEDPRACCEPT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000042 return "STATE_RECEIVEDPRACCEPT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000043 case STATE_RECEIVEDACCEPT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000044 return "STATE_RECEIVEDACCEPT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000045 case STATE_SENTMODIFY:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000046 return "STATE_SENTMODIFY";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000047 case STATE_RECEIVEDMODIFY:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000048 return "STATE_RECEIVEDMODIFY";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000049 case STATE_SENTREJECT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000050 return "STATE_SENTREJECT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000051 case STATE_RECEIVEDREJECT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000052 return "STATE_RECEIVEDREJECT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000053 case STATE_SENTREDIRECT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000054 return "STATE_SENTREDIRECT";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000055 case STATE_SENTTERMINATE:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000056 return "STATE_SENTTERMINATE";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000057 case STATE_RECEIVEDTERMINATE:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000058 return "STATE_RECEIVEDTERMINATE";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000059 case STATE_INPROGRESS:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000060 return "STATE_INPROGRESS";
pthatcher@webrtc.orgaacc2342014-12-18 20:31:29 +000061 case STATE_DEINIT:
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000062 return "STATE_DEINIT";
63 default:
64 break;
65 }
66 return "STATE_" + rtc::ToString(state);
67}
68
69BaseSession::BaseSession(rtc::Thread* signaling_thread,
70 rtc::Thread* worker_thread,
71 PortAllocator* port_allocator,
72 const std::string& sid,
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000073 bool initiator)
74 : state_(STATE_INIT),
75 error_(ERROR_NONE),
76 signaling_thread_(signaling_thread),
77 worker_thread_(worker_thread),
78 port_allocator_(port_allocator),
79 sid_(sid),
deadbeef9af63f42015-09-18 12:55:56 -070080 transport_controller_(new TransportController(signaling_thread,
81 worker_thread,
82 port_allocator)) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000083 ASSERT(signaling_thread->IsCurrent());
deadbeef9af63f42015-09-18 12:55:56 -070084 set_initiator(initiator);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000085}
86
87BaseSession::~BaseSession() {
88 ASSERT(signaling_thread()->IsCurrent());
89
90 ASSERT(state_ != STATE_DEINIT);
91 LogState(state_, STATE_DEINIT);
92 state_ = STATE_DEINIT;
93 SignalState(this, state_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000094}
95
96const SessionDescription* BaseSession::local_description() const {
97 // TODO(tommi): Assert on thread correctness.
98 return local_description_.get();
99}
100
101const SessionDescription* BaseSession::remote_description() const {
102 // TODO(tommi): Assert on thread correctness.
103 return remote_description_.get();
104}
105
106SessionDescription* BaseSession::remote_description() {
107 // TODO(tommi): Assert on thread correctness.
108 return remote_description_.get();
109}
110
111void BaseSession::set_local_description(const SessionDescription* sdesc) {
112 // TODO(tommi): Assert on thread correctness.
113 if (sdesc != local_description_.get())
114 local_description_.reset(sdesc);
115}
116
117void BaseSession::set_remote_description(SessionDescription* sdesc) {
118 // TODO(tommi): Assert on thread correctness.
119 if (sdesc != remote_description_)
120 remote_description_.reset(sdesc);
121}
122
deadbeef9af63f42015-09-18 12:55:56 -0700123void BaseSession::set_initiator(bool initiator) {
124 initiator_ = initiator;
125
126 IceRole ice_role = initiator ? ICEROLE_CONTROLLING : ICEROLE_CONTROLLED;
127 transport_controller_->SetIceRole(ice_role);
128}
129
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000130const SessionDescription* BaseSession::initiator_description() const {
131 // TODO(tommi): Assert on thread correctness.
132 return initiator_ ? local_description_.get() : remote_description_.get();
133}
134
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000135bool BaseSession::PushdownTransportDescription(ContentSource source,
136 ContentAction action,
137 std::string* error_desc) {
deadbeef9af63f42015-09-18 12:55:56 -0700138 ASSERT(signaling_thread()->IsCurrent());
139
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000140 if (source == CS_LOCAL) {
141 return PushdownLocalTransportDescription(local_description(),
142 action,
143 error_desc);
144 }
145 return PushdownRemoteTransportDescription(remote_description(),
146 action,
147 error_desc);
148}
149
150bool BaseSession::PushdownLocalTransportDescription(
151 const SessionDescription* sdesc,
152 ContentAction action,
deadbeef9af63f42015-09-18 12:55:56 -0700153 std::string* err) {
154 ASSERT(signaling_thread()->IsCurrent());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000155
deadbeef9af63f42015-09-18 12:55:56 -0700156 if (!sdesc) {
157 return false;
158 }
159
160 for (const TransportInfo& tinfo : sdesc->transport_infos()) {
161 if (!transport_controller_->SetLocalTransportDescription(
162 tinfo.content_name, tinfo.description, action, err)) {
163 return false;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000164 }
165 }
166
167 return true;
168}
169
170bool BaseSession::PushdownRemoteTransportDescription(
171 const SessionDescription* sdesc,
172 ContentAction action,
deadbeef9af63f42015-09-18 12:55:56 -0700173 std::string* err) {
174 ASSERT(signaling_thread()->IsCurrent());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000175
deadbeef9af63f42015-09-18 12:55:56 -0700176 if (!sdesc) {
177 return false;
178 }
179
180 for (const TransportInfo& tinfo : sdesc->transport_infos()) {
181 if (!transport_controller_->SetRemoteTransportDescription(
182 tinfo.content_name, tinfo.description, action, err)) {
183 return false;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000184 }
185 }
186
187 return true;
188}
189
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000190void BaseSession::SetState(State state) {
191 ASSERT(signaling_thread_->IsCurrent());
192 if (state != state_) {
193 LogState(state_, state);
194 state_ = state;
195 SignalState(this, state_);
196 signaling_thread_->Post(this, MSG_STATE);
197 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000198}
199
200void BaseSession::SetError(Error error, const std::string& error_desc) {
201 ASSERT(signaling_thread_->IsCurrent());
202 if (error != error_) {
203 error_ = error;
204 error_desc_ = error_desc;
205 SignalError(this, error);
206 }
207}
208
deadbeef9af63f42015-09-18 12:55:56 -0700209void BaseSession::SetIceConnectionReceivingTimeout(int timeout_ms) {
210 transport_controller_->SetIceConnectionReceivingTimeout(timeout_ms);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000211}
212
213void BaseSession::LogState(State old_state, State new_state) {
214 LOG(LS_INFO) << "Session:" << id()
215 << " Old state:" << StateToString(old_state)
deadbeef9af63f42015-09-18 12:55:56 -0700216 << " New state:" << StateToString(new_state);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000217}
218
219// static
220bool BaseSession::GetTransportDescription(const SessionDescription* description,
221 const std::string& content_name,
222 TransportDescription* tdesc) {
223 if (!description || !tdesc) {
224 return false;
225 }
226 const TransportInfo* transport_info =
227 description->GetTransportInfoByName(content_name);
228 if (!transport_info) {
229 return false;
230 }
231 *tdesc = transport_info->description;
232 return true;
233}
234
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000235void BaseSession::OnMessage(rtc::Message *pmsg) {
236 switch (pmsg->message_id) {
237 case MSG_TIMEOUT:
238 // Session timeout has occured.
239 SetError(ERROR_TIME, "Session timeout has occured.");
240 break;
241
242 case MSG_STATE:
243 switch (state_) {
244 case STATE_SENTACCEPT:
245 case STATE_RECEIVEDACCEPT:
246 SetState(STATE_INPROGRESS);
247 break;
248
249 default:
250 // Explicitly ignoring some states here.
251 break;
252 }
253 break;
254 }
255}
256
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000257} // namespace cricket