TCP Stack: Challenge ACKs and Timestamps

Sam Kumar samkumar99 at gmail.com
Mon Dec 28 08:25:38 UTC 2015


Hello,
I am working with the code for the TCP Stack. I noticed that support for
Challenge Acks have been added since the latest release (10.2.0), and I
think I may have found a bug in how they relate to TCP timestamps. All line
numbers below are those in commit e66e064c45687b5d294565dbd829b419848f7992.

Looking at tcp_input.c, at lines 1594 to 1604, I see code that expects a
timestamp to be in every segment during the session, if they were
negotiated when the connection was being established.
(
https://github.com/freebsd/freebsd/blob/master/sys/netinet/tcp_input.c#L1595
)

Looking at tcp_input.c, at lines 2161 and 2188, I see that Challenge ACKs
are sent via calls to tcp_respond().
(
https://github.com/freebsd/freebsd/blob/master/sys/netinet/tcp_input.c#L2161
and
https://github.com/freebsd/freebsd/blob/master/sys/netinet/tcp_input.c#L2188
)

Looking at tcp_subr.c, at line 978, I see that the segment sent by
tcp_respond() never contains TCP options.
(https://github.com/freebsd/freebsd/blob/master/sys/netinet/tcp_subr.c#L978)

Therefore, it seems to me that Challenge ACKs will never contain any TCP
options. This violates the condition that once timestamps are negotiated,
they must be present in every segment.

Please let me know if I am mistaken, or if this is actually a bug.

Sam Kumar


More information about the freebsd-current mailing list