Skip to content

Commit

Permalink
[TCP]: Fix ratehalving with bidirectional flows
Browse files Browse the repository at this point in the history
Actually, the ratehalving seems to work too well, as cwnd is
reduced on every second ACK even though the packets in flight
remains unchanged. Recoveries in a bidirectional flows suffer
quite badly because of this, both NewReno and SACK are affected.

After this patch, rate halving is performed for ACK only if
packets in flight was supposedly changed too.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ilpo Järvinen authored and David S. Miller committed Jul 31, 2007
1 parent 143cf35 commit 1e757f9
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions net/ipv4/tcp_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -1851,19 +1851,22 @@ static inline u32 tcp_cwnd_min(const struct sock *sk)
}

/* Decrease cwnd each second ack. */
static void tcp_cwnd_down(struct sock *sk)
static void tcp_cwnd_down(struct sock *sk, int flag)
{
struct tcp_sock *tp = tcp_sk(sk);
int decr = tp->snd_cwnd_cnt + 1;

tp->snd_cwnd_cnt = decr&1;
decr >>= 1;
if ((flag&FLAG_FORWARD_PROGRESS) ||
(IsReno(tp) && !(flag&FLAG_NOT_DUP))) {
tp->snd_cwnd_cnt = decr&1;
decr >>= 1;

if (decr && tp->snd_cwnd > tcp_cwnd_min(sk))
tp->snd_cwnd -= decr;
if (decr && tp->snd_cwnd > tcp_cwnd_min(sk))
tp->snd_cwnd -= decr;

tp->snd_cwnd = min(tp->snd_cwnd, tcp_packets_in_flight(tp)+1);
tp->snd_cwnd_stamp = tcp_time_stamp;
tp->snd_cwnd = min(tp->snd_cwnd, tcp_packets_in_flight(tp)+1);
tp->snd_cwnd_stamp = tcp_time_stamp;
}
}

/* Nothing was retransmitted or returned timestamp is less
Expand Down Expand Up @@ -2060,7 +2063,7 @@ static void tcp_try_to_open(struct sock *sk, int flag)
}
tcp_moderate_cwnd(tp);
} else {
tcp_cwnd_down(sk);
tcp_cwnd_down(sk, flag);
}
}

Expand Down Expand Up @@ -2260,7 +2263,7 @@ tcp_fastretrans_alert(struct sock *sk, u32 prior_snd_una,

if (is_dupack || tcp_head_timedout(sk))
tcp_update_scoreboard(sk);
tcp_cwnd_down(sk);
tcp_cwnd_down(sk, flag);
tcp_xmit_retransmit_queue(sk);
}

Expand Down

0 comments on commit 1e757f9

Please sign in to comment.