|
@@ -1255,8 +1255,6 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
|
|
|
|
|
|
if (skb == tp->retransmit_skb_hint)
|
|
|
tp->retransmit_skb_hint = prev;
|
|
|
- if (skb == tp->scoreboard_skb_hint)
|
|
|
- tp->scoreboard_skb_hint = prev;
|
|
|
if (skb == tp->lost_skb_hint) {
|
|
|
tp->lost_skb_hint = prev;
|
|
|
tp->lost_cnt_hint -= tcp_skb_pcount(prev);
|
|
@@ -1964,20 +1962,6 @@ static bool tcp_pause_early_retransmit(struct sock *sk, int flag)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static inline int tcp_skb_timedout(const struct sock *sk,
|
|
|
- const struct sk_buff *skb)
|
|
|
-{
|
|
|
- return tcp_time_stamp - TCP_SKB_CB(skb)->when > inet_csk(sk)->icsk_rto;
|
|
|
-}
|
|
|
-
|
|
|
-static inline int tcp_head_timedout(const struct sock *sk)
|
|
|
-{
|
|
|
- const struct tcp_sock *tp = tcp_sk(sk);
|
|
|
-
|
|
|
- return tp->packets_out &&
|
|
|
- tcp_skb_timedout(sk, tcp_write_queue_head(sk));
|
|
|
-}
|
|
|
-
|
|
|
/* Linux NewReno/SACK/FACK/ECN state machine.
|
|
|
* --------------------------------------
|
|
|
*
|
|
@@ -2084,12 +2068,6 @@ static bool tcp_time_to_recover(struct sock *sk, int flag)
|
|
|
if (tcp_dupack_heuristics(tp) > tp->reordering)
|
|
|
return true;
|
|
|
|
|
|
- /* Trick#3 : when we use RFC2988 timer restart, fast
|
|
|
- * retransmit can be triggered by timeout of queue head.
|
|
|
- */
|
|
|
- if (tcp_is_fack(tp) && tcp_head_timedout(sk))
|
|
|
- return true;
|
|
|
-
|
|
|
/* Trick#4: It is still not OK... But will it be useful to delay
|
|
|
* recovery more?
|
|
|
*/
|
|
@@ -2126,44 +2104,6 @@ static bool tcp_time_to_recover(struct sock *sk, int flag)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-/* New heuristics: it is possible only after we switched to restart timer
|
|
|
- * each time when something is ACKed. Hence, we can detect timed out packets
|
|
|
- * during fast retransmit without falling to slow start.
|
|
|
- *
|
|
|
- * Usefulness of this as is very questionable, since we should know which of
|
|
|
- * the segments is the next to timeout which is relatively expensive to find
|
|
|
- * in general case unless we add some data structure just for that. The
|
|
|
- * current approach certainly won't find the right one too often and when it
|
|
|
- * finally does find _something_ it usually marks large part of the window
|
|
|
- * right away (because a retransmission with a larger timestamp blocks the
|
|
|
- * loop from advancing). -ij
|
|
|
- */
|
|
|
-static void tcp_timeout_skbs(struct sock *sk)
|
|
|
-{
|
|
|
- struct tcp_sock *tp = tcp_sk(sk);
|
|
|
- struct sk_buff *skb;
|
|
|
-
|
|
|
- if (!tcp_is_fack(tp) || !tcp_head_timedout(sk))
|
|
|
- return;
|
|
|
-
|
|
|
- skb = tp->scoreboard_skb_hint;
|
|
|
- if (tp->scoreboard_skb_hint == NULL)
|
|
|
- skb = tcp_write_queue_head(sk);
|
|
|
-
|
|
|
- tcp_for_write_queue_from(skb, sk) {
|
|
|
- if (skb == tcp_send_head(sk))
|
|
|
- break;
|
|
|
- if (!tcp_skb_timedout(sk, skb))
|
|
|
- break;
|
|
|
-
|
|
|
- tcp_skb_mark_lost(tp, skb);
|
|
|
- }
|
|
|
-
|
|
|
- tp->scoreboard_skb_hint = skb;
|
|
|
-
|
|
|
- tcp_verify_left_out(tp);
|
|
|
-}
|
|
|
-
|
|
|
/* Detect loss in event "A" above by marking head of queue up as lost.
|
|
|
* For FACK or non-SACK(Reno) senders, the first "packets" number of segments
|
|
|
* are considered lost. For RFC3517 SACK, a segment is considered lost if it
|
|
@@ -2249,8 +2189,6 @@ static void tcp_update_scoreboard(struct sock *sk, int fast_rexmit)
|
|
|
else if (fast_rexmit)
|
|
|
tcp_mark_head_lost(sk, 1, 1);
|
|
|
}
|
|
|
-
|
|
|
- tcp_timeout_skbs(sk);
|
|
|
}
|
|
|
|
|
|
/* CWND moderation, preventing bursts due to too big ACKs
|
|
@@ -2842,7 +2780,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
|
|
|
fast_rexmit = 1;
|
|
|
}
|
|
|
|
|
|
- if (do_lost || (tcp_is_fack(tp) && tcp_head_timedout(sk)))
|
|
|
+ if (do_lost)
|
|
|
tcp_update_scoreboard(sk, fast_rexmit);
|
|
|
tcp_cwnd_reduction(sk, newly_acked_sacked, fast_rexmit);
|
|
|
tcp_xmit_retransmit_queue(sk);
|
|
@@ -3075,7 +3013,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
|
|
|
|
|
|
tcp_unlink_write_queue(skb, sk);
|
|
|
sk_wmem_free_skb(sk, skb);
|
|
|
- tp->scoreboard_skb_hint = NULL;
|
|
|
if (skb == tp->retransmit_skb_hint)
|
|
|
tp->retransmit_skb_hint = NULL;
|
|
|
if (skb == tp->lost_skb_hint)
|