mod cli;
mod glue;
mod reporting;
#[cfg(test)]
mod tests;
use super::json_writer::json_writer;
use crate::congestion::{
count_tp, fps_tp, rate_tp, size_tp, time_tp, PRAGUE_INITMTU, PRAGUE_MAXRATE,
};
use crate::core::{
AppError, RunnerConfig, FRAME_DURATION, FRAME_PER_SECOND, PORT, RFC8888_ACKPERIOD,
};
pub const REPT_PERIOD: u32 = 1_000_000;
#[derive(Debug)]
pub struct AppStuff {
pub sender_role: bool,
pub verbose: bool,
pub quiet: bool,
pub rcv_addr: String,
pub rcv_port: u32,
pub connect: bool,
pub startup_wait_timeout_us: Option<u32>,
pub json_output: bool,
pub json_output_failed: bool,
pub jw: json_writer,
pub max_pkt: size_tp,
pub max_rate: rate_tp,
pub data_tm: time_tp,
pub ack_tm: time_tp,
pub rept_tm: time_tp,
pub rept_int: u32,
pub rept_name: String,
pub acc_bytes_sent: rate_tp,
pub acc_bytes_rcvd: rate_tp,
pub acc_rtts: rate_tp,
pub count_rtts: count_tp,
pub prev_pkts: count_tp,
pub prev_marks: count_tp,
pub prev_losts: count_tp,
pub rfc8888_ack: bool,
pub rfc8888_ackperiod: u32,
pub rt_mode: bool,
pub rt_fps: fps_tp,
pub rt_frameduration: u32,
}
impl AppStuff {
pub fn new(sender: bool, args: &[String]) -> Result<Self, AppError> {
let mut app = Self {
sender_role: sender,
verbose: false,
quiet: false,
rcv_addr: "0.0.0.0".to_string(),
rcv_port: PORT as u32,
connect: false,
startup_wait_timeout_us: None,
json_output: false,
json_output_failed: false,
jw: json_writer::new(),
max_pkt: PRAGUE_INITMTU,
max_rate: PRAGUE_MAXRATE,
data_tm: 1,
ack_tm: 1,
rept_tm: REPT_PERIOD as time_tp,
rept_int: REPT_PERIOD,
rept_name: String::new(),
acc_bytes_sent: 0,
acc_bytes_rcvd: 0,
acc_rtts: 0,
count_rtts: 0,
prev_pkts: 0,
prev_marks: 0,
prev_losts: 0,
rfc8888_ack: false,
rfc8888_ackperiod: RFC8888_ACKPERIOD,
rt_mode: false,
rt_fps: FRAME_PER_SECOND,
rt_frameduration: FRAME_DURATION,
};
app.parse_args(args)?;
app.print_info();
Ok(app)
}
#[inline]
fn missing_value(flag: &'static str) -> AppError {
AppError::MissingValue(flag)
}
#[inline]
fn invalid_value(detail: &'static str) -> AppError {
AppError::InvalidValue(detail)
}
pub fn runner_config(&self) -> RunnerConfig {
RunnerConfig::from(self)
}
#[inline]
fn record_timing_sample(&mut self, sample: time_tp) {
self.acc_rtts = self.acc_rtts.saturating_add(sample.max(0) as u64);
self.count_rtts = self.count_rtts.wrapping_add(1);
}
}