diff -ruNp linux-2.6.25-rc7/include/net/tcp.h linux-2.6.25-rc7-comments/include/net/tcp.h --- linux-2.6.25-rc7/include/net/tcp.h 2008-03-27 18:25:07.000000000 -0800 +++ linux-2.6.25-rc7-comments/include/net/tcp.h 2008-04-04 11:05:39.000000000 -0800 @@ -645,7 +645,7 @@ struct tcp_congestion_ops { /* return slow start threshold (required) */ u32 (*ssthresh)(struct sock *sk); - /* lower bound for congestion window (optional) */ + /* lower bound for congestion window during rate halving (optional) */ u32 (*min_cwnd)(const struct sock *sk); /* do new cwnd calculation (required) */ void (*cong_avoid)(struct sock *sk, u32 ack, u32 in_flight); diff -ruNp linux-2.6.25-rc7/net/ipv4/tcp_cong.c linux-2.6.25-rc7-comments/net/ipv4/tcp_cong.c --- linux-2.6.25-rc7/net/ipv4/tcp_cong.c 2008-03-27 18:25:07.000000000 -0800 +++ linux-2.6.25-rc7-comments/net/ipv4/tcp_cong.c 2008-04-04 11:05:00.000000000 -0800 @@ -387,6 +387,8 @@ u32 tcp_reno_ssthresh(struct sock *sk) EXPORT_SYMBOL_GPL(tcp_reno_ssthresh); /* Lower bound on congestion window with halving. */ +/* Allows snd_cwnd to reduce to prev_cwnd/4 */ +/* -- see http://oss.sgi.com/archives/netdev/2003-01/msg00114.html */ u32 tcp_reno_min_cwnd(const struct sock *sk) { const struct tcp_sock *tp = tcp_sk(sk); diff -ruNp linux-2.6.25-rc7/net/ipv4/tcp_input.c linux-2.6.25-rc7-comments/net/ipv4/tcp_input.c --- linux-2.6.25-rc7/net/ipv4/tcp_input.c 2008-03-27 18:25:07.000000000 -0800 +++ linux-2.6.25-rc7-comments/net/ipv4/tcp_input.c 2008-04-04 11:07:43.000000000 -0800 @@ -2233,14 +2233,15 @@ static inline void tcp_moderate_cwnd(str tp->snd_cwnd_stamp = tcp_time_stamp; } -/* Lower bound on congestion window is slow start threshold +/* Lower bound on congestion window during rate halving is *half* of + * slow start threshold (see net/ipv4/tcp_cong.c:tcp_reno_min_cwnd() ) * unless congestion avoidance choice decides to overide it. */ static inline u32 tcp_cwnd_min(const struct sock *sk) { const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; - return ca_ops->min_cwnd ? ca_ops->min_cwnd(sk) : tcp_sk(sk)->snd_ssthresh; + return ca_ops->min_cwnd ? ca_ops->min_cwnd(sk) : tcp_sk(sk)->snd_ssthresh / 2; } /* Decrease cwnd each second ack. */