henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 1 | /* |
| 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 13 | #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.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 18 | #include "webrtc/base/stringencode.h" |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 19 | #include "webrtc/base/sslstreamadapter.h" |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 20 | #include "webrtc/p2p/base/transport.h" |
| 21 | #include "webrtc/p2p/base/transportinfo.h" |
| 22 | #include "webrtc/p2p/base/transportcontroller.h" |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 23 | #include "webrtc/p2p/base/constants.h" |
| 24 | |
| 25 | namespace cricket { |
| 26 | |
| 27 | using rtc::Bind; |
| 28 | |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 29 | std::string BaseSession::StateToString(State state) { |
| 30 | switch (state) { |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 31 | case STATE_INIT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 32 | return "STATE_INIT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 33 | case STATE_SENTINITIATE: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 34 | return "STATE_SENTINITIATE"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 35 | case STATE_RECEIVEDINITIATE: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 36 | return "STATE_RECEIVEDINITIATE"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 37 | case STATE_SENTPRACCEPT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 38 | return "STATE_SENTPRACCEPT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 39 | case STATE_SENTACCEPT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 40 | return "STATE_SENTACCEPT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 41 | case STATE_RECEIVEDPRACCEPT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 42 | return "STATE_RECEIVEDPRACCEPT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 43 | case STATE_RECEIVEDACCEPT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 44 | return "STATE_RECEIVEDACCEPT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 45 | case STATE_SENTMODIFY: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 46 | return "STATE_SENTMODIFY"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 47 | case STATE_RECEIVEDMODIFY: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 48 | return "STATE_RECEIVEDMODIFY"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 49 | case STATE_SENTREJECT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 50 | return "STATE_SENTREJECT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 51 | case STATE_RECEIVEDREJECT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 52 | return "STATE_RECEIVEDREJECT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 53 | case STATE_SENTREDIRECT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 54 | return "STATE_SENTREDIRECT"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 55 | case STATE_SENTTERMINATE: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 56 | return "STATE_SENTTERMINATE"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 57 | case STATE_RECEIVEDTERMINATE: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 58 | return "STATE_RECEIVEDTERMINATE"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 59 | case STATE_INPROGRESS: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 60 | return "STATE_INPROGRESS"; |
pthatcher@webrtc.org | aacc234 | 2014-12-18 20:31:29 +0000 | [diff] [blame] | 61 | case STATE_DEINIT: |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 62 | return "STATE_DEINIT"; |
| 63 | default: |
| 64 | break; |
| 65 | } |
| 66 | return "STATE_" + rtc::ToString(state); |
| 67 | } |
| 68 | |
| 69 | BaseSession::BaseSession(rtc::Thread* signaling_thread, |
| 70 | rtc::Thread* worker_thread, |
| 71 | PortAllocator* port_allocator, |
| 72 | const std::string& sid, |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 73 | 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), |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 80 | transport_controller_(new TransportController(signaling_thread, |
| 81 | worker_thread, |
| 82 | port_allocator)) { |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 83 | ASSERT(signaling_thread->IsCurrent()); |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 84 | set_initiator(initiator); |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | BaseSession::~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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 94 | } |
| 95 | |
| 96 | const SessionDescription* BaseSession::local_description() const { |
| 97 | // TODO(tommi): Assert on thread correctness. |
| 98 | return local_description_.get(); |
| 99 | } |
| 100 | |
| 101 | const SessionDescription* BaseSession::remote_description() const { |
| 102 | // TODO(tommi): Assert on thread correctness. |
| 103 | return remote_description_.get(); |
| 104 | } |
| 105 | |
| 106 | SessionDescription* BaseSession::remote_description() { |
| 107 | // TODO(tommi): Assert on thread correctness. |
| 108 | return remote_description_.get(); |
| 109 | } |
| 110 | |
| 111 | void 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 | |
| 117 | void 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 | |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 123 | void 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 130 | const 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 135 | bool BaseSession::PushdownTransportDescription(ContentSource source, |
| 136 | ContentAction action, |
| 137 | std::string* error_desc) { |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 138 | ASSERT(signaling_thread()->IsCurrent()); |
| 139 | |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 140 | 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 | |
| 150 | bool BaseSession::PushdownLocalTransportDescription( |
| 151 | const SessionDescription* sdesc, |
| 152 | ContentAction action, |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 153 | std::string* err) { |
| 154 | ASSERT(signaling_thread()->IsCurrent()); |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 155 | |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 156 | 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 164 | } |
| 165 | } |
| 166 | |
| 167 | return true; |
| 168 | } |
| 169 | |
| 170 | bool BaseSession::PushdownRemoteTransportDescription( |
| 171 | const SessionDescription* sdesc, |
| 172 | ContentAction action, |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 173 | std::string* err) { |
| 174 | ASSERT(signaling_thread()->IsCurrent()); |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 175 | |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 176 | 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 184 | } |
| 185 | } |
| 186 | |
| 187 | return true; |
| 188 | } |
| 189 | |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 190 | void 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 198 | } |
| 199 | |
| 200 | void 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 | |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 209 | void BaseSession::SetIceConnectionReceivingTimeout(int timeout_ms) { |
| 210 | transport_controller_->SetIceConnectionReceivingTimeout(timeout_ms); |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 211 | } |
| 212 | |
| 213 | void BaseSession::LogState(State old_state, State new_state) { |
| 214 | LOG(LS_INFO) << "Session:" << id() |
| 215 | << " Old state:" << StateToString(old_state) |
deadbeef | 9af63f4 | 2015-09-18 12:55:56 -0700 | [diff] [blame^] | 216 | << " New state:" << StateToString(new_state); |
henrike@webrtc.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 217 | } |
| 218 | |
| 219 | // static |
| 220 | bool 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 235 | void 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.org | 269fb4b | 2014-10-28 22:20:11 +0000 | [diff] [blame] | 257 | } // namespace cricket |