|  | @@ -230,8 +230,8 @@ pub struct TcpSocket<'a> {
 | 
	
		
			
				|  |  |      /// The sending window scaling factor advertised to remotes which support RFC 1323.
 | 
	
		
			
				|  |  |      /// It is zero if the window <= 64KiB and/or the remote does not support it.
 | 
	
		
			
				|  |  |      remote_win_shift: u8,
 | 
	
		
			
				|  |  | -    /// The speculative remote window size.
 | 
	
		
			
				|  |  | -    /// I.e. the actual remote window size minus the count of in-flight octets.
 | 
	
		
			
				|  |  | +    /// The remote window size, relative to local_seq_no
 | 
	
		
			
				|  |  | +    /// I.e. we're allowed to send octets until local_seq_no+remote_win_len
 | 
	
		
			
				|  |  |      remote_win_len:  usize,
 | 
	
		
			
				|  |  |      /// The receive window scaling factor for remotes which support RFC 1323, None if unsupported.
 | 
	
		
			
				|  |  |      remote_win_scale: Option<u8>,
 | 
	
	
		
			
				|  | @@ -1410,11 +1410,11 @@ impl<'a> TcpSocket<'a> {
 | 
	
		
			
				|  |  |              _ => control = TcpControl::None
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if self.remote_win_len > 0 {
 | 
	
		
			
				|  |  | -            self.remote_last_seq < self.local_seq_no + self.tx_buffer.len() + control.len()
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            false
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        self.remote_last_seq <
 | 
	
		
			
				|  |  | +            self.local_seq_no + core::cmp::min(
 | 
	
		
			
				|  |  | +                self.remote_win_len,
 | 
	
		
			
				|  |  | +                self.tx_buffer.len()
 | 
	
		
			
				|  |  | +            ) + control.len()
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      fn ack_to_transmit(&self) -> bool {
 | 
	
	
		
			
				|  | @@ -1558,7 +1558,8 @@ impl<'a> TcpSocket<'a> {
 | 
	
		
			
				|  |  |                  // Extract as much data as the remote side can receive in this packet
 | 
	
		
			
				|  |  |                  // from the transmit buffer.
 | 
	
		
			
				|  |  |                  let offset = self.remote_last_seq - self.local_seq_no;
 | 
	
		
			
				|  |  | -                let size = cmp::min(cmp::min(self.remote_win_len, self.remote_mss),
 | 
	
		
			
				|  |  | +                let win_limit = self.local_seq_no + self.remote_win_len - self.remote_last_seq;
 | 
	
		
			
				|  |  | +                let size = cmp::min(cmp::min(win_limit, self.remote_mss),
 | 
	
		
			
				|  |  |                       caps.max_transmission_unit - ip_repr.buffer_len() - repr.mss_header_len());
 | 
	
		
			
				|  |  |                  repr.payload = self.tx_buffer.get_allocated(offset, size);
 | 
	
		
			
				|  |  |                  // If we've sent everything we had in the buffer, follow it with the PSH or FIN
 | 
	
	
		
			
				|  | @@ -2755,11 +2756,6 @@ mod test {
 | 
	
		
			
				|  |  |              ack_number: Some(REMOTE_SEQ + 1),
 | 
	
		
			
				|  |  |              payload: &data[0..16],
 | 
	
		
			
				|  |  |              ..RECV_TEMPL
 | 
	
		
			
				|  |  | -        }, TcpRepr {
 | 
	
		
			
				|  |  | -            seq_number: LOCAL_SEQ + 1 + 16,
 | 
	
		
			
				|  |  | -            ack_number: Some(REMOTE_SEQ + 1),
 | 
	
		
			
				|  |  | -            payload: &data[16..32],
 | 
	
		
			
				|  |  | -            ..RECV_TEMPL
 | 
	
		
			
				|  |  |          }]);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3525,7 +3521,7 @@ mod test {
 | 
	
		
			
				|  |  |      #[test]
 | 
	
		
			
				|  |  |      fn test_data_retransmit_bursts() {
 | 
	
		
			
				|  |  |          let mut s = socket_established();
 | 
	
		
			
				|  |  | -        s.remote_win_len = 6;
 | 
	
		
			
				|  |  | +        s.remote_mss = 6;
 | 
	
		
			
				|  |  |          s.send_slice(b"abcdef012345").unwrap();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          recv!(s, time 0, Ok(TcpRepr {
 | 
	
	
		
			
				|  | @@ -3535,7 +3531,6 @@ mod test {
 | 
	
		
			
				|  |  |              payload:    &b"abcdef"[..],
 | 
	
		
			
				|  |  |              ..RECV_TEMPL
 | 
	
		
			
				|  |  |          }), exact);
 | 
	
		
			
				|  |  | -        s.remote_win_len = 6;
 | 
	
		
			
				|  |  |          recv!(s, time 0, Ok(TcpRepr {
 | 
	
		
			
				|  |  |              control:    TcpControl::Psh,
 | 
	
		
			
				|  |  |              seq_number: LOCAL_SEQ + 1 + 6,
 | 
	
	
		
			
				|  | @@ -3543,7 +3538,6 @@ mod test {
 | 
	
		
			
				|  |  |              payload:    &b"012345"[..],
 | 
	
		
			
				|  |  |              ..RECV_TEMPL
 | 
	
		
			
				|  |  |          }), exact);
 | 
	
		
			
				|  |  | -        s.remote_win_len = 6;
 | 
	
		
			
				|  |  |          recv!(s, time 0, Err(Error::Exhausted));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          recv!(s, time 50, Err(Error::Exhausted));
 | 
	
	
		
			
				|  | @@ -3555,7 +3549,6 @@ mod test {
 | 
	
		
			
				|  |  |              payload:    &b"abcdef"[..],
 | 
	
		
			
				|  |  |              ..RECV_TEMPL
 | 
	
		
			
				|  |  |          }), exact);
 | 
	
		
			
				|  |  | -        s.remote_win_len = 6;
 | 
	
		
			
				|  |  |          recv!(s, time 150, Ok(TcpRepr {
 | 
	
		
			
				|  |  |              control:    TcpControl::Psh,
 | 
	
		
			
				|  |  |              seq_number: LOCAL_SEQ + 1 + 6,
 | 
	
	
		
			
				|  | @@ -3563,7 +3556,6 @@ mod test {
 | 
	
		
			
				|  |  |              payload:    &b"012345"[..],
 | 
	
		
			
				|  |  |              ..RECV_TEMPL
 | 
	
		
			
				|  |  |          }), exact);
 | 
	
		
			
				|  |  | -        s.remote_win_len = 6;
 | 
	
		
			
				|  |  |          recv!(s, time 200, Err(Error::Exhausted));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3791,12 +3783,12 @@ mod test {
 | 
	
		
			
				|  |  |      #[test]
 | 
	
		
			
				|  |  |      fn test_fast_retransmit_after_triple_duplicate_ack() {
 | 
	
		
			
				|  |  |          let mut s = socket_established();
 | 
	
		
			
				|  |  | +        s.remote_mss = 6;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Normal ACK of previously recived segment
 | 
	
		
			
				|  |  |          send!(s, time 0, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3833,14 +3825,12 @@ mod test {
 | 
	
		
			
				|  |  |          send!(s, time 1050, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |          // Second duplicate ACK
 | 
	
		
			
				|  |  |          send!(s, time 1055, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |          // Third duplicate ACK
 | 
	
	
		
			
				|  | @@ -3848,7 +3838,6 @@ mod test {
 | 
	
		
			
				|  |  |          send!(s, time 1060, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3951,12 +3940,12 @@ mod test {
 | 
	
		
			
				|  |  |      #[test]
 | 
	
		
			
				|  |  |      fn test_fast_retransmit_duplicate_detection() {
 | 
	
		
			
				|  |  |          let mut s = socket_established();
 | 
	
		
			
				|  |  | +        s.remote_mss = 6;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Normal ACK of previously recived segment
 | 
	
		
			
				|  |  |          send!(s, time 0, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3964,7 +3953,6 @@ mod test {
 | 
	
		
			
				|  |  |          send!(s, time 0, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3972,7 +3960,7 @@ mod test {
 | 
	
		
			
				|  |  |              "duplicate ACK counter is set but wound not transmit data");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Send a long string of text divided into several packets
 | 
	
		
			
				|  |  | -        // because of previously recieved "window_len"
 | 
	
		
			
				|  |  | +        // because of small remote_mss
 | 
	
		
			
				|  |  |          s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // This packet is reordered in network
 | 
	
	
		
			
				|  | @@ -4005,21 +3993,18 @@ mod test {
 | 
	
		
			
				|  |  |          send!(s, time 1050, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |          // Second duplicate ACK
 | 
	
		
			
				|  |  |          send!(s, time 1055, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |          // Reordered packet arrives which should reset duplicate ACK count
 | 
	
		
			
				|  |  |          send!(s, time 1060, TcpRepr {
 | 
	
		
			
				|  |  |              seq_number: REMOTE_SEQ + 1,
 | 
	
		
			
				|  |  |              ack_number: Some(LOCAL_SEQ + 1 + (6 * 3)),
 | 
	
		
			
				|  |  | -            window_len: 6,
 | 
	
		
			
				|  |  |              ..SEND_TEMPL
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -4174,7 +4159,7 @@ mod test {
 | 
	
		
			
				|  |  |      #[test]
 | 
	
		
			
				|  |  |      fn test_psh_transmit() {
 | 
	
		
			
				|  |  |          let mut s = socket_established();
 | 
	
		
			
				|  |  | -        s.remote_win_len = 6;
 | 
	
		
			
				|  |  | +        s.remote_mss = 6;
 | 
	
		
			
				|  |  |          s.send_slice(b"abcdef").unwrap();
 | 
	
		
			
				|  |  |          s.send_slice(b"123456").unwrap();
 | 
	
		
			
				|  |  |          recv!(s, time 0, Ok(TcpRepr {
 |