| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); | 211 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); |
| 212 } | 212 } |
| 213 LOG(LS_INFO) << "Destroyed channel"; | 213 LOG(LS_INFO) << "Destroyed channel"; |
| 214 } | 214 } |
| 215 | 215 |
| 216 bool BaseChannel::Init() { | 216 bool BaseChannel::Init() { |
| 217 if (!SetTransport(content_name())) { | 217 if (!SetTransport(content_name())) { |
| 218 return false; | 218 return false; |
| 219 } | 219 } |
| 220 | 220 |
| 221 if (!SetDtlsSrtpCiphers(transport_channel(), false)) { | 221 if (!SetDtlsSrtpCryptoSuites(transport_channel(), false)) { |
| 222 return false; | 222 return false; |
| 223 } | 223 } |
| 224 if (rtcp_transport_enabled() && | 224 if (rtcp_transport_enabled() && |
| 225 !SetDtlsSrtpCiphers(rtcp_transport_channel(), true)) { | 225 !SetDtlsSrtpCryptoSuites(rtcp_transport_channel(), true)) { |
| 226 return false; | 226 return false; |
| 227 } | 227 } |
| 228 | 228 |
| 229 // Both RTP and RTCP channels are set, we can call SetInterface on | 229 // Both RTP and RTCP channels are set, we can call SetInterface on |
| 230 // media channel and it can set network options. | 230 // media channel and it can set network options. |
| 231 media_channel_->SetInterface(this); | 231 media_channel_->SetInterface(this); |
| 232 return true; | 232 return true; |
| 233 } | 233 } |
| 234 | 234 |
| 235 void BaseChannel::Deinit() { | 235 void BaseChannel::Deinit() { |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 ASSERT(worker_thread() == rtc::Thread::Current()); | 802 ASSERT(worker_thread() == rtc::Thread::Current()); |
| 803 signaling_thread()->Invoke<void>(Bind( | 803 signaling_thread()->Invoke<void>(Bind( |
| 804 &BaseChannel::SignalDtlsSetupFailure_s, this, rtcp)); | 804 &BaseChannel::SignalDtlsSetupFailure_s, this, rtcp)); |
| 805 } | 805 } |
| 806 | 806 |
| 807 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { | 807 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { |
| 808 ASSERT(signaling_thread() == rtc::Thread::Current()); | 808 ASSERT(signaling_thread() == rtc::Thread::Current()); |
| 809 SignalDtlsSetupFailure(this, rtcp); | 809 SignalDtlsSetupFailure(this, rtcp); |
| 810 } | 810 } |
| 811 | 811 |
| 812 bool BaseChannel::SetDtlsSrtpCiphers(TransportChannel *tc, bool rtcp) { | 812 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) { |
| 813 std::vector<std::string> ciphers; | 813 std::vector<int> crypto_suites; |
| 814 // We always use the default SRTP ciphers for RTCP, but we may use different | 814 // We always use the default SRTP crypto suites for RTCP, but we may use |
| 815 // ciphers for RTP depending on the media type. | 815 // different crypto suites for RTP depending on the media type. |
| 816 if (!rtcp) { | 816 if (!rtcp) { |
| 817 GetSrtpCryptoSuiteNames(&ciphers); | 817 GetSrtpCryptoSuites(&crypto_suites); |
| 818 } else { | 818 } else { |
| 819 GetDefaultSrtpCryptoSuiteNames(&ciphers); | 819 GetDefaultSrtpCryptoSuites(&crypto_suites); |
| 820 } | 820 } |
| 821 return tc->SetSrtpCiphers(ciphers); | 821 return tc->SetSrtpCryptoSuites(crypto_suites); |
| 822 } | 822 } |
| 823 | 823 |
| 824 bool BaseChannel::ShouldSetupDtlsSrtp() const { | 824 bool BaseChannel::ShouldSetupDtlsSrtp() const { |
| 825 return true; | 825 return true; |
| 826 } | 826 } |
| 827 | 827 |
| 828 // This function returns true if either DTLS-SRTP is not in use | 828 // This function returns true if either DTLS-SRTP is not in use |
| 829 // *or* DTLS-SRTP is successfully set up. | 829 // *or* DTLS-SRTP is successfully set up. |
| 830 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { | 830 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { |
| 831 bool ret = false; | 831 bool ret = false; |
| 832 | 832 |
| 833 TransportChannel* channel = | 833 TransportChannel* channel = |
| 834 rtcp_channel ? rtcp_transport_channel_ : transport_channel_; | 834 rtcp_channel ? rtcp_transport_channel_ : transport_channel_; |
| 835 | 835 |
| 836 // No DTLS | 836 // No DTLS |
| 837 if (!channel->IsDtlsActive()) | 837 if (!channel->IsDtlsActive()) |
| 838 return true; | 838 return true; |
| 839 | 839 |
| 840 std::string selected_cipher; | 840 int selected_crypto_suite; |
| 841 | 841 |
| 842 if (!channel->GetSrtpCryptoSuite(&selected_cipher)) { | 842 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { |
| 843 LOG(LS_ERROR) << "No DTLS-SRTP selected cipher"; | 843 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; |
| 844 return false; | 844 return false; |
| 845 } | 845 } |
| 846 | 846 |
| 847 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " | 847 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " |
| 848 << content_name() << " " | 848 << content_name() << " " |
| 849 << PacketType(rtcp_channel); | 849 << PacketType(rtcp_channel); |
| 850 | 850 |
| 851 // OK, we're now doing DTLS (RFC 5764) | 851 // OK, we're now doing DTLS (RFC 5764) |
| 852 std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 + | 852 std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 + |
| 853 SRTP_MASTER_KEY_SALT_LEN * 2); | 853 SRTP_MASTER_KEY_SALT_LEN * 2); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 | 889 |
| 890 if (role == rtc::SSL_SERVER) { | 890 if (role == rtc::SSL_SERVER) { |
| 891 send_key = &server_write_key; | 891 send_key = &server_write_key; |
| 892 recv_key = &client_write_key; | 892 recv_key = &client_write_key; |
| 893 } else { | 893 } else { |
| 894 send_key = &client_write_key; | 894 send_key = &client_write_key; |
| 895 recv_key = &server_write_key; | 895 recv_key = &server_write_key; |
| 896 } | 896 } |
| 897 | 897 |
| 898 if (rtcp_channel) { | 898 if (rtcp_channel) { |
| 899 ret = srtp_filter_.SetRtcpParams( | 899 ret = srtp_filter_.SetRtcpParams(selected_crypto_suite, &(*send_key)[0], |
| 900 selected_cipher, | 900 static_cast<int>(send_key->size()), |
| 901 &(*send_key)[0], | 901 selected_crypto_suite, &(*recv_key)[0], |
| 902 static_cast<int>(send_key->size()), | 902 static_cast<int>(recv_key->size())); |
| 903 selected_cipher, | |
| 904 &(*recv_key)[0], | |
| 905 static_cast<int>(recv_key->size())); | |
| 906 } else { | 903 } else { |
| 907 ret = srtp_filter_.SetRtpParams( | 904 ret = srtp_filter_.SetRtpParams(selected_crypto_suite, &(*send_key)[0], |
| 908 selected_cipher, | 905 static_cast<int>(send_key->size()), |
| 909 &(*send_key)[0], | 906 selected_crypto_suite, &(*recv_key)[0], |
| 910 static_cast<int>(send_key->size()), | 907 static_cast<int>(recv_key->size())); |
| 911 selected_cipher, | |
| 912 &(*recv_key)[0], | |
| 913 static_cast<int>(recv_key->size())); | |
| 914 } | 908 } |
| 915 | 909 |
| 916 if (!ret) | 910 if (!ret) |
| 917 LOG(LS_WARNING) << "DTLS-SRTP key installation failed"; | 911 LOG(LS_WARNING) << "DTLS-SRTP key installation failed"; |
| 918 else | 912 else |
| 919 dtls_keyed_ = true; | 913 dtls_keyed_ = true; |
| 920 | 914 |
| 921 return ret; | 915 return ret; |
| 922 } | 916 } |
| 923 | 917 |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { | 1567 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { |
| 1574 ASSERT(media_channel == this->media_channel()); | 1568 ASSERT(media_channel == this->media_channel()); |
| 1575 SignalMediaMonitor(this, info); | 1569 SignalMediaMonitor(this, info); |
| 1576 } | 1570 } |
| 1577 | 1571 |
| 1578 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, | 1572 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, |
| 1579 const AudioInfo& info) { | 1573 const AudioInfo& info) { |
| 1580 SignalAudioMonitor(this, info); | 1574 SignalAudioMonitor(this, info); |
| 1581 } | 1575 } |
| 1582 | 1576 |
| 1583 void VoiceChannel::GetSrtpCryptoSuiteNames( | 1577 void VoiceChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { |
| 1584 std::vector<std::string>* ciphers) const { | 1578 GetSupportedAudioCryptoSuites(crypto_suites); |
| 1585 GetSupportedAudioCryptoSuites(ciphers); | |
| 1586 } | 1579 } |
| 1587 | 1580 |
| 1588 VideoChannel::VideoChannel(rtc::Thread* thread, | 1581 VideoChannel::VideoChannel(rtc::Thread* thread, |
| 1589 VideoMediaChannel* media_channel, | 1582 VideoMediaChannel* media_channel, |
| 1590 TransportController* transport_controller, | 1583 TransportController* transport_controller, |
| 1591 const std::string& content_name, | 1584 const std::string& content_name, |
| 1592 bool rtcp) | 1585 bool rtcp) |
| 1593 : BaseChannel(thread, | 1586 : BaseChannel(thread, |
| 1594 media_channel, | 1587 media_channel, |
| 1595 transport_controller, | 1588 transport_controller, |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1963 for (ScreencastMap::iterator iter = screencast_capturers_.begin(); | 1956 for (ScreencastMap::iterator iter = screencast_capturers_.begin(); |
| 1964 iter != screencast_capturers_.end(); ++iter) { | 1957 iter != screencast_capturers_.end(); ++iter) { |
| 1965 if (iter->second == capturer) { | 1958 if (iter->second == capturer) { |
| 1966 *ssrc = iter->first; | 1959 *ssrc = iter->first; |
| 1967 return true; | 1960 return true; |
| 1968 } | 1961 } |
| 1969 } | 1962 } |
| 1970 return false; | 1963 return false; |
| 1971 } | 1964 } |
| 1972 | 1965 |
| 1973 void VideoChannel::GetSrtpCryptoSuiteNames( | 1966 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { |
| 1974 std::vector<std::string>* ciphers) const { | 1967 GetSupportedVideoCryptoSuites(crypto_suites); |
| 1975 GetSupportedVideoCryptoSuites(ciphers); | |
| 1976 } | 1968 } |
| 1977 | 1969 |
| 1978 DataChannel::DataChannel(rtc::Thread* thread, | 1970 DataChannel::DataChannel(rtc::Thread* thread, |
| 1979 DataMediaChannel* media_channel, | 1971 DataMediaChannel* media_channel, |
| 1980 TransportController* transport_controller, | 1972 TransportController* transport_controller, |
| 1981 const std::string& content_name, | 1973 const std::string& content_name, |
| 1982 bool rtcp) | 1974 bool rtcp) |
| 1983 : BaseChannel(thread, | 1975 : BaseChannel(thread, |
| 1984 media_channel, | 1976 media_channel, |
| 1985 transport_controller, | 1977 transport_controller, |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2271 } | 2263 } |
| 2272 | 2264 |
| 2273 void DataChannel::OnDataChannelReadyToSend(bool writable) { | 2265 void DataChannel::OnDataChannelReadyToSend(bool writable) { |
| 2274 // This is usded for congestion control to indicate that the stream is ready | 2266 // This is usded for congestion control to indicate that the stream is ready |
| 2275 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates | 2267 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates |
| 2276 // that the transport channel is ready. | 2268 // that the transport channel is ready. |
| 2277 signaling_thread()->Post(this, MSG_READYTOSENDDATA, | 2269 signaling_thread()->Post(this, MSG_READYTOSENDDATA, |
| 2278 new DataChannelReadyToSendMessageData(writable)); | 2270 new DataChannelReadyToSendMessageData(writable)); |
| 2279 } | 2271 } |
| 2280 | 2272 |
| 2281 void DataChannel::GetSrtpCryptoSuiteNames( | 2273 void DataChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { |
| 2282 std::vector<std::string>* ciphers) const { | 2274 GetSupportedDataCryptoSuites(crypto_suites); |
| 2283 GetSupportedDataCryptoSuites(ciphers); | |
| 2284 } | 2275 } |
| 2285 | 2276 |
| 2286 bool DataChannel::ShouldSetupDtlsSrtp() const { | 2277 bool DataChannel::ShouldSetupDtlsSrtp() const { |
| 2287 return (data_channel_type_ == DCT_RTP); | 2278 return (data_channel_type_ == DCT_RTP); |
| 2288 } | 2279 } |
| 2289 | 2280 |
| 2290 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { | 2281 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { |
| 2291 rtc::TypedMessageData<uint32_t>* message = | 2282 rtc::TypedMessageData<uint32_t>* message = |
| 2292 new rtc::TypedMessageData<uint32_t>(sid); | 2283 new rtc::TypedMessageData<uint32_t>(sid); |
| 2293 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); | 2284 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); |
| 2294 } | 2285 } |
| 2295 | 2286 |
| 2296 } // namespace cricket | 2287 } // namespace cricket |
| OLD | NEW |