From a9bac8fdadb8adecb62ad2b7aef0f016a2e1090e Mon Sep 17 00:00:00 2001 From: Crimson Date: Tue, 12 May 2026 14:34:28 +0500 Subject: [PATCH] =?UTF-8?q?fix27:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80=20roo?= =?UTF-8?q?t-=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20tc=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=BB=D0=BE=D0=B6=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- traffic_core/src/traffic.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/traffic_core/src/traffic.rs b/traffic_core/src/traffic.rs index 43c94da..2a7f4f7 100644 --- a/traffic_core/src/traffic.rs +++ b/traffic_core/src/traffic.rs @@ -606,14 +606,17 @@ fn is_not_found_error(stderr_or_msg: &str) -> bool { fn parse_root_class_rate_ceil(raw: &str, class_id: &str) -> Option { for line in raw.lines() { let t = line.trim(); - if !t.contains("class htb") - || !t.contains(class_id) - || !t.contains(" rate ") - || !t.contains(" ceil ") - { + if !t.contains("class htb") || !t.contains(" rate ") || !t.contains(" ceil ") { continue; } let toks: Vec<&str> = t.split_whitespace().collect(); + let class = toks + .iter() + .position(|v| *v == "htb") + .and_then(|i| toks.get(i + 1))?; + if *class != class_id { + continue; + } let rate = toks .iter() .position(|v| *v == "rate") @@ -1125,10 +1128,16 @@ mod tests { #[test] fn parse_root_rate_ceil() { - let raw = "class htb 1:1 root rate 1000Mbit ceil 1000Mbit"; + let raw = "class htb 1:10 parent 1:1 leaf 800f: prio 0 rate 50Mbit ceil 50Mbit burst 1600b cburst 1600b\nclass htb 1:1 root rate 500Mbit ceil 500Mbit burst 1600b cburst 1600b"; let rc = parse_root_class_rate_ceil(raw, "1:1").expect("root class exists"); - assert_eq!(normalize_tc_rate(&rc.rate), "1000mbit"); - assert_eq!(normalize_tc_rate(&rc.ceil), "1000mbit"); + assert_eq!(normalize_tc_rate(&rc.rate), "500mbit"); + assert_eq!(normalize_tc_rate(&rc.ceil), "500mbit"); + } + + #[test] + fn parse_root_rate_ceil_returns_none_when_only_parent_matches() { + let raw = "class htb 1:10 parent 1:1 leaf 800f: prio 0 rate 50Mbit ceil 50Mbit burst 1600b cburst 1600b"; + assert!(parse_root_class_rate_ceil(raw, "1:1").is_none()); } #[test]