diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 155 |
1 files changed, 68 insertions, 87 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 487e181cff86..94d729be42a9 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -849,39 +849,39 @@ static void tcp_dsack_seen(struct tcp_sock *tp) | |||
849 | tp->rack.dsack_seen = 1; | 849 | tp->rack.dsack_seen = 1; |
850 | } | 850 | } |
851 | 851 | ||
852 | static void tcp_update_reordering(struct sock *sk, const int metric, | 852 | /* It's reordering when higher sequence was delivered (i.e. sacked) before |
853 | const int ts) | 853 | * some lower never-retransmitted sequence ("low_seq"). The maximum reordering |
854 | * distance is approximated in full-mss packet distance ("reordering"). | ||
855 | */ | ||
856 | static void tcp_check_sack_reordering(struct sock *sk, const u32 low_seq, | ||
857 | const int ts) | ||
854 | { | 858 | { |
855 | struct tcp_sock *tp = tcp_sk(sk); | 859 | struct tcp_sock *tp = tcp_sk(sk); |
856 | int mib_idx; | 860 | const u32 mss = tp->mss_cache; |
861 | u32 fack, metric; | ||
857 | 862 | ||
858 | if (WARN_ON_ONCE(metric < 0)) | 863 | fack = tcp_highest_sack_seq(tp); |
864 | if (!before(low_seq, fack)) | ||
859 | return; | 865 | return; |
860 | 866 | ||
861 | if (metric > tp->reordering) { | 867 | metric = fack - low_seq; |
862 | tp->reordering = min(sock_net(sk)->ipv4.sysctl_tcp_max_reordering, metric); | 868 | if ((metric > tp->reordering * mss) && mss) { |
863 | |||
864 | #if FASTRETRANS_DEBUG > 1 | 869 | #if FASTRETRANS_DEBUG > 1 |
865 | pr_debug("Disorder%d %d %u f%u s%u rr%d\n", | 870 | pr_debug("Disorder%d %d %u f%u s%u rr%d\n", |
866 | tp->rx_opt.sack_ok, inet_csk(sk)->icsk_ca_state, | 871 | tp->rx_opt.sack_ok, inet_csk(sk)->icsk_ca_state, |
867 | tp->reordering, | 872 | tp->reordering, |
868 | tp->fackets_out, | 873 | 0, |
869 | tp->sacked_out, | 874 | tp->sacked_out, |
870 | tp->undo_marker ? tp->undo_retrans : 0); | 875 | tp->undo_marker ? tp->undo_retrans : 0); |
871 | #endif | 876 | #endif |
877 | tp->reordering = min_t(u32, (metric + mss - 1) / mss, | ||
878 | sock_net(sk)->ipv4.sysctl_tcp_max_reordering); | ||
872 | } | 879 | } |
873 | 880 | ||
874 | tp->rack.reord = 1; | 881 | tp->rack.reord = 1; |
875 | |||
876 | /* This exciting event is worth to be remembered. 8) */ | 882 | /* This exciting event is worth to be remembered. 8) */ |
877 | if (ts) | 883 | NET_INC_STATS(sock_net(sk), |
878 | mib_idx = LINUX_MIB_TCPTSREORDER; | 884 | ts ? LINUX_MIB_TCPTSREORDER : LINUX_MIB_TCPSACKREORDER); |
879 | else if (tcp_is_reno(tp)) | ||
880 | mib_idx = LINUX_MIB_TCPRENOREORDER; | ||
881 | else | ||
882 | mib_idx = LINUX_MIB_TCPSACKREORDER; | ||
883 | |||
884 | NET_INC_STATS(sock_net(sk), mib_idx); | ||
885 | } | 885 | } |
886 | 886 | ||
887 | /* This must be called before lost_out is incremented */ | 887 | /* This must be called before lost_out is incremented */ |
@@ -1097,8 +1097,7 @@ static bool tcp_check_dsack(struct sock *sk, const struct sk_buff *ack_skb, | |||
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | struct tcp_sacktag_state { | 1099 | struct tcp_sacktag_state { |
1100 | int reord; | 1100 | u32 reord; |
1101 | int fack_count; | ||
1102 | /* Timestamps for earliest and latest never-retransmitted segment | 1101 | /* Timestamps for earliest and latest never-retransmitted segment |
1103 | * that was SACKed. RTO needs the earliest RTT to stay conservative, | 1102 | * that was SACKed. RTO needs the earliest RTT to stay conservative, |
1104 | * but congestion control should still get an accurate delay signal. | 1103 | * but congestion control should still get an accurate delay signal. |
@@ -1174,15 +1173,15 @@ static u8 tcp_sacktag_one(struct sock *sk, | |||
1174 | u64 xmit_time) | 1173 | u64 xmit_time) |
1175 | { | 1174 | { |
1176 | struct tcp_sock *tp = tcp_sk(sk); | 1175 | struct tcp_sock *tp = tcp_sk(sk); |
1177 | int fack_count = state->fack_count; | ||
1178 | 1176 | ||
1179 | /* Account D-SACK for retransmitted packet. */ | 1177 | /* Account D-SACK for retransmitted packet. */ |
1180 | if (dup_sack && (sacked & TCPCB_RETRANS)) { | 1178 | if (dup_sack && (sacked & TCPCB_RETRANS)) { |
1181 | if (tp->undo_marker && tp->undo_retrans > 0 && | 1179 | if (tp->undo_marker && tp->undo_retrans > 0 && |
1182 | after(end_seq, tp->undo_marker)) | 1180 | after(end_seq, tp->undo_marker)) |
1183 | tp->undo_retrans--; | 1181 | tp->undo_retrans--; |
1184 | if (sacked & TCPCB_SACKED_ACKED) | 1182 | if ((sacked & TCPCB_SACKED_ACKED) && |
1185 | state->reord = min(fack_count, state->reord); | 1183 | before(start_seq, state->reord)) |
1184 | state->reord = start_seq; | ||
1186 | } | 1185 | } |
1187 | 1186 | ||
1188 | /* Nothing to do; acked frame is about to be dropped (was ACKed). */ | 1187 | /* Nothing to do; acked frame is about to be dropped (was ACKed). */ |
@@ -1208,9 +1207,10 @@ static u8 tcp_sacktag_one(struct sock *sk, | |||
1208 | * which was in hole. It is reordering. | 1207 | * which was in hole. It is reordering. |
1209 | */ | 1208 | */ |
1210 | if (before(start_seq, | 1209 | if (before(start_seq, |
1211 | tcp_highest_sack_seq(tp))) | 1210 | tcp_highest_sack_seq(tp)) && |
1212 | state->reord = min(fack_count, | 1211 | before(start_seq, state->reord)) |
1213 | state->reord); | 1212 | state->reord = start_seq; |
1213 | |||
1214 | if (!after(end_seq, tp->high_seq)) | 1214 | if (!after(end_seq, tp->high_seq)) |
1215 | state->flag |= FLAG_ORIG_SACK_ACKED; | 1215 | state->flag |= FLAG_ORIG_SACK_ACKED; |
1216 | if (state->first_sackt == 0) | 1216 | if (state->first_sackt == 0) |
@@ -1229,15 +1229,10 @@ static u8 tcp_sacktag_one(struct sock *sk, | |||
1229 | tp->sacked_out += pcount; | 1229 | tp->sacked_out += pcount; |
1230 | tp->delivered += pcount; /* Out-of-order packets delivered */ | 1230 | tp->delivered += pcount; /* Out-of-order packets delivered */ |
1231 | 1231 | ||
1232 | fack_count += pcount; | ||
1233 | |||
1234 | /* Lost marker hint past SACKed? Tweak RFC3517 cnt */ | 1232 | /* Lost marker hint past SACKed? Tweak RFC3517 cnt */ |
1235 | if (tp->lost_skb_hint && | 1233 | if (tp->lost_skb_hint && |
1236 | before(start_seq, TCP_SKB_CB(tp->lost_skb_hint)->seq)) | 1234 | before(start_seq, TCP_SKB_CB(tp->lost_skb_hint)->seq)) |
1237 | tp->lost_cnt_hint += pcount; | 1235 | tp->lost_cnt_hint += pcount; |
1238 | |||
1239 | if (fack_count > tp->fackets_out) | ||
1240 | tp->fackets_out = fack_count; | ||
1241 | } | 1236 | } |
1242 | 1237 | ||
1243 | /* D-SACK. We can detect redundant retransmission in S|R and plain R | 1238 | /* D-SACK. We can detect redundant retransmission in S|R and plain R |
@@ -1484,7 +1479,6 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb, | |||
1484 | } | 1479 | } |
1485 | 1480 | ||
1486 | out: | 1481 | out: |
1487 | state->fack_count += pcount; | ||
1488 | return prev; | 1482 | return prev; |
1489 | 1483 | ||
1490 | noop: | 1484 | noop: |
@@ -1563,8 +1557,6 @@ static struct sk_buff *tcp_sacktag_walk(struct sk_buff *skb, struct sock *sk, | |||
1563 | tcp_highest_sack_seq(tp))) | 1557 | tcp_highest_sack_seq(tp))) |
1564 | tcp_advance_highest_sack(sk, skb); | 1558 | tcp_advance_highest_sack(sk, skb); |
1565 | } | 1559 | } |
1566 | |||
1567 | state->fack_count += tcp_skb_pcount(skb); | ||
1568 | } | 1560 | } |
1569 | return skb; | 1561 | return skb; |
1570 | } | 1562 | } |
@@ -1575,7 +1567,6 @@ static struct sk_buff *tcp_sacktag_bsearch(struct sock *sk, | |||
1575 | { | 1567 | { |
1576 | struct rb_node *parent, **p = &sk->tcp_rtx_queue.rb_node; | 1568 | struct rb_node *parent, **p = &sk->tcp_rtx_queue.rb_node; |
1577 | struct sk_buff *skb; | 1569 | struct sk_buff *skb; |
1578 | int unack_bytes; | ||
1579 | 1570 | ||
1580 | while (*p) { | 1571 | while (*p) { |
1581 | parent = *p; | 1572 | parent = *p; |
@@ -1588,12 +1579,6 @@ static struct sk_buff *tcp_sacktag_bsearch(struct sock *sk, | |||
1588 | p = &parent->rb_right; | 1579 | p = &parent->rb_right; |
1589 | continue; | 1580 | continue; |
1590 | } | 1581 | } |
1591 | |||
1592 | state->fack_count = 0; | ||
1593 | unack_bytes = TCP_SKB_CB(skb)->seq - tcp_sk(sk)->snd_una; | ||
1594 | if (state->mss_now && unack_bytes > 0) | ||
1595 | state->fack_count = unack_bytes / state->mss_now; | ||
1596 | |||
1597 | return skb; | 1582 | return skb; |
1598 | } | 1583 | } |
1599 | return NULL; | 1584 | return NULL; |
@@ -1651,13 +1636,10 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | |||
1651 | int first_sack_index; | 1636 | int first_sack_index; |
1652 | 1637 | ||
1653 | state->flag = 0; | 1638 | state->flag = 0; |
1654 | state->reord = tp->packets_out; | 1639 | state->reord = tp->snd_nxt; |
1655 | 1640 | ||
1656 | if (!tp->sacked_out) { | 1641 | if (!tp->sacked_out) |
1657 | if (WARN_ON(tp->fackets_out)) | ||
1658 | tp->fackets_out = 0; | ||
1659 | tcp_highest_sack_reset(sk); | 1642 | tcp_highest_sack_reset(sk); |
1660 | } | ||
1661 | 1643 | ||
1662 | found_dup_sack = tcp_check_dsack(sk, ack_skb, sp_wire, | 1644 | found_dup_sack = tcp_check_dsack(sk, ack_skb, sp_wire, |
1663 | num_sacks, prior_snd_una); | 1645 | num_sacks, prior_snd_una); |
@@ -1729,7 +1711,6 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | |||
1729 | } | 1711 | } |
1730 | 1712 | ||
1731 | state->mss_now = tcp_current_mss(sk); | 1713 | state->mss_now = tcp_current_mss(sk); |
1732 | state->fack_count = 0; | ||
1733 | skb = NULL; | 1714 | skb = NULL; |
1734 | i = 0; | 1715 | i = 0; |
1735 | 1716 | ||
@@ -1787,7 +1768,6 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | |||
1787 | skb = tcp_highest_sack(sk); | 1768 | skb = tcp_highest_sack(sk); |
1788 | if (!skb) | 1769 | if (!skb) |
1789 | break; | 1770 | break; |
1790 | state->fack_count = tp->fackets_out; | ||
1791 | cache++; | 1771 | cache++; |
1792 | goto walk; | 1772 | goto walk; |
1793 | } | 1773 | } |
@@ -1802,7 +1782,6 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | |||
1802 | skb = tcp_highest_sack(sk); | 1782 | skb = tcp_highest_sack(sk); |
1803 | if (!skb) | 1783 | if (!skb) |
1804 | break; | 1784 | break; |
1805 | state->fack_count = tp->fackets_out; | ||
1806 | } | 1785 | } |
1807 | skb = tcp_sacktag_skip(skb, sk, state, start_seq); | 1786 | skb = tcp_sacktag_skip(skb, sk, state, start_seq); |
1808 | 1787 | ||
@@ -1822,9 +1801,8 @@ advance_sp: | |||
1822 | for (j = 0; j < used_sacks; j++) | 1801 | for (j = 0; j < used_sacks; j++) |
1823 | tp->recv_sack_cache[i++] = sp[j]; | 1802 | tp->recv_sack_cache[i++] = sp[j]; |
1824 | 1803 | ||
1825 | if ((state->reord < tp->fackets_out) && | 1804 | if (inet_csk(sk)->icsk_ca_state != TCP_CA_Loss || tp->undo_marker) |
1826 | ((inet_csk(sk)->icsk_ca_state != TCP_CA_Loss) || tp->undo_marker)) | 1805 | tcp_check_sack_reordering(sk, state->reord, 0); |
1827 | tcp_update_reordering(sk, tp->fackets_out - state->reord, 0); | ||
1828 | 1806 | ||
1829 | tcp_verify_left_out(tp); | 1807 | tcp_verify_left_out(tp); |
1830 | out: | 1808 | out: |
@@ -1862,8 +1840,13 @@ static bool tcp_limit_reno_sacked(struct tcp_sock *tp) | |||
1862 | static void tcp_check_reno_reordering(struct sock *sk, const int addend) | 1840 | static void tcp_check_reno_reordering(struct sock *sk, const int addend) |
1863 | { | 1841 | { |
1864 | struct tcp_sock *tp = tcp_sk(sk); | 1842 | struct tcp_sock *tp = tcp_sk(sk); |
1865 | if (tcp_limit_reno_sacked(tp)) | 1843 | |
1866 | tcp_update_reordering(sk, tp->packets_out + addend, 0); | 1844 | if (!tcp_limit_reno_sacked(tp)) |
1845 | return; | ||
1846 | |||
1847 | tp->reordering = min_t(u32, tp->packets_out + addend, | ||
1848 | sock_net(sk)->ipv4.sysctl_tcp_max_reordering); | ||
1849 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPRENOREORDER); | ||
1867 | } | 1850 | } |
1868 | 1851 | ||
1869 | /* Emulate SACKs for SACKless connection: account for a new dupack. */ | 1852 | /* Emulate SACKs for SACKless connection: account for a new dupack. */ |
@@ -1909,7 +1892,6 @@ void tcp_clear_retrans(struct tcp_sock *tp) | |||
1909 | tp->lost_out = 0; | 1892 | tp->lost_out = 0; |
1910 | tp->undo_marker = 0; | 1893 | tp->undo_marker = 0; |
1911 | tp->undo_retrans = -1; | 1894 | tp->undo_retrans = -1; |
1912 | tp->fackets_out = 0; | ||
1913 | tp->sacked_out = 0; | 1895 | tp->sacked_out = 0; |
1914 | } | 1896 | } |
1915 | 1897 | ||
@@ -1959,7 +1941,6 @@ void tcp_enter_loss(struct sock *sk) | |||
1959 | if (is_reneg) { | 1941 | if (is_reneg) { |
1960 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSACKRENEGING); | 1942 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSACKRENEGING); |
1961 | tp->sacked_out = 0; | 1943 | tp->sacked_out = 0; |
1962 | tp->fackets_out = 0; | ||
1963 | } | 1944 | } |
1964 | tcp_clear_all_retrans_hints(tp); | 1945 | tcp_clear_all_retrans_hints(tp); |
1965 | 1946 | ||
@@ -2026,11 +2007,6 @@ static bool tcp_check_sack_reneging(struct sock *sk, int flag) | |||
2026 | return false; | 2007 | return false; |
2027 | } | 2008 | } |
2028 | 2009 | ||
2029 | static inline int tcp_fackets_out(const struct tcp_sock *tp) | ||
2030 | { | ||
2031 | return tcp_is_reno(tp) ? tp->sacked_out + 1 : tp->fackets_out; | ||
2032 | } | ||
2033 | |||
2034 | /* Heurestics to calculate number of duplicate ACKs. There's no dupACKs | 2010 | /* Heurestics to calculate number of duplicate ACKs. There's no dupACKs |
2035 | * counter when SACK is enabled (without SACK, sacked_out is used for | 2011 | * counter when SACK is enabled (without SACK, sacked_out is used for |
2036 | * that purpose). | 2012 | * that purpose). |
@@ -2701,15 +2677,15 @@ static void tcp_process_loss(struct sock *sk, int flag, bool is_dupack, | |||
2701 | } | 2677 | } |
2702 | 2678 | ||
2703 | /* Undo during fast recovery after partial ACK. */ | 2679 | /* Undo during fast recovery after partial ACK. */ |
2704 | static bool tcp_try_undo_partial(struct sock *sk, const int acked) | 2680 | static bool tcp_try_undo_partial(struct sock *sk, u32 prior_snd_una) |
2705 | { | 2681 | { |
2706 | struct tcp_sock *tp = tcp_sk(sk); | 2682 | struct tcp_sock *tp = tcp_sk(sk); |
2707 | 2683 | ||
2708 | if (tp->undo_marker && tcp_packet_delayed(tp)) { | 2684 | if (tp->undo_marker && tcp_packet_delayed(tp)) { |
2709 | /* Plain luck! Hole if filled with delayed | 2685 | /* Plain luck! Hole if filled with delayed |
2710 | * packet, rather than with a retransmit. | 2686 | * packet, rather than with a retransmit. Check reordering. |
2711 | */ | 2687 | */ |
2712 | tcp_update_reordering(sk, tcp_fackets_out(tp) + acked, 1); | 2688 | tcp_check_sack_reordering(sk, prior_snd_una, 1); |
2713 | 2689 | ||
2714 | /* We are getting evidence that the reordering degree is higher | 2690 | /* We are getting evidence that the reordering degree is higher |
2715 | * than we realized. If there are no retransmits out then we | 2691 | * than we realized. If there are no retransmits out then we |
@@ -2745,6 +2721,14 @@ static void tcp_rack_identify_loss(struct sock *sk, int *ack_flag) | |||
2745 | } | 2721 | } |
2746 | } | 2722 | } |
2747 | 2723 | ||
2724 | static bool tcp_force_fast_retransmit(struct sock *sk) | ||
2725 | { | ||
2726 | struct tcp_sock *tp = tcp_sk(sk); | ||
2727 | |||
2728 | return after(tcp_highest_sack_seq(tp), | ||
2729 | tp->snd_una + tp->reordering * tp->mss_cache); | ||
2730 | } | ||
2731 | |||
2748 | /* Process an event, which can update packets-in-flight not trivially. | 2732 | /* Process an event, which can update packets-in-flight not trivially. |
2749 | * Main goal of this function is to calculate new estimate for left_out, | 2733 | * Main goal of this function is to calculate new estimate for left_out, |
2750 | * taking into account both packets sitting in receiver's buffer and | 2734 | * taking into account both packets sitting in receiver's buffer and |
@@ -2757,19 +2741,17 @@ static void tcp_rack_identify_loss(struct sock *sk, int *ack_flag) | |||
2757 | * It does _not_ decide what to send, it is made in function | 2741 | * It does _not_ decide what to send, it is made in function |
2758 | * tcp_xmit_retransmit_queue(). | 2742 | * tcp_xmit_retransmit_queue(). |
2759 | */ | 2743 | */ |
2760 | static void tcp_fastretrans_alert(struct sock *sk, const int acked, | 2744 | static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una, |
2761 | bool is_dupack, int *ack_flag, int *rexmit) | 2745 | bool is_dupack, int *ack_flag, int *rexmit) |
2762 | { | 2746 | { |
2763 | struct inet_connection_sock *icsk = inet_csk(sk); | 2747 | struct inet_connection_sock *icsk = inet_csk(sk); |
2764 | struct tcp_sock *tp = tcp_sk(sk); | 2748 | struct tcp_sock *tp = tcp_sk(sk); |
2765 | int fast_rexmit = 0, flag = *ack_flag; | 2749 | int fast_rexmit = 0, flag = *ack_flag; |
2766 | bool do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && | 2750 | bool do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && |
2767 | (tcp_fackets_out(tp) > tp->reordering)); | 2751 | tcp_force_fast_retransmit(sk)); |
2768 | 2752 | ||
2769 | if (!tp->packets_out && tp->sacked_out) | 2753 | if (!tp->packets_out && tp->sacked_out) |
2770 | tp->sacked_out = 0; | 2754 | tp->sacked_out = 0; |
2771 | if (!tp->sacked_out && tp->fackets_out) | ||
2772 | tp->fackets_out = 0; | ||
2773 | 2755 | ||
2774 | /* Now state machine starts. | 2756 | /* Now state machine starts. |
2775 | * A. ECE, hence prohibit cwnd undoing, the reduction is required. */ | 2757 | * A. ECE, hence prohibit cwnd undoing, the reduction is required. */ |
@@ -2816,11 +2798,11 @@ static void tcp_fastretrans_alert(struct sock *sk, const int acked, | |||
2816 | if (tcp_is_reno(tp) && is_dupack) | 2798 | if (tcp_is_reno(tp) && is_dupack) |
2817 | tcp_add_reno_sack(sk); | 2799 | tcp_add_reno_sack(sk); |
2818 | } else { | 2800 | } else { |
2819 | if (tcp_try_undo_partial(sk, acked)) | 2801 | if (tcp_try_undo_partial(sk, prior_snd_una)) |
2820 | return; | 2802 | return; |
2821 | /* Partial ACK arrived. Force fast retransmit. */ | 2803 | /* Partial ACK arrived. Force fast retransmit. */ |
2822 | do_lost = tcp_is_reno(tp) || | 2804 | do_lost = tcp_is_reno(tp) || |
2823 | tcp_fackets_out(tp) > tp->reordering; | 2805 | tcp_force_fast_retransmit(sk); |
2824 | } | 2806 | } |
2825 | if (tcp_try_undo_dsack(sk)) { | 2807 | if (tcp_try_undo_dsack(sk)) { |
2826 | tcp_try_keep_open(sk); | 2808 | tcp_try_keep_open(sk); |
@@ -3030,15 +3012,15 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb, | |||
3030 | * is before the ack sequence we can discard it as it's confirmed to have | 3012 | * is before the ack sequence we can discard it as it's confirmed to have |
3031 | * arrived at the other end. | 3013 | * arrived at the other end. |
3032 | */ | 3014 | */ |
3033 | static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets, | 3015 | static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, |
3034 | u32 prior_snd_una, int *acked, | 3016 | u32 prior_snd_una, |
3035 | struct tcp_sacktag_state *sack) | 3017 | struct tcp_sacktag_state *sack) |
3036 | { | 3018 | { |
3037 | const struct inet_connection_sock *icsk = inet_csk(sk); | 3019 | const struct inet_connection_sock *icsk = inet_csk(sk); |
3038 | u64 first_ackt, last_ackt; | 3020 | u64 first_ackt, last_ackt; |
3039 | struct tcp_sock *tp = tcp_sk(sk); | 3021 | struct tcp_sock *tp = tcp_sk(sk); |
3040 | u32 prior_sacked = tp->sacked_out; | 3022 | u32 prior_sacked = tp->sacked_out; |
3041 | u32 reord = tp->packets_out; | 3023 | u32 reord = tp->snd_nxt; /* lowest acked un-retx un-sacked seq */ |
3042 | struct sk_buff *skb, *next; | 3024 | struct sk_buff *skb, *next; |
3043 | bool fully_acked = true; | 3025 | bool fully_acked = true; |
3044 | long sack_rtt_us = -1L; | 3026 | long sack_rtt_us = -1L; |
@@ -3053,6 +3035,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets, | |||
3053 | 3035 | ||
3054 | for (skb = skb_rb_first(&sk->tcp_rtx_queue); skb; skb = next) { | 3036 | for (skb = skb_rb_first(&sk->tcp_rtx_queue); skb; skb = next) { |
3055 | struct tcp_skb_cb *scb = TCP_SKB_CB(skb); | 3037 | struct tcp_skb_cb *scb = TCP_SKB_CB(skb); |
3038 | const u32 start_seq = scb->seq; | ||
3056 | u8 sacked = scb->sacked; | 3039 | u8 sacked = scb->sacked; |
3057 | u32 acked_pcount; | 3040 | u32 acked_pcount; |
3058 | 3041 | ||
@@ -3083,7 +3066,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets, | |||
3083 | first_ackt = last_ackt; | 3066 | first_ackt = last_ackt; |
3084 | 3067 | ||
3085 | last_in_flight = TCP_SKB_CB(skb)->tx.in_flight; | 3068 | last_in_flight = TCP_SKB_CB(skb)->tx.in_flight; |
3086 | reord = min(pkts_acked, reord); | 3069 | if (before(start_seq, reord)) |
3070 | reord = start_seq; | ||
3087 | if (!after(scb->end_seq, tp->high_seq)) | 3071 | if (!after(scb->end_seq, tp->high_seq)) |
3088 | flag |= FLAG_ORIG_SACK_ACKED; | 3072 | flag |= FLAG_ORIG_SACK_ACKED; |
3089 | } | 3073 | } |
@@ -3161,15 +3145,12 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets, | |||
3161 | int delta; | 3145 | int delta; |
3162 | 3146 | ||
3163 | /* Non-retransmitted hole got filled? That's reordering */ | 3147 | /* Non-retransmitted hole got filled? That's reordering */ |
3164 | if (reord < prior_fackets && reord <= tp->fackets_out) | 3148 | if (before(reord, prior_fack)) |
3165 | tcp_update_reordering(sk, tp->fackets_out - reord, 0); | 3149 | tcp_check_sack_reordering(sk, reord, 0); |
3166 | 3150 | ||
3167 | delta = prior_sacked - tp->sacked_out; | 3151 | delta = prior_sacked - tp->sacked_out; |
3168 | tp->lost_cnt_hint -= min(tp->lost_cnt_hint, delta); | 3152 | tp->lost_cnt_hint -= min(tp->lost_cnt_hint, delta); |
3169 | } | 3153 | } |
3170 | |||
3171 | tp->fackets_out -= min(pkts_acked, tp->fackets_out); | ||
3172 | |||
3173 | } else if (skb && rtt_update && sack_rtt_us >= 0 && | 3154 | } else if (skb && rtt_update && sack_rtt_us >= 0 && |
3174 | sack_rtt_us > tcp_stamp_us_delta(tp->tcp_mstamp, skb->skb_mstamp)) { | 3155 | sack_rtt_us > tcp_stamp_us_delta(tp->tcp_mstamp, skb->skb_mstamp)) { |
3175 | /* Do not re-arm RTO if the sack RTT is measured from data sent | 3156 | /* Do not re-arm RTO if the sack RTT is measured from data sent |
@@ -3210,7 +3191,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets, | |||
3210 | } | 3191 | } |
3211 | } | 3192 | } |
3212 | #endif | 3193 | #endif |
3213 | *acked = pkts_acked; | ||
3214 | return flag; | 3194 | return flag; |
3215 | } | 3195 | } |
3216 | 3196 | ||
@@ -3519,12 +3499,11 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
3519 | u32 ack_seq = TCP_SKB_CB(skb)->seq; | 3499 | u32 ack_seq = TCP_SKB_CB(skb)->seq; |
3520 | u32 ack = TCP_SKB_CB(skb)->ack_seq; | 3500 | u32 ack = TCP_SKB_CB(skb)->ack_seq; |
3521 | bool is_dupack = false; | 3501 | bool is_dupack = false; |
3522 | u32 prior_fackets; | ||
3523 | int prior_packets = tp->packets_out; | 3502 | int prior_packets = tp->packets_out; |
3524 | u32 delivered = tp->delivered; | 3503 | u32 delivered = tp->delivered; |
3525 | u32 lost = tp->lost; | 3504 | u32 lost = tp->lost; |
3526 | int acked = 0; /* Number of packets newly acked */ | ||
3527 | int rexmit = REXMIT_NONE; /* Flag to (re)transmit to recover losses */ | 3505 | int rexmit = REXMIT_NONE; /* Flag to (re)transmit to recover losses */ |
3506 | u32 prior_fack; | ||
3528 | 3507 | ||
3529 | sack_state.first_sackt = 0; | 3508 | sack_state.first_sackt = 0; |
3530 | sack_state.rate = &rs; | 3509 | sack_state.rate = &rs; |
@@ -3556,7 +3535,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
3556 | icsk->icsk_retransmits = 0; | 3535 | icsk->icsk_retransmits = 0; |
3557 | } | 3536 | } |
3558 | 3537 | ||
3559 | prior_fackets = tp->fackets_out; | 3538 | prior_fack = tcp_highest_sack_seq(tp); |
3560 | rs.prior_in_flight = tcp_packets_in_flight(tp); | 3539 | rs.prior_in_flight = tcp_packets_in_flight(tp); |
3561 | 3540 | ||
3562 | /* ts_recent update must be made after we are sure that the packet | 3541 | /* ts_recent update must be made after we are sure that the packet |
@@ -3612,8 +3591,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
3612 | goto no_queue; | 3591 | goto no_queue; |
3613 | 3592 | ||
3614 | /* See if we can take anything off of the retransmit queue. */ | 3593 | /* See if we can take anything off of the retransmit queue. */ |
3615 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una, &acked, | 3594 | flag |= tcp_clean_rtx_queue(sk, prior_fack, prior_snd_una, &sack_state); |
3616 | &sack_state); | ||
3617 | 3595 | ||
3618 | tcp_rack_update_reo_wnd(sk, &rs); | 3596 | tcp_rack_update_reo_wnd(sk, &rs); |
3619 | 3597 | ||
@@ -3625,7 +3603,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
3625 | 3603 | ||
3626 | if (tcp_ack_is_dubious(sk, flag)) { | 3604 | if (tcp_ack_is_dubious(sk, flag)) { |
3627 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); | 3605 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); |
3628 | tcp_fastretrans_alert(sk, acked, is_dupack, &flag, &rexmit); | 3606 | tcp_fastretrans_alert(sk, prior_snd_una, is_dupack, &flag, |
3607 | &rexmit); | ||
3629 | } | 3608 | } |
3630 | 3609 | ||
3631 | if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP)) | 3610 | if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP)) |
@@ -3641,7 +3620,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
3641 | no_queue: | 3620 | no_queue: |
3642 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ | 3621 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ |
3643 | if (flag & FLAG_DSACKING_ACK) | 3622 | if (flag & FLAG_DSACKING_ACK) |
3644 | tcp_fastretrans_alert(sk, acked, is_dupack, &flag, &rexmit); | 3623 | tcp_fastretrans_alert(sk, prior_snd_una, is_dupack, &flag, |
3624 | &rexmit); | ||
3645 | /* If this ack opens up a zero window, clear backoff. It was | 3625 | /* If this ack opens up a zero window, clear backoff. It was |
3646 | * being used to time the probes, and is probably far higher than | 3626 | * being used to time the probes, and is probably far higher than |
3647 | * it needs to be for normal retransmission. | 3627 | * it needs to be for normal retransmission. |
@@ -3663,7 +3643,8 @@ old_ack: | |||
3663 | if (TCP_SKB_CB(skb)->sacked) { | 3643 | if (TCP_SKB_CB(skb)->sacked) { |
3664 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una, | 3644 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una, |
3665 | &sack_state); | 3645 | &sack_state); |
3666 | tcp_fastretrans_alert(sk, acked, is_dupack, &flag, &rexmit); | 3646 | tcp_fastretrans_alert(sk, prior_snd_una, is_dupack, &flag, |
3647 | &rexmit); | ||
3667 | tcp_xmit_recovery(sk, rexmit); | 3648 | tcp_xmit_recovery(sk, rexmit); |
3668 | } | 3649 | } |
3669 | 3650 | ||