diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index bc790ea9960f..c9ab964189a0 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2698,16 +2698,21 @@ static void tcp_process_loss(struct sock *sk, int flag, bool is_dupack) | |||
2698 | struct tcp_sock *tp = tcp_sk(sk); | 2698 | struct tcp_sock *tp = tcp_sk(sk); |
2699 | bool recovered = !before(tp->snd_una, tp->high_seq); | 2699 | bool recovered = !before(tp->snd_una, tp->high_seq); |
2700 | 2700 | ||
2701 | if ((flag & FLAG_SND_UNA_ADVANCED) && | ||
2702 | tcp_try_undo_loss(sk, false)) | ||
2703 | return; | ||
2704 | |||
2701 | if (tp->frto) { /* F-RTO RFC5682 sec 3.1 (sack enhanced version). */ | 2705 | if (tp->frto) { /* F-RTO RFC5682 sec 3.1 (sack enhanced version). */ |
2702 | /* Step 3.b. A timeout is spurious if not all data are | 2706 | /* Step 3.b. A timeout is spurious if not all data are |
2703 | * lost, i.e., never-retransmitted data are (s)acked. | 2707 | * lost, i.e., never-retransmitted data are (s)acked. |
2704 | */ | 2708 | */ |
2705 | if (tcp_try_undo_loss(sk, flag & FLAG_ORIG_SACK_ACKED)) | 2709 | if ((flag & FLAG_ORIG_SACK_ACKED) && |
2710 | tcp_try_undo_loss(sk, true)) | ||
2706 | return; | 2711 | return; |
2707 | 2712 | ||
2708 | if (after(tp->snd_nxt, tp->high_seq) && | 2713 | if (after(tp->snd_nxt, tp->high_seq)) { |
2709 | (flag & FLAG_DATA_SACKED || is_dupack)) { | 2714 | if (flag & FLAG_DATA_SACKED || is_dupack) |
2710 | tp->frto = 0; /* Loss was real: 2nd part of step 3.a */ | 2715 | tp->frto = 0; /* Step 3.a. loss was real */ |
2711 | } else if (flag & FLAG_SND_UNA_ADVANCED && !recovered) { | 2716 | } else if (flag & FLAG_SND_UNA_ADVANCED && !recovered) { |
2712 | tp->high_seq = tp->snd_nxt; | 2717 | tp->high_seq = tp->snd_nxt; |
2713 | __tcp_push_pending_frames(sk, tcp_current_mss(sk), | 2718 | __tcp_push_pending_frames(sk, tcp_current_mss(sk), |
@@ -2732,8 +2737,6 @@ static void tcp_process_loss(struct sock *sk, int flag, bool is_dupack) | |||
2732 | else if (flag & FLAG_SND_UNA_ADVANCED) | 2737 | else if (flag & FLAG_SND_UNA_ADVANCED) |
2733 | tcp_reset_reno_sack(tp); | 2738 | tcp_reset_reno_sack(tp); |
2734 | } | 2739 | } |
2735 | if (tcp_try_undo_loss(sk, false)) | ||
2736 | return; | ||
2737 | tcp_xmit_retransmit_queue(sk); | 2740 | tcp_xmit_retransmit_queue(sk); |
2738 | } | 2741 | } |
2739 | 2742 | ||
@@ -3283,7 +3286,9 @@ static void tcp_snd_una_update(struct tcp_sock *tp, u32 ack) | |||
3283 | { | 3286 | { |
3284 | u32 delta = ack - tp->snd_una; | 3287 | u32 delta = ack - tp->snd_una; |
3285 | 3288 | ||
3289 | u64_stats_update_begin(&tp->syncp); | ||
3286 | tp->bytes_acked += delta; | 3290 | tp->bytes_acked += delta; |
3291 | u64_stats_update_end(&tp->syncp); | ||
3287 | tp->snd_una = ack; | 3292 | tp->snd_una = ack; |
3288 | } | 3293 | } |
3289 | 3294 | ||
@@ -3292,7 +3297,9 @@ static void tcp_rcv_nxt_update(struct tcp_sock *tp, u32 seq) | |||
3292 | { | 3297 | { |
3293 | u32 delta = seq - tp->rcv_nxt; | 3298 | u32 delta = seq - tp->rcv_nxt; |
3294 | 3299 | ||
3300 | u64_stats_update_begin(&tp->syncp); | ||
3295 | tp->bytes_received += delta; | 3301 | tp->bytes_received += delta; |
3302 | u64_stats_update_end(&tp->syncp); | ||
3296 | tp->rcv_nxt = seq; | 3303 | tp->rcv_nxt = seq; |
3297 | } | 3304 | } |
3298 | 3305 | ||