@@ -192,8 +192,7 @@ where
192192 rand_val < self . p
193193 }
194194
195- fn update_avg_drate ( & mut self , pkt_size : usize ) {
196- let now = Instant :: now ( ) ;
195+ fn update_avg_drate ( & mut self , pkt_size : usize , now : Instant ) {
197196 let dq_threshold = 16384 ; // 16 KiB
198197
199198 // Enter a measurement cycle
@@ -294,11 +293,11 @@ where
294293 self . queue . push_back ( packet) ;
295294 }
296295
297- fn dequeue ( & mut self ) -> Option < P > {
296+ fn dequeue_at ( & mut self , timestamp : Instant ) -> Option < P > {
298297 if let Some ( packet) = self . queue . pop_front ( ) {
299298 let pkt_size = packet. l3_length ( ) + self . get_extra_length ( ) ;
300299 self . now_bytes -= pkt_size;
301- self . update_avg_drate ( pkt_size) ;
300+ self . update_avg_drate ( pkt_size, timestamp ) ;
302301 Some ( packet)
303302 } else {
304303 None
@@ -353,7 +352,7 @@ mod tests {
353352 assert ! ( !queue. is_empty( ) ) ;
354353 assert_eq ! ( queue. length( ) , 1 ) ;
355354
356- let dequeued = queue. dequeue ( ) ;
355+ let dequeued = queue. dequeue_at ( Instant :: now ( ) ) ;
357356 assert ! ( dequeued. is_some( ) ) ;
358357 assert ! ( queue. is_empty( ) ) ;
359358 }
@@ -456,19 +455,20 @@ mod tests {
456455
457456 // First dequeue triggers start of measurement cycle
458457 assert ! ( queue. start_measurement. is_none( ) ) ;
459- queue. dequeue ( ) ; // dequeues 10000 bytes
458+ let deq_time1 = Instant :: now ( ) ;
459+ queue. dequeue_at ( deq_time1) ; // dequeues 10000 bytes
460460 assert ! ( queue. start_measurement. is_some( ) ) ;
461461 assert_eq ! ( queue. now_bytes, 20000 ) ;
462462
463463 // Simulate time advancing for the next measurement
464464 let mut pkt2 = create_packet ( 10014 ) ;
465- pkt2. delay_until ( queue . start_measurement . unwrap ( ) + Duration :: from_millis ( 10 ) ) ;
465+ pkt2. delay_until ( deq_time1 + Duration :: from_millis ( 10 ) ) ;
466466
467467 // Enqueue the packet with advanced timestamp to update queue state
468468 queue. enqueue ( pkt2) ;
469469
470470 // Second dequeue triggers calculation of avg_drate
471- queue. dequeue ( ) ; // dequeues 10000 bytes
471+ queue. dequeue_at ( deq_time1 + Duration :: from_millis ( 10 ) ) ; // dequeues 10000 bytes
472472 assert ! ( queue. avg_drate > 0.0 , "avg_drate should be calculated" ) ;
473473 assert ! (
474474 queue. start_measurement. is_none( ) ,
0 commit comments