feat(irtt): make IRTT measurement optional and refine engine behavior
Build binaries / Build (arm-musleabi) (push) Successful in 1m42s
Build binaries / Build (aarch64-musl) (push) Successful in 1m44s
Build binaries / Build (arm-musleabihf) (push) Successful in 1m45s
Build binaries / Build (armv7-musleabi) (push) Successful in 1m44s
Build binaries / Build (i686-musl) (push) Successful in 1m36s
Build binaries / Build (armv7-musleabihf) (push) Successful in 1m39s
Build binaries / Build (mips-musl) (push) Successful in 2m6s
Build binaries / Build (mips64-muslabi64) (push) Successful in 2m7s
Build binaries / Build (mipsel-musl) (push) Successful in 2m18s
Build binaries / Build (mips64el-muslabi64) (push) Successful in 2m18s
Build binaries / Build (x86_64-musl) (push) Successful in 1m53s
Build binaries / Build (riscv64gc-musl) (push) Successful in 1m54s
Build binaries / Build (arm-musleabi) (push) Successful in 1m42s
Build binaries / Build (aarch64-musl) (push) Successful in 1m44s
Build binaries / Build (arm-musleabihf) (push) Successful in 1m45s
Build binaries / Build (armv7-musleabi) (push) Successful in 1m44s
Build binaries / Build (i686-musl) (push) Successful in 1m36s
Build binaries / Build (armv7-musleabihf) (push) Successful in 1m39s
Build binaries / Build (mips-musl) (push) Successful in 2m6s
Build binaries / Build (mips64-muslabi64) (push) Successful in 2m7s
Build binaries / Build (mipsel-musl) (push) Successful in 2m18s
Build binaries / Build (mips64el-muslabi64) (push) Successful in 2m18s
Build binaries / Build (x86_64-musl) (push) Successful in 1m53s
Build binaries / Build (riscv64gc-musl) (push) Successful in 1m54s
Conditionally compile IRTT functionality behind the `irtt` feature flag to allow building smaller binaries without IRTT dependencies. Enhance IRTT engine shutdown, configuration, and clarify ICMP protocol names.
This commit is contained in:
5 files changed
+112
-42
No files matched your search
+19
-8
@@ -8,10 +8,11 @@ use std::{
|
||||
use flume::{Receiver, SendError, Sender};
|
||||
use thiserror::Error;
|
||||
|
||||
#[cfg(feature = "irtt")]
|
||||
use crate::measurement::irtt::IrttBinding;
|
||||
use crate::{
|
||||
measurement::{
|
||||
icmp::IcmpBinding,
|
||||
irtt::IrttBinding,
|
||||
model::{MeasurementSource, MeasurementStream, MeasurementStreamId, ProbeSchedule},
|
||||
},
|
||||
settings::ReflectorDefinition,
|
||||
@@ -21,6 +22,7 @@ use crate::{
|
||||
pub enum ControllerError {
|
||||
#[error("ICMP channel error")]
|
||||
IcmpChannelError(#[from] SendError<Vec<IcmpBinding>>),
|
||||
#[cfg(feature = "irtt")]
|
||||
#[error("IRTT channel error")]
|
||||
IrttChannelError(#[from] SendError<Vec<IrttBinding>>),
|
||||
}
|
||||
@@ -28,6 +30,7 @@ pub enum ControllerError {
|
||||
pub struct Controller {
|
||||
reflector_rx: Receiver<Vec<SocketAddr>>,
|
||||
icmp_binding_tx: Sender<Vec<IcmpBinding>>,
|
||||
#[cfg(feature = "irtt")]
|
||||
irtt_binding_tx: Sender<Vec<IrttBinding>>,
|
||||
reflectors: HashMap<SocketAddr, ReflectorDefinition>,
|
||||
active_streams: Arc<RwLock<Vec<MeasurementStream>>>,
|
||||
@@ -42,7 +45,7 @@ impl Controller {
|
||||
pub fn new(
|
||||
reflector_rx: Receiver<Vec<SocketAddr>>,
|
||||
icmp_binding_tx: Sender<Vec<IcmpBinding>>,
|
||||
irtt_binding_tx: Sender<Vec<IrttBinding>>,
|
||||
#[cfg(feature = "irtt")] irtt_binding_tx: Sender<Vec<IrttBinding>>,
|
||||
reflectors: HashMap<SocketAddr, ReflectorDefinition>,
|
||||
active_streams: Arc<RwLock<Vec<MeasurementStream>>>,
|
||||
endpoint_streams: Arc<RwLock<HashMap<SocketAddr, MeasurementStream>>>,
|
||||
@@ -51,6 +54,7 @@ impl Controller {
|
||||
Self {
|
||||
reflector_rx,
|
||||
icmp_binding_tx,
|
||||
#[cfg(feature = "irtt")]
|
||||
irtt_binding_tx,
|
||||
reflectors,
|
||||
active_streams,
|
||||
@@ -90,18 +94,21 @@ impl Controller {
|
||||
) -> Result<(), ControllerError> {
|
||||
let count = endpoints.len();
|
||||
let mut icmp = Vec::new();
|
||||
#[cfg(feature = "irtt")]
|
||||
let mut irtt = Vec::new();
|
||||
let mut streams = Vec::with_capacity(count);
|
||||
let mut endpoint_streams = HashMap::new();
|
||||
for (index, endpoint) in endpoints.into_iter().enumerate() {
|
||||
let Some((port, hmac)) = self.reflectors.get(&endpoint).map(|definition| {
|
||||
(
|
||||
definition.irtt_port.unwrap_or(2112),
|
||||
definition.irtt_hmac.clone(),
|
||||
)
|
||||
}) else {
|
||||
let Some(_definition) = self.reflectors.get(&endpoint) else {
|
||||
continue;
|
||||
};
|
||||
#[cfg(feature = "irtt")]
|
||||
let (port, hmac) = {
|
||||
(
|
||||
_definition.irtt_port.unwrap_or(2112),
|
||||
_definition.irtt_hmac.clone(),
|
||||
)
|
||||
};
|
||||
let stream = self.stream_for(endpoint);
|
||||
let schedule = ProbeSchedule {
|
||||
period: self.period,
|
||||
@@ -111,9 +118,12 @@ impl Controller {
|
||||
MeasurementSource::IcmpEcho | MeasurementSource::IcmpTimestamp => {
|
||||
icmp.push(IcmpBinding::new(stream, schedule))
|
||||
}
|
||||
#[cfg(feature = "irtt")]
|
||||
MeasurementSource::Irtt => {
|
||||
irtt.push(IrttBinding::new(stream, schedule, port, hmac))
|
||||
}
|
||||
#[cfg(not(feature = "irtt"))]
|
||||
MeasurementSource::Irtt => unreachable!("IRTT feature is checked before startup"),
|
||||
_ => unreachable!("unsupported reflector measurement source"),
|
||||
}
|
||||
streams.push(stream);
|
||||
@@ -128,6 +138,7 @@ impl Controller {
|
||||
.write()
|
||||
.expect("endpoint stream lock poisoned") = endpoint_streams;
|
||||
self.icmp_binding_tx.send_async(icmp).await?;
|
||||
#[cfg(feature = "irtt")]
|
||||
self.irtt_binding_tx.send_async(irtt).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user