nlink 0.13.0

Async netlink library for Linux network configuration
Documentation
//! CoDel qdisc options.

use crate::netlink::{Error, MessageBuilder, Result, types::tc::qdisc::codel::*};

/// Build CoDel qdisc options from parameters.
///
/// Supported parameters:
/// - `limit PACKETS` - Hard limit on queue size
/// - `target TIME` - Target delay (e.g., "5ms")
/// - `interval TIME` - Width of moving time window (e.g., "100ms")
/// - `ce_threshold TIME` - ECN CE marking threshold
/// - `ecn` / `noecn` - Enable/disable ECN
pub fn build(builder: &mut MessageBuilder, params: &[String]) -> Result<()> {
    let mut i = 0;
    while i < params.len() {
        match params[i].as_str() {
            "limit" if i + 1 < params.len() => {
                let limit: u32 = params[i + 1]
                    .parse()
                    .map_err(|_| Error::InvalidMessage("invalid limit".into()))?;
                builder.append_attr_u32(TCA_CODEL_LIMIT, limit);
                i += 2;
            }
            "target" if i + 1 < params.len() => {
                let target = crate::util::parse::get_time(&params[i + 1])
                    .map_err(|_| Error::InvalidMessage("invalid target".into()))?;
                builder.append_attr_u32(TCA_CODEL_TARGET, target.as_micros() as u32);
                i += 2;
            }
            "interval" if i + 1 < params.len() => {
                let interval = crate::util::parse::get_time(&params[i + 1])
                    .map_err(|_| Error::InvalidMessage("invalid interval".into()))?;
                builder.append_attr_u32(TCA_CODEL_INTERVAL, interval.as_micros() as u32);
                i += 2;
            }
            "ce_threshold" if i + 1 < params.len() => {
                let ce = crate::util::parse::get_time(&params[i + 1])
                    .map_err(|_| Error::InvalidMessage("invalid ce_threshold".into()))?;
                builder.append_attr_u32(TCA_CODEL_CE_THRESHOLD, ce.as_micros() as u32);
                i += 2;
            }
            "ecn" => {
                builder.append_attr_u32(TCA_CODEL_ECN, 1);
                i += 1;
            }
            "noecn" => {
                builder.append_attr_u32(TCA_CODEL_ECN, 0);
                i += 1;
            }
            _ => i += 1,
        }
    }
    Ok(())
}