@@ -515,24 +515,6 @@ impl<'a> Socket<'a> {
515
515
}
516
516
let rx_cap_log2 = mem:: size_of :: < usize > ( ) * 8 - rx_capacity. leading_zeros ( ) as usize ;
517
517
let remote_win_shift = rx_cap_log2. saturating_sub ( 16 ) as u8 ;
518
- Self :: new_with_window_scaling ( rx_buffer, tx_buffer, remote_win_shift)
519
- }
520
-
521
- /// Create a socket using the given buffers and window scaling factor defined in [RFC 1323].
522
- ///
523
- /// # Panics
524
- ///
525
- /// Panics if the window scaling factor is greater than 14.
526
- ///
527
- /// See also the [local_recv_win_scale](#method.local_recv_win_scale) method.
528
- pub fn new_with_window_scaling < T > ( rx_buffer : T , tx_buffer : T , recv_win_scale : u8 ) -> Socket < ' a >
529
- where
530
- T : Into < SocketBuffer < ' a > > ,
531
- {
532
- if recv_win_scale > 14 {
533
- panic ! ( "window scaling factor too large, must be <= 14" )
534
- }
535
-
536
518
let ( rx_buffer, tx_buffer) = ( rx_buffer. into ( ) , tx_buffer. into ( ) ) ;
537
519
538
520
Socket {
@@ -554,7 +536,7 @@ impl<'a> Socket<'a> {
554
536
remote_last_ack : None ,
555
537
remote_last_win : 0 ,
556
538
remote_win_len : 0 ,
557
- remote_win_shift : recv_win_scale ,
539
+ remote_win_shift,
558
540
remote_win_scale : None ,
559
541
remote_has_sack : false ,
560
542
remote_mss : DEFAULT_MSS ,
@@ -777,6 +759,28 @@ impl<'a> Socket<'a> {
777
759
self . remote_win_shift
778
760
}
779
761
762
+ /// Set the local receive window scaling factor defined in [RFC 1323].
763
+ ///
764
+ /// The value will become constant after the connection is established.
765
+ /// It may be reset to 0 during the handshake if remote side does not support window scaling.
766
+ ///
767
+ /// # Errors
768
+ /// Returns an error if the socket is not in the `Closed` or `Listen` state, or if the
769
+ /// receive buffer is smaller than (1<<scale) bytes.
770
+ pub fn set_local_recv_win_scale ( & mut self , scale : u8 ) -> Result < ( ) , ( ) > {
771
+ if self . rx_buffer . capacity ( ) < ( 1 << scale) as usize {
772
+ return Err ( ( ) ) ;
773
+ }
774
+
775
+ match self . state {
776
+ State :: Closed | State :: Listen => {
777
+ self . remote_win_shift = scale;
778
+ Ok ( ( ) )
779
+ }
780
+ _ => Err ( ( ) ) ,
781
+ }
782
+ }
783
+
780
784
/// Return the time-to-live (IPv4) or hop limit (IPv6) value used in outgoing packets.
781
785
///
782
786
/// See also the [set_hop_limit](#method.set_hop_limit) method
@@ -7802,23 +7806,37 @@ mod test {
7802
7806
}
7803
7807
7804
7808
#[ test]
7805
- #[ should_panic]
7806
- fn test_new_with_too_large_window_scale ( ) {
7807
- Socket :: new_with_window_scaling (
7808
- SocketBuffer :: new ( Vec :: with_capacity ( 128 ) ) ,
7809
- SocketBuffer :: new ( Vec :: with_capacity ( 128 ) ) ,
7810
- 15 ,
7809
+ fn test_too_large_window_scale ( ) {
7810
+ let mut socket = Socket :: new (
7811
+ SocketBuffer :: new ( vec ! [ 0 ; 128 ] ) ,
7812
+ SocketBuffer :: new ( vec ! [ 0 ; 128 ] ) ,
7811
7813
) ;
7814
+ assert ! ( socket. set_local_recv_win_scale( 15 ) . is_err( ) )
7812
7815
}
7813
7816
7814
7817
#[ test]
7815
- fn test_new_with_window_scale ( ) {
7816
- let socket = Socket :: new_with_window_scaling (
7817
- SocketBuffer :: new ( Vec :: with_capacity ( 128 ) ) ,
7818
- SocketBuffer :: new ( Vec :: with_capacity ( 128 ) ) ,
7819
- 14 ,
7818
+ fn test_set_window_scale ( ) {
7819
+ let mut socket = Socket :: new (
7820
+ SocketBuffer :: new ( vec ! [ 0 ; 128 ] ) ,
7821
+ SocketBuffer :: new ( vec ! [ 0 ; 128 ] ) ,
7820
7822
) ;
7821
- assert_eq ! ( socket. local_recv_win_scale( ) , 14 ) ;
7823
+ assert ! ( matches!( socket. state, State :: Closed ) ) ;
7824
+ assert_eq ! ( socket. rx_buffer. capacity( ) , 128 ) ;
7825
+ assert ! ( socket. set_local_recv_win_scale( 6 ) . is_ok( ) ) ;
7826
+ assert ! ( socket. set_local_recv_win_scale( 14 ) . is_err( ) ) ;
7827
+ assert_eq ! ( socket. local_recv_win_scale( ) , 6 ) ;
7828
+ }
7829
+
7830
+ #[ test]
7831
+ fn test_set_scale_with_tcp_state ( ) {
7832
+ let mut socket = socket ( ) ;
7833
+ assert ! ( socket. set_local_recv_win_scale( 1 ) . is_ok( ) ) ;
7834
+ let mut socket = socket_established ( ) ;
7835
+ assert ! ( socket. set_local_recv_win_scale( 1 ) . is_err( ) ) ;
7836
+ let mut socket = socket_listen ( ) ;
7837
+ assert ! ( socket. set_local_recv_win_scale( 1 ) . is_ok( ) ) ;
7838
+ let mut socket = socket_syn_received ( ) ;
7839
+ assert ! ( socket. set_local_recv_win_scale( 1 ) . is_err( ) ) ;
7822
7840
}
7823
7841
7824
7842
#[ test]
0 commit comments