tcp_notify() and the connection establishment timer
Fernando Gont
fernando at gont.com.ar
Thu Oct 21 01:03:45 PDT 2004
Folks,
I was trying to figure out what the BSD policy for aborting
connection-establishment attempts was.
According to Stevens' TCPv2, when TCP sends the first SYN for establishing
a connection, a 75-seconds timer is initialized. If the connection cannot
be established before that 75-second period is over, the conenction will be
aborted.
However, looking at the tcp_notify() function, I see the following code:
static struct inpcb *
tcp_notify(inp, error)
struct inpcb *inp;
int error;
{
struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb;
/*
* Ignore some errors if we are hooked up.
* If connection hasn't completed, has retransmitted several times,
* and receives a second error, give up now. This is better
* than waiting a long time to establish a connection that
* can never complete.
*/
if (tp->t_state == TCPS_ESTABLISHED &&
(error == EHOSTUNREACH || error == ENETUNREACH ||
error == EHOSTDOWN)) {
return inp;
} else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 &&
tp->t_softerror) {
tcp_drop(tp, error);
return (struct inpcb *)0;
} else {
tp->t_softerror = error;
return inp;
}
#if 0
wakeup( &so->so_timeo);
sorwakeup(so);
sowwakeup(so);
#endif
}
Maybe I'm missing something, but I get the impression that, considering the
value (six seconds) to which the RTO is initialized, that part that says
} else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 &&
tp->t_softerror) {
tcp_drop(tp, error);
return (struct inpcb *)0;
will never be executed, as the connection-establishment timer will always
timeout before the evaluated condition becomes true.
Am I missing something? Or is it that this code is there just in case the
initial RTO is reduced to such a value that, in that case, this code would
kick in before the 75-seconds tconnection-establishment timer?
Thanks!
--
Fernando Gont
e-mail: fernando at gont.com.ar || fgont at acm.org
More information about the freebsd-net
mailing list