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 |