@@ -52,7 +52,7 @@ pub(crate) struct Tcb {
5252 send_window : u16 ,
5353 state : TcpState ,
5454 inflight_packets : BTreeMap < SeqNum , InflightPacket > ,
55- unordered_packets : BTreeMap < SeqNum , Vec < u8 > > ,
55+ unordered_packets : BTreeMap < SeqNum , bytes :: Bytes > ,
5656 duplicate_ack_count : usize ,
5757 duplicate_ack_count_helper : SeqNum ,
5858}
@@ -97,7 +97,7 @@ impl Tcb {
9797 self . duplicate_ack_count >= MAX_COUNT_FOR_DUP_ACK
9898 }
9999
100- pub ( super ) fn add_unordered_packet ( & mut self , seq : SeqNum , buf : Vec < u8 > ) {
100+ pub ( super ) fn add_unordered_packet ( & mut self , seq : SeqNum , buf : bytes :: Bytes ) {
101101 if seq < self . ack {
102102 #[ rustfmt:: skip]
103103 log:: warn!( "{:?}: Received packet seq {seq} < self ack {}, len = {}" , self . state, self . ack, buf. len( ) ) ;
@@ -113,8 +113,8 @@ impl Tcb {
113113 self . unordered_packets . values ( ) . map ( |p| p. len ( ) ) . sum ( )
114114 }
115115
116- pub ( super ) fn consume_unordered_packets ( & mut self , max_bytes : usize ) -> Option < Vec < u8 > > {
117- let mut data = Vec :: new ( ) ;
116+ pub ( super ) fn consume_unordered_packets ( & mut self , max_bytes : usize ) -> Option < bytes :: Bytes > {
117+ let mut data = bytes :: BytesMut :: new ( ) ;
118118 let mut remaining_bytes = max_bytes;
119119
120120 while remaining_bytes > 0 {
@@ -145,7 +145,7 @@ impl Tcb {
145145 }
146146 }
147147
148- if data. is_empty ( ) { None } else { Some ( data) }
148+ if data. is_empty ( ) { None } else { Some ( data. freeze ( ) ) }
149149 }
150150
151151 pub ( super ) fn increase_seq ( & mut self ) {
@@ -229,7 +229,7 @@ impl Tcb {
229229 res
230230 }
231231
232- pub ( super ) fn add_inflight_packet ( & mut self , buf : Vec < u8 > ) -> std:: io:: Result < ( ) > {
232+ pub ( super ) fn add_inflight_packet ( & mut self , buf : bytes :: Bytes ) -> std:: io:: Result < ( ) > {
233233 if buf. is_empty ( ) {
234234 return Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidInput , "Empty payload" ) ) ;
235235 }
@@ -258,7 +258,7 @@ impl Tcb {
258258 let mut inflight_packet = self . inflight_packets . remove ( & seq) . unwrap ( ) ;
259259 let distance = ack. distance ( inflight_packet. seq ) as usize ;
260260 if distance < inflight_packet. payload . len ( ) {
261- inflight_packet. payload . drain ( 0 .. distance) ;
261+ inflight_packet. payload = inflight_packet . payload . split_off ( distance) ;
262262 inflight_packet. seq = ack;
263263 self . inflight_packets . insert ( ack, inflight_packet) ;
264264 }
@@ -307,14 +307,14 @@ impl Tcb {
307307#[ derive( Debug , Clone ) ]
308308pub struct InflightPacket {
309309 pub seq : SeqNum ,
310- pub payload : Vec < u8 > ,
310+ pub payload : bytes :: Bytes ,
311311 pub send_time : std:: time:: Instant ,
312312 pub retransmit_count : usize ,
313313 pub retransmit_timeout : std:: time:: Duration , // current retransmission timeout
314314}
315315
316316impl InflightPacket {
317- fn new ( seq : SeqNum , payload : Vec < u8 > ) -> Self {
317+ fn new ( seq : SeqNum , payload : bytes :: Bytes ) -> Self {
318318 Self {
319319 seq,
320320 payload,
@@ -337,7 +337,7 @@ mod tests {
337337
338338 #[ test]
339339 fn test_in_flight_packet ( ) {
340- let p = InflightPacket :: new ( ( u32:: MAX - 1 ) . into ( ) , vec ! [ 10 , 20 , 30 , 40 , 50 ] ) ;
340+ let p = InflightPacket :: new ( ( u32:: MAX - 1 ) . into ( ) , vec ! [ 10 , 20 , 30 , 40 , 50 ] . into ( ) ) ;
341341
342342 assert ! ( p. contains_seq_num( ( u32 :: MAX - 1 ) . into( ) ) ) ;
343343 assert ! ( p. contains_seq_num( u32 :: MAX . into( ) ) ) ;
@@ -353,9 +353,9 @@ mod tests {
353353 let mut tcb = Tcb :: new ( SeqNum ( 1000 ) , 1500 ) ;
354354
355355 // 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
356+ tcb. add_unordered_packet ( SeqNum ( 1000 ) , vec ! [ 1 ; 500 ] . into ( ) ) ; // seq=1000, len=500
357+ tcb. add_unordered_packet ( SeqNum ( 1500 ) , vec ! [ 2 ; 500 ] . into ( ) ) ; // seq=1500, len=500
358+ tcb. add_unordered_packet ( SeqNum ( 2000 ) , vec ! [ 3 ; 500 ] . into ( ) ) ; // seq=2000, len=500
359359
360360 // test 1: extract up to 700 bytes
361361 let data = tcb. consume_unordered_packets ( 700 ) . unwrap ( ) ;
@@ -386,9 +386,9 @@ mod tests {
386386 tcb. seq = SeqNum ( 100 ) ; // setting the initial seq
387387
388388 // 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
389+ tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=100, len=500
390+ tcb. add_inflight_packet ( vec ! [ 2 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=600, len=500
391+ tcb. add_inflight_packet ( vec ! [ 3 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=1100, len=500
392392
393393 // test 1: confirm partial packets (ack=800)
394394 tcb. update_inflight_packet_queue ( SeqNum ( 800 ) ) ;
@@ -410,9 +410,9 @@ mod tests {
410410 tcb. seq = SeqNum ( 1000 ) ;
411411
412412 // 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
413+ tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=1000, len=500
414+ tcb. add_inflight_packet ( vec ! [ 2 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=1500, len=500
415+ tcb. add_inflight_packet ( vec ! [ 3 ; 500 ] . into ( ) ) . unwrap ( ) ; // seq=2000, len=500
416416
417417 // Emulate cumulative ACK: ack=2500
418418 tcb. update_inflight_packet_queue ( SeqNum ( 2500 ) ) ;
@@ -423,7 +423,7 @@ mod tests {
423423 fn test_retransmit_with_exponential_backoff ( ) {
424424 let mut tcb = Tcb :: new ( SeqNum ( 1000 ) , 1500 ) ;
425425
426- tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] ) . unwrap ( ) ;
426+ tcb. add_inflight_packet ( vec ! [ 1 ; 500 ] . into ( ) ) . unwrap ( ) ;
427427
428428 // Simulate retransmission timeouts
429429 for i in 0 ..MAX_RETRANSMIT_COUNT {
0 commit comments