Use platform-generic socket API with ZRTP

This commit is contained in:
Aaro Altonen 2020-10-01 07:58:14 +03:00
parent 9935706895
commit 9328b9dd1c
19 changed files with 72 additions and 152 deletions

View File

@ -14,6 +14,7 @@
#include "crypto.hh"
#include "frame.hh"
#include "socket.hh"
#include "zrtp/defines.hh"
#include "zrtp/zrtp_receiver.hh"
@ -165,7 +166,7 @@ namespace uvg_rtp {
*
* Return RTP_OK on success
* Return RTP_TIMEOUT if remote did not send messages in timely manner */
rtp_error_t init(uint32_t ssrc, socket_t& socket, sockaddr_in& addr);
rtp_error_t init(uint32_t ssrc, uvg_rtp::socket *socket, sockaddr_in& addr);
/* Get SRTP keys for the session that was just initialized
*
@ -198,13 +199,13 @@ namespace uvg_rtp {
*
* Return RTP_OK on success
* Return RTP_TIMEOUT if remote did not send messages in timely manner */
rtp_error_t init_dhm(uint32_t ssrc, socket_t& socket, sockaddr_in& addr);
rtp_error_t init_dhm(uint32_t ssrc, uvg_rtp::socket *socket, sockaddr_in& addr);
/* Initialize ZRTP session between us and remote using Multistream mode
*
* Return RTP_OK on success
* Return RTP_TIMEOUT if remote did not send messages in timely manner */
rtp_error_t init_msm(uint32_t ssrc, socket_t& socket, sockaddr_in& addr);
rtp_error_t init_msm(uint32_t ssrc, uvg_rtp::socket *socket, sockaddr_in& addr);
/* Set timeout for a socket, needed by backoff timers of ZRTP
*
@ -287,7 +288,7 @@ namespace uvg_rtp {
rtp_error_t initiator_finalize_session();
uint32_t ssrc_;
socket_t socket_;
uvg_rtp::socket *socket_;
sockaddr_in addr_;
/* Has the ZRTP connection been initialized using DH */

View File

@ -1,6 +1,7 @@
#pragma once
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
@ -35,7 +36,7 @@ namespace uvg_rtp {
~commit();
/* TODO: */
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
/* TODO: */
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session);

View File

@ -1,6 +1,7 @@
#pragma once
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
@ -21,7 +22,7 @@ namespace uvg_rtp {
~confack();
/* TODO: */
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
/* TODO: */
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver);

View File

@ -1,6 +1,7 @@
#pragma once
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
@ -39,7 +40,7 @@ namespace uvg_rtp {
~confirm();
/* TODO: */
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
/* TODO: */
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session);

View File

@ -1,6 +1,7 @@
#pragma once
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
@ -31,7 +32,7 @@ namespace uvg_rtp {
~dh_key_exchange();
/* TODO: */
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
/* TODO: */
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session);

View File

@ -1,7 +1,8 @@
#pragma once
#include "util.hh"
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
#include "zrtp/zrtp_receiver.hh"
@ -20,7 +21,7 @@ namespace uvg_rtp {
error(int error_code);
~error();
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver);

View File

@ -1,6 +1,7 @@
#pragma once
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
@ -42,7 +43,7 @@ namespace uvg_rtp {
~hello();
/* TODO: */
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
/* TODO: */
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session);

View File

@ -1,7 +1,8 @@
#pragma once
#include "util.hh"
#include "frame.hh"
#include "socket.hh"
#include "util.hh"
#include "zrtp/defines.hh"
#include "zrtp/zrtp_receiver.hh"
@ -19,7 +20,7 @@ namespace uvg_rtp {
hello_ack();
~hello_ack();
rtp_error_t send_msg(socket_t& socket, sockaddr_in& addr);
rtp_error_t send_msg(uvg_rtp::socket *socket, sockaddr_in& addr);
rtp_error_t parse_msg(uvg_rtp::zrtp_msg::receiver& receiver);

View File

@ -16,7 +16,7 @@ namespace uvg_rtp {
* Return -EPROTONOSUPPORT if message contains incompatible version number
* Return -ENOPNOTSUPP if message type is not supported
* Return -errno for any other error */
int recv_msg(socket_t& socket, int flags);
int recv_msg(uvg_rtp::socket *socket, int flags);
/* TODO: */
ssize_t get_msg(void *ptr, size_t len);

View File

@ -204,7 +204,7 @@ rtp_error_t uvg_rtp::media_stream::init(uvg_rtp::zrtp *zrtp)
return RTP_MEMORY_ERROR;
}
if ((ret = zrtp->init(rtp_->get_ssrc(), socket_->get_raw_socket(), addr_out_)) != RTP_OK) {
if ((ret = zrtp->init(rtp_->get_ssrc(), socket_, addr_out_)) != RTP_OK) {
LOG_WARN("Failed to initialize ZRTP for media stream!");
delete rtp_;
delete pkt_dispatcher_;

View File

@ -62,7 +62,7 @@ rtp_error_t uvg_rtp::zrtp::set_timeout(size_t timeout)
(int)msec * 1000,
};
if (setsockopt(socket_, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof(tv)) < 0)
if (socket_->setsockopt(SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof(tv)) != RTP_OK)
return RTP_GENERIC_ERROR;
return RTP_OK;
@ -642,14 +642,14 @@ rtp_error_t uvg_rtp::zrtp::initiator_finalize_session()
return RTP_TIMEOUT;
}
rtp_error_t uvg_rtp::zrtp::init(uint32_t ssrc, socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp::init(uint32_t ssrc, uvg_rtp::socket *socket, sockaddr_in& addr)
{
if (!initialized_)
return init_dhm(ssrc, socket, addr);
return init_msm(ssrc, socket, addr);
}
rtp_error_t uvg_rtp::zrtp::init_dhm(uint32_t ssrc, socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp::init_dhm(uint32_t ssrc, uvg_rtp::socket *socket, sockaddr_in& addr)
{
std::lock_guard<std::mutex> lock(zrtp_mtx_);
@ -745,7 +745,7 @@ rtp_error_t uvg_rtp::zrtp::init_dhm(uint32_t ssrc, socket_t& socket, sockaddr_in
return RTP_OK;
}
rtp_error_t uvg_rtp::zrtp::init_msm(uint32_t ssrc, socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp::init_msm(uint32_t ssrc, uvg_rtp::socket *socket, sockaddr_in& addr)
{
std::lock_guard<std::mutex> lock(zrtp_mtx_);

View File

@ -77,27 +77,14 @@ uvg_rtp::zrtp_msg::commit::~commit()
(void)uvg_rtp::frame::dealloc_frame(rframe_);
}
rtp_error_t uvg_rtp::zrtp_msg::commit::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::commit::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Hello message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
DWORD sent_bytes;
WSABUF data_buf;
rtp_error_t ret;
data_buf.buf = (char *)frame_;
data_buf.len = len_;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
if (WSASendTo(socket, &data_buf, 1, NULL, 0, (const struct sockaddr *)&addr, sizeof(addr), nullptr, nullptr) == -1) {
log_platform_error("WSASendTo() failed");
return RTP_SEND_ERROR;
}
#endif
return RTP_OK;
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::commit::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session)

View File

@ -48,18 +48,14 @@ uvg_rtp::zrtp_msg::confack::~confack()
(void)uvg_rtp::frame::dealloc_frame(rframe_);
}
rtp_error_t uvg_rtp::zrtp_msg::confack::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::confack::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Hello message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
/* TODO: */
#endif
rtp_error_t ret;
return RTP_OK;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::confack::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver)

View File

@ -86,27 +86,14 @@ uvg_rtp::zrtp_msg::confirm::~confirm()
(void)uvg_rtp::frame::dealloc_frame(rframe_);
}
rtp_error_t uvg_rtp::zrtp_msg::confirm::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::confirm::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Hello message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
DWORD sent_bytes;
WSABUF data_buf;
rtp_error_t ret;
data_buf.buf = (char *)frame_;
data_buf.len = len_;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
if (WSASendTo(socket, &data_buf, 1, NULL, 0, (const struct sockaddr *)&addr, sizeof(addr), nullptr, nullptr) == -1) {
log_platform_error("WSASendTo() failed");
return RTP_SEND_ERROR;
}
#endif
return RTP_OK;
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::confirm::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session)

View File

@ -110,27 +110,14 @@ uvg_rtp::zrtp_msg::dh_key_exchange::~dh_key_exchange()
(void)uvg_rtp::frame::dealloc_frame(rframe_);
}
rtp_error_t uvg_rtp::zrtp_msg::dh_key_exchange::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::dh_key_exchange::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Hello message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
DWORD sent_bytes;
WSABUF data_buf;
rtp_error_t ret;
data_buf.buf = (char *)frame_;
data_buf.len = len_;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
if (WSASendTo(socket, &data_buf, 1, nullptr, 0, (const struct sockaddr *)&addr, sizeof(addr), nullptr, nullptr) == -1) {
log_platform_error("WSASendTo() failed");
return RTP_SEND_ERROR;
}
#endif
return RTP_OK;
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::dh_key_exchange::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session)

