Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Feb 2001 23:56:18 +0100
From:      Jesper Skriver <jesper@skriver.dk>
To:        Jonathan Lemon <jlemon@flugsvamp.com>
Cc:        net@freebsd.org
Subject:   Re: ICMP unreachables, take II.
Message-ID:  <20010224235618.C57625@skriver.dk>
In-Reply-To: <20010223052012.A39613@skriver.dk>; from jesper@skriver.dk on Fri, Feb 23, 2001 at 05:20:13AM %2B0100
References:  <20010222185412.E5714@prism.flugsvamp.com> <20010223034952.A6694@skriver.dk> <20010222212044.H5714@prism.flugsvamp.com> <20010223043405.B6694@skriver.dk> <20010223052012.A39613@skriver.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Feb 23, 2001 at 05:20:13AM +0100, Jesper Skriver wrote:
> On Fri, Feb 23, 2001 at 04:34:05AM +0100, Jesper Skriver wrote:
> > On Thu, Feb 22, 2001 at 09:20:44PM -0600, Jonathan Lemon wrote:
> > > On Fri, Feb 23, 2001 at 03:49:52AM +0100, Jesper Skriver wrote:
> > > > 
> > > > I still think we should react to the following as a minimum 
> > > >  - type 3 code  0  net unreachable
> > > >  - type 3 code  1  host unreachable
> > > 
> > > RFC 1122, Section 4.2.3.9 says:
> > > 
> > >  o    Destination Unreachable -- codes 0, 1, 5
> > >                  Since these Unreachable messages indicate soft error
> > >                  conditions, TCP MUST NOT abort the connection, and it
> > >                  SHOULD make the information available to the
> > >                  application.
> > > 
> > > I think that these should be transients.
> > 
> > As discussed on IRC I suggest adding the ability (under control of a
> > sysctl, disabled by default) to treat 0/1 (perhaps even 5) like 2,3,9 &
> > 10.
> 
> Forget this, as discussed on IRC, it would be better to have a code 0/1
> trigger a immediate retransmit of the SYN, this would also give us
> timeouts < 10 secs ...
> 
> If jlemon doesn't beat me to it, I'll try to look at this in the weekend
> ... as a possible "take III"

23:53:42.440817 193.162.74.6.1059 > 193.162.153.164.53:  36307+ PTR? 1.23.41.195.in-addr.arpa. (42)
23:53:42.458868 193.162.153.164.53 > 193.162.74.6.1059:  36307 NXDomain 0/1/0 (92)
23:53:42.460135 193.162.74.6.1165 > 195.41.23.1.23: S 1847740321:1847740321(0) win 16384 <mss 1460> (DF) [tos 0x10] 
23:53:42.511069 195.249.6.93 > 193.162.74.6: icmp: host 195.41.23.1 unreachable (DF)
23:53:42.511161 193.162.74.6.1165 > 195.41.23.1.23: S 1847740321:1847740321(0) win 16384 <mss 1460> (DF) [tos 0x10] 
23:53:42.516799 195.249.6.93 > 193.162.74.6: icmp: host 195.41.23.1 unreachable (DF)
23:53:42.516836 193.162.74.6.1165 > 195.41.23.1.23: S 1847740321:1847740321(0) win 16384 <mss 1460> (DF) [tos 0x10] 
23:53:42.521763 195.249.6.93 > 193.162.74.6: icmp: host 195.41.23.1 unreachable (DF)
23:53:42.521796 193.162.74.6.1165 > 195.41.23.1.23: S 1847740321:1847740321(0) win 16384 <mss 1460> (DF) [tos 0x10] 
23:53:42.526749 195.249.6.93 > 193.162.74.6: icmp: host 195.41.23.1 unreachable (DF)
23:53:42.526793 193.162.74.6.1165 > 195.41.23.1.23: S 1847740321:1847740321(0) win 16384 <mss 1460> (DF) [tos 0x10] 
23:53:42.531753 195.249.6.93 > 193.162.74.6: icmp: host 195.41.23.1 unreachable (DF)

jesper@tam% time telnet 195.41.23.1
Trying 195.41.23.1...
telnet: connect to address 195.41.23.1: No route to host
telnet: Unable to connect to remote host
0.000u 0.020s 0:00.70 2.8%      88+164k 0+0io 12pf+0w

But that is probably too fast, what if we delay the retransmit by say
100ms efter recieving the host unreachable ?

Diff below

Index: tcp_subr.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_subr.c,v
retrieving revision 1.93
diff -u -r1.93 tcp_subr.c
--- tcp_subr.c	2001/02/23 21:07:06	1.93
+++ tcp_subr.c	2001/02/24 21:30:30
@@ -138,6 +138,11 @@
 SYSCTL_INT(_net_inet_tcp, OID_AUTO, icmp_may_rst, CTLFLAG_RW, &icmp_may_rst, 0, 
     "Certain ICMP unreachable messages may abort connections in SYN_SENT");
 
+static int	icmp_trigger_retransmit = 1;
+SYSCTL_INT(_net_inet_tcp, OID_AUTO, icmp_trigger_retransmit, CTLFLAG_RW,
+    &icmp_trigger_retransmit, 0, 
+    "Certain ICMP unreachable messages trigger retransmit when in SYN_SENT");
+
 static void	tcp_cleartaocache __P((void));
 static void	tcp_notify __P((struct inpcb *, int));
 
@@ -777,7 +782,25 @@
 	} else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 &&
 	    tp->t_softerror)
 		tcp_drop(tp, error);
-	else
+	else if (tp->t_state == TCPS_SYN_SENT && icmp_trigger_retransmit) {
+		tp->t_softerror = error;
+		tp->t_rxtshift++;
+		tp->snd_nxt = tp->snd_una;
+		/*
+		 * Note:  We overload snd_recover to function also as the
+		 * snd_last variable described in RFC 2582
+		 */
+		tp->snd_recover = tp->snd_max;
+		/*
+		 * Force a segment to be sent.
+		 */
+		tp->t_flags |= TF_ACKNOW;
+		/*
+		 * If timing a segment in this window, stop the timer.
+		 */
+		tp->t_rtttime = 0;
+		(void) tcp_output(tp);
+	} else
 		tp->t_softerror = error;
 #if 0
 	wakeup((caddr_t) &so->so_timeo);

/Jesper

-- 
Jesper Skriver, jesper(at)skriver(dot)dk  -  CCIE #5456
Work:    Network manager   @ AS3292 (Tele Danmark DataNetworks)
Private: FreeBSD committer @ AS2109 (A much smaller network ;-)

One Unix to rule them all, One Resolver to find them,
One IP to bring them all and in the zone to bind them.

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010224235618.C57625>