Rename the application Cargo package from irtt-cli to irtt-rs (crates/irtt-cli -> crates/irtt-app), and hard-rename its scriptable client binary from irtt-cli to irtt-client, now that the application also ships a first-class server and the old name reads as an umbrella CLI for both roles. Give each dedicated binary (irtt-client, irtt-tui, irtt-server) its own entry point instead of funneling through the multicall dispatcher's argv0/subcommand logic, so a dedicated binary only links the applet code for the role it implements and always runs that role regardless of the name it's invoked or copied under. irtt-rs remains the feature-selectable multicall dispatcher and is now the only binary that inspects argv0 or subcommands. Move future application releases to the irtt-rs/vX.Y.Z tag namespace (regenerated via `dist generate`), and bump the application package to 0.6.0 as a breaking distribution change. Library crate versions are unaffected.
53 lines
1.8 KiB
Rust
53 lines
1.8 KiB
Rust
use std::time::Duration;
|
|
|
|
use irtt_client::{ClientConfig, NegotiationPolicy, SocketConfig};
|
|
|
|
use super::args::CommonClientArgs;
|
|
|
|
pub const DEFAULT_RECV_TIMEOUT: Duration = Duration::from_millis(20);
|
|
|
|
impl CommonClientArgs {
|
|
/// Build the shared client configuration template for a managed run.
|
|
///
|
|
/// The template carries no server address: the managed driver replaces it
|
|
/// per target from that target's configuration, so deriving one here from
|
|
/// an arbitrary target would be dead data.
|
|
pub fn to_client_config(&self, duration: Duration) -> ClientConfig {
|
|
ClientConfig {
|
|
duration: (!duration.is_zero()).then_some(duration),
|
|
interval: self.interval,
|
|
length: self.length,
|
|
received_stats: self.stats.into(),
|
|
stamp_at: self.tstamp.into(),
|
|
clock: self.clock.into(),
|
|
dscp: self.dscp,
|
|
hmac_key: self.hmac.as_ref().map(|key| key.as_bytes().to_vec()),
|
|
server_fill: self.server_fill.clone(),
|
|
negotiation_policy: if self.loose {
|
|
NegotiationPolicy::Loose
|
|
} else {
|
|
NegotiationPolicy::Strict
|
|
},
|
|
socket_config: SocketConfig {
|
|
ttl: self.ttl,
|
|
recv_timeout: Some(DEFAULT_RECV_TIMEOUT),
|
|
..SocketConfig::default()
|
|
},
|
|
..ClientConfig::default()
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn expected_probe_count(duration: Duration, interval: Duration) -> u64 {
|
|
let interval_nanos = interval.as_nanos();
|
|
if interval_nanos == 0 {
|
|
return u64::MAX;
|
|
}
|
|
|
|
let expected = duration
|
|
.as_nanos()
|
|
.saturating_add(interval_nanos.saturating_sub(1))
|
|
/ interval_nanos;
|
|
expected.min(u128::from(u64::MAX)) as u64
|
|
}
|