diff options
-rw-r--r-- | net/ipv4/tcp_input.c | 66 |
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. */ | ||
2528 | static u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb) | 2529 | static 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 |
2554 | static 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 | */ | ||
2553 | static 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 | ||
2709 | static void tcp_ack_probe(struct sock *sk) | 2703 | static void tcp_ack_probe(struct sock *sk) |