Date: Wed, 01 Oct 1997 15:30:15 -0700 From: Paul Traina <pst@juniper.net> To: dg@root.com Cc: Don Lewis <Don.Lewis@tsc.tdk.com>, Richard Jones <richard@a42.deep-thought.org>, hackers@freebsd.org, bugs@freebsd.org Subject: Re: FreeBSD TCP stack and RST processing [subj changed] Message-ID: <199710012230.PAA03697@base.juniper.net> In-Reply-To: Your message of "Wed, 01 Oct 1997 04:51:35 PDT." <199710011151.EAA08698@implode.root.com>
next in thread | previous in thread | raw e-mail | index | archive | help
It's been so long since I touched this that I won't offer an opinion.
The original idea was ripped from Stevens by vjs and then from me, if
memory serves me.
From: David Greenman <dg@root.com>
Subject: Re: FreeBSD TCP stack and RST processing [subj changed]
>This code appears to be correct, and agrees with what's in the book.
>
>However ... there is some code *earlier* in tcp_input() that looks like it
>botches this situation:
...
>It looks like we just drop the packet containing the RST! The example code
>in the book does not execute this code in the SYN_RECEIVED state. I don't
>know the history of this code, so I don't know why it was changed.
>
>copied to freebsd-bugs
This appears to have been broken in rev 1.52:
----------------------------
revision 1.52
date: 1996/10/07 04:32:39; author: pst; state: Exp; lines: +23 -13
Increase robustness of FreeBSD against high-rate connection attempt
denial of service attacks.
Reviewed by: bde,wollman,olah
Inspired by: vjs@sgi.com
----------------------------
...
***************
*** 753,758 ****
--- 758,765 ----
}
/*
+ * If the state is SYN_RECEIVED:
+ * do just the ack and RST checks from SYN_SENT state.
* If the state is SYN_SENT:
* if seg contains an ACK, but not for our SYN, drop the input.
* if seg contains a RST, then drop the connection.
***************
*** 764,769 ****
--- 771,777 ----
* arrange for segment to be acked (eventually)
* continue processing rest of data/controls, beginning with URG
*/
+ case TCPS_SYN_RECEIVED:
case TCPS_SYN_SENT:
if ((taop = tcp_gettaocache(inp)) == NULL) {
taop = &tao_noncached;
***************
*** 791,796 ****
--- 799,806 ----
tp = tcp_drop(tp, ECONNREFUSED);
goto drop;
}
+ if (tp->t_state == TCPS_SYN_RECEIVED)
+ break;
if ((tiflags & TH_SYN) == 0)
goto drop;
tp->snd_wnd = ti->ti_win; /* initial send window */
-DG
David Greenman
Core-team/Principal Architect, The FreeBSD Project
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199710012230.PAA03697>
