• Nandita Dukkipati's avatar
    tcp: bug fix in proportional rate reduction. · 35f079eb
    Nandita Dukkipati authored
    This patch is a fix for a bug triggering newly_acked_sacked < 0
    in tcp_ack(.).
    
    The bug is triggered by sacked_out decreasing relative to prior_sacked,
    but packets_out remaining the same as pior_packets. This is because the
    snapshot of prior_packets is taken after tcp_sacktag_write_queue() while
    prior_sacked is captured before tcp_sacktag_write_queue(). The problem
    is: tcp_sacktag_write_queue (tcp_match_skb_to_sack() -> tcp_fragment)
    adjusts the pcount for packets_out and sacked_out (MSS change or other
    reason). As a result, this delta in pcount is reflected in
    (prior_sacked - sacked_out) but not in (prior_packets - packets_out).
    
    This patch does the following:
    1) initializes prior_packets at the start of tcp_ack() so as to
    capture the delta in packets_out created by tcp_fragment.
    2) introduces a new "previous_packets_out" variable that snapshots
    packets_out right before tcp_clean_rtx_queue, so pkts_acked can be
    correctly computed as before.
    3) Computes pkts_acked using previous_packets_out, and computes
    newly_acked_sacked using prior_packets.
    Signed-off-by: default avatarNandita Dukkipati <nanditad@google.com>
    Acked-by: default avatarYuchung Cheng <ycheng@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    35f079eb
tcp_input.c 165 KB