| 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 | 
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 133       if (dest_) { | 133       if (dest_) { | 
| 134         dest_->state_ = STATE_INIT; | 134         dest_->state_ = STATE_INIT; | 
| 135         dest_->dest_ = nullptr; | 135         dest_->dest_ = nullptr; | 
| 136         dest_ = nullptr; | 136         dest_ = nullptr; | 
| 137       } | 137       } | 
| 138     } | 138     } | 
| 139   } | 139   } | 
| 140 | 140 | 
| 141   void SetWritable(bool writable) { set_writable(writable); } | 141   void SetWritable(bool writable) { set_writable(writable); } | 
| 142 | 142 | 
| 143   void SetDestination(FakeTransportChannel* dest) { | 143   // Simulates the two transport channels connecting to each other. | 
|  | 144   // If |asymmetric| is true this method only affects this FakeTransportChannel. | 
|  | 145   // If false, it affects |dest| as well. | 
|  | 146   void SetDestination(FakeTransportChannel* dest, bool asymmetric = false) { | 
| 144     if (state_ == STATE_CONNECTING && dest) { | 147     if (state_ == STATE_CONNECTING && dest) { | 
| 145       // This simulates the delivery of candidates. | 148       // This simulates the delivery of candidates. | 
| 146       dest_ = dest; | 149       dest_ = dest; | 
| 147       dest_->dest_ = this; |  | 
| 148       if (local_cert_ && dest_->local_cert_) { | 150       if (local_cert_ && dest_->local_cert_) { | 
| 149         do_dtls_ = true; | 151         do_dtls_ = true; | 
| 150         dest_->do_dtls_ = true; |  | 
| 151         NegotiateSrtpCiphers(); | 152         NegotiateSrtpCiphers(); | 
| 152       } | 153       } | 
| 153       state_ = STATE_CONNECTED; | 154       state_ = STATE_CONNECTED; | 
| 154       dest_->state_ = STATE_CONNECTED; |  | 
| 155       set_writable(true); | 155       set_writable(true); | 
| 156       dest_->set_writable(true); | 156       if (!asymmetric) { | 
|  | 157         dest->SetDestination(this, true); | 
|  | 158       } | 
| 157     } else if (state_ == STATE_CONNECTED && !dest) { | 159     } else if (state_ == STATE_CONNECTED && !dest) { | 
| 158       // Simulates loss of connectivity, by asymmetrically forgetting dest_. | 160       // Simulates loss of connectivity, by asymmetrically forgetting dest_. | 
| 159       dest_ = nullptr; | 161       dest_ = nullptr; | 
| 160       state_ = STATE_CONNECTING; | 162       state_ = STATE_CONNECTING; | 
| 161       set_writable(false); | 163       set_writable(false); | 
| 162     } | 164     } | 
| 163   } | 165   } | 
| 164 | 166 | 
| 165   void SetConnectionCount(size_t connection_count) { | 167   void SetConnectionCount(size_t connection_count) { | 
| 166     size_t old_connection_count = connection_count_; | 168     size_t old_connection_count = connection_count_; | 
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 274                             uint8_t* result, | 276                             uint8_t* result, | 
| 275                             size_t result_len) override { | 277                             size_t result_len) override { | 
| 276     if (chosen_crypto_suite_ != rtc::SRTP_INVALID_CRYPTO_SUITE) { | 278     if (chosen_crypto_suite_ != rtc::SRTP_INVALID_CRYPTO_SUITE) { | 
| 277       memset(result, 0xff, result_len); | 279       memset(result, 0xff, result_len); | 
| 278       return true; | 280       return true; | 
| 279     } | 281     } | 
| 280 | 282 | 
| 281     return false; | 283     return false; | 
| 282   } | 284   } | 
| 283 | 285 | 
| 284   void NegotiateSrtpCiphers() { |  | 
| 285     for (std::vector<int>::const_iterator it1 = srtp_ciphers_.begin(); |  | 
| 286          it1 != srtp_ciphers_.end(); ++it1) { |  | 
| 287       for (std::vector<int>::const_iterator it2 = dest_->srtp_ciphers_.begin(); |  | 
| 288            it2 != dest_->srtp_ciphers_.end(); ++it2) { |  | 
| 289         if (*it1 == *it2) { |  | 
| 290           chosen_crypto_suite_ = *it1; |  | 
| 291           dest_->chosen_crypto_suite_ = *it2; |  | 
| 292           return; |  | 
| 293         } |  | 
| 294       } |  | 
| 295     } |  | 
| 296   } |  | 
| 297 |  | 
| 298   bool GetStats(ConnectionInfos* infos) override { | 286   bool GetStats(ConnectionInfos* infos) override { | 
| 299     ConnectionInfo info; | 287     ConnectionInfo info; | 
| 300     infos->clear(); | 288     infos->clear(); | 
| 301     infos->push_back(info); | 289     infos->push_back(info); | 
| 302     return true; | 290     return true; | 
| 303   } | 291   } | 
| 304 | 292 | 
| 305   void set_ssl_max_protocol_version(rtc::SSLProtocolVersion version) { | 293   void set_ssl_max_protocol_version(rtc::SSLProtocolVersion version) { | 
| 306     ssl_max_version_ = version; | 294     ssl_max_version_ = version; | 
| 307   } | 295   } | 
| 308   rtc::SSLProtocolVersion ssl_max_protocol_version() const { | 296   rtc::SSLProtocolVersion ssl_max_protocol_version() const { | 
| 309     return ssl_max_version_; | 297     return ssl_max_version_; | 
| 310   } | 298   } | 
| 311 | 299 | 
| 312  private: | 300  private: | 
|  | 301   void NegotiateSrtpCiphers() { | 
|  | 302     for (std::vector<int>::const_iterator it1 = srtp_ciphers_.begin(); | 
|  | 303          it1 != srtp_ciphers_.end(); ++it1) { | 
|  | 304       for (std::vector<int>::const_iterator it2 = dest_->srtp_ciphers_.begin(); | 
|  | 305            it2 != dest_->srtp_ciphers_.end(); ++it2) { | 
|  | 306         if (*it1 == *it2) { | 
|  | 307           chosen_crypto_suite_ = *it1; | 
|  | 308           return; | 
|  | 309         } | 
|  | 310       } | 
|  | 311     } | 
|  | 312   } | 
|  | 313 | 
| 313   enum State { STATE_INIT, STATE_CONNECTING, STATE_CONNECTED }; | 314   enum State { STATE_INIT, STATE_CONNECTING, STATE_CONNECTED }; | 
| 314   FakeTransportChannel* dest_ = nullptr; | 315   FakeTransportChannel* dest_ = nullptr; | 
| 315   State state_ = STATE_INIT; | 316   State state_ = STATE_INIT; | 
| 316   bool async_ = false; | 317   bool async_ = false; | 
| 317   Candidates remote_candidates_; | 318   Candidates remote_candidates_; | 
| 318   rtc::scoped_refptr<rtc::RTCCertificate> local_cert_; | 319   rtc::scoped_refptr<rtc::RTCCertificate> local_cert_; | 
| 319   rtc::FakeSSLCertificate* remote_cert_ = nullptr; | 320   rtc::FakeSSLCertificate* remote_cert_ = nullptr; | 
| 320   bool do_dtls_ = false; | 321   bool do_dtls_ = false; | 
| 321   std::vector<int> srtp_ciphers_; | 322   std::vector<int> srtp_ciphers_; | 
| 322   int chosen_crypto_suite_ = rtc::SRTP_INVALID_CRYPTO_SUITE; | 323   int chosen_crypto_suite_ = rtc::SRTP_INVALID_CRYPTO_SUITE; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 351   FakeTransport(const std::string& name, PortAllocator* allocator) | 352   FakeTransport(const std::string& name, PortAllocator* allocator) | 
| 352       : Transport(name, nullptr) {} | 353       : Transport(name, nullptr) {} | 
| 353 | 354 | 
| 354   ~FakeTransport() { DestroyAllChannels(); } | 355   ~FakeTransport() { DestroyAllChannels(); } | 
| 355 | 356 | 
| 356   const ChannelMap& channels() const { return channels_; } | 357   const ChannelMap& channels() const { return channels_; } | 
| 357 | 358 | 
| 358   // If async, will send packets by "Post"-ing to message queue instead of | 359   // If async, will send packets by "Post"-ing to message queue instead of | 
| 359   // synchronously "Send"-ing. | 360   // synchronously "Send"-ing. | 
| 360   void SetAsync(bool async) { async_ = async; } | 361   void SetAsync(bool async) { async_ = async; } | 
| 361   void SetDestination(FakeTransport* dest) { | 362 | 
|  | 363   // If |asymmetric| is true, only set the destination for this transport, and | 
|  | 364   // not |dest|. | 
|  | 365   void SetDestination(FakeTransport* dest, bool asymmetric = false) { | 
| 362     dest_ = dest; | 366     dest_ = dest; | 
| 363     for (const auto& kv : channels_) { | 367     for (const auto& kv : channels_) { | 
| 364       kv.second->SetLocalCertificate(certificate_); | 368       kv.second->SetLocalCertificate(certificate_); | 
| 365       SetChannelDestination(kv.first, kv.second); | 369       SetChannelDestination(kv.first, kv.second, asymmetric); | 
| 366     } | 370     } | 
| 367   } | 371   } | 
| 368 | 372 | 
| 369   void SetWritable(bool writable) { | 373   void SetWritable(bool writable) { | 
| 370     for (const auto& kv : channels_) { | 374     for (const auto& kv : channels_) { | 
| 371       kv.second->SetWritable(writable); | 375       kv.second->SetWritable(writable); | 
| 372     } | 376     } | 
| 373   } | 377   } | 
| 374 | 378 | 
| 375   void SetLocalCertificate( | 379   void SetLocalCertificate( | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 407   using Transport::remote_description; | 411   using Transport::remote_description; | 
| 408 | 412 | 
| 409  protected: | 413  protected: | 
| 410   TransportChannelImpl* CreateTransportChannel(int component) override { | 414   TransportChannelImpl* CreateTransportChannel(int component) override { | 
| 411     if (channels_.find(component) != channels_.end()) { | 415     if (channels_.find(component) != channels_.end()) { | 
| 412       return nullptr; | 416       return nullptr; | 
| 413     } | 417     } | 
| 414     FakeTransportChannel* channel = new FakeTransportChannel(name(), component); | 418     FakeTransportChannel* channel = new FakeTransportChannel(name(), component); | 
| 415     channel->set_ssl_max_protocol_version(ssl_max_version_); | 419     channel->set_ssl_max_protocol_version(ssl_max_version_); | 
| 416     channel->SetAsync(async_); | 420     channel->SetAsync(async_); | 
| 417     SetChannelDestination(component, channel); | 421     SetChannelDestination(component, channel, false); | 
| 418     channels_[component] = channel; | 422     channels_[component] = channel; | 
| 419     return channel; | 423     return channel; | 
| 420   } | 424   } | 
| 421 | 425 | 
| 422   void DestroyTransportChannel(TransportChannelImpl* channel) override { | 426   void DestroyTransportChannel(TransportChannelImpl* channel) override { | 
| 423     channels_.erase(channel->component()); | 427     channels_.erase(channel->component()); | 
| 424     delete channel; | 428     delete channel; | 
| 425   } | 429   } | 
| 426 | 430 | 
| 427  private: | 431  private: | 
| 428   FakeTransportChannel* GetFakeChannel(int component) { | 432   FakeTransportChannel* GetFakeChannel(int component) { | 
| 429     auto it = channels_.find(component); | 433     auto it = channels_.find(component); | 
| 430     return (it != channels_.end()) ? it->second : nullptr; | 434     return (it != channels_.end()) ? it->second : nullptr; | 
| 431   } | 435   } | 
| 432 | 436 | 
| 433   void SetChannelDestination(int component, FakeTransportChannel* channel) { | 437   void SetChannelDestination(int component, | 
|  | 438                              FakeTransportChannel* channel, | 
|  | 439                              bool asymmetric) { | 
| 434     FakeTransportChannel* dest_channel = nullptr; | 440     FakeTransportChannel* dest_channel = nullptr; | 
| 435     if (dest_) { | 441     if (dest_) { | 
| 436       dest_channel = dest_->GetFakeChannel(component); | 442       dest_channel = dest_->GetFakeChannel(component); | 
| 437       if (dest_channel) { | 443       if (dest_channel && !asymmetric) { | 
| 438         dest_channel->SetLocalCertificate(dest_->certificate_); | 444         dest_channel->SetLocalCertificate(dest_->certificate_); | 
| 439       } | 445       } | 
| 440     } | 446     } | 
| 441     channel->SetDestination(dest_channel); | 447     channel->SetDestination(dest_channel, asymmetric); | 
| 442   } | 448   } | 
| 443 | 449 | 
| 444   // Note, this is distinct from the Channel map owned by Transport. | 450   // Note, this is distinct from the Channel map owned by Transport. | 
| 445   // This map just tracks the FakeTransportChannels created by this class. | 451   // This map just tracks the FakeTransportChannels created by this class. | 
| 446   // It's mainly needed so that we can access a FakeTransportChannel directly, | 452   // It's mainly needed so that we can access a FakeTransportChannel directly, | 
| 447   // even if wrapped by a DtlsTransportChannelWrapper. | 453   // even if wrapped by a DtlsTransportChannelWrapper. | 
| 448   ChannelMap channels_; | 454   ChannelMap channels_; | 
| 449   FakeTransport* dest_ = nullptr; | 455   FakeTransport* dest_ = nullptr; | 
| 450   bool async_ = false; | 456   bool async_ = false; | 
| 451   rtc::scoped_refptr<rtc::RTCCertificate> certificate_; | 457   rtc::scoped_refptr<rtc::RTCCertificate> certificate_; | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 571     } | 577     } | 
| 572   } | 578   } | 
| 573 | 579 | 
| 574  private: | 580  private: | 
| 575   bool fail_create_channel_; | 581   bool fail_create_channel_; | 
| 576 }; | 582 }; | 
| 577 | 583 | 
| 578 }  // namespace cricket | 584 }  // namespace cricket | 
| 579 | 585 | 
| 580 #endif  // WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ | 586 #endif  // WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_ | 
| OLD | NEW | 
|---|