use crate::netlink::{Error, MessageBuilder, Result, types::tc::qdisc::codel::*};
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(¶ms[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(¶ms[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(¶ms[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(())
}