diff --git a/src/media_stream.cc b/src/media_stream.cc index 7ec9b4b..9dfa9ef 100644 --- a/src/media_stream.cc +++ b/src/media_stream.cc @@ -370,6 +370,12 @@ rtp_error_t uvgrtp::media_stream::init(std::shared_ptr zrtp) } } + reception_flow_->new_install_handler( + 1, remote_ssrc_, + std::bind(&uvgrtp::zrtp::new_packet_handler, zrtp, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4, std::placeholders::_5), + nullptr); + rtp_error_t ret = RTP_OK; if ((ret = zrtp->init(rtp_->get_ssrc(), socket_, remote_sockaddr_, remote_sockaddr_ip6_, perform_dh, ipv6_)) != RTP_OK) { UVG_LOG_WARN("Failed to initialize ZRTP for media stream!"); diff --git a/src/zrtp.cc b/src/zrtp.cc index ddc9d12..510d74f 100644 --- a/src/zrtp.cc +++ b/src/zrtp.cc @@ -36,7 +36,8 @@ uvgrtp::zrtp::zrtp(): remote_ip6_addr_(), initialized_(false), receiver_(), - dh_finished_(false) + dh_finished_(false), + state_(0) { cctx_.sha256 = new uvgrtp::crypto::sha256; cctx_.dh = new uvgrtp::crypto::dh; @@ -967,6 +968,28 @@ rtp_error_t uvgrtp::zrtp::get_srtp_keys( return RTP_OK; } +rtp_error_t uvgrtp::zrtp::new_packet_handler(void* args, int rce_flags, uint8_t* read_ptr, size_t size, frame::rtp_frame** out) +{ + if (size < 0 || (uint32_t)size < sizeof(uvgrtp::zrtp_msg::zrtp_msg)) + { + return RTP_PKT_NOT_HANDLED; + } + + (void)args; + (void)rce_flags; + (void)out; + + auto msg = (uvgrtp::zrtp_msg::zrtp_msg*)read_ptr; + + /* not a ZRTP packet */ + if (msg->header.version || msg->preamble != ZRTP_PREAMBLE) { + return RTP_PKT_NOT_HANDLED; + } + + +} + + rtp_error_t uvgrtp::zrtp::packet_handler(ssize_t size, void *packet, int rce_flags, frame::rtp_frame **out) { if (size < 0 || (uint32_t)size < sizeof(uvgrtp::zrtp_msg::zrtp_msg)) diff --git a/src/zrtp.hh b/src/zrtp.hh index 5775f40..d3afcb8 100644 --- a/src/zrtp.hh +++ b/src/zrtp.hh @@ -73,6 +73,7 @@ namespace uvgrtp { * Return RTP_PKT_NOT_HANDLED if "buffer" does not contain a ZRTP message * Return RTP_GENERIC_ERROR if "buffer" contains an invalid ZRTP message */ static rtp_error_t packet_handler(ssize_t size, void *packet, int rce_flags, frame::rtp_frame **out); + rtp_error_t new_packet_handler(void* args, int rce_flags, uint8_t* read_ptr, size_t size, frame::rtp_frame** out); inline bool has_dh_finished() const { @@ -192,6 +193,7 @@ namespace uvgrtp { std::mutex zrtp_mtx_; bool dh_finished_ = false; + int state_; }; }