View File

@ -35,32 +35,21 @@ uvg_rtp::zrtp_msg::error::~error()
(void)uvg_rtp::frame::dealloc_frame(frame_);
}
rtp_error_t uvg_rtp::zrtp_msg::error::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::error::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Error message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
DWORD sent_bytes;
WSABUF data_buf;
rtp_error_t ret;
data_buf.buf = (char *)frame_;
data_buf.len = len_;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
if (WSASendTo(socket, &data_buf, 1, NULL, 0, (const struct sockaddr *)&addr, sizeof(addr), nullptr, nullptr) == -1) {
log_platform_error("WSASendTo() failed");
return RTP_SEND_ERROR;
}
#endif
return RTP_OK;
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::error::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver)
{
(void)receiver;
/* TODO: */
return RTP_OK;
}

View File

@ -80,27 +80,14 @@ uvg_rtp::zrtp_msg::hello::~hello()
(void)uvg_rtp::frame::dealloc_frame(rframe_);
}
rtp_error_t uvg_rtp::zrtp_msg::hello::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::hello::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Hello message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
DWORD sent_bytes;
WSABUF data_buf;
rtp_error_t ret;
data_buf.buf = (char *)frame_;
data_buf.len = len_;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
if (WSASendTo(socket, &data_buf, 1, NULL, 0, (const struct sockaddr *)&addr, sizeof(addr), nullptr, nullptr) == -1) {
log_platform_error("WSASendTo failed");
return RTP_SEND_ERROR;
}
#endif
return RTP_OK;
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::hello::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver, zrtp_session_t& session)

