11use super :: seqnum:: SeqNum ;
2+ use bytes:: { Bytes , BytesMut } ;
23use etherparse:: TcpHeader ;
34use std:: collections:: BTreeMap ;
45
@@ -52,7 +53,7 @@ pub(crate) struct Tcb {
5253 send_window : u16 ,
5354 state : TcpState ,
5455 inflight_packets : BTreeMap < SeqNum , InflightPacket > ,
55- unordered_packets : BTreeMap < SeqNum , Vec < u8 > > ,
56+ unordered_packets : BTreeMap < SeqNum , Bytes > ,
5657 duplicate_ack_count : usize ,
5758 duplicate_ack_count_helper : SeqNum ,
5859}
@@ -97,7 +98,7 @@ impl Tcb {
9798 self . duplicate_ack_count >= MAX_COUNT_FOR_DUP_ACK
9899 }
99100
100- pub ( super ) fn add_unordered_packet ( & mut self , seq : SeqNum , buf : Vec < u8 > ) {
101+ pub ( super ) fn add_unordered_packet ( & mut self , seq : SeqNum , buf : Bytes ) {
101102 if seq < self . ack {
102103 #[ rustfmt:: skip]
103104 log:: warn!( "{:?}: Received packet seq {seq} < self ack {}, len = {}" , self . state, self . ack, buf. len( ) ) ;
@@ -113,8 +114,8 @@ impl Tcb {
113114 self . unordered_packets . values ( ) . map ( |p| p. len ( ) ) . sum ( )
114115 }
115116
116- pub ( super ) fn consume_unordered_packets ( & mut self , max_bytes : usize ) -> Option < Vec < u8 > > {
117- let mut data = Vec :: new ( ) ;
117+ pub ( super ) fn consume_unordered_packets ( & mut self , max_bytes : usize ) -> Option < Bytes > {
118+ let mut data = BytesMut :: new ( ) ;
118119 let mut remaining_bytes = max_bytes;
119120
120121 while remaining_bytes > 0 {
@@ -145,7 +146,7 @@ impl Tcb {
145146 }
146147 }
147148
148- if data. is_empty ( ) { None } else { Some ( data) }
149+ if data. is_empty ( ) { None } else { Some ( data. freeze ( ) ) }
149150 }
150151
151152 pub ( super ) fn increase_seq ( & mut self ) {
@@ -229,7 +230,7 @@ impl Tcb {
229230 res
230231 }
231232
232- pub ( super ) fn add_inflight_packet ( & mut self , buf : Vec < u8 > ) -> std:: io:: Result < ( ) > {
233+ pub ( super ) fn add_inflight_packet ( & mut self , buf : Bytes ) -> std:: io:: Result < ( ) > {
233234 if buf. is_empty ( ) {
234235 return Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidInput , "Empty payload" ) ) ;
235236 }
@@ -258,7 +259,7 @@ impl Tcb {
258259 let mut inflight_packet = self . inflight_packets . remove ( & seq) . unwrap ( ) ;
259260 let distance = ack. distance ( inflight_packet. seq ) as usize ;
260261 if distance < inflight_packet. payload . len ( ) {
261- inflight_packet. payload . drain ( 0 .. distance) ;
262+ inflight_packet. payload = inflight_packet . payload . split_off ( distance) ;
262263 inflight_packet. seq = ack;
263264 self . inflight_packets . insert ( ack, inflight_packet) ;
264265 }
@@ -307,14 +308,14 @@ impl Tcb {
307308#[ derive( Debug , Clone ) ]
308309pub struct InflightPacket {
309310 pub seq : SeqNum ,
310- pub payload : Vec < u8 > ,
311+ pub payload : Bytes ,
311312 pub send_time : std:: time:: Instant ,
312313 pub retransmit_count : usize ,
313314 pub retransmit_timeout : std:: time:: Duration , // current retransmission timeout
314315}
315316
316317impl InflightPacket {
317- fn new ( seq : SeqNum , payload : Vec < u8 > ) -> Self {
318+ fn new ( seq : SeqNum , payload : Bytes ) -> Self {
318319 Self {
319320 seq,
320321 payload,
@@ -337,7 +338,7 @@ mod tests {
337338
338339 #[ test]
339340 fn test_in_flight_packet ( ) {
340- let p = InflightPacket :: new ( ( u32:: MAX - 1 ) . into ( ) , vec ! [ 10 , 20 , 30 , 40 , 50 ] ) ;
341+ let p = InflightPacket :: new ( ( u32:: MAX - 1 ) . into ( ) , vec ! [ 10 , 20 , 30 , 40 , 50 ] . into ( ) ) ;
341342
342343 assert ! ( p. contains_seq_num( ( u32 :: MAX - 1 ) . into( ) ) ) ;
343344 assert ! ( p. contains_seq_num( u32 :: MAX . into( ) ) ) ;
@@ -353,9 +354,9 @@ mod tests {
353354 let mut tcb = Tcb :: new ( SeqNum ( 1000 ) , 1500 ) ;
354355
355356 // insert 3 consecutive packets
356- tcb. add_unordered_packet ( SeqNum ( 1000 ) , vec ! [ 1 ; 500 ] ) ; // seq=1000, len=500
357- tcb. add_unordered_packet ( SeqNum ( 1500 ) , vec ! [ 2 ; 500 ] ) ; // seq=1500, len=500
358- tcb. add_unordered_packet ( SeqNum ( 2000 ) , vec ! [ 3 ; 500 ] ) ; // seq=2000, len=500
357+ tcb. add_unordered_packet ( SeqNum ( 1000 ) , vec ! [ 1 ; 500 ] . into ( ) ) ; // seq=1000, len=500
358+ tcb. add_unordered_packet ( SeqNum ( 1500 ) , vec ! [ 2 ; 500 ] . into ( ) ) ; // seq=1500, len=500
359+ tcb. add_unordered_packet ( SeqNum ( 2000 ) , vec ! [ 3 ; 500 ] . into ( ) ) ; // seq=2000, len=500
359360
360361 // test 1: extract up to 700 bytes
361362 let data = tcb. consume_unordered_packets ( 700 ) . unwrap ( ) ;
@@ -386,9 +387,9 @@ mod tests {
386387 tcb. seq = SeqNum ( 100 ) ; // setting the initial seq
387388
388389 // insert 3 consecutive packets
389- tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] ) . unwrap ( ) ; // seq=100, len=500
390- tcb. add_inflight_packet ( vec ! [ 2 ; 500 ] ) . unwrap ( ) ; // seq=600, len=500
391- tcb. add_inflight_packet ( vec ! [ 3 ; 500 ] ) . unwrap ( ) ; // seq=1100, len=500
390+ tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=100, len=500
391+ tcb. add_inflight_packet ( vec ! [ 2 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=600, len=500
392+ tcb. add_inflight_packet ( vec ! [ 3 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=1100, len=500
392393
393394 // test 1: confirm partial packets (ack=800)
394395 tcb. update_inflight_packet_queue ( SeqNum ( 800 ) ) ;
@@ -410,9 +411,9 @@ mod tests {
410411 tcb. seq = SeqNum ( 1000 ) ;
411412
412413 // Insert 3 consecutive packets
413- tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] ) . unwrap ( ) ; // seq=1000, len=500
414- tcb. add_inflight_packet ( vec ! [ 2 ; 500 ] ) . unwrap ( ) ; // seq=1500, len=500
415- tcb. add_inflight_packet ( vec ! [ 3 ; 500 ] ) . unwrap ( ) ; // seq=2000, len=500
414+ tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=1000, len=500
415+ tcb. add_inflight_packet ( vec ! [ 2 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=1500, len=500
416+ tcb. add_inflight_packet ( vec ! [ 3 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=2000, len=500
416417
417418 // Emulate cumulative ACK: ack=2500
418419 tcb. update_inflight_packet_queue ( SeqNum ( 2500 ) ) ;
@@ -423,7 +424,7 @@ mod tests {
423424 fn test_retransmit_with_exponential_backoff ( ) {
424425 let mut tcb = Tcb :: new ( SeqNum ( 1000 ) , 1500 ) ;
425426
426- tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] ) . unwrap ( ) ;
427+ tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] . into ( ) ) . unwrap ( ) ;
427428
428429 // Simulate retransmission timeouts
429430 for i in 0 ..MAX_RETRANSMIT_COUNT {
0 commit comments