From 0b808631a2c7fb81fe8cc50e8c6544801be2159e Mon Sep 17 00:00:00 2001 From: Mikhail Baranov Date: Sat, 30 Nov 2024 20:34:08 +0100 Subject: [PATCH 1/2] Preparation for E2E latency tuning In order to be able to tune receiver's latency relying on timestamp mapping that we get from RTCP feedback, and UDP::Receive_timestamp, adding these features: * gh-674: Use receive timestamp (RTS) as report time when processing RTCP report; * RTT dumping for debugging (csvplotter ts_offset branch); * SCHED_RR for network io thread (run with root privs). --- .../roc_core/target_posix/roc_core/thread.cpp | 7 +- .../roc_core/target_posix/roc_core/thread.h | 2 +- .../target_libuv/roc_netio/network_loop.cpp | 23 +- .../target_libuv/roc_netio/network_loop.h | 12 +- src/internal_modules/roc_node/context.cpp | 2 +- src/internal_modules/roc_node/context.h | 6 +- .../roc_node/receiver_decoder.cpp | 3 + .../roc_node/sender_encoder.cpp | 3 + .../roc_pipeline/receiver_endpoint.cpp | 7 +- .../roc_pipeline/receiver_session_group.cpp | 12 +- .../roc_pipeline/receiver_session_group.h | 6 +- .../roc_pipeline/receiver_slot.cpp | 4 +- .../roc_pipeline/sender_endpoint.cpp | 8 +- .../roc_pipeline/sender_session.cpp | 13 +- .../roc_pipeline/sender_session.h | 6 +- .../roc_pipeline/sender_slot.cpp | 4 +- .../roc_rtcp/communicator.cpp | 14 +- src/internal_modules/roc_rtcp/communicator.h | 7 +- src/internal_modules/roc_rtcp/reporter.cpp | 12 +- src/internal_modules/roc_rtcp/reporter.h | 18 +- .../roc_rtcp/rtt_estimator.cpp | 36 +- src/internal_modules/roc_rtcp/rtt_estimator.h | 25 +- src/internal_modules/roc_sndio/io_pump.cpp | 12 +- src/internal_modules/roc_sndio/io_pump.h | 2 +- .../roc_status/code_to_str.cpp | 2 + src/internal_modules/roc_status/status_code.h | 10 + src/tests/public_api/test_helpers/proxy.h | 3 +- src/tests/roc_netio/test_resolve.cpp | 15 +- src/tests/roc_netio/test_tasks.cpp | 12 +- src/tests/roc_netio/test_tcp_io.cpp | 15 +- src/tests/roc_netio/test_tcp_ports.cpp | 63 ++- src/tests/roc_netio/test_udp_io.cpp | 39 +- src/tests/roc_netio/test_udp_ports.cpp | 39 +- src/tests/roc_rtcp/test_communicator.cpp | 533 +++++++++--------- src/tools/roc_recv/cmdline.ggo | 2 + src/tools/roc_recv/main.cpp | 10 +- src/tools/roc_send/cmdline.ggo | 2 + src/tools/roc_send/main.cpp | 10 +- 38 files changed, 612 insertions(+), 387 deletions(-) diff --git a/src/internal_modules/roc_core/target_posix/roc_core/thread.cpp b/src/internal_modules/roc_core/target_posix/roc_core/thread.cpp index 1b0e76443..dc89bd80e 100644 --- a/src/internal_modules/roc_core/target_posix/roc_core/thread.cpp +++ b/src/internal_modules/roc_core/target_posix/roc_core/thread.cpp @@ -46,13 +46,14 @@ uint64_t Thread::get_tid() { #endif } -bool Thread::enable_realtime() { +bool Thread::enable_realtime(const int sched_prio) { sched_param param; memset(¶m, 0, sizeof(param)); - param.sched_priority = sched_get_priority_max(SCHED_RR); + param.sched_priority = sched_prio; + roc_log(LogInfo, "thread: set realtime priority"); if (int err = pthread_setschedparam(pthread_self(), SCHED_RR, ¶m)) { - roc_log(LogDebug, + roc_log(LogError, "thread: can't set realtime priority: pthread_setschedparam(): %s", errno_to_str(err).c_str()); return false; diff --git a/src/internal_modules/roc_core/target_posix/roc_core/thread.h b/src/internal_modules/roc_core/target_posix/roc_core/thread.h index 5b2c10b82..aadfc2778 100644 --- a/src/internal_modules/roc_core/target_posix/roc_core/thread.h +++ b/src/internal_modules/roc_core/target_posix/roc_core/thread.h @@ -33,7 +33,7 @@ class Thread : public NonCopyable { static uint64_t get_tid(); //! Raise current thread priority to realtime. - ROC_NODISCARD static bool enable_realtime(); + ROC_NODISCARD static bool enable_realtime(const int sched_prio); //! Check if thread was started and can be joined. //! @returns diff --git a/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp index 132da2038..27173bedd 100644 --- a/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp +++ b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp @@ -104,10 +104,13 @@ NetworkLoop::Tasks::ResolveEndpointAddress::get_address() const { NetworkLoop::NetworkLoop(core::IPool& packet_pool, core::IPool& buffer_pool, + const int realtime_prio, core::IArena& arena) : packet_factory_(packet_pool, buffer_pool) + , realtime_prio_(realtime_prio) , arena_(arena) , started_(false) + , thr_init_cond_(thr_init_mutex_) , loop_initialized_(false) , stop_sem_initialized_(false) , task_sem_initialized_(false) @@ -145,7 +148,10 @@ NetworkLoop::NetworkLoop(core::IPool& packet_pool, return; } - init_status_ = status::StatusOK; + while (init_status_ == status::NoStatus) { + core::Mutex::Lock lock(thr_init_mutex_); + thr_init_cond_.wait(); + } } NetworkLoop::~NetworkLoop() { @@ -280,6 +286,21 @@ void NetworkLoop::handle_resolved(ResolverRequest& req) { void NetworkLoop::run() { roc_log(LogDebug, "network loop: starting event loop"); + if (realtime_prio_ > 0 && !enable_realtime(realtime_prio_)) { + core::Mutex::Lock lock(thr_init_mutex_); + + roc_log(LogError, + "network loop: can't set realtime priority of network thread. May need " + "to be root"); + init_status_ = status::StatusFailedRealtime; + thr_init_cond_.signal(); + } else { + core::Mutex::Lock lock(thr_init_mutex_); + + roc_log(LogDebug, "network loop: elevated realtime priority"); + init_status_ = status::StatusOK; + thr_init_cond_.signal(); + } int err = uv_run(&loop_, UV_RUN_DEFAULT); if (err != 0) { diff --git a/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.h b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.h index 5bf99ab45..aa3441c06 100644 --- a/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.h +++ b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.h @@ -17,6 +17,7 @@ #include "roc_address/socket_addr.h" #include "roc_core/atomic_int.h" #include "roc_core/attributes.h" +#include "roc_core/cond.h" #include "roc_core/iarena.h" #include "roc_core/ipool.h" #include "roc_core/list.h" @@ -54,6 +55,8 @@ class NetworkLoop : private ITerminateHandler, //! Opaque port handle. typedef struct PortHandle* PortHandle; + enum { DEFAULT_PRIORITY = 0 }; + //! Subclasses for specific tasks. class Tasks { public: @@ -189,7 +192,10 @@ class NetworkLoop : private ITerminateHandler, //! Initialize. //! @remarks //! Start background thread if the object was successfully constructed. - NetworkLoop(core::IPool& packet_pool, core::IPool& buffer_pool, core::IArena& arena); + NetworkLoop(core::IPool& packet_pool, + core::IPool& buffer_pool, + const int realtime_prio, + core::IArena& arena); //! Destroy. Stop all receivers and senders. //! @remarks @@ -248,10 +254,14 @@ class NetworkLoop : private ITerminateHandler, void task_resolve_endpoint_address_(NetworkTask&); packet::PacketFactory packet_factory_; + const uint8_t realtime_prio_; core::IArena& arena_; bool started_; + core::Mutex thr_init_mutex_; + core::Cond thr_init_cond_; + uv_loop_t loop_; bool loop_initialized_; diff --git a/src/internal_modules/roc_node/context.cpp b/src/internal_modules/roc_node/context.cpp index 7e5b5f74c..ff1d3cb26 100644 --- a/src/internal_modules/roc_node/context.cpp +++ b/src/internal_modules/roc_node/context.cpp @@ -23,7 +23,7 @@ Context::Context(const ContextConfig& config, core::IArena& arena) "frame_buffer_pool", arena_, sizeof(core::Buffer) + config.max_frame_size) , processor_map_(arena_) , encoding_map_(arena_) - , network_loop_(packet_pool_, packet_buffer_pool_, arena_) + , network_loop_(packet_pool_, packet_buffer_pool_, (int)config.realtime_prio, arena_) , control_loop_(network_loop_, arena_) , init_status_(status::NoStatus) { roc_log(LogDebug, "context: initializing"); diff --git a/src/internal_modules/roc_node/context.h b/src/internal_modules/roc_node/context.h index 6dd0239d2..75300e7f4 100644 --- a/src/internal_modules/roc_node/context.h +++ b/src/internal_modules/roc_node/context.h @@ -34,9 +34,13 @@ struct ContextConfig { //! Maximum size in bytes of an audio frame. size_t max_frame_size; + //! Set real-time priority. Requires root priviligies. + int realtime_prio; + ContextConfig() : max_packet_size(2048) - , max_frame_size(4096) { + , max_frame_size(4096) + , realtime_prio(0) { } }; diff --git a/src/internal_modules/roc_node/receiver_decoder.cpp b/src/internal_modules/roc_node/receiver_decoder.cpp index 458d0e618..eeb951866 100644 --- a/src/internal_modules/roc_node/receiver_decoder.cpp +++ b/src/internal_modules/roc_node/receiver_decoder.cpp @@ -169,6 +169,8 @@ status::StatusCode ReceiverDecoder::write_packet(address::Interface iface, roc_panic_if(!bytes); roc_panic_if(n_bytes == 0); + const core::nanoseconds_t capture_ts = core::timestamp(core::ClockUnix); + if (n_bytes > packet_factory_.packet_buffer_size()) { roc_log(LogError, "receiver decoder node:" @@ -195,6 +197,7 @@ status::StatusCode ReceiverDecoder::write_packet(address::Interface iface, } packet->add_flags(packet::Packet::FlagUDP); + packet->udp()->receive_timestamp = capture_ts; packet->set_buffer(buffer); packet::IWriter* writer = endpoint_writers_[iface]; diff --git a/src/internal_modules/roc_node/sender_encoder.cpp b/src/internal_modules/roc_node/sender_encoder.cpp index 624cec50e..552a32ecc 100644 --- a/src/internal_modules/roc_node/sender_encoder.cpp +++ b/src/internal_modules/roc_node/sender_encoder.cpp @@ -226,6 +226,8 @@ SenderEncoder::write_packet(address::Interface iface, const void* bytes, size_t roc_panic_if(!bytes); roc_panic_if(n_bytes == 0); + const core::nanoseconds_t capture_ts = core::timestamp(core::ClockUnix); + if (n_bytes > packet_factory_.packet_buffer_size()) { roc_log(LogError, "sender encoder node:" @@ -252,6 +254,7 @@ SenderEncoder::write_packet(address::Interface iface, const void* bytes, size_t } packet->add_flags(packet::Packet::FlagUDP); + packet->udp()->receive_timestamp = capture_ts; packet->set_buffer(buffer); packet::IWriter* writer = endpoint_writers_[iface]; diff --git a/src/internal_modules/roc_pipeline/receiver_endpoint.cpp b/src/internal_modules/roc_pipeline/receiver_endpoint.cpp index 056073dc3..6c293ea89 100644 --- a/src/internal_modules/roc_pipeline/receiver_endpoint.cpp +++ b/src/internal_modules/roc_pipeline/receiver_endpoint.cpp @@ -224,6 +224,11 @@ status::StatusCode ReceiverEndpoint::handle_packet_(const packet::PacketPtr& pac core::nanoseconds_t current_time) { status::StatusCode code = status::NoStatus; + // Apparently the packet is not from network, set its TS manually. + if (packet->udp() && packet->udp()->receive_timestamp == 0 && current_time != 0) { + packet->udp()->receive_timestamp = current_time; + } + if ((code = parser_->parse(*packet, packet->buffer())) != status::StatusOK) { roc_log(LogDebug, "receiver endpoint: dropping bad packet: can't parse: status=%s", @@ -231,7 +236,7 @@ status::StatusCode ReceiverEndpoint::handle_packet_(const packet::PacketPtr& pac return status::StatusOK; } - code = session_group_.route_packet(packet, current_time); + code = session_group_.route_packet(packet); if (code == status::StatusNoRoute) { roc_log(LogDebug, "receiver endpoint: dropping bad packet: can't route"); diff --git a/src/internal_modules/roc_pipeline/receiver_session_group.cpp b/src/internal_modules/roc_pipeline/receiver_session_group.cpp index 9d3e9268d..e96626523 100644 --- a/src/internal_modules/roc_pipeline/receiver_session_group.cpp +++ b/src/internal_modules/roc_pipeline/receiver_session_group.cpp @@ -71,7 +71,7 @@ ReceiverSessionGroup::create_control_pipeline(ReceiverEndpoint* control_endpoint // and later when we call generate_packets() or process_packets(). rtcp_communicator_.reset(new (rtcp_communicator_) rtcp::Communicator( source_config_.common.rtcp, *this, *control_endpoint->outbound_writer(), - *control_endpoint->outbound_composer(), packet_factory_, arena_)); + *control_endpoint->outbound_composer(), packet_factory_, arena_, dumper_)); const status::StatusCode code = rtcp_communicator_->init_status(); if (code != status::StatusOK) { @@ -140,12 +140,11 @@ void ReceiverSessionGroup::reclock_sessions(core::nanoseconds_t playback_time) { } } -status::StatusCode ReceiverSessionGroup::route_packet(const packet::PacketPtr& packet, - core::nanoseconds_t current_time) { +status::StatusCode ReceiverSessionGroup::route_packet(const packet::PacketPtr& packet) { roc_panic_if(init_status_ != status::StatusOK); if (packet->has_flags(packet::Packet::FlagControl)) { - return route_control_packet_(packet, current_time); + return route_control_packet_(packet); } return route_transport_packet_(packet); @@ -344,15 +343,14 @@ ReceiverSessionGroup::route_transport_packet_(const packet::PacketPtr& packet) { } status::StatusCode -ReceiverSessionGroup::route_control_packet_(const packet::PacketPtr& packet, - core::nanoseconds_t current_time) { +ReceiverSessionGroup::route_control_packet_(const packet::PacketPtr& packet) { if (!rtcp_communicator_) { roc_panic("session group: rtcp communicator is null"); } // This will invoke IParticipant methods implemented by us, // in particular notify_recv_stream() and maybe halt_recv_stream(). - return rtcp_communicator_->process_packet(packet, current_time); + return rtcp_communicator_->process_packet(packet); } bool ReceiverSessionGroup::can_create_session_(const packet::PacketPtr& packet) { diff --git a/src/internal_modules/roc_pipeline/receiver_session_group.h b/src/internal_modules/roc_pipeline/receiver_session_group.h index b53e31c20..2f6e13b34 100644 --- a/src/internal_modules/roc_pipeline/receiver_session_group.h +++ b/src/internal_modules/roc_pipeline/receiver_session_group.h @@ -90,8 +90,7 @@ class ReceiverSessionGroup : public core::NonCopyable<>, private rtcp::IParticip void reclock_sessions(core::nanoseconds_t playback_time); //! Route packet to session. - ROC_NODISCARD status::StatusCode route_packet(const packet::PacketPtr& packet, - core::nanoseconds_t current_time); + ROC_NODISCARD status::StatusCode route_packet(const packet::PacketPtr& packet); //! Get number of sessions in group. size_t num_sessions() const; @@ -129,8 +128,7 @@ class ReceiverSessionGroup : public core::NonCopyable<>, private rtcp::IParticip virtual void halt_recv_stream(packet::stream_source_t send_source_id); status::StatusCode route_transport_packet_(const packet::PacketPtr& packet); - status::StatusCode route_control_packet_(const packet::PacketPtr& packet, - core::nanoseconds_t current_time); + status::StatusCode route_control_packet_(const packet::PacketPtr& packet); bool can_create_session_(const packet::PacketPtr& packet); diff --git a/src/internal_modules/roc_pipeline/receiver_slot.cpp b/src/internal_modules/roc_pipeline/receiver_slot.cpp index 38a4cf46a..92c0bfccc 100644 --- a/src/internal_modules/roc_pipeline/receiver_slot.cpp +++ b/src/internal_modules/roc_pipeline/receiver_slot.cpp @@ -84,13 +84,13 @@ status::StatusCode ReceiverSlot::refresh(core::nanoseconds_t current_time, status::StatusCode code = status::NoStatus; if (source_endpoint_) { - if ((code = source_endpoint_->pull_packets(current_time)) != status::StatusOK) { + if ((code = source_endpoint_->pull_packets(0)) != status::StatusOK) { return code; } } if (repair_endpoint_) { - if ((code = repair_endpoint_->pull_packets(current_time)) != status::StatusOK) { + if ((code = repair_endpoint_->pull_packets(0)) != status::StatusOK) { return code; } } diff --git a/src/internal_modules/roc_pipeline/sender_endpoint.cpp b/src/internal_modules/roc_pipeline/sender_endpoint.cpp index b8f7556b5..1466ac543 100644 --- a/src/internal_modules/roc_pipeline/sender_endpoint.cpp +++ b/src/internal_modules/roc_pipeline/sender_endpoint.cpp @@ -212,13 +212,19 @@ status::StatusCode SenderEndpoint::handle_packet_(const packet::PacketPtr& packe core::nanoseconds_t current_time) { status::StatusCode code = status::NoStatus; + // Apparently the packet is not from network, set it's TS manually. + if (packet->udp() && packet->udp()->receive_timestamp == 0 && current_time != 0) { + packet->udp()->receive_timestamp = current_time; + } + if ((code = parser_->parse(*packet, packet->buffer())) != status::StatusOK) { roc_log(LogDebug, "sender endpoint: dropping bad packet: can't parse: status=%s", status::code_to_str(code)); + return status::StatusOK; } - code = sender_session_.route_packet(packet, current_time); + code = sender_session_.route_packet(packet); if (code == status::StatusNoRoute) { roc_log(LogDebug, "sender endpoint: dropping bad packet: can't route"); diff --git a/src/internal_modules/roc_pipeline/sender_session.cpp b/src/internal_modules/roc_pipeline/sender_session.cpp index f649c4b39..adad637ef 100644 --- a/src/internal_modules/roc_pipeline/sender_session.cpp +++ b/src/internal_modules/roc_pipeline/sender_session.cpp @@ -235,7 +235,7 @@ SenderSession::create_control_pipeline(SenderEndpoint* control_endpoint) { rtcp_communicator_.reset(new (rtcp_communicator_) rtcp::Communicator( sink_config_.rtcp, *this, control_endpoint->outbound_writer(), - control_endpoint->outbound_composer(), packet_factory_, arena_)); + control_endpoint->outbound_composer(), packet_factory_, arena_, dumper_)); const status::StatusCode code = rtcp_communicator_->init_status(); if (code != status::StatusOK) { @@ -281,8 +281,7 @@ status::StatusCode SenderSession::refresh(core::nanoseconds_t current_time, return status::StatusOK; } -status::StatusCode SenderSession::route_packet(const packet::PacketPtr& packet, - core::nanoseconds_t current_time) { +status::StatusCode SenderSession::route_packet(const packet::PacketPtr& packet) { roc_panic_if(init_status_ != status::StatusOK); if (fail_status_ != status::NoStatus) { @@ -294,7 +293,7 @@ status::StatusCode SenderSession::route_packet(const packet::PacketPtr& packet, roc_panic("sender session: unexpected non-control packet"); } - return route_control_packet_(packet, current_time); + return route_control_packet_(packet); } status::StatusCode SenderSession::write(audio::Frame& frame) { @@ -439,15 +438,13 @@ void SenderSession::start_feedback_monitor_() { feedback_monitor_->start(); } -status::StatusCode -SenderSession::route_control_packet_(const packet::PacketPtr& packet, - core::nanoseconds_t current_time) { +status::StatusCode SenderSession::route_control_packet_(const packet::PacketPtr& packet) { if (!rtcp_communicator_) { roc_panic("sender session: rtcp communicator is null"); } // This will invoke IParticipant methods implemented by us. - return rtcp_communicator_->process_packet(packet, current_time); + return rtcp_communicator_->process_packet(packet); } } // namespace pipeline diff --git a/src/internal_modules/roc_pipeline/sender_session.h b/src/internal_modules/roc_pipeline/sender_session.h index 2aff79c07..ec6c02ac6 100644 --- a/src/internal_modules/roc_pipeline/sender_session.h +++ b/src/internal_modules/roc_pipeline/sender_session.h @@ -96,8 +96,7 @@ class SenderSession : public core::NonCopyable<>, //! This way feedback packets from receiver reach sender pipeline. //! Packets are stored inside internal pipeline queues, and then fetched //! when frame are passed from frame_writer(). - ROC_NODISCARD status::StatusCode route_packet(const packet::PacketPtr& packet, - core::nanoseconds_t current_time); + ROC_NODISCARD status::StatusCode route_packet(const packet::PacketPtr& packet); //! Get slot metrics. //! @remarks @@ -133,8 +132,7 @@ class SenderSession : public core::NonCopyable<>, void start_feedback_monitor_(); - status::StatusCode route_control_packet_(const packet::PacketPtr& packet, - core::nanoseconds_t current_time); + status::StatusCode route_control_packet_(const packet::PacketPtr& packet); core::IArena& arena_; diff --git a/src/internal_modules/roc_pipeline/sender_slot.cpp b/src/internal_modules/roc_pipeline/sender_slot.cpp index b51cea8b1..ef8f64121 100644 --- a/src/internal_modules/roc_pipeline/sender_slot.cpp +++ b/src/internal_modules/roc_pipeline/sender_slot.cpp @@ -142,13 +142,13 @@ status::StatusCode SenderSlot::refresh(core::nanoseconds_t current_time, status::StatusCode code = status::NoStatus; if (source_endpoint_) { - if ((code = source_endpoint_->pull_packets(current_time)) != status::StatusOK) { + if ((code = source_endpoint_->pull_packets(0)) != status::StatusOK) { return code; } } if (repair_endpoint_) { - if ((code = repair_endpoint_->pull_packets(current_time)) != status::StatusOK) { + if ((code = repair_endpoint_->pull_packets(0)) != status::StatusOK) { return code; } } diff --git a/src/internal_modules/roc_rtcp/communicator.cpp b/src/internal_modules/roc_rtcp/communicator.cpp index 63df2ddaf..8ccf70c78 100644 --- a/src/internal_modules/roc_rtcp/communicator.cpp +++ b/src/internal_modules/roc_rtcp/communicator.cpp @@ -10,6 +10,7 @@ #include "roc_core/log.h" #include "roc_core/panic.h" #include "roc_core/time.h" +#include "roc_dbgio/csv_dumper.h" #include "roc_packet/ntp.h" #include "roc_packet/units.h" #include "roc_rtcp/headers.h" @@ -30,12 +31,13 @@ Communicator::Communicator(const Config& config, packet::IWriter& packet_writer, packet::IComposer& packet_composer, packet::PacketFactory& packet_factory, - core::IArena& arena) + core::IArena& arena, + dbgio::CsvDumper* dumper) : packet_factory_(packet_factory) , packet_writer_(packet_writer) , packet_composer_(packet_composer) , config_(config) - , reporter_(config, participant, arena) + , reporter_(config, participant, arena, dumper) , next_deadline_(0) , dest_addr_count_(0) , dest_addr_index_(0) @@ -69,14 +71,12 @@ size_t Communicator::total_streams() const { return reporter_.total_streams(); } -status::StatusCode Communicator::process_packet(const packet::PacketPtr& packet, - core::nanoseconds_t current_time) { +status::StatusCode Communicator::process_packet(const packet::PacketPtr& packet) { roc_panic_if(init_status_ != status::StatusOK); roc_panic_if_msg(!packet, "rtcp communicator: null packet"); roc_panic_if_msg(!packet->udp(), "rtcp communicator: non-udp packet"); roc_panic_if_msg(!packet->rtcp(), "rtcp communicator: non-rtcp packet"); - roc_panic_if_msg(current_time <= 0, "rtcp communicator: invalid timestamp"); roc_log(LogTrace, "rtcp communicator: processing incoming packet"); @@ -89,8 +89,8 @@ status::StatusCode Communicator::process_packet(const packet::PacketPtr& packet, return status::StatusOK; } - status::StatusCode status = - reporter_.begin_processing(packet->udp()->src_addr, current_time); + status::StatusCode status = reporter_.begin_processing( + packet->udp()->src_addr, packet->udp()->receive_timestamp); roc_log(LogTrace, "rtcp communicator: begin_processing(): status=%s", status::code_to_str(status)); diff --git a/src/internal_modules/roc_rtcp/communicator.h b/src/internal_modules/roc_rtcp/communicator.h index 0d86d2551..5b2fa6122 100644 --- a/src/internal_modules/roc_rtcp/communicator.h +++ b/src/internal_modules/roc_rtcp/communicator.h @@ -17,6 +17,7 @@ #include "roc_core/rate_limiter.h" #include "roc_core/stddefs.h" #include "roc_core/time.h" +#include "roc_dbgio/csv_dumper.h" #include "roc_packet/icomposer.h" #include "roc_packet/iwriter.h" #include "roc_packet/packet.h" @@ -61,7 +62,8 @@ class Communicator : public core::NonCopyable<> { packet::IWriter& packet_writer, packet::IComposer& packet_composer, packet::PacketFactory& packet_factory, - core::IArena& arena); + core::IArena& arena, + dbgio::CsvDumper* dumper); //! Check if the object was successfully constructed. status::StatusCode init_status() const; @@ -74,8 +76,7 @@ class Communicator : public core::NonCopyable<> { //! Parse and process incoming packet. //! Invokes IParticipant methods during processing. - ROC_NODISCARD status::StatusCode process_packet(const packet::PacketPtr& packet, - core::nanoseconds_t current_time); + ROC_NODISCARD status::StatusCode process_packet(const packet::PacketPtr& packet); //! When we should generate packets next time. //! Returns absolute time. diff --git a/src/internal_modules/roc_rtcp/reporter.cpp b/src/internal_modules/roc_rtcp/reporter.cpp index 50ba0f274..a4eab3643 100644 --- a/src/internal_modules/roc_rtcp/reporter.cpp +++ b/src/internal_modules/roc_rtcp/reporter.cpp @@ -21,7 +21,10 @@ namespace roc { namespace rtcp { -Reporter::Reporter(const Config& config, IParticipant& participant, core::IArena& arena) +Reporter::Reporter(const Config& config, + IParticipant& participant, + core::IArena& arena, + dbgio::CsvDumper* dumper) : arena_(arena) , participant_(participant) , local_source_id_(0) @@ -43,7 +46,8 @@ Reporter::Reporter(const Config& config, IParticipant& participant, core::IArena , report_time_(0) , config_(config) , max_delay_(packet::ntp_2_nanoseconds(header::MaxDelay)) - , init_status_(status::NoStatus) { + , init_status_(status::NoStatus) + , dumper_(dumper) { memset(local_cname_, 0, sizeof(local_cname_)); const ParticipantInfo part_info = participant_.participant_info(); @@ -1399,8 +1403,8 @@ Reporter::find_stream_(packet::stream_source_t source_id, CreateMode mode) { roc_log(LogDebug, "rtcp reporter: creating stream: ssrc=%lu", (unsigned long)source_id); - stream = - new (stream_pool_) Stream(stream_pool_, source_id, report_time_, config_.rtt); + stream = new (stream_pool_) + Stream(arena_, stream_pool_, source_id, report_time_, config_.rtt, dumper_); if (!stream) { report_error_ = status::StatusNoMem; return NULL; diff --git a/src/internal_modules/roc_rtcp/reporter.h b/src/internal_modules/roc_rtcp/reporter.h index bce290ea3..1404bf22a 100644 --- a/src/internal_modules/roc_rtcp/reporter.h +++ b/src/internal_modules/roc_rtcp/reporter.h @@ -22,6 +22,7 @@ #include "roc_core/shared_ptr.h" #include "roc_core/slab_pool.h" #include "roc_core/time.h" +#include "roc_dbgio/csv_dumper.h" #include "roc_packet/ntp.h" #include "roc_packet/units.h" #include "roc_rtcp/cname.h" @@ -90,7 +91,10 @@ namespace rtcp { class Reporter : public core::NonCopyable<> { public: //! Initialize. - Reporter(const Config& config, IParticipant& participant, core::IArena& arena); + Reporter(const Config& config, + IParticipant& participant, + core::IArena& arena, + dbgio::CsvDumper* dumper); ~Reporter(); //! Check if the object was successfully constructed. @@ -260,16 +264,18 @@ class Reporter : public core::NonCopyable<> { struct Stream : core::RefCounted, core::HashmapNode<>, core::ListNode<> { - Stream(core::IPool& pool, + Stream(core::IArena& arena, + core::IPool& pool, packet::stream_source_t source_id, core::nanoseconds_t report_time, - const RttConfig& rtt_config) + const RttConfig& rtt_config, + dbgio::CsvDumper* dumper) : core::RefCounted(pool) , source_id(source_id) , has_remote_recv_report(false) - , remote_recv_rtt(rtt_config) + , remote_recv_rtt(rtt_config, arena, dumper) , has_remote_send_report(false) - , remote_send_rtt(rtt_config) + , remote_send_rtt(rtt_config, arena, dumper) , local_recv_report(NULL) , last_update(report_time) , last_local_sr(0) @@ -482,6 +488,8 @@ class Reporter : public core::NonCopyable<> { const core::nanoseconds_t max_delay_; status::StatusCode init_status_; + + dbgio::CsvDumper* dumper_; }; } // namespace rtcp diff --git a/src/internal_modules/roc_rtcp/rtt_estimator.cpp b/src/internal_modules/roc_rtcp/rtt_estimator.cpp index 005857e32..a2165a7bf 100644 --- a/src/internal_modules/roc_rtcp/rtt_estimator.cpp +++ b/src/internal_modules/roc_rtcp/rtt_estimator.cpp @@ -12,12 +12,17 @@ namespace roc { namespace rtcp { -RttEstimator::RttEstimator(const RttConfig& config) +RttEstimator::RttEstimator(const RttConfig& config, + core::IArena& arena, + dbgio::CsvDumper* dumper) : config_(config) , metrics_() , has_metrics_(false) , first_report_ts_(0) - , last_report_ts_(0) { + , last_report_ts_(0) + , dumper_(dumper) + , rtt_stats_(arena, config.rtt_winlen, 0.5) + , clock_offset_stats_(arena, config.clock_offset_winlen, 0.5) { } bool RttEstimator::has_metrics() const { @@ -85,10 +90,33 @@ void RttEstimator::update(core::nanoseconds_t local_report_ts, } last_report_ts_ = local_report_ts; - metrics_.clock_offset = clock_offset; - metrics_.rtt = rtt; + rtt_stats_.add(rtt); + clock_offset_stats_.add(clock_offset); + metrics_.rtt = rtt_stats_.mov_quantile(); + metrics_.clock_offset = clock_offset_stats_.mov_quantile(); has_metrics_ = true; + + if (dumper_) { + dump_(local_report_ts, remote_report_ts, remote_reply_ts, local_reply_ts); + } +} + +void RttEstimator::dump_(core::nanoseconds_t local_report_ts, + core::nanoseconds_t remote_report_ts, + core::nanoseconds_t remote_reply_ts, + core::nanoseconds_t local_reply_ts) { + dbgio::CsvEntry e; + e.type = 'r'; + e.n_fields = 7; + e.fields[0] = core::timestamp(core::ClockUnix); + e.fields[1] = metrics_.rtt; + e.fields[2] = metrics_.clock_offset; + e.fields[3] = local_report_ts; + e.fields[4] = remote_report_ts; + e.fields[5] = remote_reply_ts; + e.fields[6] = local_reply_ts; + dumper_->write(e); } } // namespace rtcp diff --git a/src/internal_modules/roc_rtcp/rtt_estimator.h b/src/internal_modules/roc_rtcp/rtt_estimator.h index 9f4208141..8660d620e 100644 --- a/src/internal_modules/roc_rtcp/rtt_estimator.h +++ b/src/internal_modules/roc_rtcp/rtt_estimator.h @@ -13,7 +13,9 @@ #define ROC_RTCP_RTT_ESTIMATOR_H_ #include "roc_core/time.h" +#include "roc_dbgio/csv_dumper.h" #include "roc_packet/units.h" +#include "roc_stat/mov_quantile.h" namespace roc { namespace rtcp { @@ -24,8 +26,18 @@ struct RttConfig { //! All metrics below are computed for a sliding window of this length. core::nanoseconds_t interval_duration; + //! How many measurements of RTT is used + //! to find median value. + size_t rtt_winlen; + + //! How many measurements of RTT is used + //! to find median value. + size_t clock_offset_winlen; + RttConfig() - : interval_duration(core::Second * 5) { + : interval_duration(core::Second * 5) + , rtt_winlen(15) + , clock_offset_winlen(100) { } }; @@ -51,7 +63,7 @@ struct RttMetrics { class RttEstimator { public: //! Initialize. - RttEstimator(const RttConfig& config); + RttEstimator(const RttConfig& config, core::IArena& arena, dbgio::CsvDumper* dumper); //! Check whether metrics are already available. bool has_metrics() const; @@ -71,12 +83,21 @@ class RttEstimator { core::nanoseconds_t local_reply_ts); private: + void dump_(core::nanoseconds_t local_report_ts, + core::nanoseconds_t remote_report_ts, + core::nanoseconds_t remote_reply_ts, + core::nanoseconds_t local_reply_ts); + const RttConfig config_; RttMetrics metrics_; bool has_metrics_; core::nanoseconds_t first_report_ts_; core::nanoseconds_t last_report_ts_; + + dbgio::CsvDumper* dumper_; + stat::MovQuantile rtt_stats_; + stat::MovQuantile clock_offset_stats_; }; } // namespace rtcp diff --git a/src/internal_modules/roc_sndio/io_pump.cpp b/src/internal_modules/roc_sndio/io_pump.cpp index 6ae8a527c..8807be1f2 100644 --- a/src/internal_modules/roc_sndio/io_pump.cpp +++ b/src/internal_modules/roc_sndio/io_pump.cpp @@ -9,6 +9,7 @@ #include "roc_sndio/io_pump.h" #include "roc_audio/sample_spec_to_str.h" #include "roc_core/log.h" +#include "roc_core/thread.h" #include "roc_status/code_to_str.h" namespace roc { @@ -67,11 +68,18 @@ status::StatusCode IoPump::init_status() const { return init_status_; } -status::StatusCode IoPump::run() { +status::StatusCode IoPump::run(const int realtime_priority) { roc_log(LogDebug, "io pump: starting main loop"); - status::StatusCode code = status::NoStatus; + if (realtime_priority > 0 && !core::Thread::enable_realtime(realtime_priority)) { + roc_log(LogError, "io pump: can't set realtime priority. May need to be root"); + code = status::StatusFailedRealtime; + return code; + } else { + roc_log(LogDebug, "io pump: elevated realtime priority"); + } + for (;;) { // Transfer one frame from source to sink. if ((code = next_()) != status::StatusOK) { diff --git a/src/internal_modules/roc_sndio/io_pump.h b/src/internal_modules/roc_sndio/io_pump.h index d7c059301..e79e11a38 100644 --- a/src/internal_modules/roc_sndio/io_pump.h +++ b/src/internal_modules/roc_sndio/io_pump.h @@ -59,7 +59,7 @@ class IoPump : public core::NonCopyable<> { //! @remarks //! Run until the stop() is called or, if oneshot mode is enabled, //! the source becomes inactive. - ROC_NODISCARD status::StatusCode run(); + ROC_NODISCARD status::StatusCode run(const int realtime_priority = 0); //! Stop the pump. //! @remarks diff --git a/src/internal_modules/roc_status/code_to_str.cpp b/src/internal_modules/roc_status/code_to_str.cpp index 46313c0b8..ebdfcf299 100644 --- a/src/internal_modules/roc_status/code_to_str.cpp +++ b/src/internal_modules/roc_status/code_to_str.cpp @@ -66,6 +66,8 @@ const char* code_to_str(StatusCode code) { return "BadOperation"; case StatusBadState: return "BadState"; + case StatusFailedRealtime: + return "FailedRealtime"; } // Most likely someone forgot to initialize status to a proper diff --git a/src/internal_modules/roc_status/status_code.h b/src/internal_modules/roc_status/status_code.h index af955fc00..da88418d9 100644 --- a/src/internal_modules/roc_status/status_code.h +++ b/src/internal_modules/roc_status/status_code.h @@ -214,6 +214,16 @@ enum StatusCode { //! Example: trying to write frame after previous write failed. StatusBadState, + //! Unable to set realtime priority. + //! @remark + //! The objects thread failed to initialize and does not operating. + //! @note + //! Eaample: NetworkLoop was called wit requested real-time level + //! higher than 0, which requires root privileges. The inner thread + //! fails to elevate priority, sets init_status to this value + //! and stops. + StatusFailedRealtime, + //! Maximum enum value. MaxStatus, }; diff --git a/src/tests/public_api/test_helpers/proxy.h b/src/tests/public_api/test_helpers/proxy.h index e123d18c5..92e449468 100644 --- a/src/tests/public_api/test_helpers/proxy.h +++ b/src/tests/public_api/test_helpers/proxy.h @@ -41,7 +41,8 @@ class Proxy : public core::Thread, private packet::IWriter { : packet_pool_("proxy_packet_pool", arena_) , buffer_pool_("proxy_buffer_pool", arena_, 2000) , queue_(packet::ConcurrentQueue::Blocking) - , net_loop_(packet_pool_, buffer_pool_, arena_) + , net_loop_( + packet_pool_, buffer_pool_, netio::NetworkLoop::DEFAULT_PRIORITY, arena_) , n_source_packets_(n_source_packets) , n_repair_packets_(n_repair_packets) , flags_(flags) diff --git a/src/tests/roc_netio/test_resolve.cpp b/src/tests/roc_netio/test_resolve.cpp index 62ea3d126..0d31aee3d 100644 --- a/src/tests/roc_netio/test_resolve.cpp +++ b/src/tests/roc_netio/test_resolve.cpp @@ -43,7 +43,8 @@ bool resolve_endpoint_address(NetworkLoop& net_loop, TEST_GROUP(resolve) {}; TEST(resolve, ipv4) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -57,7 +58,8 @@ TEST(resolve, ipv4) { } TEST(resolve, ipv6) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -71,7 +73,8 @@ TEST(resolve, ipv6) { } TEST(resolve, hostname) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -91,7 +94,8 @@ TEST(resolve, hostname) { } TEST(resolve, standard_port) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -104,7 +108,8 @@ TEST(resolve, standard_port) { } TEST(resolve, bad_host) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); { // bad ipv4 diff --git a/src/tests/roc_netio/test_tasks.cpp b/src/tests/roc_netio/test_tasks.cpp index b45e1ea29..b55e459c9 100644 --- a/src/tests/roc_netio/test_tasks.cpp +++ b/src/tests/roc_netio/test_tasks.cpp @@ -150,7 +150,8 @@ class AddRemoveCompleter : public INetworkTaskCompleter { TEST_GROUP(tasks) {}; TEST(tasks, synchronous_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); @@ -167,7 +168,8 @@ TEST(tasks, synchronous_add) { } TEST(tasks, synchronous_add_recv_remove) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); @@ -195,7 +197,8 @@ TEST(tasks, synchronous_add_recv_remove) { } TEST(tasks, asynchronous_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); @@ -216,7 +219,8 @@ TEST(tasks, asynchronous_add) { } TEST(tasks, asynchronous_add_recv_remove) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); diff --git a/src/tests/roc_netio/test_tcp_io.cpp b/src/tests/roc_netio/test_tcp_io.cpp index 1de9b989f..121f2a86e 100644 --- a/src/tests/roc_netio/test_tcp_io.cpp +++ b/src/tests/roc_netio/test_tcp_io.cpp @@ -98,7 +98,8 @@ TEST(tcp_io, one_server_one_client_one_direction) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -137,7 +138,8 @@ TEST(tcp_io, one_server_one_client_both_directions) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -185,10 +187,12 @@ TEST(tcp_io, one_server_one_client_separate_loops) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop client_net_loop(packet_pool, buffer_pool, arena); + NetworkLoop client_net_loop(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, client_net_loop.init_status()); - NetworkLoop server_net_loop(packet_pool, buffer_pool, arena); + NetworkLoop server_net_loop(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, server_net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -231,7 +235,8 @@ TEST(tcp_io, one_server_many_clients) { acceptor.push_handler(server_conn_handler1); acceptor.push_handler(server_conn_handler2); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); diff --git a/src/tests/roc_netio/test_tcp_ports.cpp b/src/tests/roc_netio/test_tcp_ports.cpp index 717674b04..05f3cf87c 100644 --- a/src/tests/roc_netio/test_tcp_ports.cpp +++ b/src/tests/roc_netio/test_tcp_ports.cpp @@ -147,7 +147,8 @@ void terminate_and_wait(test::MockConnHandler& handler, TEST_GROUP(tcp_ports) {}; TEST(tcp_ports, no_ports) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UNSIGNED_LONGS_EQUAL(0, net_loop.num_ports()); @@ -160,7 +161,8 @@ TEST(tcp_ports, add_anyaddr) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("0.0.0.0", 0); @@ -207,7 +209,8 @@ TEST(tcp_ports, add_localhost) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -254,7 +257,8 @@ TEST(tcp_ports, add_addrinuse) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop1(packet_pool, buffer_pool, arena); + NetworkLoop net_loop1(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop1.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -283,7 +287,8 @@ TEST(tcp_ports, add_addrinuse) { POINTERS_EQUAL(server_conn, acceptor.wait_added()); - NetworkLoop net_loop2(packet_pool, buffer_pool, arena); + NetworkLoop net_loop2(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop2.init_status()); UNSIGNED_LONGS_EQUAL(0, net_loop2.num_ports()); @@ -306,7 +311,8 @@ TEST(tcp_ports, add_remove) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -352,7 +358,8 @@ TEST(tcp_ports, add_remove) { TEST(tcp_ports, add_remove_add) { test::MockConnAcceptor acceptor; - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -382,7 +389,8 @@ TEST(tcp_ports, connect_one_server_one_client) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -424,7 +432,8 @@ TEST(tcp_ports, connect_one_server_many_clients) { acceptor.push_handler(server_conn_handler1); acceptor.push_handler(server_conn_handler2); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -489,13 +498,16 @@ TEST(tcp_ports, connect_one_server_many_clients_many_loops) { acceptor.push_handler(server_conn_handler1); acceptor.push_handler(server_conn_handler2); - NetworkLoop net_loop_client1(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_client1(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, net_loop_client1.init_status()); - NetworkLoop net_loop_client2(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_client2(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, net_loop_client2.init_status()); - NetworkLoop net_loop_server(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_server(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, net_loop_server.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -562,7 +574,8 @@ TEST(tcp_ports, connect_many_servers_many_clients) { test::MockConnAcceptor acceptor2; acceptor2.push_handler(server_conn_handler2); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config1 = make_server_config("127.0.0.1", 0); @@ -631,10 +644,12 @@ TEST(tcp_ports, connect_many_servers_many_clients_many_loops) { test::MockConnAcceptor acceptor2; acceptor2.push_handler(server_conn_handler2); - NetworkLoop net_loop_client(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_client(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, net_loop_client.init_status()); - NetworkLoop net_loop_server(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_server(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, net_loop_server.init_status()); TcpServerConfig server_config1 = make_server_config("127.0.0.1", 0); @@ -698,7 +713,8 @@ TEST(tcp_ports, connect_error) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler1); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -738,7 +754,8 @@ TEST(tcp_ports, acceptor_error) { test::MockConnAcceptor acceptor; - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -789,7 +806,8 @@ TEST(tcp_ports, terminate_client_connection_normal) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -840,7 +858,8 @@ TEST(tcp_ports, terminate_client_connection_failure) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -892,7 +911,8 @@ TEST(tcp_ports, terminate_server_connection_normal) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -943,7 +963,8 @@ TEST(tcp_ports, terminate_server_connection_failure) { test::MockConnAcceptor acceptor; acceptor.push_handler(server_conn_handler); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); diff --git a/src/tests/roc_netio/test_udp_io.cpp b/src/tests/roc_netio/test_udp_io.cpp index a4530a229..57aaa6928 100644 --- a/src/tests/roc_netio/test_udp_io.cpp +++ b/src/tests/roc_netio/test_udp_io.cpp @@ -205,7 +205,8 @@ TEST(udp_io, one_sender_one_receiver_single_thread_non_blocking_disabled) { tx_config.enable_non_blocking = false; - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); packet::IWriter* tx_writer = NULL; @@ -232,7 +233,8 @@ TEST(udp_io, one_sender_one_receiver_single_loop) { UdpConfig tx_config = make_udp_config(); UdpConfig rx_config = make_udp_config(); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); packet::IWriter* tx_writer = NULL; @@ -259,14 +261,16 @@ TEST(udp_io, one_sender_one_receiver_separate_loops) { UdpConfig tx_config = make_udp_config(); UdpConfig rx_config = make_udp_config(); - NetworkLoop tx_loop(packet_pool, buffer_pool, arena); + NetworkLoop tx_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, tx_loop.init_status()); packet::IWriter* tx_writer = NULL; CHECK(add_udp_sender(tx_loop, tx_config, &tx_writer)); CHECK(tx_writer); - NetworkLoop rx_loop(packet_pool, buffer_pool, arena); + NetworkLoop rx_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, rx_loop.init_status()); CHECK(add_udp_receiver(rx_loop, rx_config, rx_queue)); @@ -293,18 +297,21 @@ TEST(udp_io, one_sender_many_receivers) { UdpConfig rx_config2 = make_udp_config(); UdpConfig rx_config3 = make_udp_config(); - NetworkLoop tx_loop(packet_pool, buffer_pool, arena); + NetworkLoop tx_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, tx_loop.init_status()); packet::IWriter* tx_writer = NULL; CHECK(add_udp_sender(tx_loop, tx_config, &tx_writer)); CHECK(tx_writer); - NetworkLoop rx1_loop(packet_pool, buffer_pool, arena); + NetworkLoop rx1_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, rx1_loop.init_status()); CHECK(add_udp_receiver(rx1_loop, rx_config1, rx_queue1)); - NetworkLoop rx23_loop(packet_pool, buffer_pool, arena); + NetworkLoop rx23_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, rx23_loop.init_status()); CHECK(add_udp_receiver(rx23_loop, rx_config2, rx_queue2)); CHECK(add_udp_receiver(rx23_loop, rx_config3, rx_queue3)); @@ -338,14 +345,16 @@ TEST(udp_io, many_senders_one_receiver) { UdpConfig rx_config = make_udp_config(); - NetworkLoop tx1_loop(packet_pool, buffer_pool, arena); + NetworkLoop tx1_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, tx1_loop.init_status()); packet::IWriter* tx_writer1 = NULL; CHECK(add_udp_sender(tx1_loop, tx_config1, &tx_writer1)); CHECK(tx_writer1); - NetworkLoop tx23_loop(packet_pool, buffer_pool, arena); + NetworkLoop tx23_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, tx23_loop.init_status()); packet::IWriter* tx_writer2 = NULL; @@ -356,7 +365,8 @@ TEST(udp_io, many_senders_one_receiver) { CHECK(add_udp_sender(tx23_loop, tx_config3, &tx_writer3)); CHECK(tx_writer3); - NetworkLoop rx_loop(packet_pool, buffer_pool, arena); + NetworkLoop rx_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, rx_loop.init_status()); CHECK(add_udp_receiver(rx_loop, rx_config, rx_queue)); @@ -400,7 +410,8 @@ TEST(udp_io, bidirectional_ports_one_loop) { peer1_config.enable_non_blocking = false; peer2_config.enable_non_blocking = false; - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); packet::IWriter* peer1_tx_writer = NULL; @@ -444,10 +455,12 @@ TEST(udp_io, bidirectional_ports_separate_loops) { peer1_config.enable_non_blocking = false; peer2_config.enable_non_blocking = false; - NetworkLoop peer1_net_loop(packet_pool, buffer_pool, arena); + NetworkLoop peer1_net_loop(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, peer1_net_loop.init_status()); - NetworkLoop peer2_net_loop(packet_pool, buffer_pool, arena); + NetworkLoop peer2_net_loop(packet_pool, buffer_pool, + netio::NetworkLoop::DEFAULT_PRIORITY, arena); LONGS_EQUAL(status::StatusOK, peer2_net_loop.init_status()); packet::IWriter* peer1_tx_writer = NULL; diff --git a/src/tests/roc_netio/test_udp_ports.cpp b/src/tests/roc_netio/test_udp_ports.cpp index 7ba003e90..ece6eb30e 100644 --- a/src/tests/roc_netio/test_udp_ports.cpp +++ b/src/tests/roc_netio/test_udp_ports.cpp @@ -79,7 +79,8 @@ bool start_recv(NetworkLoop& net_loop, TEST_GROUP(udp_ports) {}; TEST(udp_ports, no_ports) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -88,7 +89,8 @@ TEST(udp_ports, no_ports) { TEST(udp_ports, add_remove) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -116,7 +118,8 @@ TEST(udp_ports, add_remove) { TEST(udp_ports, add_start_remove) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -147,7 +150,8 @@ TEST(udp_ports, add_start_remove) { } TEST(udp_ports, add_remove_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -165,7 +169,8 @@ TEST(udp_ports, add_remove_add) { } TEST(udp_ports, add_start_remove_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -188,7 +193,8 @@ TEST(udp_ports, add_start_remove_add) { TEST(udp_ports, anyaddr) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -217,7 +223,8 @@ TEST(udp_ports, anyaddr) { TEST(udp_ports, localhost) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("127.0.0.1", 0); @@ -246,7 +253,8 @@ TEST(udp_ports, localhost) { TEST(udp_ports, addrinuse) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop1(packet_pool, buffer_pool, arena); + NetworkLoop net_loop1(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop1.init_status()); UdpConfig tx_config = make_udp_config("127.0.0.1", 0); @@ -271,7 +279,8 @@ TEST(udp_ports, addrinuse) { LONGS_EQUAL(2, net_loop1.num_ports()); - NetworkLoop net_loop2(packet_pool, buffer_pool, arena); + NetworkLoop net_loop2(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop2.init_status()); LONGS_EQUAL(0, net_loop2.num_ports()); @@ -286,7 +295,8 @@ TEST(udp_ports, addrinuse) { TEST(udp_ports, broadcast_sender) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -304,7 +314,8 @@ TEST(udp_ports, broadcast_sender) { TEST(udp_ports, multicast_receiver) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -336,7 +347,8 @@ TEST(udp_ports, multicast_receiver) { TEST(udp_ports, multicast_receiver_error) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -378,7 +390,8 @@ TEST(udp_ports, multicast_receiver_error) { TEST(udp_ports, bidirectional) { packet::ConcurrentQueue queue(packet::ConcurrentQueue::Blocking); - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(packet_pool, buffer_pool, netio::NetworkLoop::DEFAULT_PRIORITY, + arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_udp_config("0.0.0.0", 0); diff --git a/src/tests/roc_rtcp/test_communicator.cpp b/src/tests/roc_rtcp/test_communicator.cpp index fe9f7d976..96b90164a 100644 --- a/src/tests/roc_rtcp/test_communicator.cpp +++ b/src/tests/roc_rtcp/test_communicator.cpp @@ -438,13 +438,17 @@ void expect_recv_report(const RecvReport& report, } } -packet::PacketPtr read_packet(packet::FifoQueue& source) { +packet::PacketPtr read_packet(packet::FifoQueue& source, + core::nanoseconds_t recv_ts = -1) { CHECK(source.size() != 0); packet::PacketPtr pp; LONGS_EQUAL(status::StatusOK, source.read(pp, packet::ModeFetch)); CHECK(pp); CHECK(pp->rtcp()); CHECK(pp->rtcp()->payload); + if (recv_ts >= 0) { + pp->udp()->receive_timestamp = recv_ts; + } roc_log(LogTrace, "delivering rtcp packet"); if (core::Logger::instance().get_level() >= LogTrace) { print_packet(pp->rtcp()->payload); @@ -633,14 +637,14 @@ TEST(communicator, one_sender_one_receiver) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -655,7 +659,7 @@ TEST(communicator, one_sender_one_receiver) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -678,7 +682,7 @@ TEST(communicator, one_sender_one_receiver) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed3)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); CHECK_EQUAL(1, send_comm.total_destinations()); @@ -700,19 +704,19 @@ TEST(communicator, two_senders_one_receiver) { packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send1_time = 10000000000000000; @@ -729,7 +733,7 @@ TEST(communicator, two_senders_one_receiver) { // Deliver sender 1 report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send1_queue), recv_time)); + recv_comm.process_packet(read_packet(send1_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -750,7 +754,7 @@ TEST(communicator, two_senders_one_receiver) { // Deliver sender 2 report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(2, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -776,15 +780,17 @@ TEST(communicator, two_senders_one_receiver) { // Deliver receiver report to sender 1 and 2 packet::PacketPtr pp = read_packet(recv_queue); + pp->udp()->receive_timestamp = send1_time; send1_part.set_send_report( make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed5)); - LONGS_EQUAL(status::StatusOK, send1_comm.process_packet(pp, send1_time)); + LONGS_EQUAL(status::StatusOK, send1_comm.process_packet(pp)); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); + pp->udp()->receive_timestamp = send2_time; send2_part.set_send_report( make_send_report(send2_time, Send2Cname, Send2Ssrc, Seed6)); - LONGS_EQUAL(status::StatusOK, send2_comm.process_packet(pp, send2_time)); + LONGS_EQUAL(status::StatusOK, send2_comm.process_packet(pp)); CHECK_EQUAL(1, send2_comm.total_streams()); CHECK_EQUAL(1, send2_comm.total_destinations()); @@ -810,20 +816,20 @@ TEST(communicator, one_sender_two_receivers) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv1_queue; MockParticipant recv1_part(Recv1Cname, Recv1Ssrc, Report_Back); Communicator recv1_comm(config, recv1_part, recv1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv1_comm.init_status()); packet::FifoQueue recv2_queue; MockParticipant recv2_part(Recv2Cname, Recv2Ssrc, Report_Back); Communicator recv2_comm(config, recv2_part, recv2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv2_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -839,10 +845,12 @@ TEST(communicator, one_sender_two_receivers) { // Deliver sender report to receiver 1 and 2 packet::PacketPtr pp = read_packet(send_queue); - LONGS_EQUAL(status::StatusOK, recv1_comm.process_packet(pp, recv1_time)); + pp->udp()->receive_timestamp = recv1_time; + LONGS_EQUAL(status::StatusOK, recv1_comm.process_packet(pp)); CHECK_EQUAL(1, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); - LONGS_EQUAL(status::StatusOK, recv2_comm.process_packet(pp, recv2_time)); + pp->udp()->receive_timestamp = recv2_time; + LONGS_EQUAL(status::StatusOK, recv2_comm.process_packet(pp)); CHECK_EQUAL(1, recv2_comm.total_streams()); CHECK_EQUAL(0, recv2_comm.total_destinations()); @@ -870,7 +878,7 @@ TEST(communicator, one_sender_two_receivers) { // Deliver receiver 1 report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed3)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv1_queue), send_time)); + send_comm.process_packet(read_packet(recv1_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); CHECK_EQUAL(1, send_comm.total_destinations()); @@ -893,7 +901,7 @@ TEST(communicator, one_sender_two_receivers) { // Deliver receiver 1 report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed5)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv2_queue), send_time)); + send_comm.process_packet(read_packet(recv2_queue, send_time))); CHECK_EQUAL(2, send_comm.total_streams()); CHECK_EQUAL(1, send_comm.total_destinations()); @@ -913,14 +921,14 @@ TEST(communicator, receiver_report_first) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -937,7 +945,7 @@ TEST(communicator, receiver_report_first) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed2)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); CHECK_EQUAL(1, send_comm.total_destinations()); @@ -960,7 +968,7 @@ TEST(communicator, receiver_report_first) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed3)); LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(1, recv_comm.total_destinations()); @@ -981,13 +989,13 @@ TEST(communicator, bidirectional_peers) { packet::FifoQueue peer1_queue; MockParticipant peer1_part(Peer1Cname, Peer1Ssrc, Report_ToAddress); Communicator peer1_comm(config, peer1_part, peer1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, peer1_comm.init_status()); packet::FifoQueue peer2_queue; MockParticipant peer2_part(Peer2Cname, Peer2Ssrc, Report_ToAddress); Communicator peer2_comm(config, peer2_part, peer2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, peer2_comm.init_status()); core::nanoseconds_t peer1_time = 10000000000000000; @@ -1005,7 +1013,7 @@ TEST(communicator, bidirectional_peers) { // Deliver report to peer 2 LONGS_EQUAL(status::StatusOK, - peer2_comm.process_packet(read_packet(peer1_queue), peer2_time)); + peer2_comm.process_packet(read_packet(peer1_queue, peer2_time))); CHECK_EQUAL(1, peer2_comm.total_streams()); CHECK_EQUAL(0, peer2_comm.total_destinations()); @@ -1033,7 +1041,7 @@ TEST(communicator, bidirectional_peers) { peer1_part.set_recv_report( 0, make_recv_report(peer1_time, Peer1Cname, Peer1Ssrc, Peer2Ssrc, Seed4)); LONGS_EQUAL(status::StatusOK, - peer1_comm.process_packet(read_packet(peer2_queue), peer1_time)); + peer1_comm.process_packet(read_packet(peer2_queue, peer1_time))); CHECK_EQUAL(1, peer1_comm.total_streams()); CHECK_EQUAL(1, peer1_comm.total_destinations()); @@ -1063,7 +1071,7 @@ TEST(communicator, bidirectional_peers) { peer2_part.set_recv_report( 0, make_recv_report(peer2_time, Peer2Cname, Peer2Ssrc, Peer1Ssrc, Seed6)); LONGS_EQUAL(status::StatusOK, - peer2_comm.process_packet(read_packet(peer1_queue), peer2_time)); + peer2_comm.process_packet(read_packet(peer1_queue, peer2_time))); CHECK_EQUAL(1, peer2_comm.total_streams()); CHECK_EQUAL(1, peer2_comm.total_destinations()); @@ -1094,25 +1102,25 @@ TEST(communicator, long_run) { packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); packet::FifoQueue recv1_queue; MockParticipant recv1_part(Recv1Cname, Recv1Ssrc, Report_Back); Communicator recv1_comm(config, recv1_part, recv1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv1_comm.init_status()); packet::FifoQueue recv2_queue; MockParticipant recv2_part(Recv2Cname, Recv2Ssrc, Report_Back); Communicator recv2_comm(config, recv2_part, recv2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv2_comm.init_status()); core::nanoseconds_t send1_time = 10000000000000000; @@ -1134,21 +1142,23 @@ TEST(communicator, long_run) { // Deliver sender 1 report to receiver 1 and 2 pp = read_packet(send1_queue); + pp->udp()->receive_timestamp = recv1_time; if (iter != 0) { recv1_part.set_recv_report( 0, make_recv_report(recv1_time, Recv1Cname, Recv1Ssrc, Send1Ssrc, seed)); recv1_part.set_recv_report( 1, make_recv_report(recv1_time, Recv1Cname, Recv1Ssrc, Send2Ssrc, seed)); } - LONGS_EQUAL(status::StatusOK, recv1_comm.process_packet(pp, recv1_time)); + LONGS_EQUAL(status::StatusOK, recv1_comm.process_packet(pp)); + pp->udp()->receive_timestamp = recv2_time; if (iter != 0) { recv2_part.set_recv_report( 0, make_recv_report(recv2_time, Recv2Cname, Recv2Ssrc, Send1Ssrc, seed)); recv2_part.set_recv_report( 1, make_recv_report(recv2_time, Recv2Cname, Recv2Ssrc, Send2Ssrc, seed)); } - LONGS_EQUAL(status::StatusOK, recv2_comm.process_packet(pp, recv2_time)); + LONGS_EQUAL(status::StatusOK, recv2_comm.process_packet(pp)); advance_time(send1_time); advance_time(send2_time); @@ -1163,22 +1173,23 @@ TEST(communicator, long_run) { // Deliver sender 2 report to receiver 1 and 2 pp = read_packet(send2_queue); - + pp->udp()->receive_timestamp = recv1_time; if (iter != 0) { recv1_part.set_recv_report( 0, make_recv_report(recv1_time, Recv1Cname, Recv1Ssrc, Send1Ssrc, seed)); recv1_part.set_recv_report( 1, make_recv_report(recv1_time, Recv1Cname, Recv1Ssrc, Send2Ssrc, seed)); } - LONGS_EQUAL(status::StatusOK, recv1_comm.process_packet(pp, recv1_time)); + LONGS_EQUAL(status::StatusOK, recv1_comm.process_packet(pp)); + pp->udp()->receive_timestamp = recv2_time; if (iter != 0) { recv2_part.set_recv_report( 0, make_recv_report(recv2_time, Recv2Cname, Recv2Ssrc, Send1Ssrc, seed)); recv2_part.set_recv_report( 1, make_recv_report(recv2_time, Recv2Cname, Recv2Ssrc, Send2Ssrc, seed)); } - LONGS_EQUAL(status::StatusOK, recv2_comm.process_packet(pp, recv2_time)); + LONGS_EQUAL(status::StatusOK, recv2_comm.process_packet(pp)); advance_time(send1_time); advance_time(send2_time); @@ -1196,13 +1207,15 @@ TEST(communicator, long_run) { // Deliver receiver 1 report to sender 1 and 2 pp = read_packet(recv1_queue); + pp->udp()->receive_timestamp = send1_time; send1_part.set_send_report( make_send_report(send1_time, Send1Cname, Send1Ssrc, seed)); - LONGS_EQUAL(status::StatusOK, send1_comm.process_packet(pp, send1_time)); + LONGS_EQUAL(status::StatusOK, send1_comm.process_packet(pp)); + pp->udp()->receive_timestamp = send2_time; send2_part.set_send_report( make_send_report(send2_time, Send2Cname, Send2Ssrc, seed)); - LONGS_EQUAL(status::StatusOK, send2_comm.process_packet(pp, send2_time)); + LONGS_EQUAL(status::StatusOK, send2_comm.process_packet(pp)); advance_time(send1_time); advance_time(send2_time); @@ -1220,13 +1233,15 @@ TEST(communicator, long_run) { // Deliver receiver 2 report to sender 1 and 2 pp = read_packet(recv2_queue); + pp->udp()->receive_timestamp = send1_time; send1_part.set_send_report( make_send_report(send1_time, Send1Cname, Send1Ssrc, seed)); - LONGS_EQUAL(status::StatusOK, send1_comm.process_packet(pp, send1_time)); + LONGS_EQUAL(status::StatusOK, send1_comm.process_packet(pp)); + pp->udp()->receive_timestamp = send2_time; send2_part.set_send_report( make_send_report(send2_time, Send2Cname, Send2Ssrc, seed)); - LONGS_EQUAL(status::StatusOK, send2_comm.process_packet(pp, send2_time)); + LONGS_EQUAL(status::StatusOK, send2_comm.process_packet(pp)); advance_time(send1_time); advance_time(send2_time); @@ -1282,14 +1297,14 @@ TEST(communicator, halt_goodbye) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -1304,7 +1319,7 @@ TEST(communicator, halt_goodbye) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1325,7 +1340,7 @@ TEST(communicator, halt_goodbye) { // Deliver sender goodbye to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(0, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1347,19 +1362,19 @@ TEST(communicator, halt_timeout) { packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, SendSsrc1, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, SendSsrc2, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send1_time = 10000000000000000; @@ -1381,7 +1396,7 @@ TEST(communicator, halt_timeout) { // Deliver sender 1 report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send1_queue), recv_time)); + recv_comm.process_packet(read_packet(send1_queue, recv_time))); CHECK_EQUAL(iter == 0 ? 1 : 2, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1404,7 +1419,7 @@ TEST(communicator, halt_timeout) { // Deliver sender 2 report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(2, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1427,7 +1442,7 @@ TEST(communicator, halt_timeout) { // Deliver sender 1 report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send1_queue), recv_time)); + recv_comm.process_packet(read_packet(send1_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1467,19 +1482,19 @@ TEST(communicator, halt_cname_change) { packet::FifoQueue send1_queue; MockParticipant send1_part(SendCnameA, SendSsrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(SendCnameB, SendSsrc, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -1494,7 +1509,7 @@ TEST(communicator, halt_cname_change) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send1_queue), recv_time)); + recv_comm.process_packet(read_packet(send1_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1515,7 +1530,7 @@ TEST(communicator, halt_cname_change) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1543,7 +1558,7 @@ TEST(communicator, cname_comes_earlier) { packet::FifoQueue send1_queue; MockParticipant send1_part(SendCname, SendSsrc, Report_ToAddress); Communicator send1_comm(send1_config, send1_part, send1_queue, composer, - packet_factory, arena); + packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); Config send2_config; @@ -1554,14 +1569,14 @@ TEST(communicator, cname_comes_earlier) { packet::FifoQueue send2_queue; MockParticipant send2_part(NoCname, SendSsrc, Report_ToAddress); Communicator send2_comm(send2_config, send2_part, send2_queue, composer, - packet_factory, arena); + packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); Config recv_config; packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -1576,7 +1591,7 @@ TEST(communicator, cname_comes_earlier) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send1_queue), recv_time)); + recv_comm.process_packet(read_packet(send1_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1595,7 +1610,7 @@ TEST(communicator, cname_comes_earlier) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1622,7 +1637,7 @@ TEST(communicator, cname_comes_later) { packet::FifoQueue send1_queue; MockParticipant send1_part(NoCname, SendSsrc, Report_ToAddress); Communicator send1_comm(send1_config, send1_part, send1_queue, composer, - packet_factory, arena); + packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); Config send2_config; @@ -1633,14 +1648,14 @@ TEST(communicator, cname_comes_later) { packet::FifoQueue send2_queue; MockParticipant send2_part(SendCname, SendSsrc, Report_ToAddress); Communicator send2_comm(send2_config, send2_part, send2_queue, composer, - packet_factory, arena); + packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); Config recv_config; packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -1655,7 +1670,7 @@ TEST(communicator, cname_comes_later) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send1_queue), recv_time)); + recv_comm.process_packet(read_packet(send1_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1675,7 +1690,7 @@ TEST(communicator, cname_comes_later) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); CHECK_EQUAL(0, recv_comm.total_destinations()); @@ -1703,20 +1718,20 @@ TEST(communicator, collision_send_report) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrcA, Report_ToAddress); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); core::nanoseconds_t recv_time = 10000000000000000; @@ -1734,7 +1749,7 @@ TEST(communicator, collision_send_report) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -1764,7 +1779,7 @@ TEST(communicator, collision_send_report) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrcA, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(2, recv_comm.total_streams()); CHECK_EQUAL(1, recv_comm.total_destinations()); @@ -1795,7 +1810,7 @@ TEST(communicator, collision_send_report) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(0, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -1819,7 +1834,7 @@ TEST(communicator, collision_send_report) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -1847,20 +1862,20 @@ TEST(communicator, collision_recv_report) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrcA, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv1_queue; MockParticipant recv1_part(Recv1Cname, Recv1Ssrc, Report_ToAddress); Communicator recv1_comm(config, recv1_part, recv1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv1_comm.init_status()); packet::FifoQueue recv2_queue; MockParticipant recv2_part(Recv2Cname, Recv2Ssrc, Report_ToAddress); Communicator recv2_comm(config, recv2_part, recv2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv2_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -1876,7 +1891,7 @@ TEST(communicator, collision_recv_report) { // Deliver report from sender to receiver 1 LONGS_EQUAL(status::StatusOK, - recv1_comm.process_packet(read_packet(send_queue), recv1_time)); + recv1_comm.process_packet(read_packet(send_queue, recv1_time))); CHECK_EQUAL(1, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); @@ -1908,7 +1923,7 @@ TEST(communicator, collision_recv_report) { // same SSRC as sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrcA, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv2_queue), send_time)); + send_comm.process_packet(read_packet(recv2_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); CHECK_EQUAL(1, send_comm.total_destinations()); @@ -1937,7 +1952,7 @@ TEST(communicator, collision_recv_report) { // Deliver report from sender to receiver 1 LONGS_EQUAL(status::StatusOK, - recv1_comm.process_packet(read_packet(send_queue), recv1_time)); + recv1_comm.process_packet(read_packet(send_queue, recv1_time))); CHECK_EQUAL(0, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); @@ -1959,7 +1974,7 @@ TEST(communicator, collision_recv_report) { // Deliver report from sender to receiver 1 LONGS_EQUAL(status::StatusOK, - recv1_comm.process_packet(read_packet(send_queue), recv1_time)); + recv1_comm.process_packet(read_packet(send_queue, recv1_time))); CHECK_EQUAL(1, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); @@ -1989,19 +2004,19 @@ TEST(communicator, collision_unrelated_recv_report) { packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1SsrcA, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue recv1_queue; MockParticipant recv1_part(Recv1Cname, Recv1Ssrc, Report_ToAddress); Communicator recv1_comm(config, recv1_part, recv1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv1_comm.init_status()); packet::FifoQueue recv2_queue; MockParticipant recv2_part(Recv2Cname, Recv2Ssrc, Report_ToAddress); Communicator recv2_comm(config, recv2_part, recv2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv2_comm.init_status()); core::nanoseconds_t send1_time = 10000000000000000; @@ -2018,7 +2033,7 @@ TEST(communicator, collision_unrelated_recv_report) { // Deliver report from sender 1 to receiver 1 LONGS_EQUAL(status::StatusOK, - recv1_comm.process_packet(read_packet(send1_queue), recv1_time)); + recv1_comm.process_packet(read_packet(send1_queue, recv1_time))); CHECK_EQUAL(1, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); @@ -2051,7 +2066,7 @@ TEST(communicator, collision_unrelated_recv_report) { send1_part.set_send_report( make_send_report(send1_time, Send1Cname, Send1SsrcA, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv2_queue), send1_time)); + send1_comm.process_packet(read_packet(recv2_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -2078,7 +2093,7 @@ TEST(communicator, collision_unrelated_recv_report) { send1_part.set_send_report( make_send_report(send1_time, Send1Cname, Send1SsrcB, Seed)); LONGS_EQUAL(status::StatusOK, - recv1_comm.process_packet(read_packet(send1_queue), recv1_time)); + recv1_comm.process_packet(read_packet(send1_queue, recv1_time))); CHECK_EQUAL(0, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); @@ -2101,7 +2116,7 @@ TEST(communicator, collision_unrelated_recv_report) { // Deliver report from sender 1 to receiver 1 LONGS_EQUAL(status::StatusOK, - recv1_comm.process_packet(read_packet(send1_queue), recv1_time)); + recv1_comm.process_packet(read_packet(send1_queue, recv1_time))); CHECK_EQUAL(1, recv1_comm.total_streams()); CHECK_EQUAL(0, recv1_comm.total_destinations()); @@ -2129,14 +2144,14 @@ TEST(communicator, collision_sdes_different_cname) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrcA, Report_ToAddress); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); Config send2_config; @@ -2147,7 +2162,7 @@ TEST(communicator, collision_sdes_different_cname) { packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(send2_config, send2_part, send2_queue, composer, - packet_factory, arena); + packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); core::nanoseconds_t recv_time = 10000000000000000; @@ -2165,7 +2180,7 @@ TEST(communicator, collision_sdes_different_cname) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -2195,7 +2210,7 @@ TEST(communicator, collision_sdes_different_cname) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrcA, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(2, recv_comm.total_streams()); CHECK_EQUAL(1, recv_comm.total_destinations()); @@ -2224,7 +2239,7 @@ TEST(communicator, collision_sdes_different_cname) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(0, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -2248,7 +2263,7 @@ TEST(communicator, collision_sdes_different_cname) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -2276,14 +2291,14 @@ TEST(communicator, collision_sdes_same_cname) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); Config send2_config; @@ -2294,7 +2309,7 @@ TEST(communicator, collision_sdes_same_cname) { packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(send2_config, send2_part, send2_queue, composer, - packet_factory, arena); + packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); core::nanoseconds_t recv_time = 10000000000000000; @@ -2312,7 +2327,7 @@ TEST(communicator, collision_sdes_same_cname) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -2338,7 +2353,7 @@ TEST(communicator, collision_sdes_same_cname) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send2_queue), recv_time)); + recv_comm.process_packet(read_packet(send2_queue, recv_time))); CHECK_EQUAL(2, recv_comm.total_streams()); CHECK_EQUAL(1, recv_comm.total_destinations()); @@ -2364,7 +2379,7 @@ TEST(communicator, collision_sdes_same_cname) { // Deliver report from receiver to sender 1 send1_part.set_send_report(make_send_report(send1_time, Send1Cname, Send1Ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - send1_comm.process_packet(read_packet(recv_queue), send1_time)); + send1_comm.process_packet(read_packet(recv_queue, send1_time))); CHECK_EQUAL(1, send1_comm.total_streams()); CHECK_EQUAL(1, send1_comm.total_destinations()); @@ -2386,13 +2401,13 @@ TEST(communicator, network_loop) { packet::FifoQueue local_queue; MockParticipant local_part(LocalCname, LocalSsrc, Report_ToAddress); Communicator local_comm(config, local_part, local_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, local_comm.init_status()); packet::FifoQueue remote_queue; MockParticipant remote_part(RemoteCname, RemoteSsrc, Report_ToAddress); Communicator remote_comm(config, remote_part, remote_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, remote_comm.init_status()); core::nanoseconds_t local_time = 10000000000000000; @@ -2407,7 +2422,7 @@ TEST(communicator, network_loop) { // Deliver report to remote peer LONGS_EQUAL(status::StatusOK, - remote_comm.process_packet(read_packet(local_queue), remote_time)); + remote_comm.process_packet(read_packet(local_queue, remote_time))); // Check notifications on remote peer CHECK_EQUAL(1, remote_part.pending_notifications()); @@ -2430,7 +2445,7 @@ TEST(communicator, network_loop) { local_part.set_recv_report( 0, make_recv_report(local_time, LocalCname, LocalSsrc, RemoteSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - local_comm.process_packet(read_packet(remote_queue), local_time)); + local_comm.process_packet(read_packet(remote_queue, local_time))); // Check notifications on local peer CHECK_EQUAL(2, local_part.pending_notifications()); @@ -2451,7 +2466,7 @@ TEST(communicator, network_loop) { // Loop report back to local peer LONGS_EQUAL(status::StatusOK, - local_comm.process_packet(read_packet(local_queue), local_time)); + local_comm.process_packet(read_packet(local_queue, local_time))); // Expect no notifications CHECK_EQUAL(0, local_part.pending_notifications()); @@ -2492,14 +2507,14 @@ TEST(communicator, missing_sender_sdes) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(send_config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); Config recv_config; packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2513,7 +2528,7 @@ TEST(communicator, missing_sender_sdes) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); // Check notifications on receiver @@ -2534,7 +2549,7 @@ TEST(communicator, missing_receiver_sdes) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(send_config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); Config recv_config; @@ -2544,7 +2559,7 @@ TEST(communicator, missing_receiver_sdes) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2560,7 +2575,7 @@ TEST(communicator, missing_receiver_sdes) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); // Check notifications on sender @@ -2585,14 +2600,14 @@ TEST(communicator, missing_sender_sr) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(send_config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); Config recv_config; packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2606,7 +2621,7 @@ TEST(communicator, missing_sender_sr) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); // Check notifications on receiver @@ -2626,7 +2641,7 @@ TEST(communicator, missing_receiver_rr) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(send_config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); Config recv_config; @@ -2636,7 +2651,7 @@ TEST(communicator, missing_receiver_rr) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2652,7 +2667,7 @@ TEST(communicator, missing_receiver_rr) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); // Check notifications on sender @@ -2675,14 +2690,14 @@ TEST(communicator, missing_sender_xr) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(send_config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); Config recv_config; packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2696,7 +2711,7 @@ TEST(communicator, missing_sender_xr) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); // Check notifications on receiver @@ -2718,7 +2733,7 @@ TEST(communicator, missing_receiver_xr) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(send_config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); Config recv_config; @@ -2728,7 +2743,7 @@ TEST(communicator, missing_receiver_xr) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(recv_config, recv_part, recv_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2744,7 +2759,7 @@ TEST(communicator, missing_receiver_xr) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); CHECK_EQUAL(1, send_comm.total_streams()); // Check notifications on sender @@ -2766,7 +2781,7 @@ TEST(communicator, split_sender_report) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(config, send_part, send_queue, composer, small_packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2787,7 +2802,7 @@ TEST(communicator, split_sender_report) { packet::FifoQueue recv_queue; MockParticipant recv_part(recv_cname, recv_ssrc, Report_ToAddress); Communicator recv_comm(config, recv_part, recv_queue, composer, - small_packet_factory, arena); + small_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); // Generate receiver report @@ -2799,7 +2814,7 @@ TEST(communicator, split_sender_report) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); // Check notifications on sender CHECK_EQUAL(1, send_part.pending_notifications()); @@ -2823,7 +2838,7 @@ TEST(communicator, split_sender_report) { packet::FifoQueue recv_queue; MockParticipant recv_part(recv_cname, recv_ssrc, Report_ToAddress); Communicator recv_comm(config, recv_part, recv_queue, composer, small_packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); // Deliver sender report packets to one of the receivers @@ -2833,7 +2848,7 @@ TEST(communicator, split_sender_report) { recv_part.set_recv_report( 0, make_recv_report(recv_time, recv_cname, recv_ssrc, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); } CHECK_EQUAL(1, recv_comm.total_streams()); @@ -2858,13 +2873,13 @@ TEST(communicator, split_receiver_report) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); Communicator send_comm(config, send_part, send_queue, composer, small_packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(config, recv_part, recv_queue, composer, small_packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -2887,7 +2902,7 @@ TEST(communicator, split_receiver_report) { send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); } CHECK_EQUAL(1, send_comm.total_streams()); @@ -2911,7 +2926,7 @@ TEST(communicator, split_bidirectional_report) { packet::FifoQueue local_queue; MockParticipant local_part(local_cname, LocalSsrc, Report_ToAddress); Communicator local_comm(config, local_part, local_queue, composer, - small_packet_factory, arena); + small_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, local_comm.init_status()); core::nanoseconds_t local_time = 10000000000000000; @@ -2933,7 +2948,7 @@ TEST(communicator, split_bidirectional_report) { packet::FifoQueue remote_queue; MockParticipant remote_part(remote_cname, remote_ssrc, Report_ToAddress); Communicator remote_comm(config, remote_part, remote_queue, composer, - small_packet_factory, arena); + small_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, remote_comm.init_status()); // Generate remote peer report @@ -2946,7 +2961,7 @@ TEST(communicator, split_bidirectional_report) { local_part.set_send_report( make_send_report(local_time, local_cname, LocalSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - local_comm.process_packet(read_packet(remote_queue), local_time)); + local_comm.process_packet(read_packet(remote_queue, local_time))); // Check notifications on local peer CHECK_EQUAL(1, local_part.pending_notifications()); @@ -2976,7 +2991,7 @@ TEST(communicator, split_bidirectional_report) { packet::FifoQueue remote_queue; MockParticipant remote_part(remote_cname, remote_ssrc, Report_ToAddress); Communicator remote_comm(config, remote_part, remote_queue, composer, - small_packet_factory, arena); + small_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, remote_comm.init_status()); // Deliver local peer report packets to one of the remote peers @@ -2986,7 +3001,7 @@ TEST(communicator, split_bidirectional_report) { remote_part.set_send_report( make_send_report(remote_time, remote_cname, remote_ssrc, Seed)); LONGS_EQUAL(status::StatusOK, - remote_comm.process_packet(read_packet(local_queue), remote_time)); + remote_comm.process_packet(read_packet(local_queue, remote_time))); } CHECK_EQUAL(1, remote_comm.total_streams()); @@ -3018,20 +3033,20 @@ TEST(communicator, report_to_address_sender) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); send_part.set_report_address(send_dest_addr); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv1_queue; MockParticipant recv1_part(Recv1Cname, Recv1Ssrc, Report_ToAddress); Communicator recv1_comm(config, recv1_part, recv1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv1_comm.init_status()); packet::FifoQueue recv2_queue; MockParticipant recv2_part(Recv2Cname, Recv2Ssrc, Report_ToAddress); Communicator recv2_comm(config, recv2_part, recv2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv2_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -3068,10 +3083,10 @@ TEST(communicator, report_to_address_sender) { CHECK_EQUAL(1, recv1_queue.size()); // Deliver receiver 1 report to sender - pp = read_packet(recv1_queue); + pp = read_packet(recv1_queue, send_time); set_src_address(pp, recv1_addr); send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); CHECK_EQUAL(1, send_comm.total_streams()); // Check notifications on sender @@ -3110,10 +3125,10 @@ TEST(communicator, report_to_address_sender) { CHECK_EQUAL(1, recv2_queue.size()); // Deliver receiver 2 report to sender - pp = read_packet(recv2_queue); + pp = read_packet(recv2_queue, send_time); set_src_address(pp, recv2_addr); send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); CHECK_EQUAL(2, send_comm.total_streams()); // Check notifications on sender @@ -3155,8 +3170,8 @@ TEST(communicator, report_to_address_receiver) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); recv_part.set_report_address(recv_dest_addr); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t recv_time = 10000000000000000; @@ -3199,20 +3214,20 @@ TEST(communicator, report_back_sender) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_Back); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv1_queue; MockParticipant recv1_part(Recv1Cname, Recv1Ssrc, Report_ToAddress); Communicator recv1_comm(config, recv1_part, recv1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv1_comm.init_status()); packet::FifoQueue recv2_queue; MockParticipant recv2_part(Recv2Cname, Recv2Ssrc, Report_ToAddress); Communicator recv2_comm(config, recv2_part, recv2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, recv2_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -3241,10 +3256,10 @@ TEST(communicator, report_back_sender) { CHECK_EQUAL(1, recv1_queue.size()); // Deliver receiver 1 report to sender - pp = read_packet(recv1_queue); + pp = read_packet(recv1_queue, send_time); set_src_address(pp, recv1_addr); send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); CHECK_EQUAL(1, send_comm.total_streams()); // Check notifications on sender @@ -3282,10 +3297,10 @@ TEST(communicator, report_back_sender) { CHECK_EQUAL(1, recv2_queue.size()); // Deliver receiver 2 report to sender - pp = read_packet(recv2_queue); + pp = read_packet(recv2_queue, send_time); set_src_address(pp, recv2_addr); send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); CHECK_EQUAL(2, send_comm.total_streams()); // Check notifications on sender @@ -3335,20 +3350,20 @@ TEST(communicator, report_back_receiver) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); core::nanoseconds_t recv_time = 10000000000000000; @@ -3379,13 +3394,13 @@ TEST(communicator, report_back_receiver) { CHECK_EQUAL(1, send1_queue.size()); // Deliver sender 1 report to receiver - pp = read_packet(send1_queue); + pp = read_packet(send1_queue, recv_time); set_src_address(pp, send1_addr); recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, Send1Ssrc, Seed)); recv_part.set_recv_report( 1, make_recv_report(recv_time, RecvCname, RecvSsrc, Send2Ssrc, Seed)); - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); CHECK_EQUAL(2, recv_comm.total_streams()); // Check notifications on receiver @@ -3425,13 +3440,13 @@ TEST(communicator, report_back_receiver) { CHECK_EQUAL(1, send2_queue.size()); // Deliver sender 2 report to receiver - pp = read_packet(send2_queue); + pp = read_packet(send2_queue, recv_time); set_src_address(pp, send2_addr); recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, Send1Ssrc, Seed)); recv_part.set_recv_report( 1, make_recv_report(recv_time, RecvCname, RecvSsrc, Send2Ssrc, Seed)); - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); CHECK_EQUAL(2, recv_comm.total_streams()); // Check notifications on receiver @@ -3486,26 +3501,26 @@ TEST(communicator, report_back_combine_reports) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); packet::FifoQueue send1_queue; MockParticipant send1_part(Send1Cname, Send1Ssrc, Report_ToAddress); Communicator send1_comm(config, send1_part, send1_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send1_comm.init_status()); packet::FifoQueue send2_queue; MockParticipant send2_part(Send2Cname, Send2Ssrc, Report_ToAddress); Communicator send2_comm(config, send2_part, send2_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send2_comm.init_status()); packet::FifoQueue send3_queue; MockParticipant send3_part(Send3Cname, Send3Ssrc, Report_ToAddress); Communicator send3_comm(config, send3_part, send3_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send3_comm.init_status()); core::nanoseconds_t recv_time = 10000000000000000; @@ -3521,9 +3536,9 @@ TEST(communicator, report_back_combine_reports) { CHECK_EQUAL(1, send1_queue.size()); // Deliver sender 1 report to receiver - pp = read_packet(send1_queue); + pp = read_packet(send1_queue, recv_time); set_src_address(pp, send1_addr); - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); CHECK_EQUAL(1, recv_comm.total_streams()); // Check notifications on receiver @@ -3542,9 +3557,9 @@ TEST(communicator, report_back_combine_reports) { CHECK_EQUAL(1, send2_queue.size()); // Deliver sender 2 report to receiver - pp = read_packet(send2_queue); + pp = read_packet(send2_queue, recv_time); set_src_address(pp, send2_addr); - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); CHECK_EQUAL(2, recv_comm.total_streams()); // Check notifications on receiver @@ -3563,9 +3578,9 @@ TEST(communicator, report_back_combine_reports) { CHECK_EQUAL(1, send3_queue.size()); // Deliver sender 3 report to receiver - pp = read_packet(send3_queue); + pp = read_packet(send3_queue, recv_time); set_src_address(pp, send3_addr); - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); CHECK_EQUAL(3, recv_comm.total_streams()); // Check notifications on receiver @@ -3630,7 +3645,7 @@ TEST(communicator, report_back_split_reports) { packet::FifoQueue local_queue; MockParticipant local_part(local_cname, LocalSsrc, Report_Back); Communicator local_comm(config, local_part, local_queue, composer, - small_packet_factory, arena); + small_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, local_comm.init_status()); core::nanoseconds_t local_time = 10000000000000000; @@ -3650,7 +3665,7 @@ TEST(communicator, report_back_split_reports) { packet::FifoQueue remote_queue; MockParticipant remote_part(remote_cname, remote_ssrc, Report_ToAddress); Communicator remote_comm(config, remote_part, remote_queue, composer, - small_packet_factory, arena); + small_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, remote_comm.init_status()); // Generate remote peer report @@ -3660,9 +3675,9 @@ TEST(communicator, report_back_split_reports) { CHECK_EQUAL(1, remote_queue.size()); // Deliver remote peer report to local peer - packet::PacketPtr pp = read_packet(remote_queue); + packet::PacketPtr pp = read_packet(remote_queue, local_time); set_src_address(pp, group_addr[n_grp]); - LONGS_EQUAL(status::StatusOK, local_comm.process_packet(pp, local_time)); + LONGS_EQUAL(status::StatusOK, local_comm.process_packet(pp)); // Check notifications on local peer CHECK_EQUAL(1, local_part.pending_notifications()); @@ -3732,14 +3747,14 @@ TEST(communicator, rtt) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -3760,7 +3775,7 @@ TEST(communicator, rtt) { 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); { // Check metrics on receiver @@ -3796,7 +3811,7 @@ TEST(communicator, rtt) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); { // Check metrics on sender @@ -3833,17 +3848,19 @@ TEST(communicator, rtt_clock_drift) { const core::nanoseconds_t Drift = 1 * core::Millisecond; Config config; + config.rtt.rtt_winlen = 1; // Disable smoothing + config.rtt.clock_offset_winlen = 1; packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -3864,7 +3881,7 @@ TEST(communicator, rtt_clock_drift) { 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); { // Check metrics on receiver @@ -3892,7 +3909,7 @@ TEST(communicator, rtt_clock_drift) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); { // Check metrics on sender @@ -3927,14 +3944,14 @@ TEST(communicator, rtt_network_jitter) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -3959,7 +3976,7 @@ TEST(communicator, rtt_network_jitter) { 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); { // Check metrics on receiver @@ -3986,7 +4003,7 @@ TEST(communicator, rtt_network_jitter) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); { // Check metrics on sender @@ -4020,14 +4037,14 @@ TEST(communicator, rtt_network_losses) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -4049,14 +4066,14 @@ TEST(communicator, rtt_network_losses) { advance_time(recv_time, Rtt / 2); // Deliver sender report to receiver - pp = read_packet(send_queue); + pp = read_packet(send_queue, recv_time); if (!loss_send_report) { if (iter != 0) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); // Check metrics on receiver const SendReport report = recv_part.next_send_notification(); @@ -4080,12 +4097,12 @@ TEST(communicator, rtt_network_losses) { advance_time(recv_time, Rtt / 2); // Deliver receiver report to sender - pp = read_packet(recv_queue); + pp = read_packet(recv_queue, send_time); if (!loss_recv_report) { send_part.set_send_report( make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); // Check metrics on sender const RecvReport report = send_part.next_recv_notification(); @@ -4120,14 +4137,14 @@ TEST(communicator, rtt_network_delays) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -4152,14 +4169,14 @@ TEST(communicator, rtt_network_delays) { // Deliver sender reports to receiver if (!start_send_delay && send_delay_countdown == 0) { while (send_queue.size() != 0) { - packet::PacketPtr pp = read_packet(send_queue); + packet::PacketPtr pp = read_packet(send_queue, recv_time); if (iter != 0) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); // Check metrics on receiver const SendReport report = recv_part.next_send_notification(); @@ -4193,11 +4210,11 @@ TEST(communicator, rtt_network_delays) { // Deliver receiver reports to sender if (!start_recv_delay && recv_delay_countdown == 0) { while (recv_queue.size() != 0) { - packet::PacketPtr pp = read_packet(recv_queue); + packet::PacketPtr pp = read_packet(recv_queue, send_time); send_part.set_send_report( make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); // Check metrics on sender const RecvReport report = send_part.next_recv_notification(); @@ -4238,14 +4255,14 @@ TEST(communicator, rtt_network_reordering) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -4279,14 +4296,14 @@ TEST(communicator, rtt_network_reordering) { } while (send_queue.size() != 0) { - packet::PacketPtr pp = read_packet(send_queue); + packet::PacketPtr pp = read_packet(send_queue, recv_time); if (iter != 0) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); // Check metrics on receiver const SendReport report = recv_part.next_send_notification(); @@ -4328,11 +4345,11 @@ TEST(communicator, rtt_network_reordering) { } while (recv_queue.size() != 0) { - packet::PacketPtr pp = read_packet(recv_queue); + packet::PacketPtr pp = read_packet(recv_queue, send_time); send_part.set_send_report( make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); // Check metrics on sender const RecvReport report = send_part.next_recv_notification(); @@ -4374,14 +4391,14 @@ TEST(communicator, rtt_network_duplicates) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -4418,13 +4435,13 @@ TEST(communicator, rtt_network_duplicates) { // Deliver sender reports to receiver while (send_queue.size() != 0) { - pp = read_packet(send_queue); + pp = read_packet(send_queue, recv_time); if (iter != 0) { recv_part.set_recv_report( 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } - LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp, recv_time)); + LONGS_EQUAL(status::StatusOK, recv_comm.process_packet(pp)); // Check metrics on receiver const SendReport report = recv_part.next_send_notification(); @@ -4462,11 +4479,11 @@ TEST(communicator, rtt_network_duplicates) { // Deliver receiver reports to sender while (recv_queue.size() != 0) { - pp = read_packet(recv_queue); + pp = read_packet(recv_queue, send_time); send_part.set_send_report( make_send_report(send_time, SendCname, SendSsrc, Seed)); - LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp, send_time)); + LONGS_EQUAL(status::StatusOK, send_comm.process_packet(pp)); // Check metrics on sender const RecvReport report = send_part.next_recv_notification(); @@ -4504,14 +4521,14 @@ TEST(communicator, rtt_missing_xr) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_Back); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = SendStartTime; @@ -4532,7 +4549,7 @@ TEST(communicator, rtt_missing_xr) { 0, make_recv_report(recv_time, RecvCname, RecvSsrc, SendSsrc, Seed)); } LONGS_EQUAL(status::StatusOK, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); { // Check metrics on receiver @@ -4556,7 +4573,7 @@ TEST(communicator, rtt_missing_xr) { // Deliver receiver report to sender send_part.set_send_report(make_send_report(send_time, SendCname, SendSsrc, Seed)); LONGS_EQUAL(status::StatusOK, - send_comm.process_packet(read_packet(recv_queue), send_time)); + send_comm.process_packet(read_packet(recv_queue, send_time))); { // Check metrics on sender @@ -4581,7 +4598,7 @@ TEST(communicator, generation_error) { packet::FifoQueue peer_queue; MockParticipant peer_part(Cname, Ssrc, Report_ToAddress); Communicator peer_comm(config, peer_part, peer_queue, composer, packet_factory, - peer_arena); + peer_arena, NULL); LONGS_EQUAL(status::StatusOK, peer_comm.init_status()); core::nanoseconds_t peer_time = 10000000000000000; @@ -4604,7 +4621,7 @@ TEST(communicator, generation_error) { MockWriter peer_writer(status::StatusDrain); MockParticipant peer_part(Cname, Ssrc, Report_ToAddress); Communicator peer_comm(config, peer_part, peer_writer, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, peer_comm.init_status()); core::nanoseconds_t peer_time = 10000000000000000; @@ -4619,7 +4636,7 @@ TEST(communicator, generation_error) { MockParticipant peer_part(Cname, Ssrc, Report_ToAddress); // factory creates unreasonably small buffers Communicator peer_comm(config, peer_part, peer_queue, composer, - tiny_packet_factory, arena); + tiny_packet_factory, arena, NULL); LONGS_EQUAL(status::StatusOK, peer_comm.init_status()); core::nanoseconds_t peer_time = 10000000000000000; @@ -4643,7 +4660,7 @@ TEST(communicator, processing_error) { packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - recv_arena); + recv_arena, NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -4667,7 +4684,7 @@ TEST(communicator, processing_error) { packet::FifoQueue send_queue; MockParticipant send_part(send_cname, send_ssrc, Report_ToAddress); Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + arena, NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); // Generate sender report @@ -4679,7 +4696,7 @@ TEST(communicator, processing_error) { // Deliver sender report to receiver const status::StatusCode status = - recv_comm.process_packet(read_packet(send_queue), recv_time); + recv_comm.process_packet(read_packet(send_queue, recv_time)); if (status == status::StatusOK) { // Check notifications on receiver @@ -4712,14 +4729,14 @@ TEST(communicator, notification_error) { packet::FifoQueue send_queue; MockParticipant send_part(SendCname, SendSsrc, Report_ToAddress); - Communicator send_comm(config, send_part, send_queue, composer, packet_factory, - arena); + Communicator send_comm(config, send_part, send_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, send_comm.init_status()); packet::FifoQueue recv_queue; MockParticipant recv_part(RecvCname, RecvSsrc, Report_ToAddress); - Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, - arena); + Communicator recv_comm(config, recv_part, recv_queue, composer, packet_factory, arena, + NULL); LONGS_EQUAL(status::StatusOK, recv_comm.init_status()); core::nanoseconds_t send_time = 10000000000000000; @@ -4736,7 +4753,7 @@ TEST(communicator, notification_error) { // Deliver sender report to receiver LONGS_EQUAL(status::StatusDrain, - recv_comm.process_packet(read_packet(send_queue), recv_time)); + recv_comm.process_packet(read_packet(send_queue, recv_time))); CHECK_EQUAL(1, recv_comm.total_streams()); // Check notifications on receiver diff --git a/src/tools/roc_recv/cmdline.ggo b/src/tools/roc_recv/cmdline.ggo index ceb411e14..fbaed2148 100644 --- a/src/tools/roc_recv/cmdline.ggo +++ b/src/tools/roc_recv/cmdline.ggo @@ -5,6 +5,8 @@ option "verbose" v "Increase verbosity level (may be used multiple times)" multiple optional option "color" - "Set colored logging mode for stderr output" values="auto","always","never" default="auto" enum optional +option "real-time" - "Set realtime priority for timing sensitive threads, 0-99 Requires root privileges." + int typestr="INTEGER" optional default="0" option "list-supported" L "List supported protocols, formats, etc." optional diff --git a/src/tools/roc_recv/main.cpp b/src/tools/roc_recv/main.cpp index 91cafc290..f60fae558 100644 --- a/src/tools/roc_recv/main.cpp +++ b/src/tools/roc_recv/main.cpp @@ -83,6 +83,14 @@ bool build_io_config(const gengetopt_args_info& args, sndio::IoConfig& io_config bool build_context_config(const gengetopt_args_info& args, const sndio::IoConfig& io_config, node::ContextConfig& context_config) { + if (args.real_time_arg != 0) { + if (args.real_time_arg < 0 || args.real_time_arg >= 100) { + roc_log(LogError, "invalid --real-time: should be in range [0..99]"); + return false; + } + context_config.realtime_prio = args.real_time_arg; + } + if (args.max_packet_size_given) { if (!core::parse_size(args.max_packet_size_arg, context_config.max_packet_size)) { roc_log(LogError, "invalid --max-packet-size: bad format"); @@ -703,7 +711,7 @@ int main(int argc, char** argv) { return 1; } - const status::StatusCode status = pump.run(); + const status::StatusCode status = pump.run(args.real_time_arg); if (status != status::StatusOK) { roc_log(LogError, "io pump failed: status=%s", status::code_to_str(status)); return 1; diff --git a/src/tools/roc_send/cmdline.ggo b/src/tools/roc_send/cmdline.ggo index b5e12ff78..76aaff145 100644 --- a/src/tools/roc_send/cmdline.ggo +++ b/src/tools/roc_send/cmdline.ggo @@ -5,6 +5,8 @@ option "verbose" v "Increase verbosity level (may be used multiple times)" multiple optional option "color" - "Set colored logging mode for stderr output" values="auto","always","never" default="auto" enum optional +option "real-time" - "Set realtime priority for timing sensitive threads, 0-99 Requires root privileges." + int typestr="INTEGER" optional default="0" option "list-supported" L "List supported protocols, formats, etc." optional diff --git a/src/tools/roc_send/main.cpp b/src/tools/roc_send/main.cpp index 4a3d6100a..d318864e4 100644 --- a/src/tools/roc_send/main.cpp +++ b/src/tools/roc_send/main.cpp @@ -82,6 +82,14 @@ bool build_io_config(const gengetopt_args_info& args, sndio::IoConfig& io_config bool build_context_config(const gengetopt_args_info& args, const sndio::IoConfig& io_config, node::ContextConfig& context_config) { + if (args.real_time_arg != 0) { + if (args.real_time_arg < 0 || args.real_time_arg >= 100) { + roc_log(LogError, "invalid --real-time: should be in range [0..99]"); + return false; + } + context_config.realtime_prio = args.real_time_arg; + } + if (args.max_packet_size_given) { if (!core::parse_size(args.max_packet_size_arg, context_config.max_packet_size)) { roc_log(LogError, "invalid --max-packet-size: bad format"); @@ -613,7 +621,7 @@ int main(int argc, char** argv) { return 1; } - const status::StatusCode status = pump.run(); + const status::StatusCode status = pump.run(args.real_time_arg); if (status != status::StatusOK) { roc_log(LogError, "io pump failed: status=%s", status::code_to_str(status)); return 1; From 2bf7513f830960613f554f4d0b0a1c77b5e62059 Mon Sep 17 00:00:00 2001 From: Mikhail Baranov Date: Wed, 19 Mar 2025 01:08:52 +0100 Subject: [PATCH 2/2] Fix race in NetworkLoop --- .../roc_netio/target_libuv/roc_netio/network_loop.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp index 27173bedd..5dc32111d 100644 --- a/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp +++ b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_loop.cpp @@ -148,9 +148,11 @@ NetworkLoop::NetworkLoop(core::IPool& packet_pool, return; } - while (init_status_ == status::NoStatus) { + { core::Mutex::Lock lock(thr_init_mutex_); - thr_init_cond_.wait(); + while (init_status_ == status::NoStatus) { + thr_init_cond_.wait(); + } } }