svn commit: r367530 - in head/sys/netinet: . tcp_stacks

John Baldwin jhb at FreeBSD.org
Thu Nov 19 23:13:27 UTC 2020


On 11/19/20 2:55 PM, John Baldwin wrote:
> On 11/9/20 1:49 PM, Michael Tuexen wrote:
>> Author: tuexen
>> Date: Mon Nov  9 21:49:40 2020
>> New Revision: 367530
>> URL: https://svnweb.freebsd.org/changeset/base/367530
>>
>> Log:
>>   RFC 7323 specifies that:
>>   * TCP segments without timestamps should be dropped when support for
>>     the timestamp option has been negotiated.
>>   * TCP segments with timestamps should be processed normally if support
>>     for the timestamp option has not been negotiated.
>>   This patch enforces the above.
>>   
>>   PR:			250499
>>   Reviewed by:		gnn, rrs
>>   MFC after:		1 week
>>   Sponsored by:		Netflix, Inc
>>   Differential Revision:	https://reviews.freebsd.org/D27148
>>
>> Modified:
>>   head/sys/netinet/tcp_input.c
>>   head/sys/netinet/tcp_stacks/bbr.c
>>   head/sys/netinet/tcp_stacks/rack.c
>>   head/sys/netinet/tcp_syncache.c
>>   head/sys/netinet/tcp_timewait.c
>>
>> Modified: head/sys/netinet/tcp_timewait.c
>> ==============================================================================
>> --- head/sys/netinet/tcp_timewait.c	Mon Nov  9 21:19:17 2020	(r367529)
>> +++ head/sys/netinet/tcp_timewait.c	Mon Nov  9 21:49:40 2020	(r367530)
>> @@ -376,7 +376,7 @@ tcp_twstart(struct tcpcb *tp)
>>   * looking for a pcb in the listen state.  Returns 0 otherwise.
>>   */
>>  int
>> -tcp_twcheck(struct inpcb *inp, struct tcpopt *to __unused, struct tcphdr *th,
>> +tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
>>      struct mbuf *m, int tlen)
>>  {
>>  	struct tcptw *tw;
>> @@ -410,6 +410,16 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to __unu
>>  	 */
>>  	if (thflags & TH_RST)
>>  		goto drop;
>> +
>> +	/*
>> +	 * If timestamps were negotiated during SYN/ACK and a
>> +	 * segment without a timestamp is received, silently drop
>> +	 * the segment.
>> +	 * See section 3.2 of RFC 7323.
>> +	 */
>> +	if (((to->to_flags & TOF_TS) == 0) && (tw->t_recent != 0)) {
>> +		goto drop;
>> +	}
> 
> This causes an insta-panic with TOE because toe_4tuple_check() passes in a NULL
> pointer for 'to'.  I'm working on a fix for that, but perhaps wait to MFC until
> the fix is ready so they can be merged together?
> 
> That said, TOE only calls this in the case that it has gotten a new SYN, so I
> wonder if it makes sense to apply this check on a new SYN.  For a new SYN,
> shouldn't we not care if the new connection is using a different timestamp
> option from the old connection?  The language in RFC 7323 3.2 is all about
> segments on an existing connection, not segments from a new connection I think?
> 
> That is, I think we should perhaps move this check after the TH_SYN check so
> that a mismatch doesn't prevent recycling?

Actually, we move the check below requiring TH_ACK, I think this would fix the TOE
case and also DTRT for plain SYNs for non-TOE:

diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index c52eab956303..85f1ccbe40f9 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -411,16 +411,6 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
 	if (thflags & TH_RST)
 		goto drop;
 
-	/*
-	 * If timestamps were negotiated during SYN/ACK and a
-	 * segment without a timestamp is received, silently drop
-	 * the segment.
-	 * See section 3.2 of RFC 7323.
-	 */
-	if (((to->to_flags & TOF_TS) == 0) && (tw->t_recent != 0)) {
-		goto drop;
-	}
-
 #if 0
 /* PAWS not needed at the moment */
 	/*
@@ -455,6 +445,16 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
 	if ((thflags & TH_ACK) == 0)
 		goto drop;
 
+	/*
+	 * If timestamps were negotiated during SYN/ACK and a
+	 * segment without a timestamp is received, silently drop
+	 * the segment.
+	 * See section 3.2 of RFC 7323.
+	 */
+	if (((to->to_flags & TOF_TS) == 0) && (tw->t_recent != 0)) {
+		goto drop;
+	}
+
 	/*
 	 * Reset the 2MSL timer if this is a duplicate FIN.
 	 */

The commented out PAWS bits would also seem to not be relevant for SYN-only
packets?  However, I'm less sure of if that bit should be moved later as
well. (Or perhaps it should just be removed.  It has been #if 0'd since the
timewait structure was first added back in 2003 by jlemon@)

-- 
John Baldwin


More information about the svn-src-head mailing list