| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2011 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 SignalEvent(this, rtc::SE_READ, 0); | 101 SignalEvent(this, rtc::SE_READ, 0); |
| 102 } | 102 } |
| 103 return ret; | 103 return ret; |
| 104 } | 104 } |
| 105 | 105 |
| 106 void StreamInterfaceChannel::Close() { | 106 void StreamInterfaceChannel::Close() { |
| 107 packets_.Clear(); | 107 packets_.Clear(); |
| 108 state_ = rtc::SS_CLOSED; | 108 state_ = rtc::SS_CLOSED; |
| 109 } | 109 } |
| 110 | 110 |
| 111 DtlsTransport::DtlsTransport(IceTransportInternal* ice_transport) | 111 DtlsTransport::DtlsTransport(IceTransportInternal* ice_transport, |
| 112 const rtc::CryptoOptions& crypto_options) |
| 112 : transport_name_(ice_transport->transport_name()), | 113 : transport_name_(ice_transport->transport_name()), |
| 113 component_(ice_transport->component()), | 114 component_(ice_transport->component()), |
| 114 network_thread_(rtc::Thread::Current()), | 115 network_thread_(rtc::Thread::Current()), |
| 115 ice_transport_(ice_transport), | 116 ice_transport_(ice_transport), |
| 116 downward_(NULL), | 117 downward_(NULL), |
| 117 ssl_role_(rtc::SSL_CLIENT), | 118 ssl_role_(rtc::SSL_CLIENT), |
| 118 ssl_max_version_(rtc::SSL_PROTOCOL_DTLS_12) { | 119 ssl_max_version_(rtc::SSL_PROTOCOL_DTLS_12) { |
| 120 GetDefaultSrtpCryptoSuites(crypto_options, &srtp_ciphers_); |
| 119 ice_transport_->SignalWritableState.connect(this, | 121 ice_transport_->SignalWritableState.connect(this, |
| 120 &DtlsTransport::OnWritableState); | 122 &DtlsTransport::OnWritableState); |
| 121 ice_transport_->SignalReadPacket.connect(this, &DtlsTransport::OnReadPacket); | 123 ice_transport_->SignalReadPacket.connect(this, &DtlsTransport::OnReadPacket); |
| 122 ice_transport_->SignalSentPacket.connect(this, &DtlsTransport::OnSentPacket); | 124 ice_transport_->SignalSentPacket.connect(this, &DtlsTransport::OnSentPacket); |
| 123 ice_transport_->SignalReadyToSend.connect(this, | 125 ice_transport_->SignalReadyToSend.connect(this, |
| 124 &DtlsTransport::OnReadyToSend); | 126 &DtlsTransport::OnReadyToSend); |
| 125 ice_transport_->SignalReceivingState.connect( | 127 ice_transport_->SignalReceivingState.connect( |
| 126 this, &DtlsTransport::OnReceivingState); | 128 this, &DtlsTransport::OnReceivingState); |
| 127 } | 129 } |
| 128 | 130 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 } | 313 } |
| 312 | 314 |
| 313 LOG_J(LS_INFO, this) << "DTLS setup complete."; | 315 LOG_J(LS_INFO, this) << "DTLS setup complete."; |
| 314 | 316 |
| 315 // If the underlying ice_transport is already writable at this point, we may | 317 // If the underlying ice_transport is already writable at this point, we may |
| 316 // be able to start DTLS right away. | 318 // be able to start DTLS right away. |
| 317 MaybeStartDtls(); | 319 MaybeStartDtls(); |
| 318 return true; | 320 return true; |
| 319 } | 321 } |
| 320 | 322 |
| 321 bool DtlsTransport::SetSrtpCryptoSuites(const std::vector<int>& ciphers) { | |
| 322 if (srtp_ciphers_ == ciphers) | |
| 323 return true; | |
| 324 | |
| 325 if (dtls_state() == DTLS_TRANSPORT_CONNECTING) { | |
| 326 LOG(LS_WARNING) << "Ignoring new SRTP ciphers while DTLS is negotiating"; | |
| 327 return true; | |
| 328 } | |
| 329 | |
| 330 if (dtls_state() == DTLS_TRANSPORT_CONNECTED) { | |
| 331 // We don't support DTLS renegotiation currently. If new set of srtp ciphers | |
| 332 // are different than what's being used currently, we will not use it. | |
| 333 // So for now, let's be happy (or sad) with a warning message. | |
| 334 int current_srtp_cipher; | |
| 335 if (!dtls_->GetDtlsSrtpCryptoSuite(¤t_srtp_cipher)) { | |
| 336 LOG(LS_ERROR) | |
| 337 << "Failed to get the current SRTP cipher for DTLS transport"; | |
| 338 return false; | |
| 339 } | |
| 340 const std::vector<int>::const_iterator iter = | |
| 341 std::find(ciphers.begin(), ciphers.end(), current_srtp_cipher); | |
| 342 if (iter == ciphers.end()) { | |
| 343 std::string requested_str; | |
| 344 for (size_t i = 0; i < ciphers.size(); ++i) { | |
| 345 requested_str.append(" "); | |
| 346 requested_str.append(rtc::SrtpCryptoSuiteToName(ciphers[i])); | |
| 347 requested_str.append(" "); | |
| 348 } | |
| 349 LOG(LS_WARNING) << "Ignoring new set of SRTP ciphers, as DTLS " | |
| 350 << "renegotiation is not supported currently " | |
| 351 << "current cipher = " << current_srtp_cipher << " and " | |
| 352 << "requested = " << "[" << requested_str << "]"; | |
| 353 } | |
| 354 return true; | |
| 355 } | |
| 356 | |
| 357 if (dtls_state() != DTLS_TRANSPORT_NEW) { | |
| 358 LOG(LS_ERROR) << "Can't set SRTP ciphers for a closed session"; | |
| 359 return false; | |
| 360 } | |
| 361 | |
| 362 srtp_ciphers_ = ciphers; | |
| 363 return true; | |
| 364 } | |
| 365 | |
| 366 bool DtlsTransport::GetSrtpCryptoSuite(int* cipher) { | 323 bool DtlsTransport::GetSrtpCryptoSuite(int* cipher) { |
| 367 if (dtls_state() != DTLS_TRANSPORT_CONNECTED) { | 324 if (dtls_state() != DTLS_TRANSPORT_CONNECTED) { |
| 368 return false; | 325 return false; |
| 369 } | 326 } |
| 370 | 327 |
| 371 return dtls_->GetDtlsSrtpCryptoSuite(cipher); | 328 return dtls_->GetDtlsSrtpCryptoSuite(cipher); |
| 372 } | 329 } |
| 373 | 330 |
| 374 | 331 |
| 375 // Called from upper layers to send a media packet. | 332 // Called from upper layers to send a media packet. |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 | 672 |
| 716 dtls_->SetInitialRetransmissionTimeout(initial_timeout); | 673 dtls_->SetInitialRetransmissionTimeout(initial_timeout); |
| 717 } else { | 674 } else { |
| 718 LOG_J(LS_INFO, this) | 675 LOG_J(LS_INFO, this) |
| 719 << "no RTT estimate - using default DTLS handshake timeout"; | 676 << "no RTT estimate - using default DTLS handshake timeout"; |
| 720 } | 677 } |
| 721 } | 678 } |
| 722 | 679 |
| 723 | 680 |
| 724 } // namespace cricket | 681 } // namespace cricket |
| OLD | NEW |