diff --git a/src/config.rs b/src/config.rs index afe1b89..f00ea64 100644 --- a/src/config.rs +++ b/src/config.rs @@ -84,6 +84,9 @@ pub struct Config { pub speed_hist_size: u32, pub tick_interval: f64, pub upload_delay_ms: f64, + + // Monitoring / dry-run + pub dry_run: bool, } impl Config { @@ -186,6 +189,11 @@ impl Config { "sqm-autorate.@advanced_settings[0].upload_delay_ms", Some(15.0), )?, + dry_run: Self::get::( + "SQMA_DRY_RUN", + "sqm-autorate.@advanced_settings[0].dry_run", + Some(false), + )?, }; let mut config = config; diff --git a/src/main.rs b/src/main.rs index d52b200..fa5b2df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,6 +39,9 @@ fn main() -> anyhow::Result<()> { let config = Config::new()?; log::init(config.log_level)?; + if config.dry_run { + info!("*** MONITORING MODE ACTIVE — qdisc rates will NOT be changed ***"); + } let mut reflectors = config.load_reflectors()?; let start_t = Instant::now(); @@ -111,8 +114,8 @@ fn main() -> anyhow::Result<()> { "Setting shaper rates to minimum (D/L): {} / {}", config.download_min_kbits, config.upload_min_kbits ); - Netlink::set_qdisc_rate(down_qdisc, config.download_min_kbits as u64)?; - Netlink::set_qdisc_rate(up_qdisc, config.upload_min_kbits as u64)?; + Netlink::set_qdisc_rate(down_qdisc, config.download_min_kbits as u64, config.dry_run)?; + Netlink::set_qdisc_rate(up_qdisc, config.upload_min_kbits as u64, config.dry_run)?; // Sleep for a few seconds to give the shaper a chance // to control the queue if load is heavy diff --git a/src/netlink.rs b/src/netlink.rs index 0ee82ba..f0b9e48 100644 --- a/src/netlink.rs +++ b/src/netlink.rs @@ -1,6 +1,7 @@ use std::io; use std::str::Utf8Error; +use log::info; use netlink_bindings::{rt_link, tc}; use netlink_socket2::NetlinkSocket; use thiserror::Error; @@ -111,7 +112,15 @@ impl Netlink { Netlink::qdisc_from_ifindex(ifindex, ifname) } - pub fn set_qdisc_rate(qdisc: Qdisc, bandwidth_kbit: u64) -> Result<(), NetlinkError> { + pub fn set_qdisc_rate(qdisc: Qdisc, bandwidth_kbit: u64, dry_run: bool) -> Result<(), NetlinkError> { + if dry_run { + info!( + "dry-run: would set qdisc ifindex={} to {} kbit/s", + qdisc.ifindex, bandwidth_kbit + ); + return Ok(()); + } + let mut socket = NetlinkSocket::new(); let bandwidth = bandwidth_kbit * 1000 / 8; diff --git a/src/ratecontroller.rs b/src/ratecontroller.rs index 8b6a1d8..f2a6f3c 100644 --- a/src/ratecontroller.rs +++ b/src/ratecontroller.rs @@ -282,10 +282,12 @@ impl Ratecontroller { Netlink::set_qdisc_rate( self.state_dl.qdisc, self.state_dl.current_rate.round() as u64, + self.config.dry_run, )?; Netlink::set_qdisc_rate( self.state_ul.qdisc, self.state_ul.current_rate.round() as u64, + self.config.dry_run, )?; let mut speed_hist_fd: Option = None; @@ -346,10 +348,12 @@ impl Ratecontroller { Netlink::set_qdisc_rate( self.state_dl.qdisc, self.state_dl.next_rate as u64, + self.config.dry_run, )?; Netlink::set_qdisc_rate( self.state_ul.qdisc, self.state_ul.next_rate as u64, + self.config.dry_run, )?; self.state_dl.current_rate = self.state_dl.next_rate; @@ -370,11 +374,11 @@ impl Ratecontroller { } if self.state_dl.next_rate != self.state_dl.current_rate { - Netlink::set_qdisc_rate(self.state_dl.qdisc, self.state_dl.next_rate as u64)?; + Netlink::set_qdisc_rate(self.state_dl.qdisc, self.state_dl.next_rate as u64, self.config.dry_run)?; } if self.state_ul.next_rate != self.state_ul.current_rate { - Netlink::set_qdisc_rate(self.state_ul.qdisc, self.state_ul.next_rate as u64)?; + Netlink::set_qdisc_rate(self.state_ul.qdisc, self.state_ul.next_rate as u64, self.config.dry_run)?; } self.state_dl.current_rate = self.state_dl.next_rate;