| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2009 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_FAKETRANSPORTCONTROLLER_H_ | 11 #ifndef WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ |
| 12 #define WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ | 12 #define WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ |
| 13 | 13 |
| 14 #include <map> | 14 #include <map> |
| 15 #include <memory> | 15 #include <memory> |
| 16 #include <string> | 16 #include <string> |
| 17 #include <vector> | 17 #include <vector> |
| 18 | 18 |
| 19 #include "webrtc/p2p/base/candidatepairinterface.h" | |
| 20 #include "webrtc/p2p/base/transportchannel.h" | |
| 21 #include "webrtc/p2p/base/transportcontroller.h" | |
| 22 #include "webrtc/p2p/base/transportchannelimpl.h" | |
| 23 #include "webrtc/base/bind.h" | 19 #include "webrtc/base/bind.h" |
| 24 #include "webrtc/base/buffer.h" | 20 #include "webrtc/base/buffer.h" |
| 25 #include "webrtc/base/fakesslidentity.h" | 21 #include "webrtc/base/fakesslidentity.h" |
| 26 #include "webrtc/base/messagequeue.h" | 22 #include "webrtc/base/messagequeue.h" |
| 27 #include "webrtc/base/sigslot.h" | 23 #include "webrtc/base/sigslot.h" |
| 28 #include "webrtc/base/sslfingerprint.h" | 24 #include "webrtc/base/sslfingerprint.h" |
| 29 #include "webrtc/base/thread.h" | 25 #include "webrtc/base/thread.h" |
| 26 #include "webrtc/p2p/base/candidatepairinterface.h" |
| 27 #include "webrtc/p2p/base/dtlstransportinternal.h" |
| 28 #include "webrtc/p2p/base/icetransportinternal.h" |
| 29 #include "webrtc/p2p/base/transportcontroller.h" |
| 30 | 30 |
| 31 #ifdef HAVE_QUIC | 31 #ifdef HAVE_QUIC |
| 32 #include "webrtc/p2p/quic/quictransport.h" | 32 #include "webrtc/p2p/quic/quictransport.h" |
| 33 #endif | 33 #endif |
| 34 | 34 |
| 35 namespace cricket { | 35 namespace cricket { |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 struct PacketMessageData : public rtc::MessageData { | 38 struct PacketMessageData : public rtc::MessageData { |
| 39 PacketMessageData(const char* data, size_t len) : packet(data, len) {} | 39 PacketMessageData(const char* data, size_t len) : packet(data, len) {} |
| 40 rtc::Buffer packet; | 40 rtc::Buffer packet; |
| 41 }; | 41 }; |
| 42 } // namespace | 42 } // namespace |
| 43 | 43 |
| 44 // Fake transport channel class, which can be passed to anything that needs a | 44 class FakeIceTransport : public IceTransportInternal, |
| 45 // transport channel. Can be informed of another FakeTransportChannel via | 45 public rtc::MessageHandler { |
| 46 // SetDestination. | |
| 47 // TODO(hbos): Move implementation to .cc file, this and other classes in file. | |
| 48 class FakeTransportChannel : public TransportChannelImpl, | |
| 49 public rtc::MessageHandler { | |
| 50 public: | 46 public: |
| 51 explicit FakeTransportChannel(const std::string& name, int component) | 47 explicit FakeIceTransport(const std::string& name, int component) |
| 52 : TransportChannelImpl(name, component), | 48 : name_(name), component_(component) {} |
| 53 dtls_fingerprint_("", nullptr, 0) {} | 49 ~FakeIceTransport() { Reset(); } |
| 54 ~FakeTransportChannel() { Reset(); } | |
| 55 | 50 |
| 51 const std::string& transport_name() const override { return name_; } |
| 52 int component() const override { return component_; } |
| 56 uint64_t IceTiebreaker() const { return tiebreaker_; } | 53 uint64_t IceTiebreaker() const { return tiebreaker_; } |
| 57 IceMode remote_ice_mode() const { return remote_ice_mode_; } | 54 IceMode remote_ice_mode() const { return remote_ice_mode_; } |
| 58 const std::string& ice_ufrag() const { return ice_ufrag_; } | 55 const std::string& ice_ufrag() const { return ice_ufrag_; } |
| 59 const std::string& ice_pwd() const { return ice_pwd_; } | 56 const std::string& ice_pwd() const { return ice_pwd_; } |
| 60 const std::string& remote_ice_ufrag() const { return remote_ice_ufrag_; } | 57 const std::string& remote_ice_ufrag() const { return remote_ice_ufrag_; } |
| 61 const std::string& remote_ice_pwd() const { return remote_ice_pwd_; } | 58 const std::string& remote_ice_pwd() const { return remote_ice_pwd_; } |
| 62 const rtc::SSLFingerprint& dtls_fingerprint() const { | |
| 63 return dtls_fingerprint_; | |
| 64 } | |
| 65 | 59 |
| 66 // If async, will send packets by "Post"-ing to message queue instead of | 60 // If async, will send packets by "Post"-ing to message queue instead of |
| 67 // synchronously "Send"-ing. | 61 // synchronously "Send"-ing. |
| 68 void SetAsync(bool async) { async_ = async; } | 62 void SetAsync(bool async) { async_ = async; } |
| 69 void SetAsyncDelay(int delay_ms) { async_delay_ms_ = delay_ms; } | 63 void SetAsyncDelay(int delay_ms) { async_delay_ms_ = delay_ms; } |
| 70 | 64 |
| 71 TransportChannelState GetState() const override { | 65 IceTransportState GetState() const override { |
| 72 if (connection_count_ == 0) { | 66 if (connection_count_ == 0) { |
| 73 return had_connection_ ? TransportChannelState::STATE_FAILED | 67 return had_connection_ ? IceTransportState::STATE_FAILED |
| 74 : TransportChannelState::STATE_INIT; | 68 : IceTransportState::STATE_INIT; |
| 75 } | 69 } |
| 76 | 70 |
| 77 if (connection_count_ == 1) { | 71 if (connection_count_ == 1) { |
| 78 return TransportChannelState::STATE_COMPLETED; | 72 return IceTransportState::STATE_COMPLETED; |
| 79 } | 73 } |
| 80 | 74 |
| 81 return TransportChannelState::STATE_CONNECTING; | 75 return IceTransportState::STATE_CONNECTING; |
| 82 } | 76 } |
| 83 | 77 |
| 84 void SetIceRole(IceRole role) override { role_ = role; } | 78 void SetIceRole(IceRole role) override { role_ = role; } |
| 85 IceRole GetIceRole() const override { return role_; } | 79 IceRole GetIceRole() const override { return role_; } |
| 86 void SetIceTiebreaker(uint64_t tiebreaker) override { | 80 void SetIceTiebreaker(uint64_t tiebreaker) override { |
| 87 tiebreaker_ = tiebreaker; | 81 tiebreaker_ = tiebreaker; |
| 88 } | 82 } |
| 89 void SetIceParameters(const IceParameters& ice_params) override { | 83 void SetIceParameters(const IceParameters& ice_params) override { |
| 90 ice_ufrag_ = ice_params.ufrag; | 84 ice_ufrag_ = ice_params.ufrag; |
| 91 ice_pwd_ = ice_params.pwd; | 85 ice_pwd_ = ice_params.pwd; |
| 92 } | 86 } |
| 93 void SetRemoteIceParameters(const IceParameters& params) override { | 87 void SetRemoteIceParameters(const IceParameters& params) override { |
| 94 remote_ice_ufrag_ = params.ufrag; | 88 remote_ice_ufrag_ = params.ufrag; |
| 95 remote_ice_pwd_ = params.pwd; | 89 remote_ice_pwd_ = params.pwd; |
| 96 } | 90 } |
| 97 | 91 |
| 98 void SetRemoteIceMode(IceMode mode) override { remote_ice_mode_ = mode; } | 92 void SetRemoteIceMode(IceMode mode) override { remote_ice_mode_ = mode; } |
| 99 bool SetRemoteFingerprint(const std::string& alg, | |
| 100 const uint8_t* digest, | |
| 101 size_t digest_len) override { | |
| 102 dtls_fingerprint_ = rtc::SSLFingerprint(alg, digest, digest_len); | |
| 103 return true; | |
| 104 } | |
| 105 bool SetSslRole(rtc::SSLRole role) override { | |
| 106 ssl_role_ = role; | |
| 107 return true; | |
| 108 } | |
| 109 bool GetSslRole(rtc::SSLRole* role) const override { | |
| 110 *role = ssl_role_; | |
| 111 return true; | |
| 112 } | |
| 113 | 93 |
| 114 void MaybeStartGathering() override { | 94 void MaybeStartGathering() override { |
| 115 if (gathering_state_ == kIceGatheringNew) { | 95 if (gathering_state_ == kIceGatheringNew) { |
| 116 gathering_state_ = kIceGatheringGathering; | 96 gathering_state_ = kIceGatheringGathering; |
| 117 SignalGatheringState(this); | 97 SignalGatheringState(this); |
| 118 } | 98 } |
| 119 } | 99 } |
| 120 | 100 |
| 121 IceGatheringState gathering_state() const override { | 101 IceGatheringState gathering_state() const override { |
| 122 return gathering_state_; | 102 return gathering_state_; |
| 123 } | 103 } |
| 124 | 104 |
| 125 void Reset() { | 105 void Reset() { |
| 126 if (state_ != STATE_INIT) { | 106 if (state_ != STATE_INIT) { |
| 127 state_ = STATE_INIT; | 107 state_ = STATE_INIT; |
| 128 if (dest_) { | 108 if (dest_) { |
| 129 dest_->state_ = STATE_INIT; | 109 dest_->state_ = STATE_INIT; |
| 130 dest_->dest_ = nullptr; | 110 dest_->dest_ = nullptr; |
| 131 dest_ = nullptr; | 111 dest_ = nullptr; |
| 132 } | 112 } |
| 133 } | 113 } |
| 134 } | 114 } |
| 135 | 115 |
| 136 void SetWritable(bool writable) { set_writable(writable); } | 116 void SetWritable(bool writable) { set_writable(writable); } |
| 137 | 117 |
| 138 // Simulates the two transport channels connecting to each other. | 118 void set_writable(bool writable) { |
| 139 // If |asymmetric| is true this method only affects this FakeTransportChannel. | 119 if (writable_ == writable) { |
| 120 return; |
| 121 } |
| 122 LOG(INFO) << "set_writable from:" << writable_ << " to " << writable; |
| 123 writable_ = writable; |
| 124 if (writable_) { |
| 125 SignalReadyToSend(this); |
| 126 } |
| 127 SignalWritableState(this); |
| 128 } |
| 129 bool writable() const override { return writable_; } |
| 130 |
| 131 // Simulates the two transports connecting to each other. |
| 132 // If |asymmetric| is true this method only affects this FakeIceTransport. |
| 140 // If false, it affects |dest| as well. | 133 // If false, it affects |dest| as well. |
| 141 void SetDestination(FakeTransportChannel* dest, bool asymmetric = false) { | 134 void SetDestination(FakeIceTransport* dest, bool asymmetric = false) { |
| 142 if (state_ == STATE_INIT && dest) { | 135 if (state_ == STATE_INIT && dest) { |
| 143 // This simulates the delivery of candidates. | 136 // This simulates the delivery of candidates. |
| 144 dest_ = dest; | 137 dest_ = dest; |
| 145 if (local_cert_ && dest_->local_cert_) { | |
| 146 do_dtls_ = true; | |
| 147 NegotiateSrtpCiphers(); | |
| 148 } | |
| 149 state_ = STATE_CONNECTED; | 138 state_ = STATE_CONNECTED; |
| 150 set_writable(true); | 139 set_writable(true); |
| 151 if (!asymmetric) { | 140 if (!asymmetric) { |
| 152 dest->SetDestination(this, true); | 141 dest->SetDestination(this, true); |
| 153 } | 142 } |
| 154 } else if (state_ == STATE_CONNECTED && !dest) { | 143 } else if (state_ == STATE_CONNECTED && !dest) { |
| 155 // Simulates loss of connectivity, by asymmetrically forgetting dest_. | 144 // Simulates loss of connectivity, by asymmetrically forgetting dest_. |
| 156 dest_ = nullptr; | 145 dest_ = nullptr; |
| 157 state_ = STATE_INIT; | 146 state_ = STATE_INIT; |
| 158 set_writable(false); | 147 set_writable(false); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 172 | 161 |
| 173 void SetCandidatesGatheringComplete() { | 162 void SetCandidatesGatheringComplete() { |
| 174 if (gathering_state_ != kIceGatheringComplete) { | 163 if (gathering_state_ != kIceGatheringComplete) { |
| 175 gathering_state_ = kIceGatheringComplete; | 164 gathering_state_ = kIceGatheringComplete; |
| 176 SignalGatheringState(this); | 165 SignalGatheringState(this); |
| 177 } | 166 } |
| 178 } | 167 } |
| 179 | 168 |
| 180 void SetReceiving(bool receiving) { set_receiving(receiving); } | 169 void SetReceiving(bool receiving) { set_receiving(receiving); } |
| 181 | 170 |
| 171 void set_receiving(bool receiving) { |
| 172 if (receiving_ == receiving) { |
| 173 return; |
| 174 } |
| 175 receiving_ = receiving; |
| 176 SignalReceivingState(this); |
| 177 } |
| 178 bool receiving() const override { return receiving_; } |
| 179 |
| 182 void SetIceConfig(const IceConfig& config) override { ice_config_ = config; } | 180 void SetIceConfig(const IceConfig& config) override { ice_config_ = config; } |
| 183 | 181 |
| 184 int receiving_timeout() const { return ice_config_.receiving_timeout; } | 182 int receiving_timeout() const { return ice_config_.receiving_timeout; } |
| 185 bool gather_continually() const { return ice_config_.gather_continually(); } | 183 bool gather_continually() const { return ice_config_.gather_continually(); } |
| 186 | 184 |
| 187 int SendPacket(const char* data, | 185 int SendPacket(const char* data, |
| 188 size_t len, | 186 size_t len, |
| 189 const rtc::PacketOptions& options, | 187 const rtc::PacketOptions& options, |
| 190 int flags) override { | 188 int flags) override { |
| 191 if (state_ != STATE_CONNECTED) { | 189 if (state_ != STATE_CONNECTED) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 | 221 |
| 224 const Candidates& remote_candidates() const { return remote_candidates_; } | 222 const Candidates& remote_candidates() const { return remote_candidates_; } |
| 225 | 223 |
| 226 void OnMessage(rtc::Message* msg) override { | 224 void OnMessage(rtc::Message* msg) override { |
| 227 PacketMessageData* data = static_cast<PacketMessageData*>(msg->pdata); | 225 PacketMessageData* data = static_cast<PacketMessageData*>(msg->pdata); |
| 228 dest_->SignalReadPacket(dest_, data->packet.data<char>(), | 226 dest_->SignalReadPacket(dest_, data->packet.data<char>(), |
| 229 data->packet.size(), rtc::CreatePacketTime(0), 0); | 227 data->packet.size(), rtc::CreatePacketTime(0), 0); |
| 230 delete data; | 228 delete data; |
| 231 } | 229 } |
| 232 | 230 |
| 231 bool GetStats(ConnectionInfos* infos) override { |
| 232 ConnectionInfo info; |
| 233 infos->clear(); |
| 234 infos->push_back(info); |
| 235 return true; |
| 236 } |
| 237 |
| 238 void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override { |
| 239 } |
| 240 |
| 241 private: |
| 242 std::string name_; |
| 243 int component_; |
| 244 enum State { STATE_INIT, STATE_CONNECTED }; |
| 245 FakeIceTransport* dest_ = nullptr; |
| 246 State state_ = STATE_INIT; |
| 247 bool async_ = false; |
| 248 int async_delay_ms_ = 0; |
| 249 Candidates remote_candidates_; |
| 250 IceConfig ice_config_; |
| 251 IceRole role_ = ICEROLE_UNKNOWN; |
| 252 uint64_t tiebreaker_ = 0; |
| 253 std::string ice_ufrag_; |
| 254 std::string ice_pwd_; |
| 255 std::string remote_ice_ufrag_; |
| 256 std::string remote_ice_pwd_; |
| 257 IceMode remote_ice_mode_ = ICEMODE_FULL; |
| 258 size_t connection_count_ = 0; |
| 259 IceGatheringState gathering_state_ = kIceGatheringNew; |
| 260 bool had_connection_ = false; |
| 261 bool writable_ = false; |
| 262 bool receiving_ = false; |
| 263 }; |
| 264 |
| 265 class FakeDtlsTransport : public DtlsTransportInternal { |
| 266 public: |
| 267 explicit FakeDtlsTransport(FakeIceTransport* ice_transport) |
| 268 : ice_transport_(ice_transport), |
| 269 transport_name_(ice_transport->transport_name()), |
| 270 component_(ice_transport->component()), |
| 271 dtls_fingerprint_("", nullptr, 0) { |
| 272 ice_transport_->SignalReadPacket.connect( |
| 273 this, &FakeDtlsTransport::OnIceTransportReadPacket); |
| 274 } |
| 275 |
| 276 explicit FakeDtlsTransport(const std::string& name, int component) |
| 277 : ice_transport_(new FakeIceTransport(name, component)), |
| 278 transport_name_(ice_transport_->transport_name()), |
| 279 component_(ice_transport_->component()), |
| 280 dtls_fingerprint_("", nullptr, 0) { |
| 281 ice_transport_->SignalReadPacket.connect( |
| 282 this, &FakeDtlsTransport::OnIceTransportReadPacket); |
| 283 } |
| 284 |
| 285 ~FakeDtlsTransport() override { Reset(); } |
| 286 |
| 287 uint64_t IceTiebreaker() const { return ice_transport_->IceTiebreaker(); } |
| 288 IceMode remote_ice_mode() const { return ice_transport_->remote_ice_mode(); } |
| 289 const std::string& ice_ufrag() const { return ice_transport_->ice_ufrag(); } |
| 290 const std::string& ice_pwd() const { return ice_transport_->ice_pwd(); } |
| 291 const std::string& remote_ice_ufrag() const { |
| 292 return ice_transport_->remote_ice_ufrag(); |
| 293 } |
| 294 const std::string& remote_ice_pwd() const { |
| 295 return ice_transport_->remote_ice_pwd(); |
| 296 } |
| 297 |
| 298 DtlsTransportState dtls_state() const override { return dtls_state_; } |
| 299 |
| 300 const std::string& transport_name() const override { return transport_name_; } |
| 301 |
| 302 int component() const override { return component_; } |
| 303 |
| 304 const rtc::SSLFingerprint& dtls_fingerprint() const { |
| 305 return dtls_fingerprint_; |
| 306 } |
| 307 |
| 308 // If async, will send packets by "Post"-ing to message queue instead of |
| 309 // synchronously "Send"-ing. |
| 310 void SetAsync(bool async) { ice_transport_->SetAsync(async); } |
| 311 void SetAsyncDelay(int delay_ms) { ice_transport_->SetAsyncDelay(delay_ms); } |
| 312 |
| 313 IceRole GetIceRole() const { return ice_transport_->GetIceRole(); } |
| 314 |
| 315 bool SetRemoteFingerprint(const std::string& alg, |
| 316 const uint8_t* digest, |
| 317 size_t digest_len) override { |
| 318 dtls_fingerprint_ = rtc::SSLFingerprint(alg, digest, digest_len); |
| 319 return true; |
| 320 } |
| 321 |
| 322 bool SetSslRole(rtc::SSLRole role) override { |
| 323 ssl_role_ = role; |
| 324 return true; |
| 325 } |
| 326 |
| 327 bool GetSslRole(rtc::SSLRole* role) const override { |
| 328 *role = ssl_role_; |
| 329 return true; |
| 330 } |
| 331 |
| 332 IceGatheringState gathering_state() const { |
| 333 return ice_transport_->gathering_state(); |
| 334 } |
| 335 |
| 336 void Reset() { |
| 337 if (state_ != STATE_INIT) { |
| 338 state_ = STATE_INIT; |
| 339 if (dest_) { |
| 340 dest_->state_ = STATE_INIT; |
| 341 dest_->dest_ = nullptr; |
| 342 dest_ = nullptr; |
| 343 } |
| 344 } |
| 345 } |
| 346 |
| 347 void SetWritable(bool writable) { set_writable(writable); } |
| 348 |
| 349 // Simulates the two transport channels connecting to each other. |
| 350 // If |asymmetric| is true this method only affects this FakeDtlsTransport. |
| 351 // If false, it affects |dest| as well. |
| 352 void SetDestination(FakeDtlsTransport* dest, bool asymmetric = false) { |
| 353 if (state_ == STATE_INIT && dest) { |
| 354 // This simulates the delivery of candidates. |
| 355 dest_ = dest; |
| 356 if (local_cert_ && dest_->local_cert_) { |
| 357 do_dtls_ = true; |
| 358 NegotiateSrtpCiphers(); |
| 359 } |
| 360 state_ = STATE_CONNECTED; |
| 361 SetWritable(true); |
| 362 if (!asymmetric) { |
| 363 dest->SetDestination(this, true); |
| 364 } |
| 365 ice_transport_->SetDestination( |
| 366 static_cast<FakeIceTransport*>(dest->ice_transport()), asymmetric); |
| 367 } else if (state_ == STATE_CONNECTED && !dest) { |
| 368 // Simulates loss of connectivity, by asymmetrically forgetting dest_. |
| 369 dest_ = nullptr; |
| 370 state_ = STATE_INIT; |
| 371 SetWritable(false); |
| 372 ice_transport_->SetDestination(nullptr, asymmetric); |
| 373 } |
| 374 } |
| 375 |
| 376 void SetConnectionCount(size_t connection_count) { |
| 377 ice_transport_->SetConnectionCount(connection_count); |
| 378 } |
| 379 |
| 380 void SetCandidatesGatheringComplete() { |
| 381 ice_transport_->SetCandidatesGatheringComplete(); |
| 382 } |
| 383 |
| 384 void SetReceiving(bool receiving) { |
| 385 ice_transport_->SetReceiving(receiving); |
| 386 set_receiving(receiving); |
| 387 } |
| 388 |
| 389 int receiving_timeout() const { return ice_transport_->receiving_timeout(); } |
| 390 bool gather_continually() const { |
| 391 return ice_transport_->gather_continually(); |
| 392 } |
| 393 |
| 394 int SendPacket(const char* data, |
| 395 size_t len, |
| 396 const rtc::PacketOptions& options, |
| 397 int flags) override { |
| 398 return ice_transport_->SendPacket(data, len, options, flags); |
| 399 } |
| 400 |
| 401 bool GetOption(rtc::Socket::Option opt, int* value) override { return true; } |
| 402 |
| 403 const Candidates& remote_candidates() const { |
| 404 return ice_transport_->remote_candidates(); |
| 405 } |
| 406 |
| 407 void OnIceTransportReadPacket(PacketTransportInterface* ice_, |
| 408 const char* data, |
| 409 size_t len, |
| 410 const rtc::PacketTime& time, |
| 411 int flags) { |
| 412 SignalReadPacket(this, data, len, time, flags); |
| 413 } |
| 414 |
| 233 bool SetLocalCertificate( | 415 bool SetLocalCertificate( |
| 234 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override { | 416 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override { |
| 235 local_cert_ = certificate; | 417 local_cert_ = certificate; |
| 236 return true; | 418 return true; |
| 237 } | 419 } |
| 238 | 420 |
| 239 void SetRemoteSSLCertificate(rtc::FakeSSLCertificate* cert) { | 421 void SetRemoteSSLCertificate(rtc::FakeSSLCertificate* cert) { |
| 240 remote_cert_ = cert; | 422 remote_cert_ = cert; |
| 241 } | 423 } |
| 242 | 424 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 uint8_t* result, | 457 uint8_t* result, |
| 276 size_t result_len) override { | 458 size_t result_len) override { |
| 277 if (chosen_crypto_suite_ != rtc::SRTP_INVALID_CRYPTO_SUITE) { | 459 if (chosen_crypto_suite_ != rtc::SRTP_INVALID_CRYPTO_SUITE) { |
| 278 memset(result, 0xff, result_len); | 460 memset(result, 0xff, result_len); |
| 279 return true; | 461 return true; |
| 280 } | 462 } |
| 281 | 463 |
| 282 return false; | 464 return false; |
| 283 } | 465 } |
| 284 | 466 |
| 285 bool GetStats(ConnectionInfos* infos) override { | |
| 286 ConnectionInfo info; | |
| 287 infos->clear(); | |
| 288 infos->push_back(info); | |
| 289 return true; | |
| 290 } | |
| 291 | |
| 292 void set_ssl_max_protocol_version(rtc::SSLProtocolVersion version) { | 467 void set_ssl_max_protocol_version(rtc::SSLProtocolVersion version) { |
| 293 ssl_max_version_ = version; | 468 ssl_max_version_ = version; |
| 294 } | 469 } |
| 295 rtc::SSLProtocolVersion ssl_max_protocol_version() const { | 470 rtc::SSLProtocolVersion ssl_max_protocol_version() const { |
| 296 return ssl_max_version_; | 471 return ssl_max_version_; |
| 297 } | 472 } |
| 298 | 473 |
| 299 void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override { | 474 IceTransportInternal* ice_transport() override { return ice_transport_; } |
| 475 |
| 476 bool writable() const override { return writable_; } |
| 477 |
| 478 bool receiving() const override { return receiving_; } |
| 479 |
| 480 int GetError() override { return ice_transport_->GetError(); } |
| 481 |
| 482 int SetOption(rtc::Socket::Option opt, int value) override { |
| 483 return ice_transport_->SetOption(opt, value); |
| 484 } |
| 485 |
| 486 bool SetSrtpCiphers(const std::vector<std::string>& ciphers) override { |
| 487 std::vector<int> crypto_suites; |
| 488 for (const auto cipher : ciphers) { |
| 489 crypto_suites.push_back(rtc::SrtpCryptoSuiteFromName(cipher)); |
| 490 } |
| 491 return SetSrtpCryptoSuites(crypto_suites); |
| 300 } | 492 } |
| 301 | 493 |
| 302 private: | 494 private: |
| 303 void NegotiateSrtpCiphers() { | 495 void NegotiateSrtpCiphers() { |
| 304 for (std::vector<int>::const_iterator it1 = srtp_ciphers_.begin(); | 496 for (std::vector<int>::const_iterator it1 = srtp_ciphers_.begin(); |
| 305 it1 != srtp_ciphers_.end(); ++it1) { | 497 it1 != srtp_ciphers_.end(); ++it1) { |
| 306 for (std::vector<int>::const_iterator it2 = dest_->srtp_ciphers_.begin(); | 498 for (std::vector<int>::const_iterator it2 = dest_->srtp_ciphers_.begin(); |
| 307 it2 != dest_->srtp_ciphers_.end(); ++it2) { | 499 it2 != dest_->srtp_ciphers_.end(); ++it2) { |
| 308 if (*it1 == *it2) { | 500 if (*it1 == *it2) { |
| 309 chosen_crypto_suite_ = *it1; | 501 chosen_crypto_suite_ = *it1; |
| 310 return; | 502 return; |
| 311 } | 503 } |
| 312 } | 504 } |
| 313 } | 505 } |
| 314 } | 506 } |
| 315 | 507 |
| 508 void set_receiving(bool receiving) { |
| 509 if (receiving_ == receiving) { |
| 510 return; |
| 511 } |
| 512 receiving_ = receiving; |
| 513 SignalReceivingState(this); |
| 514 } |
| 515 |
| 516 void set_writable(bool writable) { |
| 517 if (writable_ == writable) { |
| 518 return; |
| 519 } |
| 520 writable_ = writable; |
| 521 if (writable_) { |
| 522 SignalReadyToSend(this); |
| 523 } |
| 524 SignalWritableState(this); |
| 525 } |
| 526 |
| 316 enum State { STATE_INIT, STATE_CONNECTED }; | 527 enum State { STATE_INIT, STATE_CONNECTED }; |
| 317 FakeTransportChannel* dest_ = nullptr; | 528 FakeIceTransport* ice_transport_; |
| 529 std::string transport_name_; |
| 530 int component_; |
| 531 FakeDtlsTransport* dest_ = nullptr; |
| 318 State state_ = STATE_INIT; | 532 State state_ = STATE_INIT; |
| 319 bool async_ = false; | |
| 320 int async_delay_ms_ = 0; | |
| 321 Candidates remote_candidates_; | 533 Candidates remote_candidates_; |
| 322 rtc::scoped_refptr<rtc::RTCCertificate> local_cert_; | 534 rtc::scoped_refptr<rtc::RTCCertificate> local_cert_; |
| 323 rtc::FakeSSLCertificate* remote_cert_ = nullptr; | 535 rtc::FakeSSLCertificate* remote_cert_ = nullptr; |
| 324 bool do_dtls_ = false; | 536 bool do_dtls_ = false; |
| 325 std::vector<int> srtp_ciphers_; | 537 std::vector<int> srtp_ciphers_; |
| 326 int chosen_crypto_suite_ = rtc::SRTP_INVALID_CRYPTO_SUITE; | 538 int chosen_crypto_suite_ = rtc::SRTP_INVALID_CRYPTO_SUITE; |
| 327 IceConfig ice_config_; | |
| 328 IceRole role_ = ICEROLE_UNKNOWN; | |
| 329 uint64_t tiebreaker_ = 0; | |
| 330 std::string ice_ufrag_; | |
| 331 std::string ice_pwd_; | |
| 332 std::string remote_ice_ufrag_; | |
| 333 std::string remote_ice_pwd_; | |
| 334 IceMode remote_ice_mode_ = ICEMODE_FULL; | |
| 335 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12; | 539 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12; |
| 336 rtc::SSLFingerprint dtls_fingerprint_; | 540 rtc::SSLFingerprint dtls_fingerprint_; |
| 337 rtc::SSLRole ssl_role_ = rtc::SSL_CLIENT; | 541 rtc::SSLRole ssl_role_ = rtc::SSL_CLIENT; |
| 338 size_t connection_count_ = 0; | 542 |
| 339 IceGatheringState gathering_state_ = kIceGatheringNew; | 543 DtlsTransportState dtls_state_ = DTLS_TRANSPORT_NEW; |
| 340 bool had_connection_ = false; | 544 |
| 545 bool receiving_ = false; |
| 546 bool writable_ = false; |
| 341 }; | 547 }; |
| 342 | 548 |
| 343 // Fake candidate pair class, which can be passed to BaseChannel for testing | 549 // Fake candidate pair class, which can be passed to BaseChannel for testing |
| 344 // purposes. | 550 // purposes. |
| 345 class FakeCandidatePair : public CandidatePairInterface { | 551 class FakeCandidatePair : public CandidatePairInterface { |
| 346 public: | 552 public: |
| 347 FakeCandidatePair(const Candidate& local_candidate, | 553 FakeCandidatePair(const Candidate& local_candidate, |
| 348 const Candidate& remote_candidate) | 554 const Candidate& remote_candidate) |
| 349 : local_candidate_(local_candidate), | 555 : local_candidate_(local_candidate), |
| 350 remote_candidate_(remote_candidate) {} | 556 remote_candidate_(remote_candidate) {} |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 } | 591 } |
| 386 | 592 |
| 387 explicit FakeTransportController(rtc::Thread* network_thread) | 593 explicit FakeTransportController(rtc::Thread* network_thread) |
| 388 : TransportController(rtc::Thread::Current(), network_thread, nullptr) {} | 594 : TransportController(rtc::Thread::Current(), network_thread, nullptr) {} |
| 389 | 595 |
| 390 FakeTransportController(rtc::Thread* network_thread, IceRole role) | 596 FakeTransportController(rtc::Thread* network_thread, IceRole role) |
| 391 : TransportController(rtc::Thread::Current(), network_thread, nullptr) { | 597 : TransportController(rtc::Thread::Current(), network_thread, nullptr) { |
| 392 SetIceRole(role); | 598 SetIceRole(role); |
| 393 } | 599 } |
| 394 | 600 |
| 395 FakeTransportChannel* GetFakeTransportChannel_n( | 601 FakeDtlsTransport* GetFakeDtlsTransport_n(const std::string& transport_name, |
| 396 const std::string& transport_name, | 602 int component) { |
| 397 int component) { | 603 return static_cast<FakeDtlsTransport*>( |
| 398 return static_cast<FakeTransportChannel*>( | |
| 399 get_channel_for_testing(transport_name, component)); | 604 get_channel_for_testing(transport_name, component)); |
| 400 } | 605 } |
| 401 | 606 |
| 402 // Simulate the exchange of transport descriptions, and the gathering and | 607 // Simulate the exchange of transport descriptions, and the gathering and |
| 403 // exchange of ICE candidates. | 608 // exchange of ICE candidates. |
| 404 void Connect(FakeTransportController* dest) { | 609 void Connect(FakeTransportController* dest) { |
| 405 for (const std::string& transport_name : transport_names_for_testing()) { | 610 for (const std::string& transport_name : transport_names_for_testing()) { |
| 406 TransportDescription local_desc( | 611 TransportDescription local_desc( |
| 407 std::vector<std::string>(), | 612 std::vector<std::string>(), |
| 408 rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH), | 613 rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH), |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 "foundation", local_network_id, 0); | 645 "foundation", local_network_id, 0); |
| 441 Candidate remote_candidate(0, "udp", remote_address, 0u, "", "", "local", 0, | 646 Candidate remote_candidate(0, "udp", remote_address, 0u, "", "", "local", 0, |
| 442 "foundation", remote_network_id, 0); | 647 "foundation", remote_network_id, 0); |
| 443 return new FakeCandidatePair(local_candidate, remote_candidate); | 648 return new FakeCandidatePair(local_candidate, remote_candidate); |
| 444 } | 649 } |
| 445 | 650 |
| 446 protected: | 651 protected: |
| 447 // The ICE channel is never actually used by TransportController directly, | 652 // The ICE channel is never actually used by TransportController directly, |
| 448 // since (currently) the DTLS channel pretends to be both ICE + DTLS. This | 653 // since (currently) the DTLS channel pretends to be both ICE + DTLS. This |
| 449 // will change when we get rid of TransportChannelImpl. | 654 // will change when we get rid of TransportChannelImpl. |
| 450 TransportChannelImpl* CreateIceTransportChannel_n( | 655 IceTransportInternal* CreateIceTransportChannel_n( |
| 451 const std::string& transport_name, | 656 const std::string& transport_name, |
| 452 int component) override { | 657 int component) override { |
| 453 return nullptr; | 658 return new FakeIceTransport(transport_name, component); |
| 454 } | 659 } |
| 455 | 660 |
| 456 TransportChannelImpl* CreateDtlsTransportChannel_n( | 661 DtlsTransportInternal* CreateDtlsTransportChannel_n( |
| 457 const std::string& transport_name, | 662 const std::string& transport_name, |
| 458 int component, | 663 int component, |
| 459 TransportChannelImpl*) override { | 664 IceTransportInternal* ice) override { |
| 460 return new FakeTransportChannel(transport_name, component); | 665 return new FakeDtlsTransport(static_cast<FakeIceTransport*>(ice)); |
| 461 } | 666 } |
| 462 | 667 |
| 463 private: | 668 private: |
| 464 void SetChannelDestinations_n(FakeTransportController* dest) { | 669 void SetChannelDestinations_n(FakeTransportController* dest) { |
| 465 for (TransportChannelImpl* tc : channels_for_testing()) { | 670 for (DtlsTransportInternal* tc : channels_for_testing()) { |
| 466 FakeTransportChannel* local = static_cast<FakeTransportChannel*>(tc); | 671 FakeDtlsTransport* local = static_cast<FakeDtlsTransport*>(tc); |
| 467 FakeTransportChannel* remote = dest->GetFakeTransportChannel_n( | 672 FakeDtlsTransport* remote = dest->GetFakeDtlsTransport_n( |
| 468 local->transport_name(), local->component()); | 673 local->transport_name(), local->component()); |
| 469 if (remote) { | 674 if (remote) { |
| 470 bool asymmetric = false; | 675 bool asymmetric = false; |
| 471 local->SetDestination(remote, asymmetric); | 676 local->SetDestination(remote, asymmetric); |
| 472 } | 677 } |
| 473 } | 678 } |
| 474 } | 679 } |
| 475 }; | 680 }; |
| 476 | 681 |
| 477 } // namespace cricket | 682 } // namespace cricket |
| 478 | 683 |
| 479 #endif // WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ | 684 #endif // WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ |
| OLD | NEW |