Skip to content

Commit a18829c

Browse files
authored
feat(queue): implement RED and PIE queues (#197)
1 parent b0e3a3f commit a18829c

7 files changed

Lines changed: 1987 additions & 3 deletions

File tree

rattan-core/src/cells/bandwidth/queue/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ mod codel;
1515
mod drophead;
1616
mod droptail;
1717
mod infinite;
18+
mod pie;
19+
mod red;
1820

1921
pub use codel::*;
2022
pub use drophead::*;
2123
pub use droptail::*;
2224
pub use infinite::*;
25+
pub use pie::*;
26+
pub use red::*;
2327

2428
#[cfg(feature = "serde")]
2529
fn serde_default<T: Default + PartialEq>(t: &T) -> bool {

rattan-core/src/cells/bandwidth/queue/pie.rs

Lines changed: 957 additions & 0 deletions
Large diffs are not rendered by default.

rattan-core/src/cells/bandwidth/queue/red.rs

Lines changed: 960 additions & 0 deletions
Large diffs are not rendered by default.

rattan-core/src/config/bandwidth.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ pub enum BwCellBuildConfig<P: Packet> {
3535
DropTail(bandwidth::BwCellConfig<P, queue::DropTailQueue<P>>),
3636
DropHead(bandwidth::BwCellConfig<P, queue::DropHeadQueue<P>>),
3737
CoDel(bandwidth::BwCellConfig<P, queue::CoDelQueue<P>>),
38+
Red(bandwidth::BwCellConfig<P, queue::RedQueue<P>>),
39+
Pie(bandwidth::BwCellConfig<P, queue::PieQueue<P>>),
3840
}
3941

4042
macro_rules! impl_bw_cell_into_factory {
@@ -56,7 +58,14 @@ macro_rules! impl_bw_cell_into_factory {
5658
};
5759
}
5860

59-
impl_bw_cell_into_factory!(InfiniteQueue, DropTailQueue, DropHeadQueue, CoDelQueue);
61+
impl_bw_cell_into_factory!(
62+
InfiniteQueue,
63+
DropTailQueue,
64+
DropHeadQueue,
65+
CoDelQueue,
66+
RedQueue,
67+
PieQueue
68+
);
6069

6170
#[cfg_attr(
6271
feature = "serde",
@@ -69,6 +78,8 @@ pub enum BwReplayCellBuildConfig<P: Packet> {
6978
DropTail(BwReplayQueueConfig<P, queue::DropTailQueue<P>>),
7079
DropHead(BwReplayQueueConfig<P, queue::DropHeadQueue<P>>),
7180
CoDel(BwReplayQueueConfig<P, queue::CoDelQueue<P>>),
81+
Red(BwReplayQueueConfig<P, queue::RedQueue<P>>),
82+
Pie(BwReplayQueueConfig<P, queue::PieQueue<P>>),
7283
}
7384

7485
#[cfg_attr(
@@ -218,4 +229,11 @@ macro_rules! impl_bw_replay_cell_into_factory {
218229
};
219230
}
220231

221-
impl_bw_replay_cell_into_factory!(InfiniteQueue, DropTailQueue, DropHeadQueue, CoDelQueue);
232+
impl_bw_replay_cell_into_factory!(
233+
InfiniteQueue,
234+
DropTailQueue,
235+
DropHeadQueue,
236+
CoDelQueue,
237+
RedQueue,
238+
PieQueue
239+
);

rattan-core/src/radix/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,12 @@ where
348348
crate::config::BwCellBuildConfig::CoDel(config) => {
349349
self.build_cell(id, config.into_factory())?;
350350
}
351+
crate::config::BwCellBuildConfig::Red(config) => {
352+
self.build_cell(id, config.into_factory())?;
353+
}
354+
crate::config::BwCellBuildConfig::Pie(config) => {
355+
self.build_cell(id, config.into_factory())?;
356+
}
351357
},
352358
CellBuildConfig::BwReplay(bw_replay_config) => match bw_replay_config {
353359
crate::config::BwReplayCellBuildConfig::Infinite(config) => {
@@ -362,6 +368,12 @@ where
362368
crate::config::BwReplayCellBuildConfig::CoDel(config) => {
363369
self.build_cell(id, config.into_factory())?;
364370
}
371+
crate::config::BwReplayCellBuildConfig::Red(config) => {
372+
self.build_cell(id, config.into_factory())?;
373+
}
374+
crate::config::BwReplayCellBuildConfig::Pie(config) => {
375+
self.build_cell(id, config.into_factory())?;
376+
}
365377
},
366378
CellBuildConfig::Delay(config) => {
367379
self.build_cell(id, config.into_factory())?;

src/channel.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ use netem_trace::{Bandwidth, Delay};
55
use paste::paste;
66
use rattan_core::{
77
cells::bandwidth::{
8-
queue::{CoDelQueueConfig, DropHeadQueueConfig, DropTailQueueConfig, InfiniteQueueConfig},
8+
queue::{
9+
CoDelQueueConfig, DropHeadQueueConfig, DropTailQueueConfig, InfiniteQueueConfig,
10+
PieQueueConfig, RedQueueConfig,
11+
},
912
BwCellConfig,
1013
},
1114
config::{
@@ -92,6 +95,8 @@ enum QueueType {
9295
DropTail,
9396
DropHead,
9497
CoDel,
98+
Red,
99+
Pie,
95100
}
96101

97102
// Deserialize queue args and create BwCellBuildConfig
@@ -170,6 +175,12 @@ impl ChannelArgs {
170175
Some(QueueType::CoDel) => {
171176
bw_q_args_into_config!(CoDel, self.uplink_queue_args.clone(), bandwidth)
172177
}
178+
Some(QueueType::Red) => {
179+
bw_q_args_into_config!(Red, self.uplink_queue_args.clone(), bandwidth)
180+
}
181+
Some(QueueType::Pie) => {
182+
bw_q_args_into_config!(Pie, self.uplink_queue_args.clone(), bandwidth)
183+
}
173184
};
174185
uplink_count += 1;
175186
cells_config.insert(format!("up_{uplink_count}"), cell_config);
@@ -197,6 +208,12 @@ impl ChannelArgs {
197208
Some(QueueType::CoDel) => {
198209
bwreplay_q_args_into_config!(CoDel, self.uplink_queue_args.clone(), trace_file)
199210
}
211+
Some(QueueType::Red) => {
212+
bwreplay_q_args_into_config!(Red, self.uplink_queue_args.clone(), trace_file)
213+
}
214+
Some(QueueType::Pie) => {
215+
bwreplay_q_args_into_config!(Pie, self.uplink_queue_args.clone(), trace_file)
216+
}
200217
};
201218
uplink_count += 1;
202219
cells_config.insert(format!("up_{uplink_count}"), cell_config);
@@ -220,6 +237,12 @@ impl ChannelArgs {
220237
Some(QueueType::CoDel) => {
221238
bw_q_args_into_config!(CoDel, self.downlink_queue_args.clone(), bandwidth)
222239
}
240+
Some(QueueType::Red) => {
241+
bw_q_args_into_config!(Red, self.downlink_queue_args.clone(), bandwidth)
242+
}
243+
Some(QueueType::Pie) => {
244+
bw_q_args_into_config!(Pie, self.downlink_queue_args.clone(), bandwidth)
245+
}
223246
};
224247
downlink_count += 1;
225248
cells_config.insert(format!("down_{downlink_count}"), cell_config);
@@ -251,6 +274,12 @@ impl ChannelArgs {
251274
trace_file
252275
)
253276
}
277+
Some(QueueType::Red) => {
278+
bwreplay_q_args_into_config!(Red, self.downlink_queue_args.clone(), trace_file)
279+
}
280+
Some(QueueType::Pie) => {
281+
bwreplay_q_args_into_config!(Pie, self.downlink_queue_args.clone(), trace_file)
282+
}
254283
};
255284
downlink_count += 1;
256285
cells_config.insert(format!("down_{downlink_count}"), cell_config);

src/visualize_trace.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ pub fn write_visualize_trace<P: Packet>(
261261
BwCellBuildConfig::Infinite(config) => config.bandwidth,
262262
BwCellBuildConfig::DropHead(config) => config.bandwidth,
263263
BwCellBuildConfig::DropTail(config) => config.bandwidth,
264+
BwCellBuildConfig::Red(config) => config.bandwidth,
265+
BwCellBuildConfig::Pie(config) => config.bandwidth,
264266
}
265267
.unwrap_or(Bandwidth::from_bps(u64::MAX));
266268
trace_record.add_cell(
@@ -292,6 +294,8 @@ pub fn write_visualize_trace<P: Packet>(
292294
BwReplayCellBuildConfig::DropHead(config) => config.get_trace(),
293295
BwReplayCellBuildConfig::DropTail(config) => config.get_trace(),
294296
BwReplayCellBuildConfig::Infinite(config) => config.get_trace(),
297+
BwReplayCellBuildConfig::Red(config) => config.get_trace(),
298+
BwReplayCellBuildConfig::Pie(config) => config.get_trace(),
295299
}?;
296300

297301
let trace_points = expand_bw_trace(trace.as_mut(), start, end_time)

0 commit comments

Comments
 (0)