diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 84bcdc94dfa9..20c9440ab85e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1444,12 +1444,17 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1444 | tp->retransmit_skb_hint = NULL; | 1444 | tp->retransmit_skb_hint = NULL; |
1445 | } | 1445 | } |
1446 | } else { | 1446 | } else { |
1447 | /* New sack for not retransmitted frame, | 1447 | if (!(sacked & TCPCB_RETRANS)) { |
1448 | * which was in hole. It is reordering. | 1448 | /* New sack for not retransmitted frame, |
1449 | */ | 1449 | * which was in hole. It is reordering. |
1450 | if (!(sacked & TCPCB_RETRANS) && | 1450 | */ |
1451 | fack_count < prior_fackets) | 1451 | if (fack_count < prior_fackets) |
1452 | reord = min(fack_count, reord); | 1452 | reord = min(fack_count, reord); |
1453 | |||
1454 | /* SACK enhanced F-RTO (RFC4138; Appendix B) */ | ||
1455 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->frto_highmark)) | ||
1456 | flag |= FLAG_ONLY_ORIG_SACKED; | ||
1457 | } | ||
1453 | 1458 | ||
1454 | if (sacked & TCPCB_LOST) { | 1459 | if (sacked & TCPCB_LOST) { |
1455 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST; | 1460 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST; |
@@ -1458,18 +1463,6 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1458 | /* clear lost hint */ | 1463 | /* clear lost hint */ |
1459 | tp->retransmit_skb_hint = NULL; | 1464 | tp->retransmit_skb_hint = NULL; |
1460 | } | 1465 | } |
1461 | /* SACK enhanced F-RTO detection. | ||
1462 | * Set flag if and only if non-rexmitted | ||
1463 | * segments below frto_highmark are | ||
1464 | * SACKed (RFC4138; Appendix B). | ||
1465 | * Clearing correct due to in-order walk | ||
1466 | */ | ||
1467 | if (after(end_seq, tp->frto_highmark)) { | ||
1468 | flag &= ~FLAG_ONLY_ORIG_SACKED; | ||
1469 | } else { | ||
1470 | if (!(sacked & TCPCB_RETRANS)) | ||
1471 | flag |= FLAG_ONLY_ORIG_SACKED; | ||
1472 | } | ||
1473 | } | 1466 | } |
1474 | 1467 | ||
1475 | TCP_SKB_CB(skb)->sacked |= TCPCB_SACKED_ACKED; | 1468 | TCP_SKB_CB(skb)->sacked |= TCPCB_SACKED_ACKED; |
@@ -1503,6 +1496,12 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1503 | tp->retransmit_skb_hint = NULL; | 1496 | tp->retransmit_skb_hint = NULL; |
1504 | } | 1497 | } |
1505 | } | 1498 | } |
1499 | |||
1500 | /* SACK enhanced FRTO (RFC4138, Appendix B): Clearing correct | ||
1501 | * due to in-order walk | ||
1502 | */ | ||
1503 | if (after(end_seq, tp->frto_highmark)) | ||
1504 | flag &= ~FLAG_ONLY_ORIG_SACKED; | ||
1506 | } | 1505 | } |
1507 | 1506 | ||
1508 | if (tp->retrans_out && | 1507 | if (tp->retrans_out && |