| Index: pc/srtptransport.cc
|
| diff --git a/pc/srtptransport.cc b/pc/srtptransport.cc
|
| index f3b5309e37c0c56faefb81740b96cfcde6dae61e..64889c65f69be77c77049615d76a3c73204953e8 100644
|
| --- a/pc/srtptransport.cc
|
| +++ b/pc/srtptransport.cc
|
| @@ -174,25 +174,42 @@ bool SrtpTransport::SetRtpParams(int send_cs,
|
| int recv_cs,
|
| const uint8_t* recv_key,
|
| int recv_key_len) {
|
| - CreateSrtpSessions();
|
| + // If parameters are being set for the first time, we should create new SRTP
|
| + // sessions and call "SetSend/SetRecv". Otherwise we should call
|
| + // "UpdateSend"/"UpdateRecv" on the existing sessions, which will internally
|
| + // call "srtp_update".
|
| + bool new_sessions = false;
|
| + if (!send_session_) {
|
| + RTC_DCHECK(!recv_session_);
|
| + CreateSrtpSessions();
|
| + new_sessions = true;
|
| + }
|
| +
|
| send_session_->SetEncryptedHeaderExtensionIds(
|
| send_encrypted_header_extension_ids_);
|
| if (external_auth_enabled_) {
|
| send_session_->EnableExternalAuth();
|
| }
|
| - if (!send_session_->SetSend(send_cs, send_key, send_key_len)) {
|
| + bool ret = new_sessions
|
| + ? send_session_->SetSend(send_cs, send_key, send_key_len)
|
| + : send_session_->UpdateSend(send_cs, send_key, send_key_len);
|
| + if (!ret) {
|
| ResetParams();
|
| return false;
|
| }
|
|
|
| recv_session_->SetEncryptedHeaderExtensionIds(
|
| recv_encrypted_header_extension_ids_);
|
| - if (!recv_session_->SetRecv(recv_cs, recv_key, recv_key_len)) {
|
| + ret = new_sessions
|
| + ? recv_session_->SetRecv(recv_cs, recv_key, recv_key_len)
|
| + : recv_session_->UpdateRecv(recv_cs, recv_key, recv_key_len);
|
| + if (!ret) {
|
| ResetParams();
|
| return false;
|
| }
|
|
|
| - LOG(LS_INFO) << "SRTP activated with negotiated parameters:"
|
| + LOG(LS_INFO) << "SRTP " << (new_sessions ? "updated" : "activated")
|
| + << " with negotiated parameters:"
|
| << " send cipher_suite " << send_cs << " recv cipher_suite "
|
| << recv_cs;
|
| return true;
|
|
|