@@ -63,6 +63,30 @@ impl Display for ConnectError {
63
63
#[ cfg( feature = "std" ) ]
64
64
impl std:: error:: Error for ConnectError { }
65
65
66
+ /// Error returned by set_*
67
+ #[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
68
+ #[ cfg_attr( feature = "defmt" , derive( defmt:: Format ) ) ]
69
+ pub enum ArgumentError {
70
+ InvalidArgs ,
71
+ InvalidState ,
72
+ InsufficientResource ,
73
+ }
74
+
75
+ impl Display for crate :: socket:: tcp:: ArgumentError {
76
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
77
+ match * self {
78
+ crate :: socket:: tcp:: ArgumentError :: InvalidArgs => write ! ( f, "invalid arguments by RFC" ) ,
79
+ crate :: socket:: tcp:: ArgumentError :: InvalidState => write ! ( f, "invalid state" ) ,
80
+ crate :: socket:: tcp:: ArgumentError :: InsufficientResource => {
81
+ write ! ( f, "insufficient runtime resource" )
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ #[ cfg( feature = "std" ) ]
88
+ impl std:: error:: Error for crate :: socket:: tcp:: ArgumentError { }
89
+
66
90
/// Error returned by [`Socket::send`]
67
91
#[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
68
92
#[ cfg_attr( feature = "defmt" , derive( defmt:: Format ) ) ]
@@ -514,8 +538,6 @@ impl<'a> Socket<'a> {
514
538
panic ! ( "receiving buffer too large, cannot exceed 1 GiB" )
515
539
}
516
540
let rx_cap_log2 = mem:: size_of :: < usize > ( ) * 8 - rx_capacity. leading_zeros ( ) as usize ;
517
- let remote_win_shift = rx_cap_log2. saturating_sub ( 16 ) as u8 ;
518
- let ( rx_buffer, tx_buffer) = ( rx_buffer. into ( ) , tx_buffer. into ( ) ) ;
519
541
520
542
Socket {
521
543
state : State :: Closed ,
@@ -536,7 +558,7 @@ impl<'a> Socket<'a> {
536
558
remote_last_ack : None ,
537
559
remote_last_win : 0 ,
538
560
remote_win_len : 0 ,
539
- remote_win_shift,
561
+ remote_win_shift : rx_cap_log2 . saturating_sub ( 16 ) as u8 ,
540
562
remote_win_scale : None ,
541
563
remote_has_sack : false ,
542
564
remote_mss : DEFAULT_MSS ,
@@ -765,19 +787,24 @@ impl<'a> Socket<'a> {
765
787
/// It may be reset to 0 during the handshake if remote side does not support window scaling.
766
788
///
767
789
/// # 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 < ( ) , ( ) > {
790
+ /// `Err(ArgumentError::InvalidArgs)` if the scale is greater than 14.
791
+ /// `Err(ArgumentError::InvalidState)` if the socket is not in the `Closed` or `Listen` state.
792
+ /// `Err(ArgumentError::InsufficientResource)` if the receive buffer is smaller than (1<<scale) bytes.
793
+ pub fn set_local_recv_win_scale ( & mut self , scale : u8 ) -> Result < ( ) , ArgumentError > {
794
+ if scale > 14 {
795
+ return Err ( ArgumentError :: InvalidArgs ) ;
796
+ }
797
+
771
798
if self . rx_buffer . capacity ( ) < ( 1 << scale) as usize {
772
- return Err ( ( ) ) ;
799
+ return Err ( ArgumentError :: InsufficientResource ) ;
773
800
}
774
801
775
802
match self . state {
776
803
State :: Closed | State :: Listen => {
777
804
self . remote_win_shift = scale;
778
805
Ok ( ( ) )
779
806
}
780
- _ => Err ( ( ) ) ,
807
+ _ => Err ( ArgumentError :: InvalidState ) ,
781
808
}
782
809
}
783
810
@@ -7808,8 +7835,8 @@ mod test {
7808
7835
#[ test]
7809
7836
fn test_too_large_window_scale ( ) {
7810
7837
let mut socket = Socket :: new (
7811
- SocketBuffer :: new ( vec ! [ 0 ; 128 ] ) ,
7812
- SocketBuffer :: new ( vec ! [ 0 ; 128 ] ) ,
7838
+ SocketBuffer :: new ( vec ! [ 0 ; 8 * ( 1 << 15 ) ] ) ,
7839
+ SocketBuffer :: new ( vec ! [ 0 ; 8 * ( 1 << 15 ) ] ) ,
7813
7840
) ;
7814
7841
assert ! ( socket. set_local_recv_win_scale( 15 ) . is_err( ) )
7815
7842
}
0 commit comments