diff --git a/include/zrtp.hh b/include/zrtp.hh index f9519e2..174a2a4 100644 --- a/include/zrtp.hh +++ b/include/zrtp.hh @@ -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 */ diff --git a/include/zrtp/commit.hh b/include/zrtp/commit.hh index 8ef4fea..1c2fa12 100644 --- a/include/zrtp/commit.hh +++ b/include/zrtp/commit.hh @@ -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); diff --git a/include/zrtp/confack.hh b/include/zrtp/confack.hh index d9b273d..3799643 100644 --- a/include/zrtp/confack.hh +++ b/include/zrtp/confack.hh @@ -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); diff --git a/include/zrtp/confirm.hh b/include/zrtp/confirm.hh index 7b16005..c523311 100644 --- a/include/zrtp/confirm.hh +++ b/include/zrtp/confirm.hh @@ -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); diff --git a/include/zrtp/dh_kxchng.hh b/include/zrtp/dh_kxchng.hh index 77bf640..98d15b1 100644 --- a/include/zrtp/dh_kxchng.hh +++ b/include/zrtp/dh_kxchng.hh @@ -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); diff --git a/include/zrtp/error.hh b/include/zrtp/error.hh index 3dc778e..8520dd3 100644 --- a/include/zrtp/error.hh +++ b/include/zrtp/error.hh @@ -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); diff --git a/include/zrtp/hello.hh b/include/zrtp/hello.hh index 6524253..cb91f56 100644 --- a/include/zrtp/hello.hh +++ b/include/zrtp/hello.hh @@ -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); diff --git a/include/zrtp/hello_ack.hh b/include/zrtp/hello_ack.hh index 21e0ec3..f1420c2 100644 --- a/include/zrtp/hello_ack.hh +++ b/include/zrtp/hello_ack.hh @@ -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); diff --git a/include/zrtp/zrtp_receiver.hh b/include/zrtp/zrtp_receiver.hh index fc015a6..bd78fe9 100644 --- a/include/zrtp/zrtp_receiver.hh +++ b/include/zrtp/zrtp_receiver.hh @@ -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); diff --git a/src/media_stream.cc b/src/media_stream.cc index 3ac570c..ed890e4 100644 --- a/src/media_stream.cc +++ b/src/media_stream.cc @@ -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_; diff --git a/src/zrtp.cc b/src/zrtp.cc index 87e1398..8718130 100644 --- a/src/zrtp.cc +++ b/src/zrtp.cc @@ -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 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 lock(zrtp_mtx_); diff --git a/src/zrtp/commit.cc b/src/zrtp/commit.cc index 0a94aa5..952e05e 100644 --- a/src/zrtp/commit.cc +++ b/src/zrtp/commit.cc @@ -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) diff --git a/src/zrtp/confack.cc b/src/zrtp/confack.cc index b391859..46eb589 100644 --- a/src/zrtp/confack.cc +++ b/src/zrtp/confack.cc @@ -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) diff --git a/src/zrtp/confirm.cc b/src/zrtp/confirm.cc index e460b65..05e8c04 100644 --- a/src/zrtp/confirm.cc +++ b/src/zrtp/confirm.cc @@ -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) diff --git a/src/zrtp/dh_kxchng.cc b/src/zrtp/dh_kxchng.cc index cf9f6fb..d2bc2f3 100644 --- a/src/zrtp/dh_kxchng.cc +++ b/src/zrtp/dh_kxchng.cc @@ -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) diff --git a/src/zrtp/error.cc b/src/zrtp/error.cc index 8996359..03a30bc 100644 --- a/src/zrtp/error.cc +++ b/src/zrtp/error.cc @@ -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; } diff --git a/src/zrtp/hello.cc b/src/zrtp/hello.cc index 839795b..8760599 100644 --- a/src/zrtp/hello.cc +++ b/src/zrtp/hello.cc @@ -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) diff --git a/src/zrtp/hello_ack.cc b/src/zrtp/hello_ack.cc index 432648d..3313b51 100644 --- a/src/zrtp/hello_ack.cc +++ b/src/zrtp/hello_ack.cc @@ -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) diff --git a/src/zrtp/zrtp_receiver.cc b/src/zrtp/zrtp_receiver.cc index 94dfb84..617a413 100644 --- a/src/zrtp/zrtp_receiver.cc +++ b/src/zrtp/zrtp_receiver.cc @@ -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;