On 07/18/2018 01:56 PM, Yuchung Cheng wrote:
> Currently when a DCTCP receiver delays an ACK and receive a
> data packet with a different CE mark from the previous one's, it
> sends two immediate ACKs acking previous and latest sequences
> respectly (for ECN accounting).
>
> Previously sending the first ACK may mark off the delayed ACK timer
> (tcp_event_ack_sent). This may subsequently prevent sending the
> second ACK to acknowledge the latest sequence (tcp_ack_snd_check).
> The culprit is that tcp_send_ack() assumes it always acknowleges
> the latest sequence, which is not true for the first special ACK.
>
> The fix is to not make the assumption in tcp_send_ack and check the
> actual ack sequence before cancelling the delayed ACK. Further it's
> safer to pass the ack sequence number as a local variable into
> tcp_send_ack routine, instead of intercepting tp->rcv_nxt to avoid
> future bugs like this.
>
> Reported-by: Neal Cardwell <ncardw...@google.com>
> Signed-off-by: Yuchung Cheng <ych...@google.com>
> Acked-by: Neal Cardwell <ncardw...@google.com>
Signed-off-by: Eric Dumazet <eduma...@google.com>