diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2007-05-03 06:30:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-05-03 06:30:34 -0400 |
commit | 0ec96822d5c0df77107c03b8d9a81a436ab707fc (patch) | |
tree | 0e17c856f1d1317741fa340b631b88abbc8f6ccf /include/net/tcp.h | |
parent | ec9c948546a84d0dcee851be1009a8066958e69d (diff) |
[TCP]: Use S+L catcher only with SACK for now
TCP has a transitional state when SACK is not in use during
which this invariant is temporarily broken. Without SACK,
tcp_clean_rtx_queue does not decrement sacked_out. Therefore
calls to tcp_sync_left_out before sacked_out is again
corrected by tcp_fastretrans_alert can trigger this trap as
sacked_out still has couple of segments that are already out
of window.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/tcp.h')
-rw-r--r-- | include/net/tcp.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h index ef8f9d4dae85..e22b4f0305a3 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -736,7 +736,8 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk) | |||
736 | 736 | ||
737 | static inline void tcp_sync_left_out(struct tcp_sock *tp) | 737 | static inline void tcp_sync_left_out(struct tcp_sock *tp) |
738 | { | 738 | { |
739 | BUG_ON(tp->sacked_out + tp->lost_out > tp->packets_out); | 739 | BUG_ON(tp->rx_opt.sack_ok && |
740 | (tp->sacked_out + tp->lost_out > tp->packets_out)); | ||
740 | tp->left_out = tp->sacked_out + tp->lost_out; | 741 | tp->left_out = tp->sacked_out + tp->lost_out; |
741 | } | 742 | } |
742 | 743 | ||