On Tue, Dec 19, 2017 at 5:00 PM, Steve Ibanez <siba...@stanford.edu> wrote: > Hi Neal, > > I managed to track down the code path that the unACKed CWR packet is > taking. The tcp_rcv_established() function calls tcp_ack_snd_check() > at the end of step5 and then the return statement indicated below is > invoked, which prevents the __tcp_ack_snd_check() function from > running. > > static inline void tcp_ack_snd_check(struct sock *sk) > { > if (!inet_csk_ack_scheduled(sk)) { > /* We sent a data segment already. */ > return; /* <=== here */ > } > __tcp_ack_snd_check(sk, 1); > } > > So somehow tcp_ack_snd_check() thinks that a data segment was already > sent when in fact it wasn't. Do you see a way around this issue?
Thanks for tracking that down! AFAICT in this case the call chain we are trying to achieve is as follows: tcp_rcv_established() -> tcp_data_queue() -> tcp_event_data_recv() -> inet_csk_schedule_ack() The only think I can think of would be to add printks that fire for CWR packets, to isolate why the code bails out before it reaches those calls... thanks, neal