Message ID | 20220319090142.137998-1-zhouzhouyi@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net:ipv4: send an ack when seg.ack > snd.nxt | expand |
zhouzhouyi@gmail.com <zhouzhouyi@gmail.com> wrote: > - if (after(ack, tp->snd_nxt)) > + if (after(ack, tp->snd_nxt)) { > + tcp_send_ack(sk); > return -1; > + } If we really need to do this we need to if (!(flag & FLAG_NO_CHALLENGE_ACK)) tcp_send_challenge_ack(sk); ... else this might result in two acks? Whats the problem thats being fixed here?
Dear Florian Thank you for reviewing my patch ;-) On Sat, Mar 19, 2022 at 6:04 PM Florian Westphal <fw@strlen.de> wrote: > > zhouzhouyi@gmail.com <zhouzhouyi@gmail.com> wrote: > > - if (after(ack, tp->snd_nxt)) > > + if (after(ack, tp->snd_nxt)) { > > + tcp_send_ack(sk); > > return -1; > > + } > > If we really need to do this we need to > if (!(flag & FLAG_NO_CHALLENGE_ACK)) Yes, we need to check FLAG_NO_CHALLENGE_ACK here to avoid two acks. > tcp_send_challenge_ack(sk); > > ... else this might result in two acks? > Whats the problem thats being fixed here? We fix the code to let it match what RFC 793 page 72 has described. I guess this is also what the intermediate internet devices (routers, firewalls for example) expect us to do ;-) Thanks again Zhouyi
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index bfe4112e000c..c10f84599655 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -3771,11 +3771,13 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) goto old_ack; } - /* If the ack includes data we haven't sent yet, discard - * this segment (RFC793 Section 3.9). + /* If the ack includes data we haven't sent yet, then send + * an ack, drop this segment, and return (RFC793 Section 3.9). */ - if (after(ack, tp->snd_nxt)) + if (after(ack, tp->snd_nxt)) { + tcp_send_ack(sk); return -1; + } if (after(ack, prior_snd_una)) { flag |= FLAG_SND_UNA_ADVANCED;