Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 05 Apr 2002 00:20:06 +0100
From:      Brian Somers <brian@freebsd-services.com>
To:        Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de>
Cc:        Brian Somers <brian@freebsd-services.com>, Doug Ambrisko <ambrisko@ambrisko.com>, "M. Warner Losh" <imp@village.org>, alan@clegg.com, luigi@FreeBSD.org, nsayer@FreeBSD.org, ryand-bsd@zenspider.com, freebsd-arch@FreeBSD.org, freebsd-net@FreeBSD.org
Subject:   Re: Your change to in.c to limit duplicate networks is causing trouble 
Message-ID:  <200204042320.g34NK6q7041410@hak.lan.Awfulhak.org>
In-Reply-To: Message from Joerg Wunsch <j@uriah.heep.sax.de>  of "Thu, 04 Apr 2002 21:58:44 %2B0200." <20020404215844.A83154@uriah.heep.sax.de> 

next in thread | previous in thread | raw e-mail | index | archive | help
> As Brian Somers wrote:
> 
> > The code now avoids adding a host route if the interface address is 
> > 0.0.0.0, and always treats a failure to add a host route as fatal 
> > (previously, it masked EEXIST for some reason - I guessed because it 
> > was trying to handle address re-assignment, but that works ok with 
> > this patch).
> 
> I think that will be fatal for the sppp case with dynamic IP
> address negotiation.  We use 0.0.0.0 as the local IP address
> for the unnegotiated PPP link then, with the idea that it's
> still possible to route through the interface anyway.  For
> dial-on-demand PPP links (like on ISDN), the routed packets
> will then trigger the dialout event.  In the course of the
> PPP negotiations, an actual local IP address will be negotiated
> and assigned, but we first need some packets to pass through the
> PPP layer in order to trigger this.
> 
> Perhaps it would still be possible to use per-interface routes
> even after your change (-iface isp0 etc.), but currently, a number
> of documents describe that it's possible to use local address
> 0.0.0.0 and still get normal routing behaviour for those links.

Hmm, valid point :(

So the code will have to become something like the attached ?  This 
is quite grotty, but I can't think of any clean way other than 
somehow telling SIOCAIFADDR and SIOCSIFADDR not to add the host route 
in the first place.

> -- 
> cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL
> 
> http://www.sax.de/~joerg/                        NIC: JW11-RIPE
> Never trust an operating system you don't have sources for. ;-)

-- 
Brian <brian@freebsd-services.com>                <brian@Awfulhak.org>
      http://www.freebsd-services.com/        <brian@[uk.]FreeBSD.org>
Don't _EVER_ lose your sense of humour !      <brian@[uk.]OpenBSD.org>

Index: in.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in.c,v
retrieving revision 1.63
diff -u -r1.63 in.c
--- in.c	1 Apr 2002 21:31:06 -0000	1.63
+++ in.c	4 Apr 2002 23:18:36 -0000
@@ -661,7 +661,7 @@
 {
 	register u_long i = ntohl(sin->sin_addr.s_addr);
 	struct sockaddr_in oldaddr;
-	int s = splimp(), flags = RTF_UP, error;
+	int s = splimp(), flags = RTF_UP, error = 0;
 
 	oldaddr = ia->ia_addr;
 	ia->ia_addr = *sin;
@@ -723,17 +723,25 @@
 			return (0);
 		flags |= RTF_HOST;
 	}
-	if ((error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, flags)) == 0)
-		ia->ia_flags |= IFA_ROUTE;
 
-	if (error != 0 && ia->ia_dstaddr.sin_family == AF_INET) {
-		ia->ia_addr = oldaddr;
-		return (error);
+	/*-
+	 * Don't add host routes for interface addresses of
+	 * 0.0.0.0 --> 0.255.255.255 netmask 255.0.0.0.  This makes it
+	 * possible to assign several such address pairs with consistent
+	 * results (no host route) and is required by BOOTP.
+	 *
+	 * XXX: This is ugly !  There should be a way for the caller to
+	 *      say that they don't want a host route.
+	 */
+	if (ia->ia_addr.sin_addr.s_addr != INADDR_ANY ||
+	    ia->ia_netmask != IN_CLASSA_NET ||
+	    ia->ia_dstaddr.sin_addr.s_addr != htonl(IN_CLASSA_HOST)) {
+		if ((error = rtinit(&ia->ia_ifa, (int)RTM_ADD, flags)) != 0) {
+			ia->ia_addr = oldaddr;
+			return (error);
+		}
+		ia->ia_flags |= IFA_ROUTE;
 	}
-
-	/* XXX check if the subnet route points to the same interface */
-	if (error == EEXIST)
-		error = 0;
 
 	/*
 	 * If the interface supports multicast, join the "all hosts"



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?200204042320.g34NK6q7041410>