diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index ccbe04f80040..076206873e3e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2223,9 +2223,7 @@ static void tcp_update_scoreboard(struct sock *sk, int fast_rexmit) | |||
2223 | { | 2223 | { |
2224 | struct tcp_sock *tp = tcp_sk(sk); | 2224 | struct tcp_sock *tp = tcp_sk(sk); |
2225 | 2225 | ||
2226 | if (tcp_is_reno(tp)) { | 2226 | if (tcp_is_sack(tp)) { |
2227 | tcp_mark_head_lost(sk, 1, 1); | ||
2228 | } else { | ||
2229 | int sacked_upto = tp->sacked_out - tp->reordering; | 2227 | int sacked_upto = tp->sacked_out - tp->reordering; |
2230 | if (sacked_upto >= 0) | 2228 | if (sacked_upto >= 0) |
2231 | tcp_mark_head_lost(sk, sacked_upto, 0); | 2229 | tcp_mark_head_lost(sk, sacked_upto, 0); |
@@ -2723,11 +2721,16 @@ static bool tcp_try_undo_partial(struct sock *sk, u32 prior_snd_una) | |||
2723 | return false; | 2721 | return false; |
2724 | } | 2722 | } |
2725 | 2723 | ||
2726 | static void tcp_rack_identify_loss(struct sock *sk, int *ack_flag) | 2724 | static void tcp_identify_packet_loss(struct sock *sk, int *ack_flag) |
2727 | { | 2725 | { |
2728 | struct tcp_sock *tp = tcp_sk(sk); | 2726 | struct tcp_sock *tp = tcp_sk(sk); |
2729 | 2727 | ||
2730 | if (tcp_is_rack(sk)) { | 2728 | if (tcp_rtx_queue_empty(sk)) |
2729 | return; | ||
2730 | |||
2731 | if (unlikely(tcp_is_reno(tp))) { | ||
2732 | tcp_newreno_mark_lost(sk, *ack_flag & FLAG_SND_UNA_ADVANCED); | ||
2733 | } else if (tcp_is_rack(sk)) { | ||
2731 | u32 prior_retrans = tp->retrans_out; | 2734 | u32 prior_retrans = tp->retrans_out; |
2732 | 2735 | ||
2733 | tcp_rack_mark_lost(sk); | 2736 | tcp_rack_mark_lost(sk); |
@@ -2823,11 +2826,11 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una, | |||
2823 | tcp_try_keep_open(sk); | 2826 | tcp_try_keep_open(sk); |
2824 | return; | 2827 | return; |
2825 | } | 2828 | } |
2826 | tcp_rack_identify_loss(sk, ack_flag); | 2829 | tcp_identify_packet_loss(sk, ack_flag); |
2827 | break; | 2830 | break; |
2828 | case TCP_CA_Loss: | 2831 | case TCP_CA_Loss: |
2829 | tcp_process_loss(sk, flag, is_dupack, rexmit); | 2832 | tcp_process_loss(sk, flag, is_dupack, rexmit); |
2830 | tcp_rack_identify_loss(sk, ack_flag); | 2833 | tcp_identify_packet_loss(sk, ack_flag); |
2831 | if (!(icsk->icsk_ca_state == TCP_CA_Open || | 2834 | if (!(icsk->icsk_ca_state == TCP_CA_Open || |
2832 | (*ack_flag & FLAG_LOST_RETRANS))) | 2835 | (*ack_flag & FLAG_LOST_RETRANS))) |
2833 | return; | 2836 | return; |
@@ -2844,7 +2847,7 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una, | |||
2844 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) | 2847 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) |
2845 | tcp_try_undo_dsack(sk); | 2848 | tcp_try_undo_dsack(sk); |
2846 | 2849 | ||
2847 | tcp_rack_identify_loss(sk, ack_flag); | 2850 | tcp_identify_packet_loss(sk, ack_flag); |
2848 | if (!tcp_time_to_recover(sk, flag)) { | 2851 | if (!tcp_time_to_recover(sk, flag)) { |
2849 | tcp_try_to_open(sk, flag); | 2852 | tcp_try_to_open(sk, flag); |
2850 | return; | 2853 | return; |