From 0d4cc2fc65e70df408494918a8f0d1f32a262b91 Mon Sep 17 00:00:00 2001 From: ziyue <1213642868@qq.com> Date: Sat, 27 Mar 2021 09:38:13 +0800 Subject: [PATCH] =?UTF-8?q?srtp=E8=87=AA=E5=8A=A8=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webrtc/SrtpSession.cpp | 93 ++++++++++++++++++++------------------ webrtc/SrtpSession.hpp | 29 ++++++------ webrtc/WebRtcTransport.cpp | 7 +-- 3 files changed, 66 insertions(+), 63 deletions(-) diff --git a/webrtc/SrtpSession.cpp b/webrtc/SrtpSession.cpp index 13eeebd4..580c190b 100644 --- a/webrtc/SrtpSession.cpp +++ b/webrtc/SrtpSession.cpp @@ -4,15 +4,14 @@ #include "SrtpSession.hpp" #include // std::memset(), std::memcpy() #include "logger.h" +#include "Util/util.h" +using namespace toolkit; namespace RTC { /* Static. */ - static constexpr size_t EncryptBufferSize{ 65536 }; - static uint8_t EncryptBuffer[EncryptBufferSize]; - - std::vector DepLibSRTP::errors = { + static std::vector errors = { // From 0 (srtp_err_status_ok) to 24 (srtp_err_status_pfkey_err). "success (srtp_err_status_ok)", "unspecified failure (srtp_err_status_fail)", @@ -43,65 +42,69 @@ namespace RTC /* Static methods. */ - void DepLibSRTP::ClassInit() { + const char *DepLibSRTP::GetErrorString(srtp_err_status_t code) { + // This throws out_of_range if the given index is not in the vector. + return errors.at(code); + } + + bool DepLibSRTP::IsError(srtp_err_status_t code) { + return (code != srtp_err_status_ok); + } + + INSTANCE_IMP(DepLibSRTP); + + DepLibSRTP::DepLibSRTP(){ MS_TRACE(); MS_DEBUG_TAG(info, "libsrtp version: \"%s\"", srtp_get_version_string()); srtp_err_status_t err = srtp_init(); - if (DepLibSRTP::IsError(err)) + if (DepLibSRTP::IsError(err)) { MS_THROW_ERROR("srtp_init() failed: %s", DepLibSRTP::GetErrorString(err)); + } + + // Set libsrtp event handler. + err = srtp_install_event_handler([](srtp_event_data_t *data){ + MS_TRACE(); + switch (data->event) + { + case event_ssrc_collision: + MS_WARN_TAG(srtp, "SSRC collision occurred"); + break; + + case event_key_soft_limit: + MS_WARN_TAG(srtp, "stream reached the soft key usage limit and will expire soon"); + break; + + case event_key_hard_limit: + MS_WARN_TAG(srtp, "stream reached the hard key usage limit and has expired"); + break; + + case event_packet_index_limit: + MS_WARN_TAG(srtp, "stream reached the hard packet limit (2^48 packets)"); + break; + } + }); + + if (DepLibSRTP::IsError(err)) + { + MS_THROW_ERROR("srtp_install_event_handler() failed: %s", DepLibSRTP::GetErrorString(err)); + } } - void DepLibSRTP::ClassDestroy() { + DepLibSRTP::~DepLibSRTP(){ MS_TRACE(); - srtp_shutdown(); } - /* Class methods. */ - - void SrtpSession::ClassInit() - { - // Set libsrtp event handler. - srtp_err_status_t err = - srtp_install_event_handler(static_cast(OnSrtpEvent)); - - if (DepLibSRTP::IsError(err)) - { - MS_THROW_ERROR("srtp_install_event_handler() failed: %s", DepLibSRTP::GetErrorString(err)); - } - } - - void SrtpSession::OnSrtpEvent(srtp_event_data_t* data) - { - MS_TRACE(); - - switch (data->event) - { - case event_ssrc_collision: - MS_WARN_TAG(srtp, "SSRC collision occurred"); - break; - - case event_key_soft_limit: - MS_WARN_TAG(srtp, "stream reached the soft key usage limit and will expire soon"); - break; - - case event_key_hard_limit: - MS_WARN_TAG(srtp, "stream reached the hard key usage limit and has expired"); - break; - - case event_packet_index_limit: - MS_WARN_TAG(srtp, "stream reached the hard packet limit (2^48 packets)"); - break; - } - } + ///////////////////////////////////////////////////////////////////////////////////// /* Instance methods. */ SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t* key, size_t keyLen) { + _env = DepLibSRTP::Instance().shared_from_this(); MS_TRACE(); srtp_policy_t policy; // NOLINT(cppcoreguidelines-pro-type-member-init) diff --git a/webrtc/SrtpSession.hpp b/webrtc/SrtpSession.hpp index 3a4c32f4..fb21ea9f 100644 --- a/webrtc/SrtpSession.hpp +++ b/webrtc/SrtpSession.hpp @@ -4,21 +4,22 @@ #include "Utils.hpp" #include #include +#include namespace RTC { - class DepLibSRTP { + class DepLibSRTP : public std::enable_shared_from_this + { public: - static void ClassInit(); - static void ClassDestroy(); - static bool IsError(srtp_err_status_t code) { return (code != srtp_err_status_ok); } - static const char *GetErrorString(srtp_err_status_t code) { - // This throws out_of_range if the given index is not in the vector. - return DepLibSRTP::errors.at(code); - } + using Ptr = std::shared_ptr; + ~DepLibSRTP(); + + static bool IsError(srtp_err_status_t code); + static const char *GetErrorString(srtp_err_status_t code); + static DepLibSRTP &Instance(); private: - static std::vector errors; + DepLibSRTP(); }; class SrtpSession @@ -40,12 +41,6 @@ namespace RTC OUTBOUND }; - public: - static void ClassInit(); - - private: - static void OnSrtpEvent(srtp_event_data_t* data); - public: SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t* key, size_t keyLen); ~SrtpSession(); @@ -63,6 +58,10 @@ namespace RTC private: // Allocated by this. srtp_t session{ nullptr }; + //rtp包最大1600 + static constexpr size_t EncryptBufferSize{ 1600 }; + uint8_t EncryptBuffer[EncryptBufferSize]; + DepLibSRTP::Ptr _env; }; } // namespace RTC diff --git a/webrtc/WebRtcTransport.cpp b/webrtc/WebRtcTransport.cpp index 94c66837..f727876c 100644 --- a/webrtc/WebRtcTransport.cpp +++ b/webrtc/WebRtcTransport.cpp @@ -5,15 +5,16 @@ WebRtcTransport::WebRtcTransport() { static onceToken token([](){ RTC::DtlsTransport::ClassInit(); - RTC::DepLibSRTP::ClassInit(); - RTC::SrtpSession::ClassInit(); }); dtls_transport_ = std::make_shared(EventPollerPool::Instance().getFirstPoller(), this); ice_server_ = std::make_shared(this, makeRandStr(4), makeRandStr(24)); } -WebRtcTransport::~WebRtcTransport() {} +WebRtcTransport::~WebRtcTransport() { + dtls_transport_ = nullptr; + ice_server_ = nullptr; +} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////