diff --git a/src/internal_modules/roc_audio/latency_monitor.cpp b/src/internal_modules/roc_audio/latency_monitor.cpp index 06926f2c4..a9050b53f 100644 --- a/src/internal_modules/roc_audio/latency_monitor.cpp +++ b/src/internal_modules/roc_audio/latency_monitor.cpp @@ -34,6 +34,7 @@ LatencyMonitor::LatencyMonitor(IFrameReader& frame_reader, , fec_reader_(fec_reader) , resampler_(resampler) , enable_scaling_(latency_config.tuner_profile != audio::LatencyTunerProfile_Intact) + , current_time_(0) , capture_ts_(0) , packet_sample_spec_(packet_sample_spec) , frame_sample_spec_(frame_sample_spec) @@ -86,6 +87,14 @@ status::StatusCode LatencyMonitor::read(Frame& frame, return status::StatusOK; } +void LatencyMonitor::refresh(const core::nanoseconds_t current_time) { + roc_panic_if(init_status_ != status::StatusOK); + + // this method is called before reading next frame + // now we know current time and can use it to compute metrics + current_time_ = current_time; +} + void LatencyMonitor::reclock(const core::nanoseconds_t playback_timestamp) { roc_panic_if(init_status_ != status::StatusOK); @@ -146,10 +155,8 @@ void LatencyMonitor::compute_niq_latency_() { // compute delay since last packet const core::nanoseconds_t rts = latest_packet->receive_timestamp(); - const core::nanoseconds_t now = core::timestamp(core::ClockUnix); - - if (rts > 0 && rts < now) { - latency_metrics_.niq_stalling = now - rts; + if (rts > 0 && rts < current_time_) { + latency_metrics_.niq_stalling = current_time_ - rts; } } diff --git a/src/internal_modules/roc_audio/latency_monitor.h b/src/internal_modules/roc_audio/latency_monitor.h index 974a00d63..06242325c 100644 --- a/src/internal_modules/roc_audio/latency_monitor.h +++ b/src/internal_modules/roc_audio/latency_monitor.h @@ -85,6 +85,13 @@ class LatencyMonitor : public IFrameReader, public core::NonCopyable<> { virtual ROC_NODISCARD status::StatusCode read(Frame& frame, packet::stream_timestamp_t duration, FrameReadMode mode); + //! Report current time. + //! @remarks + //! Pipeline invokes this method before reading each frame. + //! Until it's invoked for the first time, metrics that need current + //! time (like niq_stalling) are not computed. + void refresh(core::nanoseconds_t current_time); + //! Report playback timestamp of last frame returned by read. //! @remarks //! Pipeline invokes this method after adding last frame to @@ -117,6 +124,7 @@ class LatencyMonitor : public IFrameReader, public core::NonCopyable<> { ResamplerReader* resampler_; const bool enable_scaling_; + core::nanoseconds_t current_time_; core::nanoseconds_t capture_ts_; const SampleSpec packet_sample_spec_; 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..f07c41771 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,15 @@ 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(LogDebug, "thread: setting realtime priority to %d", sched_prio); 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_config.h b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_config.h new file mode 100644 index 000000000..d9a87ab26 --- /dev/null +++ b/src/internal_modules/roc_netio/target_libuv/roc_netio/network_config.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2026 Roc Streaming authors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +//! @file roc_netio/target_libuv/roc_netio/network_config.h +//! @brief Network loop config. + +#ifndef ROC_NETIO_NETWORK_CONFIG_H_ +#define ROC_NETIO_NETWORK_CONFIG_H_ + +#include "roc_core/stddefs.h" + +namespace roc { +namespace netio { + +//! Network loop config. +struct NetworkConfig { + //! Priority of the network thread. + //! @remarks + //! If non-zero, network thread is switched to real-time scheduling policy + //! with this priority. Should be in range [0; 99]. Requires privileges. + int realtime_prio; + + //! Initialize. + NetworkConfig() + : realtime_prio(0) { + } +}; + +} // namespace netio +} // namespace roc + +#endif // ROC_NETIO_NETWORK_CONFIG_H_ 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 25a5c8cac..5ee79c199 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 @@ -110,12 +110,15 @@ NetworkLoop::Tasks::ResolveEndpointAddress::get_address() const { return resolve_req_.resolved_address; } -NetworkLoop::NetworkLoop(core::IPool& packet_pool, +NetworkLoop::NetworkLoop(const NetworkConfig& net_config, + core::IPool& packet_pool, core::IPool& buffer_pool, core::IArena& arena) - : packet_factory_(packet_pool, buffer_pool) + : net_config_(net_config) + , packet_factory_(packet_pool, buffer_pool) , arena_(arena) , started_(false) + , thr_init_cond_(thr_init_mutex_) , loop_initialized_(false) , stop_sem_initialized_(false) , task_sem_initialized_(false) @@ -148,12 +151,19 @@ NetworkLoop::NetworkLoop(core::IPool& packet_pool, task_sem_.data = this; task_sem_initialized_ = true; + roc_panic_if(init_status_ != status::NoStatus); + if (!(started_ = Thread::start())) { init_status_ = status::StatusErrThread; return; } - init_status_ = status::StatusOK; + { + core::Mutex::Lock lock(thr_init_mutex_); + while (init_status_ == status::NoStatus) { + thr_init_cond_.wait(); + } + } } NetworkLoop::~NetworkLoop() { @@ -289,6 +299,22 @@ void NetworkLoop::handle_resolved(ResolverRequest& req) { void NetworkLoop::run() { roc_log(LogDebug, "network loop: starting event loop"); + if (net_config_.realtime_prio > 0 + && !Thread::enable_realtime(net_config_.realtime_prio)) { + core::Mutex::Lock lock(thr_init_mutex_); + + roc_log(LogError, + "network loop: can't elevate realtime priority, may need to be root"); + init_status_ = status::StatusErrThread; + thr_init_cond_.signal(); + } else { + core::Mutex::Lock lock(thr_init_mutex_); + + roc_log(LogNote, "network loop: elevated realtime priority"); + init_status_ = status::StatusOK; + thr_init_cond_.signal(); + } + int err = uv_run(&loop_, UV_RUN_DEFAULT); if (err != 0) { roc_log(LogInfo, "network loop: uv_run() returned non-zero"); 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 cbfb1d564..561bdaf02 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" @@ -32,6 +33,7 @@ #include "roc_netio/iconn_handler.h" #include "roc_netio/inetwork_task_completer.h" #include "roc_netio/iterminate_handler.h" +#include "roc_netio/network_config.h" #include "roc_netio/network_task.h" #include "roc_netio/resolver.h" #include "roc_netio/tcp_connection_port.h" @@ -196,7 +198,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(const NetworkConfig& net_config, + core::IPool& packet_pool, + core::IPool& buffer_pool, + core::IArena& arena); //! Destroy. Stop all receivers and senders. //! @remarks @@ -255,11 +260,15 @@ class NetworkLoop : private ITerminateHandler, void task_remove_port_(NetworkTask&); void task_resolve_endpoint_address_(NetworkTask&); + const NetworkConfig net_config_; packet::PacketFactory packet_factory_; 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..71dba4a55 100644 --- a/src/internal_modules/roc_node/context.cpp +++ b/src/internal_modules/roc_node/context.cpp @@ -13,6 +13,16 @@ namespace roc { namespace node { +namespace { + +netio::NetworkConfig make_network_config(const ContextConfig& config) { + netio::NetworkConfig net_config; + net_config.realtime_prio = config.realtime_prio; + return net_config; +} + +} // namespace + Context::Context(const ContextConfig& config, core::IArena& arena) : arena_(arena) , packet_pool_("packet_pool", arena_) @@ -23,7 +33,8 @@ 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_( + make_network_config(config), packet_pool_, packet_buffer_pool_, 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..a39a56c91 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 privileges. + 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..52bf03402 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 receive_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 = receive_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..927e372f7 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 receive_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 = receive_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.cpp b/src/internal_modules/roc_pipeline/receiver_session.cpp index f1c52b109..ae8a6b6b3 100644 --- a/src/internal_modules/roc_pipeline/receiver_session.cpp +++ b/src/internal_modules/roc_pipeline/receiver_session.cpp @@ -296,6 +296,8 @@ status::StatusCode ReceiverSession::refresh(core::nanoseconds_t current_time, return fail_status_; } + latency_monitor_->refresh(current_time); + return status::StatusOK; } 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/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_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..cbde10593 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) { } }; @@ -46,12 +58,12 @@ struct RttMetrics { //! Round-trip time estimator. //! Created inside rtcp::Reporter for each RTP stream. -//! Continously computes RTT and clock offset based on LSR/DLSR +//! Continuously computes RTT and clock offset based on LSR/DLSR //! or LRR/DLRR timestamps. 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_config.h b/src/internal_modules/roc_sndio/io_config.h index f4aee8a1c..998213cd9 100644 --- a/src/internal_modules/roc_sndio/io_config.h +++ b/src/internal_modules/roc_sndio/io_config.h @@ -31,11 +31,18 @@ struct IoConfig { //! Duration of the internal frames, in nanoseconds. core::nanoseconds_t frame_length; + //! Priority of the thread running the I/O pump. + //! @remarks + //! If non-zero, pump thread is switched to real-time scheduling policy + //! with this priority. Should be in range [0; 99]. Requires privileges. + int realtime_prio; + //! Initialize. IoConfig() : sample_spec() , latency(0) - , frame_length(0) { + , frame_length(0) + , realtime_prio(0) { } }; diff --git a/src/internal_modules/roc_sndio/io_pump.cpp b/src/internal_modules/roc_sndio/io_pump.cpp index 6ae8a527c..e937b2390 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 { @@ -33,6 +34,7 @@ IoPump::IoPump(core::IPool& frame_pool, , current_source_(&source) , sink_(sink) , sample_spec_(io_config.sample_spec) + , realtime_prio_(io_config.realtime_prio) , frame_size_(0) , frame_duration_(0) , mode_(mode) @@ -70,6 +72,14 @@ status::StatusCode IoPump::init_status() const { status::StatusCode IoPump::run() { roc_log(LogDebug, "io pump: starting main loop"); + if (realtime_prio_ > 0 && !core::Thread::enable_realtime(realtime_prio_)) { + roc_log(LogError, + "io pump: can't elevate realtime priority, may need to be root"); + return status::StatusErrThread; + } else { + roc_log(LogNote, "io pump: elevated realtime priority"); + } + status::StatusCode code = status::NoStatus; for (;;) { diff --git a/src/internal_modules/roc_sndio/io_pump.h b/src/internal_modules/roc_sndio/io_pump.h index d7c059301..130c458a1 100644 --- a/src/internal_modules/roc_sndio/io_pump.h +++ b/src/internal_modules/roc_sndio/io_pump.h @@ -81,6 +81,7 @@ class IoPump : public core::NonCopyable<> { ISink& sink_; const audio::SampleSpec sample_spec_; + const int realtime_prio_; audio::FramePtr frame_; size_t frame_size_; diff --git a/src/tests/public_api/test_helpers/proxy.h b/src/tests/public_api/test_helpers/proxy.h index e123d18c5..4fd9f5fa9 100644 --- a/src/tests/public_api/test_helpers/proxy.h +++ b/src/tests/public_api/test_helpers/proxy.h @@ -41,7 +41,7 @@ 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_(netio::NetworkConfig(), packet_pool_, buffer_pool_, 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..0d86ca1d8 100644 --- a/src/tests/roc_netio/test_resolve.cpp +++ b/src/tests/roc_netio/test_resolve.cpp @@ -24,6 +24,8 @@ core::HeapArena arena; core::SlabPool buffer_pool("buffer_pool", arena, MaxBufSize); core::SlabPool packet_pool("packet_pool", arena); +NetworkConfig network_config; + bool resolve_endpoint_address(NetworkLoop& net_loop, const address::NetworkUri& endpoint_uri, address::SocketAddr& result_address) { @@ -43,7 +45,7 @@ bool resolve_endpoint_address(NetworkLoop& net_loop, TEST_GROUP(resolve) {}; TEST(resolve, ipv4) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -57,7 +59,7 @@ TEST(resolve, ipv4) { } TEST(resolve, ipv6) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -71,7 +73,7 @@ TEST(resolve, ipv6) { } TEST(resolve, hostname) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -91,7 +93,7 @@ TEST(resolve, hostname) { } TEST(resolve, standard_port) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); address::NetworkUri endpoint_uri(arena); @@ -104,7 +106,7 @@ TEST(resolve, standard_port) { } TEST(resolve, bad_host) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, 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..050879811 100644 --- a/src/tests/roc_netio/test_tasks.cpp +++ b/src/tests/roc_netio/test_tasks.cpp @@ -27,6 +27,8 @@ core::HeapArena arena; core::SlabPool buffer_pool("buffer_pool", arena, MaxBufSize); core::SlabPool packet_pool("packet_pool", arena); +NetworkConfig network_config; + UdpConfig make_receiver_config(const char* ip, int port) { UdpConfig config; CHECK(config.bind_address.set_host_port(address::Family_IPv4, ip, port)); @@ -150,7 +152,7 @@ class AddRemoveCompleter : public INetworkTaskCompleter { TEST_GROUP(tasks) {}; TEST(tasks, synchronous_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); @@ -167,7 +169,7 @@ TEST(tasks, synchronous_add) { } TEST(tasks, synchronous_add_recv_remove) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); @@ -195,7 +197,7 @@ TEST(tasks, synchronous_add_recv_remove) { } TEST(tasks, asynchronous_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig config = make_receiver_config("127.0.0.1", 0); @@ -216,7 +218,7 @@ TEST(tasks, asynchronous_add) { } TEST(tasks, asynchronous_add_recv_remove) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, 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..380b93cf2 100644 --- a/src/tests/roc_netio/test_tcp_io.cpp +++ b/src/tests/roc_netio/test_tcp_io.cpp @@ -30,6 +30,8 @@ core::HeapArena arena; core::SlabPool buffer_pool("buffer_pool", arena, MaxBufSize); core::SlabPool packet_pool("packet_pool", arena); +NetworkConfig network_config; + TcpServerConfig make_server_config(const char* ip, int port) { TcpServerConfig config; CHECK(config.bind_address.set_host_port(address::Family_IPv4, ip, port) @@ -98,7 +100,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -137,7 +139,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -185,10 +187,10 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, client_net_loop.init_status()); - NetworkLoop server_net_loop(packet_pool, buffer_pool, arena); + NetworkLoop server_net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, server_net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -231,7 +233,7 @@ 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(network_config, packet_pool, buffer_pool, 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..022151047 100644 --- a/src/tests/roc_netio/test_tcp_ports.cpp +++ b/src/tests/roc_netio/test_tcp_ports.cpp @@ -28,6 +28,8 @@ core::HeapArena arena; core::SlabPool buffer_pool("buffer_pool", arena, MaxBufSize); core::SlabPool packet_pool("packet_pool", arena); +NetworkConfig network_config; + address::SocketAddr make_address(const char* ip, int port) { address::SocketAddr address; CHECK(address.set_host_port(address::Family_IPv4, ip, port) @@ -147,7 +149,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UNSIGNED_LONGS_EQUAL(0, net_loop.num_ports()); @@ -160,7 +162,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("0.0.0.0", 0); @@ -207,7 +209,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -254,7 +256,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop1.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -283,7 +285,7 @@ TEST(tcp_ports, add_addrinuse) { POINTERS_EQUAL(server_conn, acceptor.wait_added()); - NetworkLoop net_loop2(packet_pool, buffer_pool, arena); + NetworkLoop net_loop2(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop2.init_status()); UNSIGNED_LONGS_EQUAL(0, net_loop2.num_ports()); @@ -306,7 +308,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -352,7 +354,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -382,7 +384,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -424,7 +426,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -489,13 +491,13 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop_client1.init_status()); - NetworkLoop net_loop_client2(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_client2(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop_client2.init_status()); - NetworkLoop net_loop_server(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_server(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop_server.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -562,7 +564,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config1 = make_server_config("127.0.0.1", 0); @@ -631,10 +633,10 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop_client.init_status()); - NetworkLoop net_loop_server(packet_pool, buffer_pool, arena); + NetworkLoop net_loop_server(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop_server.init_status()); TcpServerConfig server_config1 = make_server_config("127.0.0.1", 0); @@ -698,7 +700,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -738,7 +740,7 @@ TEST(tcp_ports, acceptor_error) { test::MockConnAcceptor acceptor; - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -789,7 +791,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -840,7 +842,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -892,7 +894,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); TcpServerConfig server_config = make_server_config("127.0.0.1", 0); @@ -943,7 +945,7 @@ 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(network_config, packet_pool, buffer_pool, 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..4ca346dff 100644 --- a/src/tests/roc_netio/test_udp_io.cpp +++ b/src/tests/roc_netio/test_udp_io.cpp @@ -32,6 +32,8 @@ core::SlabPool packet::PacketFactory packet_factory(packet_pool, buffer_pool); +NetworkConfig network_config; + void short_delay() { core::sleep_for(core::ClockMonotonic, core::Microsecond * 500); } @@ -205,7 +207,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); packet::IWriter* tx_writer = NULL; @@ -232,7 +234,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); packet::IWriter* tx_writer = NULL; @@ -259,14 +261,14 @@ 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(network_config, packet_pool, buffer_pool, 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, rx_loop.init_status()); CHECK(add_udp_receiver(rx_loop, rx_config, rx_queue)); @@ -293,18 +295,18 @@ 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(network_config, packet_pool, buffer_pool, 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(network_config, packet_pool, buffer_pool, 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(network_config, packet_pool, buffer_pool, 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 +340,14 @@ TEST(udp_io, many_senders_one_receiver) { UdpConfig rx_config = make_udp_config(); - NetworkLoop tx1_loop(packet_pool, buffer_pool, arena); + NetworkLoop tx1_loop(network_config, packet_pool, buffer_pool, 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, tx23_loop.init_status()); packet::IWriter* tx_writer2 = NULL; @@ -356,7 +358,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, rx_loop.init_status()); CHECK(add_udp_receiver(rx_loop, rx_config, rx_queue)); @@ -400,7 +402,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); packet::IWriter* peer1_tx_writer = NULL; @@ -444,10 +446,10 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, peer1_net_loop.init_status()); - NetworkLoop peer2_net_loop(packet_pool, buffer_pool, arena); + NetworkLoop peer2_net_loop(network_config, packet_pool, buffer_pool, 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..68f7292a7 100644 --- a/src/tests/roc_netio/test_udp_ports.cpp +++ b/src/tests/roc_netio/test_udp_ports.cpp @@ -25,6 +25,8 @@ core::HeapArena arena; core::SlabPool buffer_pool("buffer_pool", arena, MaxBufSize); core::SlabPool packet_pool("packet_pool", arena); +NetworkConfig network_config; + UdpConfig make_udp_config(const char* ip, int port) { UdpConfig config; CHECK(config.bind_address.set_host_port(address::Family_IPv4, ip, port) @@ -79,7 +81,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -88,7 +90,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -116,7 +118,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -147,7 +149,7 @@ TEST(udp_ports, add_start_remove) { } TEST(udp_ports, add_remove_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -165,7 +167,7 @@ TEST(udp_ports, add_remove_add) { } TEST(udp_ports, add_start_remove_add) { - NetworkLoop net_loop(packet_pool, buffer_pool, arena); + NetworkLoop net_loop(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -188,7 +190,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("0.0.0.0", 0); @@ -217,7 +219,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); UdpConfig tx_config = make_udp_config("127.0.0.1", 0); @@ -246,7 +248,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop1.init_status()); UdpConfig tx_config = make_udp_config("127.0.0.1", 0); @@ -271,7 +273,7 @@ TEST(udp_ports, addrinuse) { LONGS_EQUAL(2, net_loop1.num_ports()); - NetworkLoop net_loop2(packet_pool, buffer_pool, arena); + NetworkLoop net_loop2(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop2.init_status()); LONGS_EQUAL(0, net_loop2.num_ports()); @@ -286,7 +288,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -304,7 +306,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -336,7 +338,7 @@ 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(network_config, packet_pool, buffer_pool, arena); LONGS_EQUAL(status::StatusOK, net_loop.init_status()); LONGS_EQUAL(0, net_loop.num_ports()); @@ -378,7 +380,7 @@ 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(network_config, packet_pool, buffer_pool, 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..76d2c7598 100644 --- a/src/tools/roc_recv/cmdline.ggo +++ b/src/tools/roc_recv/cmdline.ggo @@ -86,6 +86,11 @@ section "Memory options" option "max-frame-size" - "Maximum I/O and processing frame size, SIZE units" typestr="SIZE" string optional +section "Perf options" + + option "real-time" - "Set realtime priority for timing sensitive threads, needs root" + int typestr="INT(0-99)" optional default="0" + section "Debugging options" option "prof" - "Enable self-profiling" flag off diff --git a/src/tools/roc_recv/main.cpp b/src/tools/roc_recv/main.cpp index 7071c18ee..982f0e381 100644 --- a/src/tools/roc_recv/main.cpp +++ b/src/tools/roc_recv/main.cpp @@ -77,12 +77,22 @@ bool build_io_config(const gengetopt_args_info& args, sndio::IoConfig& io_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; + } + io_config.realtime_prio = args.real_time_arg; + } + return true; } bool build_context_config(const gengetopt_args_info& args, const sndio::IoConfig& io_config, node::ContextConfig& context_config) { + context_config.realtime_prio = io_config.realtime_prio; + 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"); diff --git a/src/tools/roc_send/cmdline.ggo b/src/tools/roc_send/cmdline.ggo index b5e12ff78..2b56a0fe9 100644 --- a/src/tools/roc_send/cmdline.ggo +++ b/src/tools/roc_send/cmdline.ggo @@ -75,6 +75,11 @@ section "Memory options" option "max-frame-size" - "Maximum I/O and processing frame size, SIZE units" typestr="SIZE" string optional +section "Perf options" + + option "real-time" - "Set realtime priority for timing sensitive threads, needs root" + int typestr="INT(0-99)" optional default="0" + section "Debugging options" option "prof" - "Enable self-profiling" flag off diff --git a/src/tools/roc_send/main.cpp b/src/tools/roc_send/main.cpp index f31e51854..da2064511 100644 --- a/src/tools/roc_send/main.cpp +++ b/src/tools/roc_send/main.cpp @@ -76,12 +76,22 @@ bool build_io_config(const gengetopt_args_info& args, sndio::IoConfig& io_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; + } + io_config.realtime_prio = args.real_time_arg; + } + return true; } bool build_context_config(const gengetopt_args_info& args, const sndio::IoConfig& io_config, node::ContextConfig& context_config) { + context_config.realtime_prio = io_config.realtime_prio; + 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");