From f15db24c785da1481f3c66d857395189e6125b7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 08:50:26 -0500 Subject: [PATCH 01/38] Update libloading requirement from 0.7 to 0.8 (#203) Updates the requirements on [libloading](https://github.com/nagisa/rust_libloading) to permit the latest version. - [Release notes](https://github.com/nagisa/rust_libloading/releases) - [Commits](https://github.com/nagisa/rust_libloading/compare/0.7.0...0.8.0) --- updated-dependencies: - dependency-name: libloading dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- srt-tokio/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index 135816cd..783a58af 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -44,7 +44,7 @@ version = "0.1" anyhow = "1" lazy_static = "1" libc = "0.2" -libloading = "0.7" +libloading = "0.8" rand = "0.8" rand_distr = "0.4" assert_matches = "1.0.0" From 755eb36dda04bb50e4bd32d1ab80a8411c287a98 Mon Sep 17 00:00:00 2001 From: Caleb Leinz Date: Sat, 1 Apr 2023 15:21:14 -0700 Subject: [PATCH 02/38] Add additional TryFrom implementations for SocketAddress --- srt-protocol/src/options/address.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/srt-protocol/src/options/address.rs b/srt-protocol/src/options/address.rs index 235d8071..0088699e 100644 --- a/srt-protocol/src/options/address.rs +++ b/srt-protocol/src/options/address.rs @@ -1,4 +1,5 @@ use std::{ + borrow::Cow, convert::{TryFrom, TryInto}, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, num::ParseIntError, @@ -17,6 +18,22 @@ pub struct SocketAddress { pub port: u16, } +impl<'a> TryFrom> for SocketAddress { + type Error = SocketAddressParseError; + + fn try_from(value: Cow<'a, str>) -> Result { + TryFrom::try_from(value.as_ref()) + } +} + +impl TryFrom for SocketAddress { + type Error = SocketAddressParseError; + + fn try_from(value: String) -> Result { + TryFrom::try_from(value.as_ref()) + } +} + impl TryFrom<&str> for SocketAddress { type Error = SocketAddressParseError; From f81bf6d30739e96a27fd8c558c1433d8e7da2888 Mon Sep 17 00:00:00 2001 From: nipierre Date: Sat, 15 Apr 2023 13:59:26 +0200 Subject: [PATCH 03/38] fix: use more robust dns resolution Issue: #201 --- srt-tokio/Cargo.toml | 1 + srt-tokio/src/net.rs | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index 783a58af..c1de980a 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -14,6 +14,7 @@ version = "0.4.1" bytes = "1" rand = "0.8" socket2 = "0.5" +trust-dns-resolver = "0.22.0" [dependencies.ac-ffmpeg] optional = true diff --git a/srt-tokio/src/net.rs b/srt-tokio/src/net.rs index 7e703cfe..cec617df 100644 --- a/srt-tokio/src/net.rs +++ b/srt-tokio/src/net.rs @@ -3,7 +3,10 @@ use std::{ error, fmt::{Debug, Display, Formatter}, io::{self, Cursor, ErrorKind}, - net::SocketAddr, + net::{ + IpAddr::{V4, V6}, + SocketAddr, + }, sync::Arc, }; @@ -13,6 +16,7 @@ use futures::{channel::mpsc, prelude::*}; use socket2::{Domain, Protocol, Socket, Type}; use srt_protocol::packet::{Packet, ReceivePacketResult}; use tokio::net::UdpSocket; +use trust_dns_resolver::TokioAsyncResolver; use crate::options::*; @@ -41,12 +45,22 @@ pub async fn bind_socket(options: &SocketOptions) -> Result Result { use SocketHost::*; let mut remote_address = match &remote.host { - Domain(domain) => tokio::net::lookup_host(domain) - .await? - .next() - .ok_or_else(|| { + Domain(domain) => { + let resolver = TokioAsyncResolver::tokio_from_system_conf().map_err(|e| { + io::Error::new( + ErrorKind::NotFound, + format!("Cannot load DNS resolver from system configuration: {}", e), + ) + })?; + let response = resolver.lookup_ip(domain).await?; + let address = response.iter().next().ok_or_else(|| { io::Error::new(ErrorKind::NotFound, OptionsError::InvalidRemoteAddress) - })?, + })?; + match address { + V4(ipv4) => SocketAddr::new((ipv4).into(), 0), + V6(ipv6) => SocketAddr::new((ipv6).into(), 0), + } + } Ipv4(ipv4) => SocketAddr::new((*ipv4).into(), 0), Ipv6(ipv6) => SocketAddr::new((*ipv6).into(), 0), }; From f0af8a9d6ad885848605ae5c0d51704abec285d4 Mon Sep 17 00:00:00 2001 From: nipierre Date: Sun, 16 Apr 2023 18:25:07 +0200 Subject: [PATCH 04/38] tests: add test for dns resolution --- srt-tokio/src/net.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/srt-tokio/src/net.rs b/srt-tokio/src/net.rs index cec617df..27f50e77 100644 --- a/srt-tokio/src/net.rs +++ b/srt-tokio/src/net.rs @@ -150,3 +150,22 @@ impl Display for PacketStreamClosedError { } impl error::Error for PacketStreamClosedError {} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::Ipv4Addr; + + #[tokio::test] + async fn resolve_dns() { + let socket_address = SocketAddress { + host: SocketHost::Domain("localhost".to_string()), + port: 3000, + }; + let remote_host = lookup_remote_host(&socket_address).await.unwrap(); + assert_eq!( + remote_host, + SocketAddr::new(V4(Ipv4Addr::new(127, 0, 0, 1)), 3000) + ); + } +} From b34cfa43e844e58d5952f4c5d551f81d3640d409 Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Mon, 19 Jun 2023 22:05:25 -0500 Subject: [PATCH 05/38] update deps --- srt-c/Cargo.toml | 2 +- srt-protocol/Cargo.toml | 2 +- srt-tokio/Cargo.toml | 2 +- srt-transmit/Cargo.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/srt-c/Cargo.toml b/srt-c/Cargo.toml index 20db05c8..4168b35f 100644 --- a/srt-c/Cargo.toml +++ b/srt-c/Cargo.toml @@ -19,7 +19,7 @@ futures = "0.3" log = "0.4" thiserror = "1" os_socketaddr = "0.2.4" -pretty_env_logger = "0.4" +pretty_env_logger = "0.5" bitflags = "2" console-subscriber = { version = "0.1", optional = true } diff --git a/srt-protocol/Cargo.toml b/srt-protocol/Cargo.toml index 8e518698..36bfe2c7 100644 --- a/srt-protocol/Cargo.toml +++ b/srt-protocol/Cargo.toml @@ -45,7 +45,7 @@ rand_distr = "0.4.2" [dev-dependencies.pretty_env_logger] default-features = false -version = "0.4.0" +version = "0.5.0" [features] default = [] diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index c1de980a..348f9111 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -52,7 +52,7 @@ assert_matches = "1.0.0" [dev-dependencies.pretty_env_logger] default-features = false -version = "0.4" +version = "0.5" [dev-dependencies.tokio] features = ["rt-multi-thread"] diff --git a/srt-transmit/Cargo.toml b/srt-transmit/Cargo.toml index c4b9c09d..4ed662a4 100644 --- a/srt-transmit/Cargo.toml +++ b/srt-transmit/Cargo.toml @@ -18,7 +18,7 @@ log = { version = "0.4", default-features = false } url = "2.3.1" # https://github.com/servo/rust-url/issues/581 bytes = "1.0" anyhow = "1" -pretty_env_logger = { version = "0.4", default-features = false } +pretty_env_logger = { version = "0.5", default-features = false } futures = { version = "0.3", default-features = false, features = ["std", "async-await"] } console-subscriber = { version = "0.1", optional = true } From 7c9937cea5901e3222a70086f5af14bb8f476a0e Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Mon, 19 Jun 2023 22:19:49 -0500 Subject: [PATCH 06/38] fix srt-transmit logging --- srt-transmit/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/srt-transmit/src/main.rs b/srt-transmit/src/main.rs index 45ede0ae..ca750f39 100644 --- a/srt-transmit/src/main.rs +++ b/srt-transmit/src/main.rs @@ -592,6 +592,7 @@ async fn main() { async fn run() -> Result<(), Error> { pretty_env_logger::formatted_builder() + .parse_default_env() // .format(|buf, record| writeln!(buf, "{} [{}] {}", record.args())) .format_timestamp_micros() .init(); From 7de1999d42bf8405383fde327f593f40f9f9840f Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Tue, 20 Jun 2023 00:31:51 -0500 Subject: [PATCH 07/38] implement peeridletimeout correctly --- srt-protocol/src/connection/mod.rs | 61 ++++++++++--------- srt-protocol/src/connection/status.rs | 14 ++--- srt-protocol/src/listener/input.rs | 1 - .../src/protocol/pending_connection/hsv5.rs | 2 + srt-protocol/src/protocol/time/mod.rs | 14 ++--- srt-protocol/src/settings/connection.rs | 2 + srt-transmit/src/helptext.txt | 1 + srt-transmit/src/main.rs | 19 +++--- 8 files changed, 63 insertions(+), 51 deletions(-) diff --git a/srt-protocol/src/connection/mod.rs b/srt-protocol/src/connection/mod.rs index dd735668..4d375ae6 100644 --- a/srt-protocol/src/connection/mod.rs +++ b/srt-protocol/src/connection/mod.rs @@ -62,6 +62,8 @@ pub struct ConnectionSettings { pub send_tsbpd_latency: Duration, pub recv_tsbpd_latency: Duration, + pub peer_idle_timeout: Duration, + /// Size of the receive buffer, in packets pub recv_buffer_size: PacketCount, /// Size of the send buffer, in packets @@ -108,12 +110,13 @@ pub enum Input { impl DuplexConnection { pub fn new(connection: Connection) -> DuplexConnection { let settings = connection.settings; + DuplexConnection { settings: settings.clone(), handshake: connection.handshake, output: Output::new(&settings), status: ConnectionStatus::new(settings.send_tsbpd_latency * 2), // the timeout should be larger than latency as otherwise packets that have just arrived definitely have a change to flush - timers: Timers::new(settings.socket_start_time, settings.statistics_interval), + timers: Timers::new(settings.socket_start_time, settings.statistics_interval, settings.peer_idle_timeout), stats: SocketStatistics::new(), receiver: Receiver::new(settings.clone()), sender: Sender::new(settings), @@ -164,35 +167,34 @@ impl DuplexConnection { } pub fn next_packet(&mut self, now: Instant) -> Option<(Packet, SocketAddr)> { - self.output.pop_packet().map(|p| { - self.stats.tx_all_packets += 1; - self.stats.tx_all_bytes += u64::try_from(p.wire_size()).unwrap(); - - // payload length + (20 bytes IPv4 + 8 bytes UDP + 16 bytes SRT) - match &p { - Packet::Data(d) => { - self.stats.tx_data += 1; - self.stats.tx_bytes += u64::try_from(d.wire_size()).unwrap(); - } - Packet::Control(c) => match c.control_type { - ControlTypes::Ack(ref a) => { - self.stats.tx_ack += 1; - if matches!(a, Acknowledgement::Lite(_)) { - self.stats.tx_light_ack += 1; - } - } - ControlTypes::Nak(_) => { - self.stats.tx_nak += 1; - } - ControlTypes::Ack2(_) => { - self.stats.tx_ack2 += 1; - } - _ => {} - }, + let p = self.output.pop_packet()?; + self.stats.tx_all_packets += 1; + self.stats.tx_all_bytes += u64::try_from(p.wire_size()).unwrap(); + + // payload length + (20 bytes IPv4 + 8 bytes UDP + 16 bytes SRT) + match &p { + Packet::Data(d) => { + self.stats.tx_data += 1; + self.stats.tx_bytes += u64::try_from(d.wire_size()).unwrap(); } - self.debug(now, "send", &p); - (p, self.settings.remote) - }) + Packet::Control(c) => match c.control_type { + ControlTypes::Ack(ref a) => { + self.stats.tx_ack += 1; + if matches!(a, Acknowledgement::Lite(_)) { + self.stats.tx_light_ack += 1; + } + } + ControlTypes::Nak(_) => { + self.stats.tx_nak += 1; + } + ControlTypes::Ack2(_) => { + self.stats.tx_ack2 += 1; + } + _ => {} + }, + } + self.debug(now, "send", &p); + Some((p, self.settings.remote)) } pub fn next_data(&mut self, now: Instant) -> Option<(Instant, Bytes)> { @@ -477,6 +479,7 @@ mod duplex_connection { stream_id: None, bandwidth: LiveBandwidthMode::Unlimited, statistics_interval: Duration::from_secs(10), + peer_idle_timeout: Duration::from_secs(5), }, handshake: crate::protocol::handshake::Handshake::Connector, } diff --git a/srt-protocol/src/connection/status.rs b/srt-protocol/src/connection/status.rs index d6bbdcbc..becd0fa4 100644 --- a/srt-protocol/src/connection/status.rs +++ b/srt-protocol/src/connection/status.rs @@ -6,9 +6,9 @@ use crate::settings::SocketId; #[derive(Debug, Clone, Eq, PartialEq)] enum Status { - Open(Duration), - Shutdown(Instant), - Drain(Instant), + Open(Duration), // (flush_timeout) + Shutdown(Instant), // (flush_deadline) + Drain(Instant), // (drain_deadline) Closed, } @@ -20,11 +20,11 @@ pub struct ConnectionStatus { } impl ConnectionStatus { - pub fn new(timeout: Duration) -> Self { + pub fn new(flush_timeout: Duration) -> Self { Self { - connection: Status::Open(timeout), - receiver: Status::Open(timeout), - sender: Status::Open(timeout), + connection: Status::Open(flush_timeout), + receiver: Status::Open(flush_timeout), + sender: Status::Open(flush_timeout), } } diff --git a/srt-protocol/src/listener/input.rs b/srt-protocol/src/listener/input.rs index 1f300d63..d26569f5 100644 --- a/srt-protocol/src/listener/input.rs +++ b/srt-protocol/src/listener/input.rs @@ -50,7 +50,6 @@ pub struct NextInputContext(Option); impl NextInputContext { pub fn for_action(action: &Action) -> Self { - use crate::listener::Action::{Close, WaitForInput}; use Action::*; let context = match action { SendPacket((_, address)) => Some(ResultOf::SendPacket(*address)), diff --git a/srt-protocol/src/protocol/pending_connection/hsv5.rs b/srt-protocol/src/protocol/pending_connection/hsv5.rs index dffdade8..72d878a6 100644 --- a/srt-protocol/src/protocol/pending_connection/hsv5.rs +++ b/srt-protocol/src/protocol/pending_connection/hsv5.rs @@ -139,6 +139,7 @@ pub fn gen_access_control_response( recv_buffer_size: settings.recv_buffer_size, send_buffer_size: settings.send_buffer_size, statistics_interval: settings.statistics_interval, + peer_idle_timeout: settings.peer_idle_timeout, }, ) } @@ -238,6 +239,7 @@ impl StartedInitiator { recv_buffer_size: self.settings.recv_buffer_size, send_buffer_size: self.settings.send_buffer_size, statistics_interval: self.settings.statistics_interval, + peer_idle_timeout: self.settings.peer_idle_timeout, }) } } diff --git a/srt-protocol/src/protocol/time/mod.rs b/srt-protocol/src/protocol/time/mod.rs index fc8bb9ac..e2d2fd12 100644 --- a/srt-protocol/src/protocol/time/mod.rs +++ b/srt-protocol/src/protocol/time/mod.rs @@ -47,7 +47,7 @@ impl Timers { pub const SYN: Duration = Duration::from_millis(10); const EXP_MAX: u32 = 16; - pub fn new(now: Instant, statistics_interval: Duration) -> Self { + pub fn new(now: Instant, statistics_interval: Duration, peer_idle_timeout: Duration) -> Self { let (ack, nak, exp) = Self::calculate_periods(1, &Rtt::default()); Self { snd: Timer::new(now, Duration::from_millis(1)), @@ -55,7 +55,7 @@ impl Timers { nak: Timer::new(now, nak), exp: Timer::new(now, exp), exp_count: 1, - peer_idle: Timer::new(now, Duration::from_secs(5)), + peer_idle: Timer::new(now, peer_idle_timeout), // this isn't in the spec, but it's in the reference implementation // https://github.com/Haivision/srt/blob/1d7b391905d7e344d80b86b39ac5c90fda8764a9/srtcore/core.cpp#L10610-L10614 statistics: Timer::new(now, statistics_interval), @@ -171,7 +171,7 @@ mod tests { prop_assume!((rtt_mean + 4 * rtt_variance) / 2 > ms(20)); let start = Instant::now(); - let mut timers = Timers::new(start, ms(10_000)); + let mut timers = Timers::new(start, ms(10_000), ms(5_000)); timers.update_rtt(&rtt); @@ -199,7 +199,7 @@ mod tests { prop_assume!(4 * rtt_mean + rtt_variance + syn > ms(300)); let start = Instant::now(); - let mut timers = Timers::new(start, ms(10_000)); + let mut timers = Timers::new(start, ms(10_000), ms(5_000)); timers.update_rtt(&rtt); @@ -229,7 +229,7 @@ mod tests { prop_assume!((rtt_mean + 4 * rtt_variance) / 2 <= ms(20)); let start = Instant::now(); - let mut timers = Timers::new(start, ms(10_000)); + let mut timers = Timers::new(start, ms(10_000), ms(5_000)); timers.update_rtt(&rtt); @@ -257,7 +257,7 @@ mod tests { prop_assume!(4 * rtt_mean + rtt_variance + syn <= ms(300)); let start = Instant::now(); - let mut timers = Timers::new(start, ms(10_000)); + let mut timers = Timers::new(start, ms(10_000), ms(5_000)); timers.update_rtt(&rtt); @@ -273,7 +273,7 @@ mod tests { fn next_timer() { let ms = TimeSpan::from_millis; let start = Instant::now(); - let mut timers = Timers::new(start, Duration::MAX); + let mut timers = Timers::new(start, Duration::MAX, ms(5_000)); // next timer should be ack, 10ms let now = start; diff --git a/srt-protocol/src/settings/connection.rs b/srt-protocol/src/settings/connection.rs index fa521828..28deab5b 100644 --- a/srt-protocol/src/settings/connection.rs +++ b/srt-protocol/src/settings/connection.rs @@ -13,6 +13,7 @@ pub struct ConnInitSettings { pub key_refresh: KeyMaterialRefreshSettings, pub send_latency: Duration, pub recv_latency: Duration, + pub peer_idle_timeout: Duration, pub bandwidth: options::LiveBandwidthMode, pub statistics_interval: Duration, @@ -58,6 +59,7 @@ impl From for ConnInitSettings { .unwrap(), send_latency: options.sender.peer_latency, recv_latency: options.receiver.latency, + peer_idle_timeout: options.session.peer_idle_timeout, bandwidth: options.sender.bandwidth, statistics_interval: options.session.statistics_interval, recv_buffer_size: options.receiver.buffer_size diff --git a/srt-transmit/src/helptext.txt b/srt-transmit/src/helptext.txt index 7312201c..0209d2a0 100644 --- a/srt-transmit/src/helptext.txt +++ b/srt-transmit/src/helptext.txt @@ -82,6 +82,7 @@ Supported protocols: * pbkeylen the key length to use for encryption. Defaults to 0, unless passphrse is passed, in which case 16 is the default. Must be 16, 24, or 32 * autoreconnect should the socket reconnect after connection is broken. Default is false, specify for true + * peeridletimeout_ms how long to wait from last contact with the peer to shutdown, in milliseconds. Default is 5000 ms FILE - save or send a file example: diff --git a/srt-transmit/src/main.rs b/srt-transmit/src/main.rs index ca750f39..e887a163 100644 --- a/srt-transmit/src/main.rs +++ b/srt-transmit/src/main.rs @@ -83,16 +83,21 @@ where for (k, v) in args { match &*k { "latency_ms" => { - let latency = Duration::from_millis(match v.parse() { - Ok(i) => i, - Err(e) => bail!( - "Failed to parse latency_ms parameter to input as integer: {}", - e - ), - }); + let latency = Duration::from_secs_f64( + v.parse::() + .map_err(|e| format_err!("Failed to parse latency_ms: {e}"))? + / 1e3, + ); options.sender.peer_latency = latency; options.receiver.latency = latency; } + "peeridletimeout_ms" => { + options.session.peer_idle_timeout = Duration::from_secs_f64( + v.parse::() + .map_err(|e| format_err!("Failed to parse peeridletimeout_ms: {e}"))? + / 1e3, + ) + } "interface" => { options.connect.local.set_ip(match v.parse() { Ok(local) => local, From d3c9555ec43bbe56291efc22c9f680318594f376 Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Tue, 20 Jun 2023 00:53:12 -0500 Subject: [PATCH 08/38] add missing field --- srt-protocol/src/protocol/pending_connection/connect.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/srt-protocol/src/protocol/pending_connection/connect.rs b/srt-protocol/src/protocol/pending_connection/connect.rs index 01da2f17..e2f54db7 100644 --- a/srt-protocol/src/protocol/pending_connection/connect.rs +++ b/srt-protocol/src/protocol/pending_connection/connect.rs @@ -301,6 +301,7 @@ mod test { send_buffer_size: options::PacketCount(8192), max_packet_size: options::PacketSize(1500), max_flow_size: options::PacketCount(8192), + peer_idle_timeout: Duration::from_secs(5), }, sid, random(), From 92fe84fa53a253bbc5c7db5a09515497a637a458 Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Tue, 20 Jun 2023 00:53:58 -0500 Subject: [PATCH 09/38] add simple stats printing to srt-transmit --- srt-transmit/src/helptext.txt | 1 + srt-transmit/src/main.rs | 38 ++++++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/srt-transmit/src/helptext.txt b/srt-transmit/src/helptext.txt index 0209d2a0..83f4593e 100644 --- a/srt-transmit/src/helptext.txt +++ b/srt-transmit/src/helptext.txt @@ -83,6 +83,7 @@ Supported protocols: in which case 16 is the default. Must be 16, 24, or 32 * autoreconnect should the socket reconnect after connection is broken. Default is false, specify for true * peeridletimeout_ms how long to wait from last contact with the peer to shutdown, in milliseconds. Default is 5000 ms + * stats print basic stats every second FILE - save or send a file example: diff --git a/srt-transmit/src/main.rs b/srt-transmit/src/main.rs index e887a163..d9d993ac 100644 --- a/srt-transmit/src/main.rs +++ b/srt-transmit/src/main.rs @@ -30,6 +30,7 @@ use tokio::{ net::TcpListener, net::TcpStream, net::UdpSocket, + spawn, }; use tokio_util::{codec::BytesCodec, codec::Framed, codec::FramedWrite, udp::UdpFramed}; @@ -118,7 +119,7 @@ where options.encryption.key_size = size.try_into()?; key = true; } - "rendezvous" | "multiplex" | "autoreconnect" => (), + "rendezvous" | "multiplex" | "autoreconnect" | "stats" => (), unrecog => bail!("Unrecgonized parameter '{}' for srt", unrecog), } } @@ -246,6 +247,22 @@ fn parse_rendezvous(input_url: &Url) -> Option> { rendezvous_v } +fn start_stat_task_if_requested(socket: &mut SrtSocket, url: &Url) -> Result<(), Error> { + if let Some((_, val)) = url.query_pairs().find(|(a, _)| a == "stats") { + if !val.is_empty() { + bail!("value {val} assigned to `stats`. Do not assign a value to stats"); + } + + let mut stat = socket.statistics().clone(); + spawn(async move { + while let Some(s) = stat.next().await { + println!("{:?}", s); + } + }); + } + Ok(()) +} + async fn make_srt_input( input_url: Url, input_addr: Option, @@ -258,11 +275,9 @@ async fn make_srt_input( bail!("multiplex is not a valid option for input urls"); } - Ok(SrtSocket::bind(bind_options?) - .await? - .map(Result::unwrap) - .map(|(_, b)| b) - .boxed()) + let mut srt_socket = SrtSocket::bind(bind_options?).await?; + start_stat_task_if_requested(&mut srt_socket, &input_url)?; + Ok(srt_socket.map(Result::unwrap).map(|(_, b)| b).boxed()) } fn resolve_input( @@ -393,10 +408,13 @@ async fn make_srt_ouput( .await? .with(|b| future::ok((Instant::now(), b))) .boxed_sink()), - None => Ok(SrtSocket::bind(bind_options) - .await? - .with(|b| future::ok((Instant::now(), b))) - .boxed_sink()), + None => { + let mut srt_socket = SrtSocket::bind(bind_options).await?; + start_stat_task_if_requested(&mut srt_socket, &output_url)?; + Ok(srt_socket + .with(|b| future::ok((Instant::now(), b))) + .boxed_sink()) + } } } From 6efcfabaf056d90265fb58dacdcbdf5465fd847e Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Sun, 25 Jun 2023 14:51:18 -0600 Subject: [PATCH 10/38] fix tests build --- srt-protocol/src/connection/mod.rs | 6 +++++- srt-protocol/src/connection/status.rs | 4 ++-- srt-protocol/src/protocol/sender/buffer.rs | 1 + srt-protocol/src/protocol/time/mod.rs | 2 +- srt-protocol/tests/simulator/mod.rs | 1 + srt-protocol/tests/timestamp_rollover.rs | 2 ++ 6 files changed, 12 insertions(+), 4 deletions(-) diff --git a/srt-protocol/src/connection/mod.rs b/srt-protocol/src/connection/mod.rs index 4d375ae6..cdb57b46 100644 --- a/srt-protocol/src/connection/mod.rs +++ b/srt-protocol/src/connection/mod.rs @@ -116,7 +116,11 @@ impl DuplexConnection { handshake: connection.handshake, output: Output::new(&settings), status: ConnectionStatus::new(settings.send_tsbpd_latency * 2), // the timeout should be larger than latency as otherwise packets that have just arrived definitely have a change to flush - timers: Timers::new(settings.socket_start_time, settings.statistics_interval, settings.peer_idle_timeout), + timers: Timers::new( + settings.socket_start_time, + settings.statistics_interval, + settings.peer_idle_timeout, + ), stats: SocketStatistics::new(), receiver: Receiver::new(settings.clone()), sender: Sender::new(settings), diff --git a/srt-protocol/src/connection/status.rs b/srt-protocol/src/connection/status.rs index becd0fa4..4a925a73 100644 --- a/srt-protocol/src/connection/status.rs +++ b/srt-protocol/src/connection/status.rs @@ -6,9 +6,9 @@ use crate::settings::SocketId; #[derive(Debug, Clone, Eq, PartialEq)] enum Status { - Open(Duration), // (flush_timeout) + Open(Duration), // (flush_timeout) Shutdown(Instant), // (flush_deadline) - Drain(Instant), // (drain_deadline) + Drain(Instant), // (drain_deadline) Closed, } diff --git a/srt-protocol/src/protocol/sender/buffer.rs b/srt-protocol/src/protocol/sender/buffer.rs index d3841176..d88eaebb 100644 --- a/srt-protocol/src/protocol/sender/buffer.rs +++ b/srt-protocol/src/protocol/sender/buffer.rs @@ -594,6 +594,7 @@ mod test { recv_buffer_size: PacketCount(8196), send_buffer_size: PacketCount(8196), statistics_interval: Duration::from_secs(10), + peer_idle_timeout: Duration::from_secs(5), } } diff --git a/srt-protocol/src/protocol/time/mod.rs b/srt-protocol/src/protocol/time/mod.rs index e2d2fd12..52258f9f 100644 --- a/srt-protocol/src/protocol/time/mod.rs +++ b/srt-protocol/src/protocol/time/mod.rs @@ -273,7 +273,7 @@ mod tests { fn next_timer() { let ms = TimeSpan::from_millis; let start = Instant::now(); - let mut timers = Timers::new(start, Duration::MAX, ms(5_000)); + let mut timers = Timers::new(start, Duration::MAX, Duration::from_millis(5_000)); // next timer should be ack, 10ms let now = start; diff --git a/srt-protocol/tests/simulator/mod.rs b/srt-protocol/tests/simulator/mod.rs index ad94ab12..b9ca47df 100644 --- a/srt-protocol/tests/simulator/mod.rs +++ b/srt-protocol/tests/simulator/mod.rs @@ -214,6 +214,7 @@ impl RandomLossSimulation { recv_buffer_size: PacketCount(8192), send_buffer_size: PacketCount(8192), statistics_interval: Duration::from_secs(1), + peer_idle_timeout: Duration::from_secs(5), } } } diff --git a/srt-protocol/tests/timestamp_rollover.rs b/srt-protocol/tests/timestamp_rollover.rs index 048ef92b..feafbd5b 100644 --- a/srt-protocol/tests/timestamp_rollover.rs +++ b/srt-protocol/tests/timestamp_rollover.rs @@ -46,6 +46,7 @@ fn timestamp_rollover() { recv_buffer_size: PacketCount(8192), send_buffer_size: PacketCount(8192), statistics_interval: Duration::from_secs(1), + peer_idle_timeout: Duration::from_secs(5), }; let s2 = ConnectionSettings { @@ -66,6 +67,7 @@ fn timestamp_rollover() { recv_buffer_size: PacketCount(8192), send_buffer_size: PacketCount(8192), statistics_interval: Duration::from_secs(1), + peer_idle_timeout: Duration::from_secs(5), }; const PACKET_RATE: u32 = 10; // 10 packet/s From 17021aac5efcf95cb5d7b6774a259c09f0b0364b Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Sun, 25 Jun 2023 14:51:30 -0600 Subject: [PATCH 11/38] fix bsd build --- srt-c/src/catch.cpp | 4 +++- srt-tokio/tests/stransmit_interop.rs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/srt-c/src/catch.cpp b/srt-c/src/catch.cpp index f2605f13..a43103c0 100644 --- a/srt-c/src/catch.cpp +++ b/srt-c/src/catch.cpp @@ -1,7 +1,9 @@ -#if defined __linux__ || defined __APPLE__ +#if defined __linux__ || defined __APPLE__ || defined __FreeBSD__ #include #elif defined _WIN32 || defined WIN32 #include +#else +#error "Unsupported platform" #endif using SRTSOCKET = int; diff --git a/srt-tokio/tests/stransmit_interop.rs b/srt-tokio/tests/stransmit_interop.rs index 9eda934a..637654aa 100644 --- a/srt-tokio/tests/stransmit_interop.rs +++ b/srt-tokio/tests/stransmit_interop.rs @@ -559,7 +559,7 @@ fn make_sockaddr(port: u16) -> sockaddr { } } -#[cfg(target_os = "macos")] +#[cfg(any(target_os = "macos", target_os = "freebsd"))] fn make_sockaddr(port: u16) -> sockaddr { use libc::{in_addr, sockaddr_in, AF_INET}; unsafe { @@ -581,7 +581,7 @@ fn make_sockaddr(port: u16) -> sockaddr { } fn open_libsrt() -> Option { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "freebsd"))] let possible_names = ["libsrt-gnutls.so.1.4", "libsrt.so", "libsrt.so.1"]; #[cfg(target_os = "windows")] From e45f83743c222a01b274fc8f1db635775c1547a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= Date: Fri, 28 Jul 2023 05:48:32 +0200 Subject: [PATCH 12/38] srt-tokio: remove `trust-dns-resolver` dependency (#207) Without `trust-dns-resolver` a boatload of dependencies are removed from the project: * `data-encoding`, `enum-as-inner`, `heck`, `hostname`, `ipconfig`, `ipnet`, `linked-hash-map`, `lock_api`, `lru-cache`, `match_cfg`, `matches`, `parking_lot`, `resolv-conf`, `scopeguard`, `trust-dns-proto`, `trust-dns-resolver`, `widestring`, `winreg` If the user wants to use DNS-over-TLS, they can either lookup the name themself and supply a `SocketAddr` instead of a domain name, or they can set up their system resolver to use DNS-over-TLS. This PR effectly reverts , but fixes the bug in instead. The problem was actually that Tokio's `lookup_host()` resolves to a `SocketAddr` instead of an `IpAddr`, so its argument needs a domain name and a port, not only a domain name. --- srt-tokio/Cargo.toml | 1 - srt-tokio/src/net.rs | 36 +++++++++++------------------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index 348f9111..ad84890f 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -14,7 +14,6 @@ version = "0.4.1" bytes = "1" rand = "0.8" socket2 = "0.5" -trust-dns-resolver = "0.22.0" [dependencies.ac-ffmpeg] optional = true diff --git a/srt-tokio/src/net.rs b/srt-tokio/src/net.rs index 27f50e77..a3ef8713 100644 --- a/srt-tokio/src/net.rs +++ b/srt-tokio/src/net.rs @@ -3,10 +3,7 @@ use std::{ error, fmt::{Debug, Display, Formatter}, io::{self, Cursor, ErrorKind}, - net::{ - IpAddr::{V4, V6}, - SocketAddr, - }, + net::SocketAddr, sync::Arc, }; @@ -15,8 +12,7 @@ use futures::channel::mpsc::Receiver; use futures::{channel::mpsc, prelude::*}; use socket2::{Domain, Protocol, Socket, Type}; use srt_protocol::packet::{Packet, ReceivePacketResult}; -use tokio::net::UdpSocket; -use trust_dns_resolver::TokioAsyncResolver; +use tokio::net::{lookup_host, UdpSocket}; use crate::options::*; @@ -45,22 +41,12 @@ pub async fn bind_socket(options: &SocketOptions) -> Result Result { use SocketHost::*; let mut remote_address = match &remote.host { - Domain(domain) => { - let resolver = TokioAsyncResolver::tokio_from_system_conf().map_err(|e| { - io::Error::new( - ErrorKind::NotFound, - format!("Cannot load DNS resolver from system configuration: {}", e), - ) - })?; - let response = resolver.lookup_ip(domain).await?; - let address = response.iter().next().ok_or_else(|| { + Domain(domain) => lookup_host(format!("{domain}:0")) + .await? + .next() + .ok_or_else(|| { io::Error::new(ErrorKind::NotFound, OptionsError::InvalidRemoteAddress) - })?; - match address { - V4(ipv4) => SocketAddr::new((ipv4).into(), 0), - V6(ipv6) => SocketAddr::new((ipv6).into(), 0), - } - } + })?, Ipv4(ipv4) => SocketAddr::new((*ipv4).into(), 0), Ipv6(ipv6) => SocketAddr::new((*ipv6).into(), 0), }; @@ -154,7 +140,7 @@ impl error::Error for PacketStreamClosedError {} #[cfg(test)] mod tests { use super::*; - use std::net::Ipv4Addr; + use assert_matches::assert_matches; #[tokio::test] async fn resolve_dns() { @@ -163,9 +149,9 @@ mod tests { port: 3000, }; let remote_host = lookup_remote_host(&socket_address).await.unwrap(); - assert_eq!( - remote_host, - SocketAddr::new(V4(Ipv4Addr::new(127, 0, 0, 1)), 3000) + assert_matches!( + remote_host.to_string().as_str(), + "127.0.0.1:3000" | "[::1]:3000" ); } } From d185d555ff9693382eb6b712135d09d4c6ea9a0a Mon Sep 17 00:00:00 2001 From: nipierre Date: Fri, 8 Sep 2023 11:16:41 +0200 Subject: [PATCH 13/38] feat: add drop too late packet option to rcv buffer --- srt-protocol/src/connection/mod.rs | 6 +++ .../protocol/pending_connection/connect.rs | 1 + .../src/protocol/pending_connection/hsv5.rs | 2 + srt-protocol/src/protocol/receiver/arq.rs | 7 +++ srt-protocol/src/protocol/receiver/buffer.rs | 49 ++++++++++++------- srt-protocol/src/protocol/receiver/mod.rs | 1 + srt-protocol/src/protocol/sender/buffer.rs | 1 + srt-protocol/src/settings/connection.rs | 3 +- srt-protocol/tests/simulator/mod.rs | 1 + srt-protocol/tests/timestamp_rollover.rs | 2 + 10 files changed, 53 insertions(+), 20 deletions(-) diff --git a/srt-protocol/src/connection/mod.rs b/srt-protocol/src/connection/mod.rs index cdb57b46..7d9b533e 100644 --- a/srt-protocol/src/connection/mod.rs +++ b/srt-protocol/src/connection/mod.rs @@ -62,6 +62,11 @@ pub struct ConnectionSettings { pub send_tsbpd_latency: Duration, pub recv_tsbpd_latency: Duration, + /// The Too-Late Packet Drop (TLPKTDROP) mechanism allows the sender to + /// drop packets that have no chance to be delivered in time, and allows + /// the receiver to skip missing packets that have not been delivered in time + pub too_late_packet_drop: bool, + pub peer_idle_timeout: Duration, /// Size of the receive buffer, in packets @@ -484,6 +489,7 @@ mod duplex_connection { bandwidth: LiveBandwidthMode::Unlimited, statistics_interval: Duration::from_secs(10), peer_idle_timeout: Duration::from_secs(5), + too_late_packet_drop: true, }, handshake: crate::protocol::handshake::Handshake::Connector, } diff --git a/srt-protocol/src/protocol/pending_connection/connect.rs b/srt-protocol/src/protocol/pending_connection/connect.rs index e2f54db7..5697bbab 100644 --- a/srt-protocol/src/protocol/pending_connection/connect.rs +++ b/srt-protocol/src/protocol/pending_connection/connect.rs @@ -302,6 +302,7 @@ mod test { max_packet_size: options::PacketSize(1500), max_flow_size: options::PacketCount(8192), peer_idle_timeout: Duration::from_secs(5), + too_late_packet_drop: true, }, sid, random(), diff --git a/srt-protocol/src/protocol/pending_connection/hsv5.rs b/srt-protocol/src/protocol/pending_connection/hsv5.rs index 72d878a6..e5e3c152 100644 --- a/srt-protocol/src/protocol/pending_connection/hsv5.rs +++ b/srt-protocol/src/protocol/pending_connection/hsv5.rs @@ -140,6 +140,7 @@ pub fn gen_access_control_response( send_buffer_size: settings.send_buffer_size, statistics_interval: settings.statistics_interval, peer_idle_timeout: settings.peer_idle_timeout, + too_late_packet_drop: settings.too_late_packet_drop, }, ) } @@ -240,6 +241,7 @@ impl StartedInitiator { send_buffer_size: self.settings.send_buffer_size, statistics_interval: self.settings.statistics_interval, peer_idle_timeout: self.settings.peer_idle_timeout, + too_late_packet_drop: self.settings.too_late_packet_drop, }) } } diff --git a/srt-protocol/src/protocol/receiver/arq.rs b/srt-protocol/src/protocol/receiver/arq.rs index a2d5b4b8..243a4092 100644 --- a/srt-protocol/src/protocol/receiver/arq.rs +++ b/srt-protocol/src/protocol/receiver/arq.rs @@ -174,6 +174,7 @@ impl AutomaticRepeatRequestAlgorithm { pub fn new( socket_start_time: Instant, tsbpd_latency: Duration, + too_late_packet_drop: bool, init_seq_num: SeqNumber, buffer_size_packets: PacketCount, ) -> Self { @@ -183,6 +184,7 @@ impl AutomaticRepeatRequestAlgorithm { receive_buffer: ReceiveBuffer::new( socket_start_time, tsbpd_latency, + too_late_packet_drop, init_seq_num, buffer_size_packets, ), @@ -353,6 +355,7 @@ mod automatic_repeat_request_algorithm { let mut arq = AutomaticRepeatRequestAlgorithm::new( start, Duration::from_secs(2), + true, init_seq_num, PacketCount(8192), ); @@ -410,6 +413,7 @@ mod automatic_repeat_request_algorithm { let mut arq = AutomaticRepeatRequestAlgorithm::new( start, Duration::from_secs(2), + true, init_seq_num, PacketCount(8192), ); @@ -478,6 +482,7 @@ mod automatic_repeat_request_algorithm { let mut arq = AutomaticRepeatRequestAlgorithm::new( start, Duration::from_secs(2), + true, init_seq_num, PacketCount(8192), ); @@ -520,6 +525,7 @@ mod automatic_repeat_request_algorithm { let mut arq = AutomaticRepeatRequestAlgorithm::new( start, Duration::from_secs(1), + true, init_seq_num, PacketCount(8192), ); @@ -571,6 +577,7 @@ mod automatic_repeat_request_algorithm { let mut arq = AutomaticRepeatRequestAlgorithm::new( start, tsbpd_latency, + true, init_seq_num, PacketCount(8192), ); diff --git a/srt-protocol/src/protocol/receiver/buffer.rs b/srt-protocol/src/protocol/receiver/buffer.rs index 71b3f1d8..dd8a7e14 100644 --- a/srt-protocol/src/protocol/receiver/buffer.rs +++ b/srt-protocol/src/protocol/receiver/buffer.rs @@ -175,6 +175,7 @@ pub struct ReceiveBuffer { // first sequence number in the list seqno0: SeqNumber, + too_late_packet_drop: bool, remote_clock: SynchronizedRemoteClock, buffer: VecDeque, max_buffer_size: PacketCount, @@ -184,11 +185,13 @@ impl ReceiveBuffer { pub fn new( socket_start_time: Instant, tsbpd_latency: Duration, + too_late_packet_drop: bool, init_seq_num: SeqNumber, max_buffer_size: PacketCount, ) -> Self { Self { tsbpd_latency, + too_late_packet_drop, lrsn: init_seq_num, seqno0: init_seq_num, remote_clock: SynchronizedRemoteClock::new(socket_start_time), @@ -262,9 +265,13 @@ impl ReceiveBuffer { let timestamp = match self.front_ts() { Some(timestamp) => timestamp, None => { - return match self.drop_too_late_packets(now) { - Some(error) => Err(error), - None => Ok(None), + if self.too_late_packet_drop { + return match self.drop_too_late_packets(now) { + Some(error) => Err(error), + None => Ok(None), + }; + } else { + return Ok(None); } } }; @@ -277,9 +284,13 @@ impl ReceiveBuffer { let packet_count = match self.next_message_packet_count() { Some(packet_count) => packet_count, None => { - return match self.drop_too_late_packets(now) { - Some(error) => Err(error), - None => Ok(None), + if self.too_late_packet_drop { + return match self.drop_too_late_packets(now) { + Some(error) => Err(error), + None => Ok(None), + }; + } else { + return Ok(None); } } }; @@ -542,7 +553,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(3); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!(buf.next_ack_dsn(), init_seq_num); assert_eq!(buf.next_message_release_time(), None); @@ -555,7 +566,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!( buf.push_packet( @@ -582,7 +593,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!( buf.push_packet( @@ -631,7 +642,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!( buf.push_packet( @@ -676,7 +687,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!( buf.push_packet( @@ -722,7 +733,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!( buf.push_packet( start, @@ -746,7 +757,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!( buf.push_packet( start, @@ -810,7 +821,7 @@ mod receive_buffer { let init_seq_num = SeqNumber(5); let mean_rtt = TimeSpan::from_micros(10_000); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); assert_eq!(buf.prepare_loss_list(start, mean_rtt), None); @@ -879,7 +890,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); let now = start; let _ = buf.push_packet( @@ -958,7 +969,7 @@ mod receive_buffer { let init_seq_num = SeqNumber(5); let mean_rtt = TimeSpan::from_micros(10_000); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); let now = start; assert_eq!( @@ -991,7 +1002,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(10)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(10)); assert_eq!(buf.buffer_available(), 10); @@ -1102,7 +1113,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(8192)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); let now = start; assert_eq!( @@ -1141,7 +1152,7 @@ mod receive_buffer { let start = Instant::now(); let init_seq_num = SeqNumber(5); - let mut buf = ReceiveBuffer::new(start, tsbpd, init_seq_num, PacketCount(10)); + let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(10)); let add_packet = |i, buf: &mut ReceiveBuffer| { buf.push_packet( diff --git a/srt-protocol/src/protocol/receiver/mod.rs b/srt-protocol/src/protocol/receiver/mod.rs index 782db33b..d7891129 100644 --- a/srt-protocol/src/protocol/receiver/mod.rs +++ b/srt-protocol/src/protocol/receiver/mod.rs @@ -71,6 +71,7 @@ impl Receiver { arq: AutomaticRepeatRequestAlgorithm::new( settings.socket_start_time, settings.recv_tsbpd_latency, + settings.too_late_packet_drop, settings.init_seq_num, settings.recv_buffer_size, ), diff --git a/srt-protocol/src/protocol/sender/buffer.rs b/srt-protocol/src/protocol/sender/buffer.rs index d88eaebb..6cd8e29c 100644 --- a/srt-protocol/src/protocol/sender/buffer.rs +++ b/srt-protocol/src/protocol/sender/buffer.rs @@ -595,6 +595,7 @@ mod test { send_buffer_size: PacketCount(8196), statistics_interval: Duration::from_secs(10), peer_idle_timeout: Duration::from_secs(5), + too_late_packet_drop: true, } } diff --git a/srt-protocol/src/settings/connection.rs b/srt-protocol/src/settings/connection.rs index 28deab5b..78bc0eb2 100644 --- a/srt-protocol/src/settings/connection.rs +++ b/srt-protocol/src/settings/connection.rs @@ -16,7 +16,7 @@ pub struct ConnInitSettings { pub peer_idle_timeout: Duration, pub bandwidth: options::LiveBandwidthMode, pub statistics_interval: Duration, - + pub too_late_packet_drop: bool, /// Receive buffer size in packets pub recv_buffer_size: options::PacketCount, /// Size of the send buffer, in packets @@ -68,6 +68,7 @@ impl From for ConnInitSettings { / (options.session.max_segment_size - Packet::HEADER_SIZE), max_packet_size: options.sender.max_payload_size, max_flow_size: options.sender.flow_control_window_size, + too_late_packet_drop: options.receiver.too_late_packet_drop, } } } diff --git a/srt-protocol/tests/simulator/mod.rs b/srt-protocol/tests/simulator/mod.rs index b9ca47df..333eda45 100644 --- a/srt-protocol/tests/simulator/mod.rs +++ b/srt-protocol/tests/simulator/mod.rs @@ -215,6 +215,7 @@ impl RandomLossSimulation { send_buffer_size: PacketCount(8192), statistics_interval: Duration::from_secs(1), peer_idle_timeout: Duration::from_secs(5), + too_late_packet_drop: true, } } } diff --git a/srt-protocol/tests/timestamp_rollover.rs b/srt-protocol/tests/timestamp_rollover.rs index feafbd5b..6efe6c74 100644 --- a/srt-protocol/tests/timestamp_rollover.rs +++ b/srt-protocol/tests/timestamp_rollover.rs @@ -47,6 +47,7 @@ fn timestamp_rollover() { send_buffer_size: PacketCount(8192), statistics_interval: Duration::from_secs(1), peer_idle_timeout: Duration::from_secs(5), + too_late_packet_drop: true, }; let s2 = ConnectionSettings { @@ -68,6 +69,7 @@ fn timestamp_rollover() { send_buffer_size: PacketCount(8192), statistics_interval: Duration::from_secs(1), peer_idle_timeout: Duration::from_secs(5), + too_late_packet_drop: true, }; const PACKET_RATE: u32 = 10; // 10 packet/s From 3618fc5817be7a3c08e83b71f2e409e6849c5597 Mon Sep 17 00:00:00 2001 From: nipierre Date: Mon, 11 Sep 2023 09:54:19 +0200 Subject: [PATCH 14/38] tests: add tests for disabling too late packets drop --- srt-protocol/src/protocol/receiver/buffer.rs | 62 ++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/srt-protocol/src/protocol/receiver/buffer.rs b/srt-protocol/src/protocol/receiver/buffer.rs index dd8a7e14..bb586605 100644 --- a/srt-protocol/src/protocol/receiver/buffer.rs +++ b/srt-protocol/src/protocol/receiver/buffer.rs @@ -962,6 +962,68 @@ mod receive_buffer { assert_eq!(buf.next_ack_dsn(), init_seq_num + 6); } + #[test] + fn not_dropping_too_late_packets() { + let _ = pretty_env_logger::try_init(); + + let tsbpd = Duration::from_secs(2); + let start = Instant::now(); + let init_seq_num = SeqNumber(5); + + let mut buf = ReceiveBuffer::new(start, tsbpd, false, init_seq_num, PacketCount(8192)); + + let now = start; + let _ = buf.push_packet( + now, + DataPacket { + seq_number: init_seq_num + 1, + message_loc: PacketLocation::FIRST, + payload: b"hello"[..].into(), + ..basic_pack() + }, + ); + let _ = buf.push_packet( + now, + DataPacket { + seq_number: init_seq_num + 2, + message_loc: PacketLocation::MIDDLE, + payload: b"hello"[..].into(), + ..basic_pack() + }, + ); + assert_eq!(buf.pop_next_message(now), Ok(None)); + assert_eq!(buf.next_ack_dsn(), init_seq_num); + + let now = now + tsbpd; + let _ = buf.push_packet( + now, + DataPacket { + timestamp: TimeStamp::MIN + tsbpd, + seq_number: init_seq_num + 5, + message_loc: PacketLocation::ONLY, + payload: b"yas"[..].into(), + ..basic_pack() + }, + ); + assert_eq!(buf.pop_next_message(now), Ok(None)); + assert_eq!(buf.next_ack_dsn(), init_seq_num); + + // 2 ms buffer release tolerance, we are ok with releasing them 2ms late + let now = now + Duration::from_millis(5); + // it should not drop packets + assert_eq!(buf.pop_next_message(now), Ok(None)); + assert_eq!(buf.next_ack_dsn(), init_seq_num, "{buf:?}"); + + // 2 ms buffer release tolerance, we are ok with releasing them 2ms late + let now = now + tsbpd + Duration::from_millis(5); + // it should not drop packets + assert_eq!(buf.pop_next_message(now), Ok(None)); + assert_eq!(buf.next_ack_dsn(), init_seq_num); + + assert_eq!(buf.pop_next_message(now), Ok(None)); + assert_eq!(buf.next_ack_dsn(), init_seq_num); + } + #[test] fn drop_message() { let tsbpd = Duration::from_secs(2); From 934e366b918cedd0173c393a90dfb9b70f14247e Mon Sep 17 00:00:00 2001 From: nipierre Date: Mon, 11 Sep 2023 11:00:19 +0200 Subject: [PATCH 15/38] style: remove unnecessary casts --- srt-c/src/c_api.rs | 2 +- srt-c/src/socket.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/srt-c/src/c_api.rs b/srt-c/src/c_api.rs index 95622ddd..b668fe92 100644 --- a/srt-c/src/c_api.rs +++ b/srt-c/src/c_api.rs @@ -684,7 +684,7 @@ pub extern "C" fn srt_accept( Ok((sock, remote)) => { if let Some((addr, len)) = addr { let osa = OsSocketAddr::from(remote); - *addr = unsafe { *(osa.as_ptr() as *const libc::sockaddr) }; + *addr = unsafe { *(osa.as_ptr()) }; *len = osa.len() as c_int; } sock diff --git a/srt-c/src/socket.rs b/srt-c/src/socket.rs index b6e5d31b..c42ae3e4 100644 --- a/srt-c/src/socket.rs +++ b/srt-c/src/socket.rs @@ -434,7 +434,7 @@ impl SocketData { opts.listen_cb_opaque, new_sock, 5, - OsSocketAddr::from(req.remote()).as_ptr() as *const libc::sockaddr, + OsSocketAddr::from(req.remote()).as_ptr(), streamid_ptr, &mut ret, ) From 5dd57eac3ad29e805c10ce60b7a6b17ed0991fc8 Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Mon, 11 Sep 2023 09:47:21 -0700 Subject: [PATCH 16/38] DRY self.too_late_packet_drop --- srt-protocol/src/protocol/receiver/buffer.rs | 42 +++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/srt-protocol/src/protocol/receiver/buffer.rs b/srt-protocol/src/protocol/receiver/buffer.rs index bb586605..9d95dba4 100644 --- a/srt-protocol/src/protocol/receiver/buffer.rs +++ b/srt-protocol/src/protocol/receiver/buffer.rs @@ -264,16 +264,7 @@ impl ReceiveBuffer { ) -> Result, MessageError> { let timestamp = match self.front_ts() { Some(timestamp) => timestamp, - None => { - if self.too_late_packet_drop { - return match self.drop_too_late_packets(now) { - Some(error) => Err(error), - None => Ok(None), - }; - } else { - return Ok(None); - } - } + None => return self.drop_too_late_packets(now), }; let sent_time = self.remote_clock.instant_from(timestamp); @@ -283,16 +274,7 @@ impl ReceiveBuffer { let packet_count = match self.next_message_packet_count() { Some(packet_count) => packet_count, - None => { - if self.too_late_packet_drop { - return match self.drop_too_late_packets(now) { - Some(error) => Err(error), - None => Ok(None), - }; - } else { - return Ok(None); - } - } + None => return self.drop_too_late_packets(now), }; self.seqno0 += u32::try_from(packet_count).unwrap(); @@ -473,10 +455,17 @@ impl ReceiveBuffer { /// Drops the packets that are deemed to be too late /// i.e.: there is a packet after it that is ready to be released - fn drop_too_late_packets(&mut self, now: Instant) -> Option { + fn drop_too_late_packets( + &mut self, + now: Instant, + ) -> Result, MessageError> { + if self.too_late_packet_drop { + return Ok(None); + } + let latency_window = self.tsbpd_latency + Duration::from_millis(5); // Not only does it have to be non-none, it also has to be a First (don't drop half messages) - let (index, seq_number, timestamp) = self + let dropped_messages = self .buffer .iter() .enumerate() @@ -487,7 +476,12 @@ impl ReceiveBuffer { p.data_packet() .map(|d| (i, d.seq_number, self.remote_clock.instant_from(d.timestamp))) }) - .filter(|(_, _, timestamp)| now >= *timestamp + latency_window)?; + .filter(|(_, _, timestamp)| now >= *timestamp + latency_window); + + let (index, seq_number, timestamp) = match dropped_messages { + Some(d) => d, + None => return Ok(None), + }; let delay = TimeSpan::from_interval(timestamp + self.tsbpd_latency, now); let drop_count = self.buffer.drain(0..index).count(); @@ -495,7 +489,7 @@ impl ReceiveBuffer { self.seqno0 = seq_number; self.recalculate_lrsn(0); - Some(MessageError { + Err(MessageError { too_late_packets: seq_number - drop_count as u32..seq_number, delay, }) From 5f19515da95b413a145ffd3a6691747859bfd48b Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Mon, 11 Sep 2023 09:54:11 -0700 Subject: [PATCH 17/38] whoops: inverted conditional --- srt-protocol/src/protocol/receiver/buffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srt-protocol/src/protocol/receiver/buffer.rs b/srt-protocol/src/protocol/receiver/buffer.rs index 9d95dba4..8132a583 100644 --- a/srt-protocol/src/protocol/receiver/buffer.rs +++ b/srt-protocol/src/protocol/receiver/buffer.rs @@ -459,7 +459,7 @@ impl ReceiveBuffer { &mut self, now: Instant, ) -> Result, MessageError> { - if self.too_late_packet_drop { + if !self.too_late_packet_drop { return Ok(None); } From c22068d39eb0ff7cd2682485c73714245ed6d27f Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Thu, 21 Sep 2023 16:19:16 -0700 Subject: [PATCH 18/38] fix drop_too_late_packets --- srt-protocol/Cargo.toml | 1 + srt-protocol/src/protocol/receiver/arq.rs | 4 +- srt-protocol/src/protocol/receiver/buffer.rs | 187 ++++++------------- 3 files changed, 62 insertions(+), 130 deletions(-) diff --git a/srt-protocol/Cargo.toml b/srt-protocol/Cargo.toml index 36bfe2c7..8c5f9a31 100644 --- a/srt-protocol/Cargo.toml +++ b/srt-protocol/Cargo.toml @@ -42,6 +42,7 @@ version = "0.12.1" assert_matches = "1.0.0" proptest = "1.0.0" rand_distr = "0.4.2" +pretty_assertions = "1.3.0" [dev-dependencies.pretty_env_logger] default-features = false diff --git a/srt-protocol/src/protocol/receiver/arq.rs b/srt-protocol/src/protocol/receiver/arq.rs index 243a4092..8ed5842e 100644 --- a/srt-protocol/src/protocol/receiver/arq.rs +++ b/srt-protocol/src/protocol/receiver/arq.rs @@ -400,7 +400,7 @@ mod automatic_repeat_request_algorithm { assert_eq!( arq.pop_next_message(start + Duration::from_secs(10)), Err(MessageError { - too_late_packets: SeqNumber(5)..SeqNumber(8), + too_late_packets: SeqNumber(5)..SeqNumber(9), delay: TimeSpan::from_millis(8_000) }) ); @@ -622,7 +622,7 @@ mod automatic_repeat_request_algorithm { assert_eq!( arq.pop_next_message(now), Err(MessageError { - too_late_packets: SeqNumber(5)..SeqNumber(9), + too_late_packets: SeqNumber(5)..SeqNumber(10), delay: TimeSpan::from_millis(10) }) ); diff --git a/srt-protocol/src/protocol/receiver/buffer.rs b/srt-protocol/src/protocol/receiver/buffer.rs index 8132a583..b41280c9 100644 --- a/srt-protocol/src/protocol/receiver/buffer.rs +++ b/srt-protocol/src/protocol/receiver/buffer.rs @@ -7,7 +7,6 @@ use std::{ }; use bytes::{Bytes, BytesMut}; -use take_until::TakeUntilExt; use crate::{options::PacketCount, packet::*}; @@ -204,6 +203,7 @@ impl ReceiveBuffer { self.buffer.is_empty() } + /// Data Sequence Number of the packet following the last acknowledged packet pub fn next_ack_dsn(&self) -> SeqNumber { self.lrsn } @@ -463,35 +463,47 @@ impl ReceiveBuffer { return Ok(None); } - let latency_window = self.tsbpd_latency + Duration::from_millis(5); - // Not only does it have to be non-none, it also has to be a First (don't drop half messages) - let dropped_messages = self - .buffer - .iter() - .enumerate() - .skip(1) - .take_until(|(_, p)| p.is_first()) - .last() - .and_then(|(i, p)| { - p.data_packet() - .map(|d| (i, d.seq_number, self.remote_clock.instant_from(d.timestamp))) + let data_packets = self.buffer.iter().map(|packet| { + packet.data_packet().map(|data| { + ( + data.seq_number, + self.remote_clock.instant_from(data.timestamp), + data.message_loc, + ) + }) + }); + + let tsbpd_threshold = now - self.tsbpd_latency - Duration::from_millis(5); + let too_late_packets = data_packets.take_while(|packet| { + packet.map_or(true, |(_, packet_time, message_loc)| { + packet_time <= tsbpd_threshold || !message_loc.contains(PacketLocation::FIRST) }) - .filter(|(_, _, timestamp)| now >= *timestamp + latency_window); + }); + + let dropped_packets = too_late_packets.fold(None, |last, packet| match (last, packet) { + (None, Some((seq_number, packet_time, _))) => Some((seq_number, packet_time)), + (Some((_, first_packet_time)), Some((seq_number, _, _))) => { + Some((seq_number, first_packet_time)) + } + (last, _) => last, + }); - let (index, seq_number, timestamp) = match dropped_messages { - Some(d) => d, + let (last_seq_number, first_packet_time) = match dropped_packets { + Some(packets) => packets, None => return Ok(None), }; - let delay = TimeSpan::from_interval(timestamp + self.tsbpd_latency, now); - let drop_count = self.buffer.drain(0..index).count(); + let begin_packet = self.seqno0; + let end_packet = last_seq_number + 1; + let drop_count = end_packet.saturating_sub(begin_packet); - self.seqno0 = seq_number; + self.seqno0 = end_packet; + self.buffer.drain(0..drop_count); self.recalculate_lrsn(0); Err(MessageError { - too_late_packets: seq_number - drop_count as u32..seq_number, - delay, + delay: TimeSpan::from_interval(first_packet_time + self.tsbpd_latency, now), + too_late_packets: begin_packet..end_packet, }) } @@ -522,6 +534,8 @@ impl ReceiveBuffer { #[cfg(test)] mod receive_buffer { + use pretty_assertions::assert_eq; + use super::*; use DataPacketAction::*; @@ -537,7 +551,7 @@ mod receive_buffer { message_number: MsgNumber(0), timestamp: TimeStamp::from_micros(0), dest_sockid: SocketId(4), - payload: Bytes::new(), + payload: b"basic payload"[..].into(), } } @@ -578,14 +592,14 @@ mod receive_buffer { ); assert_eq!(buf.next_ack_dsn(), init_seq_num + 1); assert_eq!(buf.next_message_release_time(), Some(start + tsbpd)); - assert_eq!(buf.pop_next_message(start + tsbpd * 2), Ok(None)); + assert_eq!(buf.pop_next_message(start + tsbpd), Ok(None)); } #[test] fn multi_packet_message_lost_last_packet() { let tsbpd = Duration::from_secs(2); let start = Instant::now(); - let init_seq_num = SeqNumber(5); + let init_seq_num = SeqNumber(0); let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); @@ -605,7 +619,7 @@ mod receive_buffer { ); assert_eq!(buf.next_ack_dsn(), init_seq_num + 1); assert_eq!(buf.next_message_release_time(), Some(start + tsbpd)); - assert_eq!(buf.pop_next_message(start + tsbpd * 2), Ok(None)); + assert_eq!(buf.pop_next_message(start + tsbpd), Ok(None)); // 1 lost packet assert_eq!( @@ -617,14 +631,14 @@ mod receive_buffer { ..basic_pack() } ), - Ok(ReceivedWithLoss([SeqNumber(6)].iter().collect())) + Ok(ReceivedWithLoss([init_seq_num + 1].iter().collect())) ); assert_eq!(buf.next_ack_dsn(), init_seq_num + 1); assert_eq!(buf.next_message_release_time(), Some(start + tsbpd)); assert_eq!( buf.pop_next_message(start + tsbpd * 2), Err(MessageError { - too_late_packets: SeqNumber(5)..SeqNumber(7), + too_late_packets: SeqNumber(0)..SeqNumber(3), delay: TimeSpan::from_millis(2_000) }) ); @@ -654,7 +668,8 @@ mod receive_buffer { ); assert_eq!(buf.next_ack_dsn(), init_seq_num + 1); assert_eq!(buf.next_message_release_time(), Some(start + tsbpd)); - assert_eq!(buf.pop_next_message(start + tsbpd * 2), Ok(None)); + assert_eq!(buf.pop_next_message(start + tsbpd), Ok(None)); + assert_eq!(buf.pop_next_message(start + tsbpd), Ok(None)); assert_eq!( buf.push_packet( @@ -721,30 +736,6 @@ mod receive_buffer { ); } - #[test] - fn push_packet_with_loss_empty_buffer() { - let tsbpd = Duration::from_secs(2); - let start = Instant::now(); - let init_seq_num = SeqNumber(5); - - let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); - assert_eq!( - buf.push_packet( - start, - DataPacket { - seq_number: init_seq_num + 2, - message_loc: PacketLocation::MIDDLE, - payload: b"hello"[..].into(), - ..basic_pack() - } - ), - Ok(ReceivedWithLoss((init_seq_num..init_seq_num + 2).into())) - ); - assert_eq!(buf.next_ack_dsn(), init_seq_num); - assert_eq!(buf.next_message_release_time(), None); - assert_eq!(buf.pop_next_message(start + tsbpd), Ok(None)); - } - #[test] fn push_packet_multi_packet_message_ready() { let tsbpd = Duration::from_secs(2); @@ -878,11 +869,17 @@ mod receive_buffer { #[test] fn drop_too_late_packets() { + // packets: + // (0) missing + // (1) late + // (0) missing + // (2) on time + let _ = pretty_env_logger::try_init(); let tsbpd = Duration::from_secs(2); let start = Instant::now(); - let init_seq_num = SeqNumber(5); + let init_seq_num = SeqNumber(0); let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); @@ -892,16 +889,6 @@ mod receive_buffer { DataPacket { seq_number: init_seq_num + 1, message_loc: PacketLocation::FIRST, - payload: b"hello"[..].into(), - ..basic_pack() - }, - ); - let _ = buf.push_packet( - now, - DataPacket { - seq_number: init_seq_num + 2, - message_loc: PacketLocation::MIDDLE, - payload: b"hello"[..].into(), ..basic_pack() }, ); @@ -914,46 +901,29 @@ mod receive_buffer { now, DataPacket { timestamp: TimeStamp::MIN + tsbpd, - seq_number: init_seq_num + 5, - message_loc: PacketLocation::ONLY, - payload: b"yas"[..].into(), + seq_number: init_seq_num + 3, + payload: b"test"[..].into(), ..basic_pack() }, ); assert_eq!(buf.pop_next_message(now), Ok(None)); assert_eq!(buf.next_ack_dsn(), init_seq_num); - // 2 ms buffer release tolerance, we are ok with releasing them 2ms late + // 5 ms buffer release tolerance, we are ok with releasing them 5ms late let now = now + Duration::from_millis(5); - // it should drop all missing packets up to the next viable message - // and begin to ack all viable packets + // it should drop all packets before and including the last late packet assert_eq!( buf.pop_next_message(now), Err(MessageError { - too_late_packets: SeqNumber(5)..SeqNumber(6), + too_late_packets: SeqNumber(0)..SeqNumber(2), delay: TimeSpan::from_millis(5) }) ); - assert_eq!(buf.next_ack_dsn(), init_seq_num + 3, "{buf:?}"); - - // 2 ms buffer release tolerance, we are ok with releasing them 2ms late - let now = now + tsbpd + Duration::from_millis(5); - // it should drop all missing packets up to the next viable message - // and begin to ack all viable packets - assert_eq!( - buf.pop_next_message(now), - Err(MessageError { - too_late_packets: SeqNumber(6)..SeqNumber(10), - delay: TimeSpan::from_millis(10) - }) - ); - assert_eq!(buf.next_ack_dsn(), init_seq_num + 6); + assert_eq!(buf.next_ack_dsn(), SeqNumber(2)); - assert_eq!( - buf.pop_next_message(now), - Ok(Some((expected_release_time, b"yas"[..].into()))) - ); - assert_eq!(buf.next_ack_dsn(), init_seq_num + 6); + // it should continue to wait for any remaining missing packets + assert_eq!(buf.pop_next_message(now), Ok(None)); + assert_eq!(buf.next_ack_dsn(), SeqNumber(2)); } #[test] @@ -1163,45 +1133,6 @@ mod receive_buffer { assert_eq!(buf.buffer_available(), 0); } - #[test] - fn wrong_lrsn_after_drop_all() { - let tsbpd = Duration::from_secs(2); - let start = Instant::now(); - let init_seq_num = SeqNumber(5); - - let mut buf = ReceiveBuffer::new(start, tsbpd, true, init_seq_num, PacketCount(8192)); - - let now = start; - assert_eq!( - buf.push_packet( - now, - DataPacket { - seq_number: init_seq_num + 3, - payload: b"yas"[..].into(), - ..basic_pack() - }, - ), - Ok(ReceivedWithLoss((init_seq_num..init_seq_num + 3).into())) - ); - - assert_eq!(buf.next_ack_dsn(), init_seq_num); - - // pop_next_message is strange, may want some cleanup - assert_eq!( - buf.pop_next_message(now + tsbpd + Duration::from_millis(10)), - Err(MessageError { - too_late_packets: SeqNumber(5)..SeqNumber(8), - delay: TimeSpan::from_millis(10) - }) - ); - assert_eq!( - buf.pop_next_message(now + tsbpd + Duration::from_millis(10)), - Ok(Some((now, b"yas"[..].into()))) - ); - - assert_eq!(buf.next_ack_dsn(), init_seq_num + 4); - } - #[test] fn rx_acknowledged_time() { let tsbpd = Duration::from_secs(2); From 341276a9dea43d24fe453852b255824b296388f7 Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Mon, 25 Sep 2023 13:18:46 -0700 Subject: [PATCH 19/38] Introduce tsbpd_tolerance and add some code comments --- srt-protocol/src/protocol/receiver/buffer.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/srt-protocol/src/protocol/receiver/buffer.rs b/srt-protocol/src/protocol/receiver/buffer.rs index b41280c9..1c1be31c 100644 --- a/srt-protocol/src/protocol/receiver/buffer.rs +++ b/srt-protocol/src/protocol/receiver/buffer.rs @@ -167,6 +167,8 @@ pub struct MessageError { #[derive(Debug)] pub struct ReceiveBuffer { tsbpd_latency: Duration, + /// Adds an extra delay to the TSBPD threshold for dropping too late packets + tsbpd_tolerance: Duration, // Sequence number that all packets up to have been received + 1 lrsn: SeqNumber, @@ -190,6 +192,8 @@ impl ReceiveBuffer { ) -> Self { Self { tsbpd_latency, + // TODO: perhaps make this configurable + tsbpd_tolerance: Duration::from_millis(5), too_late_packet_drop, lrsn: init_seq_num, seqno0: init_seq_num, @@ -473,7 +477,7 @@ impl ReceiveBuffer { }) }); - let tsbpd_threshold = now - self.tsbpd_latency - Duration::from_millis(5); + let tsbpd_threshold = now - self.tsbpd_latency - self.tsbpd_tolerance; let too_late_packets = data_packets.take_while(|packet| { packet.map_or(true, |(_, packet_time, message_loc)| { packet_time <= tsbpd_threshold || !message_loc.contains(PacketLocation::FIRST) @@ -896,7 +900,6 @@ mod receive_buffer { assert_eq!(buf.next_ack_dsn(), init_seq_num); let now = now + tsbpd; - let expected_release_time = now; let _ = buf.push_packet( now, DataPacket { From 14f623608e3f264b52af4fc6fa48edd212d1eebc Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Mon, 25 Sep 2023 14:02:10 -0700 Subject: [PATCH 20/38] v0.4.2 --- srt-protocol/Cargo.toml | 2 +- srt-tokio/Cargo.toml | 2 +- srt-transmit/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/srt-protocol/Cargo.toml b/srt-protocol/Cargo.toml index 8c5f9a31..07d57ad6 100644 --- a/srt-protocol/Cargo.toml +++ b/srt-protocol/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" name = "srt-protocol" publish = true repository = "https://github.com/russelltg/srt-rs" -version = "0.4.1" +version = "0.4.2" [dependencies] array-init = "2.0.0" diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index ad84890f..0418b863 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" name = "srt-tokio" publish = true repository = "https://github.com/russelltg/srt-rs" -version = "0.4.1" +version = "0.4.2" [dependencies] bytes = "1" diff --git a/srt-transmit/Cargo.toml b/srt-transmit/Cargo.toml index 4ed662a4..d56f7d12 100644 --- a/srt-transmit/Cargo.toml +++ b/srt-transmit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srt-transmit" -version = "0.4.1" +version = "0.4.2" authors = ["Russell Greene "] description = "SRT implementation in Rust" license = "Apache-2.0" From 1d1f063070dff6698e2f38021485c55f8b3dd285 Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Mon, 25 Sep 2023 14:23:21 -0700 Subject: [PATCH 21/38] v0.4.2 fix --- srt-c/Cargo.toml | 6 +++--- srt-tokio/Cargo.toml | 2 +- srt-transmit/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/srt-c/Cargo.toml b/srt-c/Cargo.toml index 4168b35f..f1fbdeed 100644 --- a/srt-c/Cargo.toml +++ b/srt-c/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srt-c" -version = "0.4.0" +version = "0.4.2" edition = "2021" publish = true description = "API compatabile libsrt reimplementation using srt-tokio" @@ -10,8 +10,8 @@ license = "Apache-2.0" crate-type = ["cdylib", "staticlib"] [dependencies] -srt-tokio = {version = "0.4.0", path = "../srt-tokio"} -srt-protocol = {version = "0.4.0", path = "../srt-protocol"} +srt-tokio = {version = "0.4.2", path = "../srt-tokio"} +srt-protocol = {version = "0.4.2", path = "../srt-protocol"} lazy_static = "1" libc = "0.2" bytes = "1" diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index 0418b863..c38867c8 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -29,7 +29,7 @@ default-features = false version = "0.4" [dependencies.srt-protocol] -version = "0.4.0" +version = "0.4.2" path = "../srt-protocol" [dependencies.tokio] diff --git a/srt-transmit/Cargo.toml b/srt-transmit/Cargo.toml index d56f7d12..6676775f 100644 --- a/srt-transmit/Cargo.toml +++ b/srt-transmit/Cargo.toml @@ -12,7 +12,7 @@ publish = true [dependencies] bus = "2" -srt-tokio = { version = "0.4.0", path = "../srt-tokio"} +srt-tokio = { version = "0.4.2", path = "../srt-tokio"} clap = { version = "4", features = ["std"]} log = { version = "0.4", default-features = false } url = "2.3.1" # https://github.com/servo/rust-url/issues/581 From ec4a9833156042106f06d3a7935cdd0034f914f8 Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Mon, 25 Sep 2023 16:29:54 -0600 Subject: [PATCH 22/38] update resolver to suppress warning --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index a7834965..50fbf3b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,4 @@ [workspace] members = ["srt-protocol", "srt-tokio", "srt-transmit", "srt-c", "srt-c-unittests"] default-members = ["srt-transmit", "srt-protocol", "srt-tokio", "srt-c"] +resolver = "2" From 28ab2b1c2a6dd58c27ff716d7a8b3b74f577d6f0 Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Mon, 25 Sep 2023 17:45:31 -0600 Subject: [PATCH 23/38] bump to 0.4.3 --- srt-c/Cargo.toml | 6 +++--- srt-protocol/Cargo.toml | 4 ++-- srt-tokio/Cargo.toml | 4 ++-- srt-transmit/Cargo.toml | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/srt-c/Cargo.toml b/srt-c/Cargo.toml index f1fbdeed..03cc6549 100644 --- a/srt-c/Cargo.toml +++ b/srt-c/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srt-c" -version = "0.4.2" +version = "0.4.3" edition = "2021" publish = true description = "API compatabile libsrt reimplementation using srt-tokio" @@ -10,8 +10,8 @@ license = "Apache-2.0" crate-type = ["cdylib", "staticlib"] [dependencies] -srt-tokio = {version = "0.4.2", path = "../srt-tokio"} -srt-protocol = {version = "0.4.2", path = "../srt-protocol"} +srt-tokio = {version = "0.4.3", path = "../srt-tokio"} +srt-protocol = {version = "0.4.3", path = "../srt-protocol"} lazy_static = "1" libc = "0.2" bytes = "1" diff --git a/srt-protocol/Cargo.toml b/srt-protocol/Cargo.toml index 07d57ad6..5b25d312 100644 --- a/srt-protocol/Cargo.toml +++ b/srt-protocol/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" name = "srt-protocol" publish = true repository = "https://github.com/russelltg/srt-rs" -version = "0.4.2" +version = "0.4.3" [dependencies] array-init = "2.0.0" @@ -41,7 +41,7 @@ version = "0.12.1" [dev-dependencies] assert_matches = "1.0.0" proptest = "1.0.0" -rand_distr = "0.4.2" +rand_distr = "0.4.3" pretty_assertions = "1.3.0" [dev-dependencies.pretty_env_logger] diff --git a/srt-tokio/Cargo.toml b/srt-tokio/Cargo.toml index c38867c8..d360fab4 100644 --- a/srt-tokio/Cargo.toml +++ b/srt-tokio/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" name = "srt-tokio" publish = true repository = "https://github.com/russelltg/srt-rs" -version = "0.4.2" +version = "0.4.3" [dependencies] bytes = "1" @@ -29,7 +29,7 @@ default-features = false version = "0.4" [dependencies.srt-protocol] -version = "0.4.2" +version = "0.4.3" path = "../srt-protocol" [dependencies.tokio] diff --git a/srt-transmit/Cargo.toml b/srt-transmit/Cargo.toml index 6676775f..1dad4f34 100644 --- a/srt-transmit/Cargo.toml +++ b/srt-transmit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srt-transmit" -version = "0.4.2" +version = "0.4.3" authors = ["Russell Greene "] description = "SRT implementation in Rust" license = "Apache-2.0" @@ -12,7 +12,7 @@ publish = true [dependencies] bus = "2" -srt-tokio = { version = "0.4.2", path = "../srt-tokio"} +srt-tokio = { version = "0.4.3", path = "../srt-tokio"} clap = { version = "4", features = ["std"]} log = { version = "0.4", default-features = false } url = "2.3.1" # https://github.com/servo/rust-url/issues/581 From 36f92e62246ca1a933a38808ffa2a2e2830da55b Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Sat, 14 Oct 2023 15:14:00 -0600 Subject: [PATCH 24/38] fix clippy lints --- srt-protocol/src/options/srt_version.rs | 16 ++++++++-------- srt-transmit/src/main.rs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/srt-protocol/src/options/srt_version.rs b/srt-protocol/src/options/srt_version.rs index 1be043cc..ecc707b3 100644 --- a/srt-protocol/src/options/srt_version.rs +++ b/srt-protocol/src/options/srt_version.rs @@ -43,19 +43,19 @@ impl SrtVersion { impl PartialOrd for SrtVersion { fn partial_cmp(&self, other: &SrtVersion) -> Option { - Some(match self.major.cmp(&other.major) { - Ordering::Equal => match self.minor.cmp(&other.minor) { - Ordering::Equal => self.patch.cmp(&other.patch), - o => o, - }, - o => o, - }) + Some(self.cmp(other)) } } impl Ord for SrtVersion { fn cmp(&self, other: &SrtVersion) -> Ordering { - self.partial_cmp(other).unwrap() // this cannot fail + match self.major.cmp(&other.major) { + Ordering::Equal => match self.minor.cmp(&other.minor) { + Ordering::Equal => self.patch.cmp(&other.patch), + o => o, + }, + o => o, + } } } diff --git a/srt-transmit/src/main.rs b/srt-transmit/src/main.rs index d9d993ac..14dd4aa0 100644 --- a/srt-transmit/src/main.rs +++ b/srt-transmit/src/main.rs @@ -140,7 +140,7 @@ fn local_port_addr(url: &Url, kind: &str) -> Result<(u16, Option), E Ok(match url.host() { // no host means bind to the port specified None => (port, None), - Some(Host::Domain(d)) if d == "0.0.0.0" => (port, None), + Some(Host::Domain("0.0.0.0")) => (port, None), // if host is specified, bind to 0 Some(Host::Domain(d)) => ( From 84fd13b587e76c40d4606b5d82841830b771239c Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Sun, 31 Dec 2023 09:56:45 -0700 Subject: [PATCH 25/38] clippy --- srt-c/src/c_api.rs | 4 ++-- srt-protocol/src/options/socket.rs | 5 ++--- srt-protocol/src/options/uri.rs | 2 +- srt-protocol/src/packet/modular_num.rs | 2 -- srt-protocol/tests/simulator/mod.rs | 8 ++++---- srt-tokio/tests/accesscontrol.rs | 3 +-- 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/srt-c/src/c_api.rs b/srt-c/src/c_api.rs index b668fe92..17be61e9 100644 --- a/srt-c/src/c_api.rs +++ b/srt-c/src/c_api.rs @@ -776,7 +776,7 @@ pub extern "C" fn srt_sendmsg2( .try_send( Instant::now(), Bytes::copy_from_slice(unsafe { - from_raw_parts(buf as *const u8, len as usize) + from_raw_parts(buf, len as usize) }), ) .is_err() @@ -798,7 +798,7 @@ pub extern "C" fn srt_recv(sock: SRTSOCKET, buf: *mut c_char, len: c_int) -> c_i Some(sock) => sock, }; - let bytes = unsafe { from_raw_parts_mut(buf as *mut u8, len as usize) }; + let bytes = unsafe { from_raw_parts_mut(buf, len as usize) }; let mut l = sock.lock().unwrap(); if let SocketData::Established(ref mut sock, opts) = *l { diff --git a/srt-protocol/src/options/socket.rs b/srt-protocol/src/options/socket.rs index 76c3846a..cd8edd7e 100644 --- a/srt-protocol/src/options/socket.rs +++ b/srt-protocol/src/options/socket.rs @@ -99,7 +99,6 @@ impl OptionsOf for SocketOptions { #[cfg(test)] mod test { - use std::convert::TryInto; use std::time::Duration; use super::*; @@ -119,7 +118,7 @@ mod test { })? .with(Encryption { key_size: KeySize::AES192, - passphrase: "this is a passphrase".try_into().ok(), + passphrase: Some("this is a passphrase".into()), ..Default::default() })? .with(Sender { @@ -142,7 +141,7 @@ mod test { }, encryption: Encryption { key_size: KeySize::AES192, - passphrase: "this is a passphrase".try_into().ok(), + passphrase: Some("this is a passphrase".into()), ..Default::default() }, sender: Sender { diff --git a/srt-protocol/src/options/uri.rs b/srt-protocol/src/options/uri.rs index 008ef23f..5c3cc52e 100644 --- a/srt-protocol/src/options/uri.rs +++ b/srt-protocol/src/options/uri.rs @@ -447,7 +447,7 @@ mod tests { socket.connect.linger = Some(Duration::from_millis(128)); socket.receiver.reorder_tolerance_max = PacketCount(256); socket.session.max_segment_size = PacketSize(1300); - socket.encryption.passphrase = "passphrase1234".try_into().ok(); + socket.encryption.passphrase = Some("passphrase1234".into()); socket.sender.max_payload_size = PacketSize(1234); socket.encryption.key_size = KeySize::AES256; socket.session.peer_idle_timeout = Duration::from_millis(4242); diff --git a/srt-protocol/src/packet/modular_num.rs b/srt-protocol/src/packet/modular_num.rs index da9b531b..d70fa039 100644 --- a/srt-protocol/src/packet/modular_num.rs +++ b/srt-protocol/src/packet/modular_num.rs @@ -156,8 +156,6 @@ macro_rules! modular_num_impls { } }; } -pub use modular_num_impls; - #[cfg(test)] mod tests { diff --git a/srt-protocol/tests/simulator/mod.rs b/srt-protocol/tests/simulator/mod.rs index 333eda45..c7698492 100644 --- a/srt-protocol/tests/simulator/mod.rs +++ b/srt-protocol/tests/simulator/mod.rs @@ -22,13 +22,13 @@ struct SentPacket(Instant, (Packet, SocketAddr)); impl PartialOrd for SentPacket { fn partial_cmp(&self, other: &Self) -> Option { - Some(self.0.cmp(&other.0).reverse()) // reverse to make it a min-heap + Some(self.cmp(other)) } } impl Ord for SentPacket { fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.partial_cmp(other).unwrap() + self.0.cmp(&other.0).reverse() // reverse to make it a min-heap } } @@ -44,13 +44,13 @@ impl Eq for ScheduledInput {} impl PartialOrd for ScheduledInput { fn partial_cmp(&self, other: &Self) -> Option { - Some(self.0.cmp(&other.0).reverse()) // reverse to make it a min-heap + Some(self.cmp(other)) } } impl Ord for ScheduledInput { fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.partial_cmp(other).unwrap() + self.0.cmp(&other.0).reverse() // reverse to make it a min-heap } } diff --git a/srt-tokio/tests/accesscontrol.rs b/srt-tokio/tests/accesscontrol.rs index 516e35f3..0eaefd88 100644 --- a/srt-tokio/tests/accesscontrol.rs +++ b/srt-tokio/tests/accesscontrol.rs @@ -1,5 +1,4 @@ use std::{ - convert::{TryFrom, TryInto}, io, time::Instant, }; @@ -128,7 +127,7 @@ async fn set_password() { let listener = tokio::spawn(async move { while let Some(request) = incoming.incoming().next().await { - let passphrase = request.stream_id().unwrap().as_str().try_into().unwrap(); + let passphrase = request.stream_id().unwrap().as_str().into(); if let Ok(mut sender) = request .accept(Some(KeySettings { From 266913b30d96cc3026045308730f43ad8f67490c Mon Sep 17 00:00:00 2001 From: Russell Greene Date: Sat, 24 Feb 2024 20:00:40 -0700 Subject: [PATCH 26/38] update deps + check in lockfile * for our binaries, it makes sense to have a checked in lockfile --- .gitignore | 1 - Cargo.lock | 2225 ++++++++++++++++++++++++++++++++++++++++++++++ srt-c/Cargo.toml | 2 +- 3 files changed, 2226 insertions(+), 2 deletions(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 7fa6da80..409493b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ /target **/*.rs.bk -Cargo.lock .idea/ .vscode/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..73553aba --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2225 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ac-ffmpeg" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d1d77cd9038693a0551d28ccb8bd5c542e54017673bf9af780f7a3ca6da37c" +dependencies = [ + "cc", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "anstream" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bus" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b7118d0221d84fada881b657c2ddb7cd55108db79c8764c9ee212c0c259b783" +dependencies = [ + "crossbeam-channel", + "num_cpus", + "parking_lot_core", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "console-api" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2895653b4d9f1538a83970077cb01dfc77a4810524e51a110944688e916b18e" +dependencies = [ + "prost 0.11.9", + "prost-types 0.11.9", + "tonic 0.9.2", + "tracing-core", +] + +[[package]] +name = "console-api" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" +dependencies = [ + "futures-core", + "prost 0.12.3", + "prost-types 0.12.3", + "tonic 0.10.2", + "tracing-core", +] + +[[package]] +name = "console-subscriber" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4cf42660ac07fcebed809cfe561dd8730bcd35b075215e6479c516bcd0d11cb" +dependencies = [ + "console-api 0.5.0", + "crossbeam-channel", + "crossbeam-utils", + "futures", + "hdrhistogram", + "humantime", + "prost-types 0.11.9", + "serde", + "serde_json", + "thread_local", + "tokio", + "tokio-stream", + "tonic 0.9.2", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "console-subscriber" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" +dependencies = [ + "console-api 0.6.0", + "crossbeam-channel", + "crossbeam-utils", + "futures-task", + "hdrhistogram", + "humantime", + "prost-types 0.12.3", + "serde", + "serde_json", + "thread_local", + "tokio", + "tokio-stream", + "tonic 0.10.2", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "h2" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "base64", + "byteorder", + "flate2", + "nom", + "num-traits", +] + +[[package]] +name = "hermit-abi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "379dada1584ad501b383485dd706b8afb7a70fcbc7f4da7d780638a5a6124a60" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "keyed_priority_queue" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" +dependencies = [ + "indexmap 2.2.3", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "os_socketaddr" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa149f3ec09cadeb41968390fcd71e6ea038a9a373d1d4eb070f4d9484d4b244" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.4.2", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.2", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive 0.12.3", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.5", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "srt-c" +version = "0.4.3" +dependencies = [ + "bitflags 2.4.2", + "bytes", + "cc", + "console-subscriber 0.2.0", + "futures", + "lazy_static", + "libc", + "log", + "os_socketaddr", + "pretty_env_logger", + "srt-protocol", + "srt-tokio", + "thiserror", + "tokio", +] + +[[package]] +name = "srt-c-unittests" +version = "0.1.0" +dependencies = [ + "cc", + "srt-c", +] + +[[package]] +name = "srt-protocol" +version = "0.4.3" +dependencies = [ + "aes", + "array-init", + "arraydeque", + "assert_matches", + "bitflags 2.4.2", + "bytes", + "cipher", + "ctr", + "derive_more", + "hex", + "hmac", + "keyed_priority_queue", + "log", + "pbkdf2", + "pretty_assertions", + "pretty_env_logger", + "proptest", + "rand", + "rand_distr", + "regex", + "sha-1", + "streaming-stats", + "take-until", + "thiserror", + "url", +] + +[[package]] +name = "srt-tokio" +version = "0.4.3" +dependencies = [ + "ac-ffmpeg", + "anyhow", + "assert_matches", + "bytes", + "futures", + "lazy_static", + "libc", + "libloading", + "log", + "pretty_env_logger", + "rand", + "rand_distr", + "socket2", + "srt-protocol", + "tokio", + "tokio-stream", + "tokio-util", +] + +[[package]] +name = "srt-transmit" +version = "0.4.3" +dependencies = [ + "anyhow", + "bus", + "bytes", + "clap", + "console-subscriber 0.1.10", + "futures", + "log", + "pretty_assertions", + "pretty_env_logger", + "rand", + "srt-tokio", + "tokio", + "tokio-stream", + "tokio-util", + "url", +] + +[[package]] +name = "streaming-stats" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0d670ce4e348a2081843569e0f79b21c99c91bb9028b3b3ecb0f050306de547" +dependencies = [ + "num-traits", +] + +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "take-until" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" + +[[package]] +name = "tempfile" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "futures-util", + "hashbrown 0.14.3", + "pin-project-lite", + "slab", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +dependencies = [ + "async-trait", + "axum", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.11.9", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "once_cell", + "regex", + "sharded-slab", + "thread_local", + "tracing", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.3", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] diff --git a/srt-c/Cargo.toml b/srt-c/Cargo.toml index 03cc6549..5b9a1405 100644 --- a/srt-c/Cargo.toml +++ b/srt-c/Cargo.toml @@ -21,7 +21,7 @@ thiserror = "1" os_socketaddr = "0.2.4" pretty_env_logger = "0.5" bitflags = "2" -console-subscriber = { version = "0.1", optional = true } +console-subscriber = { version = "0.2", optional = true } [dependencies.tokio] version = "1" From 23e59bb12d5f4d9e29651d1209a2834eb37fb557 Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Wed, 22 May 2024 09:44:25 -0700 Subject: [PATCH 27/38] fix build failures, warnings, clippy, and fmt --- Cargo.lock | 15 +++++++++++++-- srt-c/build.rs | 1 + srt-c/src/c_api.rs | 6 +++--- srt-protocol/tests/simulator/mod.rs | 15 --------------- srt-tokio/tests/accesscontrol.rs | 5 +---- srt-transmit/src/streamer_server.rs | 3 +++ 6 files changed, 21 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73553aba..c20c3c4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,11 +304,13 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.87" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ + "jobserver", "libc", + "once_cell", ] [[package]] @@ -913,6 +915,15 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "keyed_priority_queue" version = "0.4.2" diff --git a/srt-c/build.rs b/srt-c/build.rs index 93bfa88d..39ac1b14 100644 --- a/srt-c/build.rs +++ b/srt-c/build.rs @@ -3,5 +3,6 @@ fn main() { cc::Build::new() .cpp(true) .file("src/catch.cpp") + .flag("-std=c++11") .compile("catch"); } diff --git a/srt-c/src/c_api.rs b/srt-c/src/c_api.rs index 17be61e9..da9169ef 100644 --- a/srt-c/src/c_api.rs +++ b/srt-c/src/c_api.rs @@ -719,7 +719,7 @@ fn handle_result(res: Result<(), SrtError>) -> c_int { thread_local! { pub static LAST_ERROR_STR: RefCell = RefCell::new(CString::new("(no error set on this thread)").unwrap()); - pub static LAST_ERROR: RefCell = RefCell::new(SRT_ERRNO::SRT_SUCCESS); + pub static LAST_ERROR: RefCell = const { RefCell::new(SRT_ERRNO::SRT_SUCCESS) }; } #[no_mangle] @@ -776,7 +776,7 @@ pub extern "C" fn srt_sendmsg2( .try_send( Instant::now(), Bytes::copy_from_slice(unsafe { - from_raw_parts(buf, len as usize) + from_raw_parts(buf as *const u8, len as usize) }), ) .is_err() @@ -798,7 +798,7 @@ pub extern "C" fn srt_recv(sock: SRTSOCKET, buf: *mut c_char, len: c_int) -> c_i Some(sock) => sock, }; - let bytes = unsafe { from_raw_parts_mut(buf, len as usize) }; + let bytes = unsafe { from_raw_parts_mut(buf as *mut u8, len as usize) }; let mut l = sock.lock().unwrap(); if let SocketData::Established(ref mut sock, opts) = *l { diff --git a/srt-protocol/tests/simulator/mod.rs b/srt-protocol/tests/simulator/mod.rs index c7698492..0758136a 100644 --- a/srt-protocol/tests/simulator/mod.rs +++ b/srt-protocol/tests/simulator/mod.rs @@ -17,21 +17,6 @@ use srt_protocol::{ protocol::handshake::Handshake, }; -#[derive(Eq, PartialEq)] -struct SentPacket(Instant, (Packet, SocketAddr)); - -impl PartialOrd for SentPacket { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for SentPacket { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.0.cmp(&other.0).reverse() // reverse to make it a min-heap - } -} - struct ScheduledInput(Instant, Input); impl PartialEq for ScheduledInput { diff --git a/srt-tokio/tests/accesscontrol.rs b/srt-tokio/tests/accesscontrol.rs index 0eaefd88..da048c7f 100644 --- a/srt-tokio/tests/accesscontrol.rs +++ b/srt-tokio/tests/accesscontrol.rs @@ -1,7 +1,4 @@ -use std::{ - io, - time::Instant, -}; +use std::{io, time::Instant}; use assert_matches::assert_matches; use bytes::Bytes; diff --git a/srt-transmit/src/streamer_server.rs b/srt-transmit/src/streamer_server.rs index f174ccd9..6120ec3f 100644 --- a/srt-transmit/src/streamer_server.rs +++ b/srt-transmit/src/streamer_server.rs @@ -15,6 +15,9 @@ use srt_tokio::{ SrtIncoming, SrtListener, SrtSocket, }; +// Even though it is never directly used, oneshot::Sender<()> is not dead code. It is used to +// ensures the run_receive_loop task terminates when the StreamerServer is dropped +#[allow(dead_code)] pub struct StreamerServer(broadcast::Sender<(Instant, Bytes)>, oneshot::Sender<()>); impl StreamerServer { From efe0be0e95830318fd0a1acd04fac5ce42ab9343 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 00:39:05 -0400 Subject: [PATCH 28/38] Expose the caller's specifed key size in ConnectionRequest --- .../src/protocol/pending_connection/listen.rs | 2 + .../src/protocol/pending_connection/mod.rs | 2 + .../examples/multiplex_authorizing_server.rs | 49 +++++++++++++++++++ srt-tokio/src/listener/session.rs | 3 ++ srt-tokio/tests/accesscontrol.rs | 43 ++++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 srt-tokio/examples/multiplex_authorizing_server.rs diff --git a/srt-protocol/src/protocol/pending_connection/listen.rs b/srt-protocol/src/protocol/pending_connection/listen.rs index 7fe854a4..37aa6855 100644 --- a/srt-protocol/src/protocol/pending_connection/listen.rs +++ b/srt-protocol/src/protocol/pending_connection/listen.rs @@ -237,6 +237,7 @@ impl Listen { // TODO: handle StreamId parsing error let stream_id = incoming.sid.clone().and_then(|s| s.try_into().ok()); let remote_socket_id = shake.socket_id; + let key_size = incoming.key_size.clone(); self.state = AccessControlRequested(state, timestamp, shake, incoming); @@ -245,6 +246,7 @@ impl Listen { remote, remote_socket_id, stream_id, + key_size, }) } diff --git a/srt-protocol/src/protocol/pending_connection/mod.rs b/srt-protocol/src/protocol/pending_connection/mod.rs index 666948b2..209ffe7f 100644 --- a/srt-protocol/src/protocol/pending_connection/mod.rs +++ b/srt-protocol/src/protocol/pending_connection/mod.rs @@ -7,6 +7,7 @@ pub(crate) mod cookie; use std::{error::Error, fmt, io, net::SocketAddr}; +use crate::options::KeySize; use crate::{connection::Connection, options::StreamId, packet::*, settings::KeySettings}; #[non_exhaustive] @@ -38,6 +39,7 @@ pub struct AccessControlRequest { pub remote: SocketAddr, pub remote_socket_id: SocketId, pub stream_id: Option, + pub key_size: KeySize, } #[derive(Debug, Eq, PartialEq)] diff --git a/srt-tokio/examples/multiplex_authorizing_server.rs b/srt-tokio/examples/multiplex_authorizing_server.rs new file mode 100644 index 00000000..56a6892c --- /dev/null +++ b/srt-tokio/examples/multiplex_authorizing_server.rs @@ -0,0 +1,49 @@ +use bytes::Bytes; +use futures::{stream, SinkExt, StreamExt}; +use log::info; +use srt_protocol::access::RejectReason; +use srt_protocol::options::KeySize; +use srt_protocol::packet::ServerRejectReason; +use srt_protocol::settings::{KeySettings, Passphrase}; +use srt_tokio::{ConnectionRequest, SrtListener}; +use std::io; +use std::time::Instant; + +#[tokio::main] +async fn main() -> io::Result<()> { + let _ = pretty_env_logger::try_init(); + + let (_server, mut incoming) = SrtListener::builder().bind(3333).await.unwrap(); + + while let Some(request) = incoming.incoming().next().await { + tokio::spawn(async move { handle_request(request).await }); + } + + Ok(()) +} + +async fn handle_request(request: ConnectionRequest) { + info!("received connection request"); + + if *request.key_size() != KeySize::AES256 { + info!("rejecting, key size is not AES256"); + request + .reject(RejectReason::Server(ServerRejectReason::BadRequest)) + .await + .unwrap(); + return; + } + + let key_settings = KeySettings { + key_size: KeySize::AES256, + passphrase: Passphrase::try_from("password128").unwrap(), + }; + let mut sender = request.accept(Some(key_settings)).await.unwrap(); + let mut stream = stream::iter( + Some(Ok((Instant::now(), Bytes::from("Hello authorized user!!")))).into_iter(), + ); + + sender.send_all(&mut stream).await.unwrap(); + sender.close().await.unwrap(); + info!("finished sending bytes to caller"); +} diff --git a/srt-tokio/src/listener/session.rs b/srt-tokio/src/listener/session.rs index 639c8131..a68fddce 100644 --- a/srt-tokio/src/listener/session.rs +++ b/srt-tokio/src/listener/session.rs @@ -40,6 +40,9 @@ impl ConnectionRequest { pub fn stream_id(&self) -> Option<&StreamId> { self.request.stream_id.as_ref() } + pub fn key_size(&self) -> &KeySize { + &self.request.key_size + } pub async fn accept( self, diff --git a/srt-tokio/tests/accesscontrol.rs b/srt-tokio/tests/accesscontrol.rs index da048c7f..b81038e3 100644 --- a/srt-tokio/tests/accesscontrol.rs +++ b/srt-tokio/tests/accesscontrol.rs @@ -182,3 +182,46 @@ async fn set_password() { server.close().await; listener.await.unwrap(); } + +#[tokio::test] +async fn key_size() { + let (mut server, mut incoming) = SrtListener::builder().bind(2001).await.unwrap(); + + let listener = tokio::spawn(async move { + while let Some(request) = incoming.incoming().next().await { + let passphrase = request.stream_id().unwrap().as_str().into(); + let key_size = request.key_size().clone(); + + if let Ok(mut sender) = request + .accept(Some(KeySettings { + key_size, + passphrase, + })) + .await + { + let mut stream = + stream::iter(Some(Ok((Instant::now(), Bytes::from("asdf")))).into_iter()); + + tokio::spawn(async move { + sender.send_all(&mut stream).await.unwrap(); + sender.close().await.unwrap(); + info!("Sender finished"); + }); + } + } + }); + + for key_size_bytes in [0, 16, 24, 32] { + SrtSocket::builder() + .encryption(key_size_bytes, "password128") + .call("127.0.0.1:2001", Some("password128")) + .await + .unwrap() + .close() + .await + .expect("server should use the advertised key size"); + } + + server.close().await; + listener.await.unwrap(); +} From 9ed8f3444446d74ad2123f5733c6ca5f31e9a6f9 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 13:19:20 -0400 Subject: [PATCH 29/38] Fix clippy --- srt-protocol/src/protocol/pending_connection/listen.rs | 2 +- srt-tokio/examples/multiplex_authorizing_server.rs | 4 ++-- srt-tokio/src/listener/session.rs | 4 ++-- srt-tokio/tests/accesscontrol.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/srt-protocol/src/protocol/pending_connection/listen.rs b/srt-protocol/src/protocol/pending_connection/listen.rs index 37aa6855..0ccb9b65 100644 --- a/srt-protocol/src/protocol/pending_connection/listen.rs +++ b/srt-protocol/src/protocol/pending_connection/listen.rs @@ -237,7 +237,7 @@ impl Listen { // TODO: handle StreamId parsing error let stream_id = incoming.sid.clone().and_then(|s| s.try_into().ok()); let remote_socket_id = shake.socket_id; - let key_size = incoming.key_size.clone(); + let key_size = incoming.key_size; self.state = AccessControlRequested(state, timestamp, shake, incoming); diff --git a/srt-tokio/examples/multiplex_authorizing_server.rs b/srt-tokio/examples/multiplex_authorizing_server.rs index 56a6892c..d2606836 100644 --- a/srt-tokio/examples/multiplex_authorizing_server.rs +++ b/srt-tokio/examples/multiplex_authorizing_server.rs @@ -13,7 +13,7 @@ use std::time::Instant; async fn main() -> io::Result<()> { let _ = pretty_env_logger::try_init(); - let (_server, mut incoming) = SrtListener::builder().bind(3333).await.unwrap(); + let (_server, mut incoming) = SrtListener::builder().bind(333).await.unwrap(); while let Some(request) = incoming.incoming().next().await { tokio::spawn(async move { handle_request(request).await }); @@ -25,7 +25,7 @@ async fn main() -> io::Result<()> { async fn handle_request(request: ConnectionRequest) { info!("received connection request"); - if *request.key_size() != KeySize::AES256 { + if request.key_size() != KeySize::AES256 { info!("rejecting, key size is not AES256"); request .reject(RejectReason::Server(ServerRejectReason::BadRequest)) diff --git a/srt-tokio/src/listener/session.rs b/srt-tokio/src/listener/session.rs index a68fddce..2a0866b6 100644 --- a/srt-tokio/src/listener/session.rs +++ b/srt-tokio/src/listener/session.rs @@ -40,8 +40,8 @@ impl ConnectionRequest { pub fn stream_id(&self) -> Option<&StreamId> { self.request.stream_id.as_ref() } - pub fn key_size(&self) -> &KeySize { - &self.request.key_size + pub fn key_size(&self) -> KeySize { + self.request.key_size } pub async fn accept( diff --git a/srt-tokio/tests/accesscontrol.rs b/srt-tokio/tests/accesscontrol.rs index b81038e3..5c084530 100644 --- a/srt-tokio/tests/accesscontrol.rs +++ b/srt-tokio/tests/accesscontrol.rs @@ -189,8 +189,8 @@ async fn key_size() { let listener = tokio::spawn(async move { while let Some(request) = incoming.incoming().next().await { + let key_size = request.key_size(); let passphrase = request.stream_id().unwrap().as_str().into(); - let key_size = request.key_size().clone(); if let Ok(mut sender) = request .accept(Some(KeySettings { From f9e3bf060cc5193a1ab4fbfc510976f0f2925d37 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 13:21:49 -0400 Subject: [PATCH 30/38] Example uses authn, not authz --- ...thorizing_server.rs => multiplex_authenticating_server.rs} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename srt-tokio/examples/{multiplex_authorizing_server.rs => multiplex_authenticating_server.rs} (92%) diff --git a/srt-tokio/examples/multiplex_authorizing_server.rs b/srt-tokio/examples/multiplex_authenticating_server.rs similarity index 92% rename from srt-tokio/examples/multiplex_authorizing_server.rs rename to srt-tokio/examples/multiplex_authenticating_server.rs index d2606836..23742a6d 100644 --- a/srt-tokio/examples/multiplex_authorizing_server.rs +++ b/srt-tokio/examples/multiplex_authenticating_server.rs @@ -13,7 +13,7 @@ use std::time::Instant; async fn main() -> io::Result<()> { let _ = pretty_env_logger::try_init(); - let (_server, mut incoming) = SrtListener::builder().bind(333).await.unwrap(); + let (_server, mut incoming) = SrtListener::builder().bind(3333).await.unwrap(); while let Some(request) = incoming.incoming().next().await { tokio::spawn(async move { handle_request(request).await }); @@ -40,7 +40,7 @@ async fn handle_request(request: ConnectionRequest) { }; let mut sender = request.accept(Some(key_settings)).await.unwrap(); let mut stream = stream::iter( - Some(Ok((Instant::now(), Bytes::from("Hello authorized user!!")))).into_iter(), + Some(Ok((Instant::now(), Bytes::from("Hello authenticated user!!")))).into_iter(), ); sender.send_all(&mut stream).await.unwrap(); From def22a39b2b638afcb61f91c43e5f767e82bfbd3 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 13:27:44 -0400 Subject: [PATCH 31/38] Passphrase::from --- srt-tokio/examples/multiplex_authenticating_server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srt-tokio/examples/multiplex_authenticating_server.rs b/srt-tokio/examples/multiplex_authenticating_server.rs index 23742a6d..fadcf64f 100644 --- a/srt-tokio/examples/multiplex_authenticating_server.rs +++ b/srt-tokio/examples/multiplex_authenticating_server.rs @@ -36,7 +36,7 @@ async fn handle_request(request: ConnectionRequest) { let key_settings = KeySettings { key_size: KeySize::AES256, - passphrase: Passphrase::try_from("password128").unwrap(), + passphrase: Passphrase::from("password128"), }; let mut sender = request.accept(Some(key_settings)).await.unwrap(); let mut stream = stream::iter( From 80099426ce11fa011f0e5334ae575bea9b3b2761 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 13:29:37 -0400 Subject: [PATCH 32/38] Fmt --- srt-tokio/examples/multiplex_authenticating_server.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/srt-tokio/examples/multiplex_authenticating_server.rs b/srt-tokio/examples/multiplex_authenticating_server.rs index fadcf64f..98102702 100644 --- a/srt-tokio/examples/multiplex_authenticating_server.rs +++ b/srt-tokio/examples/multiplex_authenticating_server.rs @@ -40,7 +40,11 @@ async fn handle_request(request: ConnectionRequest) { }; let mut sender = request.accept(Some(key_settings)).await.unwrap(); let mut stream = stream::iter( - Some(Ok((Instant::now(), Bytes::from("Hello authenticated user!!")))).into_iter(), + Some(Ok(( + Instant::now(), + Bytes::from("Hello authenticated user!!"), + ))) + .into_iter(), ); sender.send_all(&mut stream).await.unwrap(); From ec9749d4af142c71a13d3f9deb65ff646cc4962b Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 18:00:39 -0400 Subject: [PATCH 33/38] Write unit test --- .../src/protocol/pending_connection/listen.rs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/srt-protocol/src/protocol/pending_connection/listen.rs b/srt-protocol/src/protocol/pending_connection/listen.rs index 0ccb9b65..a122a955 100644 --- a/srt-protocol/src/protocol/pending_connection/listen.rs +++ b/srt-protocol/src/protocol/pending_connection/listen.rs @@ -571,4 +571,46 @@ mod test { ) ); } + + #[test] + fn advertise_key_size() { + let mut l = Listen::new(ConnInitSettings::default(), true); + + l.handle_packet( + Instant::now(), + Ok((build_hs_pack(test_induction()), conn_addr())), + ); + + let send_key_size = KeySize::AES256; + + let shake = HandshakeControlInfo { + info: HandshakeVsInfo::V5(HsV5Info { + key_size: send_key_size, + ext_hs: Some(SrtControlPacket::HandshakeRequest(SrtHandshake { + version: SrtVersion::CURRENT, + flags: SrtShakeFlags::SUPPORTED, + send_latency: Duration::from_secs(1), + recv_latency: Duration::from_secs(2), + })), + ext_km: None, + ext_group: None, + sid: None, + }), + ..test_conclusion() + }; + + let hs_packet = Packet::Control(ControlPacket { + timestamp: TimeStamp::from_micros(0), + dest_sockid: random(), + control_type: ControlTypes::Handshake(shake), + }); + + let RequestAccess(request_access) = + l.handle_packet(Instant::now(), Ok((hs_packet, conn_addr()))) + else { + panic!("expected a ConnectionResult::RequestAccess"); + }; + + assert_eq!(request_access.key_size, send_key_size); + } } From 56f32d38564357239750f62660207883d328c7d6 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 18:03:23 -0400 Subject: [PATCH 34/38] Remove integration test --- srt-tokio/tests/accesscontrol.rs | 45 +------------------------------- 1 file changed, 1 insertion(+), 44 deletions(-) diff --git a/srt-tokio/tests/accesscontrol.rs b/srt-tokio/tests/accesscontrol.rs index 5c084530..39cb9c34 100644 --- a/srt-tokio/tests/accesscontrol.rs +++ b/srt-tokio/tests/accesscontrol.rs @@ -80,7 +80,7 @@ async fn streamid() -> io::Result<()> { StandardAccessControlEntry::UserName("russell".into()).into(), StandardAccessControlEntry::ResourceName(format!("{i}")).into(), ]) - .to_string(); + .to_string(); let recvr = SrtSocket::builder() .call("127.0.0.1:2000", Some(stream_id.as_str())) @@ -182,46 +182,3 @@ async fn set_password() { server.close().await; listener.await.unwrap(); } - -#[tokio::test] -async fn key_size() { - let (mut server, mut incoming) = SrtListener::builder().bind(2001).await.unwrap(); - - let listener = tokio::spawn(async move { - while let Some(request) = incoming.incoming().next().await { - let key_size = request.key_size(); - let passphrase = request.stream_id().unwrap().as_str().into(); - - if let Ok(mut sender) = request - .accept(Some(KeySettings { - key_size, - passphrase, - })) - .await - { - let mut stream = - stream::iter(Some(Ok((Instant::now(), Bytes::from("asdf")))).into_iter()); - - tokio::spawn(async move { - sender.send_all(&mut stream).await.unwrap(); - sender.close().await.unwrap(); - info!("Sender finished"); - }); - } - } - }); - - for key_size_bytes in [0, 16, 24, 32] { - SrtSocket::builder() - .encryption(key_size_bytes, "password128") - .call("127.0.0.1:2001", Some("password128")) - .await - .unwrap() - .close() - .await - .expect("server should use the advertised key size"); - } - - server.close().await; - listener.await.unwrap(); -} From 76bee1c626bc1ed5f72e760497780eb6e407b418 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 18:05:45 -0400 Subject: [PATCH 35/38] Nit --- srt-protocol/src/protocol/pending_connection/listen.rs | 4 ++-- srt-tokio/tests/accesscontrol.rs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/srt-protocol/src/protocol/pending_connection/listen.rs b/srt-protocol/src/protocol/pending_connection/listen.rs index a122a955..a31b20b9 100644 --- a/srt-protocol/src/protocol/pending_connection/listen.rs +++ b/srt-protocol/src/protocol/pending_connection/listen.rs @@ -581,11 +581,11 @@ mod test { Ok((build_hs_pack(test_induction()), conn_addr())), ); - let send_key_size = KeySize::AES256; + let hs_key_size = KeySize::AES256; let shake = HandshakeControlInfo { info: HandshakeVsInfo::V5(HsV5Info { - key_size: send_key_size, + key_size: hs_key_size, ext_hs: Some(SrtControlPacket::HandshakeRequest(SrtHandshake { version: SrtVersion::CURRENT, flags: SrtShakeFlags::SUPPORTED, diff --git a/srt-tokio/tests/accesscontrol.rs b/srt-tokio/tests/accesscontrol.rs index 39cb9c34..32143f11 100644 --- a/srt-tokio/tests/accesscontrol.rs +++ b/srt-tokio/tests/accesscontrol.rs @@ -79,8 +79,7 @@ async fn streamid() -> io::Result<()> { let stream_id = AccessControlList(vec![ StandardAccessControlEntry::UserName("russell".into()).into(), StandardAccessControlEntry::ResourceName(format!("{i}")).into(), - ]) - .to_string(); + ]).to_string(); let recvr = SrtSocket::builder() .call("127.0.0.1:2000", Some(stream_id.as_str())) From 4dc2ae41af605bab8fbcab3f505b930c06b73432 Mon Sep 17 00:00:00 2001 From: Pierce Forte Date: Wed, 22 May 2024 18:15:08 -0400 Subject: [PATCH 36/38] Fix --- srt-protocol/src/protocol/pending_connection/listen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srt-protocol/src/protocol/pending_connection/listen.rs b/srt-protocol/src/protocol/pending_connection/listen.rs index a31b20b9..fbc0553a 100644 --- a/srt-protocol/src/protocol/pending_connection/listen.rs +++ b/srt-protocol/src/protocol/pending_connection/listen.rs @@ -611,6 +611,6 @@ mod test { panic!("expected a ConnectionResult::RequestAccess"); }; - assert_eq!(request_access.key_size, send_key_size); + assert_eq!(request_access.key_size, hs_key_size); } } From 34b697067e8f6dde6955b149bc3f10f5926afbda Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Sun, 26 May 2024 18:06:37 -0700 Subject: [PATCH 37/38] add failing tests --- srt-tokio/tests/crypto.rs | 53 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/srt-tokio/tests/crypto.rs b/srt-tokio/tests/crypto.rs index c6413544..884e260b 100644 --- a/srt-tokio/tests/crypto.rs +++ b/srt-tokio/tests/crypto.rs @@ -1,12 +1,15 @@ -use std::time::{Duration, Instant}; +use std::{ + io, + time::{Duration, Instant}, +}; use srt_tokio::SrtSocket; +use assert_matches::assert_matches; use bytes::Bytes; use futures::{SinkExt, TryStreamExt}; use log::info; - -use tokio::{spawn, time::sleep}; +use tokio::{select, spawn, time::sleep}; async fn test_crypto(size: u16) { let sender = SrtSocket::builder() @@ -49,5 +52,47 @@ async fn crypto_exchange() { test_crypto(32).await; } -// TODO: bad password +#[tokio::test] +async fn bad_password_listen() { + let listener = SrtSocket::builder() + .encryption(16, "password1234") + .listen_on(":3000"); + + let caller = SrtSocket::builder() + .encryption(16, "password123") + .call("127.0.0.1:3000", None); + + let listener_fut = spawn(async move { + listener.await.unwrap(); + }); + + let res = caller.await; + assert_matches!(res, Err(e) if e.kind() == io::ErrorKind::ConnectionRefused); + + assert_matches!( + tokio::time::timeout(Duration::from_millis(100), listener_fut).await, + Err(_) + ); +} + +#[tokio::test] +async fn bad_password_rendezvous() { + let a = SrtSocket::builder() + .local_port(5301) + .encryption(16, "password1234") + .rendezvous("127.0.0.1:5300"); + + let b = SrtSocket::builder() + .encryption(16, "password123") + .local_port(5300) + .rendezvous("127.0.0.1:5301"); + + let result = select!( + r = a => r, + r = b => r + ); + + assert_matches!(result, Err(e) if e.kind() == io::ErrorKind::ConnectionRefused); +} + // TODO: mismatch From e8068160235738ce8137d7abad5c154a422d6014 Mon Sep 17 00:00:00 2001 From: Robert Ream Date: Sun, 26 May 2024 18:07:22 -0700 Subject: [PATCH 38/38] fix rejection --- srt-protocol/src/protocol/pending_connection/listen.rs | 7 ++++--- .../src/protocol/pending_connection/rendezvous.rs | 4 ++-- srt-tokio/src/socket/listen.rs | 7 ++++++- srt-tokio/src/socket/rendezvous.rs | 8 +++++++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/srt-protocol/src/protocol/pending_connection/listen.rs b/srt-protocol/src/protocol/pending_connection/listen.rs index fbc0553a..7b863fea 100644 --- a/srt-protocol/src/protocol/pending_connection/listen.rs +++ b/srt-protocol/src/protocol/pending_connection/listen.rs @@ -96,7 +96,7 @@ impl Listen { } pub fn handle_timer(&self, _now: Instant) -> ConnectionResult { - ConnectionResult::NoAction + NoAction } fn handle_control_packets( @@ -299,13 +299,14 @@ impl Listen { } fn make_rejection( - &self, + &mut self, response_to: &HandshakeControlInfo, from: SocketAddr, timestamp: TimeStamp, r: ConnectionReject, ) -> ConnectionResult { - ConnectionResult::Reject( + self.state = InductionWait; + Reject( Some(( ControlPacket { timestamp, diff --git a/srt-protocol/src/protocol/pending_connection/rendezvous.rs b/srt-protocol/src/protocol/pending_connection/rendezvous.rs index c211e69f..5bef6cd4 100644 --- a/srt-protocol/src/protocol/pending_connection/rendezvous.rs +++ b/srt-protocol/src/protocol/pending_connection/rendezvous.rs @@ -166,12 +166,12 @@ impl Rendezvous { // } fn make_rejection( - &self, + &mut self, response_to: &HandshakeControlInfo, timestamp: TimeStamp, r: ConnectionReject, ) -> ConnectionResult { - ConnectionResult::Reject( + Reject( Some(( ControlPacket { timestamp, diff --git a/srt-tokio/src/socket/listen.rs b/srt-tokio/src/socket/listen.rs index 7202feb1..9ae7c71e 100644 --- a/srt-tokio/src/socket/listen.rs +++ b/srt-tokio/src/socket/listen.rs @@ -34,7 +34,12 @@ pub async fn bind_with( NotHandled(e) => { warn!("{:?}", e); } - Reject(_, _) => todo!(), + Reject(packet, e) => { + warn!("{:?}", e); + if let Some(packet) = packet { + let _ = socket.send(packet).await?; + } + } Connected(p, connection) => { if let Some(packet) = p { let _ = socket.send(packet).await?; diff --git a/srt-tokio/src/socket/rendezvous.rs b/srt-tokio/src/socket/rendezvous.rs index dfcf3daf..c9e8ccbf 100644 --- a/srt-tokio/src/socket/rendezvous.rs +++ b/srt-tokio/src/socket/rendezvous.rs @@ -43,7 +43,13 @@ pub async fn bind_with( NotHandled(e) => { warn!("rendezvous {:?} error: {}", socket_id, e); } - Reject(_, _) => todo!(), + Reject(p, e) => { + warn!("rendezvous {:?} error: {}", socket_id, e); + if let Some(packet) = p { + let _ = socket.send(packet).await?; + } + return Err(io::Error::new(io::ErrorKind::ConnectionRefused, e)); + } Connected(p, connection) => { if let Some(packet) = p { let _ = socket.send(packet).await?;