aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r--net/ipv4/tcp_input.c66
1 files changed, 30 insertions, 36 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 4238ed98acb9..8fe754be8076 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2525,55 +2525,49 @@ static void tcp_rearm_rto(struct sock *sk)
2525 } 2525 }
2526} 2526}
2527 2527
2528/* If we get here, the whole TSO packet has not been acked. */
2528static u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb) 2529static u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb)
2529{ 2530{
2530 struct tcp_sock *tp = tcp_sk(sk); 2531 struct tcp_sock *tp = tcp_sk(sk);
2531 struct tcp_skb_cb *scb = TCP_SKB_CB(skb); 2532 u32 packets_acked;
2532 __u32 seq = tp->snd_una;
2533 __u32 packets_acked;
2534 2533
2535 /* If we get here, the whole TSO packet has not been 2534 BUG_ON(!after(TCP_SKB_CB(skb)->end_seq, tp->snd_una));
2536 * acked.
2537 */
2538 BUG_ON(!after(scb->end_seq, seq));
2539 2535
2540 packets_acked = tcp_skb_pcount(skb); 2536 packets_acked = tcp_skb_pcount(skb);
2541 if (tcp_trim_head(sk, skb, seq - scb->seq)) 2537 if (tcp_trim_head(sk, skb, tp->snd_una - TCP_SKB_CB(skb)->seq))
2542 return 0; 2538 return 0;
2543 packets_acked -= tcp_skb_pcount(skb); 2539 packets_acked -= tcp_skb_pcount(skb);
2544 2540
2545 if (packets_acked) { 2541 if (packets_acked) {
2546 BUG_ON(tcp_skb_pcount(skb) == 0); 2542 BUG_ON(tcp_skb_pcount(skb) == 0);
2547 BUG_ON(!before(scb->seq, scb->end_seq)); 2543 BUG_ON(!before(TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq));
2548 } 2544 }
2549 2545
2550 return packets_acked; 2546 return packets_acked;
2551} 2547}
2552 2548
2553/* Remove acknowledged frames from the retransmission queue. */ 2549/* Remove acknowledged frames from the retransmission queue. If our packet
2554static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) 2550 * is before the ack sequence we can discard it as it's confirmed to have
2551 * arrived at the other end.
2552 */
2553static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p)
2555{ 2554{
2556 struct tcp_sock *tp = tcp_sk(sk); 2555 struct tcp_sock *tp = tcp_sk(sk);
2557 const struct inet_connection_sock *icsk = inet_csk(sk); 2556 const struct inet_connection_sock *icsk = inet_csk(sk);
2558 struct sk_buff *skb; 2557 struct sk_buff *skb;
2559 __u32 now = tcp_time_stamp; 2558 u32 now = tcp_time_stamp;
2560 int fully_acked = 1; 2559 int fully_acked = 1;
2561 int acked = 0; 2560 int flag = 0;
2562 int prior_packets = tp->packets_out; 2561 int prior_packets = tp->packets_out;
2563 __s32 seq_rtt = -1; 2562 s32 seq_rtt = -1;
2564 ktime_t last_ackt = net_invalid_timestamp(); 2563 ktime_t last_ackt = net_invalid_timestamp();
2565 2564
2566 while ((skb = tcp_write_queue_head(sk)) && 2565 while ((skb = tcp_write_queue_head(sk)) && skb != tcp_send_head(sk)) {
2567 skb != tcp_send_head(sk)) {
2568 struct tcp_skb_cb *scb = TCP_SKB_CB(skb); 2566 struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
2569 u32 end_seq; 2567 u32 end_seq;
2570 u32 packets_acked; 2568 u32 packets_acked;
2571 __u8 sacked = scb->sacked; 2569 u8 sacked = scb->sacked;
2572 2570
2573 /* If our packet is before the ack sequence we can
2574 * discard it as it's confirmed to have arrived at
2575 * the other end.
2576 */
2577 if (after(scb->end_seq, tp->snd_una)) { 2571 if (after(scb->end_seq, tp->snd_una)) {
2578 if (tcp_skb_pcount(skb) == 1 || 2572 if (tcp_skb_pcount(skb) == 1 ||
2579 !after(tp->snd_una, scb->seq)) 2573 !after(tp->snd_una, scb->seq))
@@ -2598,38 +2592,38 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
2598 * quickly. This is severely frowned upon behavior. 2592 * quickly. This is severely frowned upon behavior.
2599 */ 2593 */
2600 if (!(scb->flags & TCPCB_FLAG_SYN)) { 2594 if (!(scb->flags & TCPCB_FLAG_SYN)) {
2601 acked |= FLAG_DATA_ACKED; 2595 flag |= FLAG_DATA_ACKED;
2602 } else { 2596 } else {
2603 acked |= FLAG_SYN_ACKED; 2597 flag |= FLAG_SYN_ACKED;
2604 tp->retrans_stamp = 0; 2598 tp->retrans_stamp = 0;
2605 } 2599 }
2606 2600
2607 /* MTU probing checks */ 2601 /* MTU probing checks */
2608 if (fully_acked && icsk->icsk_mtup.probe_size) { 2602 if (fully_acked && icsk->icsk_mtup.probe_size &&
2609 if (!after(tp->mtu_probe.probe_seq_end, TCP_SKB_CB(skb)->end_seq)) { 2603 !after(tp->mtu_probe.probe_seq_end, scb->end_seq)) {
2610 tcp_mtup_probe_success(sk, skb); 2604 tcp_mtup_probe_success(sk, skb);
2611 }
2612 } 2605 }
2613 2606
2614 if (sacked) { 2607 if (sacked) {
2615 if (sacked & TCPCB_RETRANS) { 2608 if (sacked & TCPCB_RETRANS) {
2616 if (sacked & TCPCB_SACKED_RETRANS) 2609 if (sacked & TCPCB_SACKED_RETRANS)
2617 tp->retrans_out -= packets_acked; 2610 tp->retrans_out -= packets_acked;
2618 acked |= FLAG_RETRANS_DATA_ACKED; 2611 flag |= FLAG_RETRANS_DATA_ACKED;
2619 seq_rtt = -1; 2612 seq_rtt = -1;
2620 } else if (seq_rtt < 0) { 2613 } else if (seq_rtt < 0) {
2621 seq_rtt = now - scb->when; 2614 seq_rtt = now - scb->when;
2622 if (fully_acked) 2615 if (fully_acked)
2623 last_ackt = skb->tstamp; 2616 last_ackt = skb->tstamp;
2624 } 2617 }
2618
2625 if (sacked & TCPCB_SACKED_ACKED) 2619 if (sacked & TCPCB_SACKED_ACKED)
2626 tp->sacked_out -= packets_acked; 2620 tp->sacked_out -= packets_acked;
2627 if (sacked & TCPCB_LOST) 2621 if (sacked & TCPCB_LOST)
2628 tp->lost_out -= packets_acked; 2622 tp->lost_out -= packets_acked;
2629 if (sacked & TCPCB_URG) { 2623
2630 if (tp->urg_mode && !before(end_seq, tp->snd_up)) 2624 if ((sacked & TCPCB_URG) && tp->urg_mode &&
2631 tp->urg_mode = 0; 2625 !before(end_seq, tp->snd_up))
2632 } 2626 tp->urg_mode = 0;
2633 } else if (seq_rtt < 0) { 2627 } else if (seq_rtt < 0) {
2634 seq_rtt = now - scb->when; 2628 seq_rtt = now - scb->when;
2635 if (fully_acked) 2629 if (fully_acked)
@@ -2645,12 +2639,12 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
2645 tcp_clear_all_retrans_hints(tp); 2639 tcp_clear_all_retrans_hints(tp);
2646 } 2640 }
2647 2641
2648 if (acked&FLAG_ACKED) { 2642 if (flag & FLAG_ACKED) {
2649 u32 pkts_acked = prior_packets - tp->packets_out; 2643 u32 pkts_acked = prior_packets - tp->packets_out;
2650 const struct tcp_congestion_ops *ca_ops 2644 const struct tcp_congestion_ops *ca_ops
2651 = inet_csk(sk)->icsk_ca_ops; 2645 = inet_csk(sk)->icsk_ca_ops;
2652 2646
2653 tcp_ack_update_rtt(sk, acked, seq_rtt); 2647 tcp_ack_update_rtt(sk, flag, seq_rtt);
2654 tcp_rearm_rto(sk); 2648 tcp_rearm_rto(sk);
2655 2649
2656 tp->fackets_out -= min(pkts_acked, tp->fackets_out); 2650 tp->fackets_out -= min(pkts_acked, tp->fackets_out);
@@ -2664,7 +2658,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
2664 s32 rtt_us = -1; 2658 s32 rtt_us = -1;
2665 2659
2666 /* Is the ACK triggering packet unambiguous? */ 2660 /* Is the ACK triggering packet unambiguous? */
2667 if (!(acked & FLAG_RETRANS_DATA_ACKED)) { 2661 if (!(flag & FLAG_RETRANS_DATA_ACKED)) {
2668 /* High resolution needed and available? */ 2662 /* High resolution needed and available? */
2669 if (ca_ops->flags & TCP_CONG_RTT_STAMP && 2663 if (ca_ops->flags & TCP_CONG_RTT_STAMP &&
2670 !ktime_equal(last_ackt, 2664 !ktime_equal(last_ackt,
@@ -2703,7 +2697,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
2703 } 2697 }
2704#endif 2698#endif
2705 *seq_rtt_p = seq_rtt; 2699 *seq_rtt_p = seq_rtt;
2706 return acked; 2700 return flag;
2707} 2701}
2708 2702
2709static void tcp_ack_probe(struct sock *sk) 2703static void tcp_ack_probe(struct sock *sk)