uvgrtp-base/src/session.cc

120 lines
3.0 KiB
C++
Raw Normal View History

#include "debug.hh"
#include "session.hh"
2020-04-27 11:07:24 +00:00
uvg_rtp::session::session(std::string addr):
#ifdef __RTP_CRYPTO__
zrtp_(nullptr),
#endif
addr_(addr),
laddr_("")
{
}
2020-04-27 11:07:24 +00:00
uvg_rtp::session::session(std::string remote_addr, std::string local_addr):
session(remote_addr)
{
laddr_ = local_addr;
}
2020-04-27 11:07:24 +00:00
uvg_rtp::session::~session()
{
for (auto&i : streams_) {
(void)destroy_stream(i.second);
}
streams_.clear();
#ifdef __RTP_CRYPTO__
delete zrtp_;
#endif
}
2020-04-27 11:07:24 +00:00
uvg_rtp::media_stream *uvg_rtp::session::create_stream(int r_port, int s_port, rtp_format_t fmt, int flags)
{
2020-04-27 11:07:24 +00:00
uvg_rtp::media_stream *stream = nullptr;
if (flags & RCE_SYSTEM_CALL_DISPATCHER) {
LOG_ERROR("SCD is not supported!");
rtp_errno = RTP_NOT_SUPPORTED;
return nullptr;
}
if (laddr_ == "")
2020-04-27 11:07:24 +00:00
stream = new uvg_rtp::media_stream(addr_, r_port, s_port, fmt, flags);
else
2020-04-27 11:07:24 +00:00
stream = new uvg_rtp::media_stream(addr_, laddr_, r_port, s_port, fmt, flags);
if (!stream) {
LOG_ERROR("Failed to create media stream for %s:%d -> %s:%d",
(laddr_ == "") ? "0.0.0.0" : laddr_.c_str(), s_port, addr_.c_str(), r_port
);
return nullptr;
}
#ifdef __RTP_CRYPTO__
if (flags & RCE_SRTP) {
2020-09-04 06:03:28 +00:00
if (flags & RCE_SRTP_REPLAY_PROTECTION)
flags |= RCE_SRTP_AUTHENTICATE_RTP;
if (flags & RCE_SRTP_KMNGMNT_ZRTP) {
if (!zrtp_) {
if (!(zrtp_ = new uvg_rtp::zrtp())) {
rtp_errno = RTP_MEMORY_ERROR;
return nullptr;
}
}
if (stream->init(zrtp_) != RTP_OK) {
LOG_ERROR("Failed to initialize media stream %s:%d/%d", addr_.c_str(), r_port, s_port);
return nullptr;
}
} else if (flags & RCE_SRTP_KMNGMNT_USER) {
LOG_DEBUG("SRTP with user-managed keys enabled, postpone initialization");
} else {
LOG_ERROR("SRTP key management scheme not specified!");
rtp_errno = RTP_INVALID_VALUE;
return nullptr;
}
} else {
#endif
if (flags & RCE_SRTP) {
LOG_ERROR("One or more security flags provided but uvgRTP has not been compiled with SRTP support!");
rtp_errno = RTP_INVALID_VALUE;
return nullptr;
}
if (stream->init() != RTP_OK) {
LOG_ERROR("Failed to initialize media stream %s:%d/%d", addr_.c_str(), r_port, s_port);
return nullptr;
}
#ifdef __RTP_CRYPTO__
}
#endif
streams_.insert(std::make_pair(stream->get_key(), stream));
return stream;
}
2020-04-27 11:07:24 +00:00
rtp_error_t uvg_rtp::session::destroy_stream(uvg_rtp::media_stream *stream)
{
if (!stream)
return RTP_INVALID_VALUE;
auto mstream = streams_.find(stream->get_key());
if (mstream == streams_.end())
return RTP_NOT_FOUND;
delete mstream->second;
mstream->second = nullptr;
return RTP_OK;
}
2020-04-27 11:07:24 +00:00
std::string& uvg_rtp::session::get_key()
{
return addr_;
}