View File

@ -33,27 +33,14 @@ uvg_rtp::zrtp_msg::hello_ack::~hello_ack()
(void)uvg_rtp::frame::dealloc_frame(frame_);
}
rtp_error_t uvg_rtp::zrtp_msg::hello_ack::send_msg(socket_t& socket, sockaddr_in& addr)
rtp_error_t uvg_rtp::zrtp_msg::hello_ack::send_msg(uvg_rtp::socket *socket, sockaddr_in& addr)
{
#ifdef __linux
if (::sendto(socket, (void *)frame_, len_, 0, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr)) < 0) {
LOG_ERROR("Failed to send ZRTP Hello ACK message: %s!", strerror(errno));
return RTP_SEND_ERROR;
}
#else
DWORD sent_bytes;
WSABUF data_buf;
rtp_error_t ret;
data_buf.buf = (char *)frame_;
data_buf.len = len_;
if ((ret = socket->sendto(addr, (uint8_t *)frame_, len_, 0, nullptr)) != RTP_OK)
log_platform_error("Failed to send ZRTP Hello message");
if (WSASendTo(socket, &data_buf, 1, NULL, 0, (const struct sockaddr *)&addr, sizeof(addr), nullptr, nullptr) == -1) {
log_platform_error("WSASendTo() failed");
return RTP_SEND_ERROR;
}
#endif
return RTP_OK;
return ret;
}
rtp_error_t uvg_rtp::zrtp_msg::hello_ack::parse_msg(uvg_rtp::zrtp_msg::receiver& receiver)

View File

@ -36,28 +36,20 @@ uvg_rtp::zrtp_msg::receiver::~receiver()
delete[] mem_;
}
int uvg_rtp::zrtp_msg::receiver::recv_msg(socket_t& socket, int flags)
int uvg_rtp::zrtp_msg::receiver::recv_msg(uvg_rtp::socket *socket, int flags)
{
int nread = 0;
rlen_ = 0;
rtp_error_t ret = RTP_GENERIC_ERROR;
int nread = 0;
rlen_ = 0;
if ((nread = ::recv(socket, (char *)mem_, len_, flags)) < 0) {
#ifdef __linux__
if (errno == EAGAIN || errno == EINTR)
return -RTP_INTERRUPTED;
LOG_ERROR("Failed to receive ZRTP Hello message: %d %s!", errno, strerror(errno));
return -RTP_RECV_ERROR;
#else
if (WSAGetLastError() == WSAEWOULDBLOCK)
return -RTP_INTERRUPTED;
if ((ret = socket->recv(mem_, len_, flags, &nread)) != RTP_OK) {
if (ret == RTP_INTERRUPTED)
return -ret;
log_platform_error("recv(2) failed");
return -RTP_RECV_ERROR;
#endif
}
/* TODO: validate header */
zrtp_msg *msg = (zrtp_msg *)mem_;
rlen_ = nread;