@@ -6,13 +6,15 @@ use netem_trace::{model::BwTraceConfig, Bandwidth, BwTrace, Delay};
66#[ cfg( feature = "serde" ) ]
77use serde:: { Deserialize , Serialize } ;
88use tokio:: sync:: mpsc;
9+ use tokio:: sync:: mpsc:: error:: TryRecvError ;
910use tokio:: time:: Instant ;
1011use tracing:: { debug, info, trace} ;
1112
1213use super :: {
1314 AtomicCellState , Cell , CellState , ControlInterface , CurrentConfig , Egress , Ingress , Packet ,
1415 LARGE_DURATION , TRACE_START_INSTANT ,
1516} ;
17+ use crate :: cells:: bandwidth:: queue:: AQM ;
1618use crate :: error:: Error ;
1719use crate :: metal:: timer:: Timer ;
1820
9193 egress : mpsc:: UnboundedReceiver < P > ,
9294 bw_type : BwType ,
9395 bandwidth : Bandwidth ,
94- packet_queue : Q ,
96+ packet_queue : AQM < Q , P > ,
9597 next_available : Instant ,
9698 config_rx : mpsc:: UnboundedReceiver < BwCellConfig < P , Q > > ,
9799 timer : Timer ,
@@ -143,6 +145,7 @@ where
143145 /// queue and thus being returnd, this function returns `Some`. When this happens, the caller
144146 /// should send out the packet immediately.
145147 #[ inline( always) ]
148+ #[ must_use]
146149 fn enqueue_packet ( & mut self , new_packet : P ) -> Option < P > {
147150 if let Some ( packet_to_drop) = self . packet_queue . enqueue ( new_packet) {
148151 let timestamp = packet_to_drop. get_timestamp ( ) ;
@@ -155,7 +158,6 @@ where
155158 None
156159 }
157160}
158-
159161#[ async_trait]
160162impl < P , Q > Egress < P > for BwCellEgress < P , Q >
161163where
@@ -187,7 +189,29 @@ where
187189 }
188190 }
189191
190- let mut packet = self . packet_queue . dequeue ( ) ;
192+ while self . packet_queue . need_more_packets ( self . next_available ) {
193+ match self . egress . try_recv ( ) {
194+ Ok ( new_packet) => {
195+ let new_packet = crate :: check_cell_state!( self . state, new_packet) ;
196+ if let Some ( packet) = self . enqueue_packet ( new_packet) {
197+ return Some ( packet) ;
198+ }
199+ }
200+ Err ( TryRecvError :: Empty ) => {
201+ break ;
202+ }
203+ Err ( TryRecvError :: Disconnected ) => {
204+ return None ;
205+ }
206+ }
207+ }
208+ // Here, either:
209+ // 1) No more packets can be retrived from egress, or
210+ // 2) A packet, that should enter the queue after `self.next_available` is seen.
211+ // Thus the `dequeue_at()` see a correct queue, containing any packet that should
212+ // enter the AQM at `self.next_available`.
213+ let mut packet = self . packet_queue . dequeue_at ( self . next_available ) ;
214+
191215 while packet. is_none ( ) {
192216 // the queue is empty, wait for the next packet
193217 tokio:: select! {
@@ -198,10 +222,11 @@ where
198222 // `new_packet` can be None only if `self.egress` is closed.
199223 new_packet = self . egress. recv( ) => {
200224 let new_packet = crate :: check_cell_state!( self . state, new_packet?) ;
225+ let timestamp = new_packet. get_timestamp( ) ;
201226 if let Some ( packet) = self . enqueue_packet( new_packet) {
202227 return Some ( packet) ;
203228 }
204- packet = self . packet_queue. dequeue ( ) ;
229+ packet = self . packet_queue. dequeue_at ( timestamp ) ;
205230 }
206231 }
207232 }
@@ -377,7 +402,7 @@ where
377402 egress : tx,
378403 bw_type : bw_type. into ( ) . unwrap_or_default ( ) ,
379404 bandwidth : bandwidth. into ( ) . unwrap_or ( MAX_BANDWIDTH ) ,
380- packet_queue,
405+ packet_queue : AQM :: new ( packet_queue ) ,
381406 next_available : Instant :: now ( ) ,
382407 config_rx,
383408 timer : Timer :: new ( ) ?,
@@ -400,7 +425,7 @@ where
400425 egress : mpsc:: UnboundedReceiver < P > ,
401426 bw_type : BwType ,
402427 trace : Box < dyn BwTrace > ,
403- packet_queue : Q ,
428+ packet_queue : AQM < Q , P > ,
404429 current_bandwidth : CurrentConfig < Bandwidth > ,
405430 next_available : Instant ,
406431 next_change : Instant ,
@@ -478,11 +503,12 @@ where
478503 if let Some ( ( bandwidth, duration) ) = self . trace . next_bw ( ) {
479504 self . change_bandwidth ( bandwidth, change_time) ;
480505 self . next_change = change_time + duration;
481- #[ cfg( test) ]
482- trace ! (
483- "Bandwidth changed to {:?}, next change after {:?}" ,
506+ // #[cfg(test)]
507+ eprintln ! (
508+ "Bandwidth changed to {:?}, next change after {:?}. now {:?} " ,
484509 bandwidth,
485- self . next_change - Instant :: now( )
510+ self . next_change - Instant :: now( ) ,
511+ Instant :: now( ) ,
486512 ) ;
487513 true
488514 } else {
@@ -556,7 +582,29 @@ where
556582 }
557583 }
558584
559- let mut packet = self . packet_queue . dequeue ( ) ;
585+ while self . packet_queue . need_more_packets ( self . next_available ) {
586+ match self . egress . try_recv ( ) {
587+ Ok ( new_packet) => {
588+ let new_packet = crate :: check_cell_state!( self . state, new_packet) ;
589+ if let Some ( packet) = self . enqueue_packet ( new_packet) {
590+ return Some ( packet) ;
591+ }
592+ }
593+ Err ( TryRecvError :: Empty ) => {
594+ break ;
595+ }
596+ Err ( TryRecvError :: Disconnected ) => {
597+ return None ;
598+ }
599+ }
600+ }
601+
602+ // Here, either:
603+ // 1) No more packets can be retrived from egress, or
604+ // 2) A packet, that should enter the queue after `self.next_available` is seen.
605+ // Thus the `dequeue_at()` see a correct queue, containing any packet that should
606+ // enter the AQM at `self.next_available`.
607+ let mut packet = self . packet_queue . dequeue_at ( self . next_available ) ;
560608
561609 while packet. is_none ( ) {
562610 // the queue is empty, wait for the next packet
@@ -571,10 +619,11 @@ where
571619 // `new_packet` can be None only if `self.egress` is closed.
572620 new_packet = self . egress. recv( ) => {
573621 let new_packet = crate :: check_cell_state!( self . state, new_packet?) ;
622+ let timestamp = new_packet. get_timestamp( ) ;
574623 if let Some ( packet) = self . enqueue_packet( new_packet) {
575624 return Some ( packet) ;
576625 }
577- packet = self . packet_queue. dequeue ( ) ;
626+ packet = self . packet_queue. dequeue_at ( timestamp ) ;
578627 }
579628 }
580629 }
@@ -606,6 +655,7 @@ where
606655 fn reset ( & mut self ) {
607656 self . next_available = * TRACE_START_INSTANT . get_or_init ( Instant :: now) ;
608657 self . next_change = * TRACE_START_INSTANT . get_or_init ( Instant :: now) ;
658+ eprintln ! ( "Reset to {:?}" , self . next_change) ;
609659 }
610660
611661 fn change_state ( & self , state : CellState ) {
@@ -770,7 +820,7 @@ where
770820 egress : tx,
771821 bw_type : bw_type. into ( ) . unwrap_or_default ( ) ,
772822 trace,
773- packet_queue,
823+ packet_queue : AQM :: new ( packet_queue ) ,
774824 current_bandwidth : CurrentConfig :: default ( ) ,
775825 next_available : Instant :: now ( ) ,
776826 next_change : Instant :: now ( ) ,
0 commit comments