|
|
@@ -402,11 +402,12 @@ static int __tcp_grow_window(const struct sock *sk, const struct sk_buff *skb)
|
|
|
static void tcp_grow_window(struct sock *sk, const struct sk_buff *skb)
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
+ int room;
|
|
|
+
|
|
|
+ room = min_t(int, tp->window_clamp, tcp_space(sk)) - tp->rcv_ssthresh;
|
|
|
|
|
|
/* Check #1 */
|
|
|
- if (tp->rcv_ssthresh < tp->window_clamp &&
|
|
|
- (int)tp->rcv_ssthresh < tcp_space(sk) &&
|
|
|
- !tcp_under_memory_pressure(sk)) {
|
|
|
+ if (room > 0 && !tcp_under_memory_pressure(sk)) {
|
|
|
int incr;
|
|
|
|
|
|
/* Check #2. Increase window, if skb with such overhead
|
|
|
@@ -419,8 +420,7 @@ static void tcp_grow_window(struct sock *sk, const struct sk_buff *skb)
|
|
|
|
|
|
if (incr) {
|
|
|
incr = max_t(int, incr, 2 * skb->len);
|
|
|
- tp->rcv_ssthresh = min(tp->rcv_ssthresh + incr,
|
|
|
- tp->window_clamp);
|
|
|
+ tp->rcv_ssthresh += min(room, incr);
|
|
|
inet_csk(sk)->icsk_ack.quick |= 1;
|
|
|
}
|
|
|
}
|