Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 04 Apr 2002 18:17:46 +0100
From:      Brian Somers <brian@freebsd-services.com>
To:        Doug Ambrisko <ambrisko@ambrisko.com>
Cc:        "M. Warner Losh" <imp@village.org>, j@uriah.heep.sax.de, alan@clegg.com, luigi@FreeBSD.org, nsayer@FreeBSD.org, ryand-bsd@zenspider.com, Brian Somers <brian@freebsd-services.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:  <200204041717.g34HHkq7037326@hak.lan.Awfulhak.org>
In-Reply-To: Message from Doug Ambrisko <ambrisko@ambrisko.com>  of "Mon, 25 Mar 2002 11:34:50 PST." <200203251934.g2PJYoY68469@ambrisko.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
I've crossposted to -net and -arch as this could probably do with a 
review from a larger audience....

> Brian Somers writes:
> | > In message: <20020325172024.B60771@uriah.heep.sax.de>
> | >             Joerg Wunsch <j@uriah.heep.sax.de> writes:
> | > : As Alan Clegg wrote:
> | > : 
> | > : > Is there any motion to pull this back?
> | > : 
> | > : There was only consensus to special-case the BOOTP case.
> | > : 
> | > : As i understand it, the change itself was more than desirable for
> | > : PPP connections (so no surprise it was Brian who committed it).
> | > 
> | > dhclient is still broken, however.  The 0.0.0.0 should be the special
> | > case, not bootp.
> | 
> | Yes, I agree.
> | 
> | The question is.... should interface address assignments with 
> | destinations of 0.0.0.0 have host routes created in the first place ?
> | 
> | I'd tend to think not.
> | 
> | Doing this will make things consistent, but maybe at the expense of 
> | breaking something else - under ``usual'' circumstances.  I'm 
> | thinking along the lines of some program that may configure a 
> | destination address of 0.0.0.0 and then expect to be able to do stuff 
> | with the routing table - such as adding a route via 0.0.0.0 or calling 
> | sendto() or connect() with 0.0.0.0 as the destination.
> | 
> | I'm guessing that dhclient will continue to work without a host route 
> | as it writes raw IP packets, and I haven't heard of any problems with 
> | running multiple dhclients using the old in.c code where second and 
> | subsequent SIOCAIADDRs with a 0.0.0.0 destination had no host route.  
> | I haven't tested it yet though.
> | 
> | If nobody objects, I'll tweak things so that destinations of 0.0.0.0 
> | don't add host routes and see if it breaks anything I know of.  I'll 
> | post patches to -arch and cc -net when I get something working.
> 
> Sounds reasonable.  I can test it when you have something since I'm hitting
> this on a few machines around here.
> 
> Doug A.

The attached patches seem to make things work for BOOTP with multiple 
interfaces and for ppp expecting failures for duplicate destination 
address assignments.

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).

If people could get some time to review it, it'd be appreciated.

Cheers.
-- 
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: netinet/in.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in.c,v
retrieving revision 1.63
diff -u -r1.63 in.c
--- netinet/in.c	1 Apr 2002 21:31:06 -0000	1.63
+++ netinet/in.c	4 Apr 2002 16:52:59 -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,21 @@
 			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 routing table entries for interface address entries
+	 * of 0.0.0.0.  This makes it possible to assign several such address
+	 * pairs with consistent results (no host route) and is required by
+	 * BOOTP.
+	 */
+	if (ia->ia_addr.sin_addr.s_addr != INADDR_ANY) {
+		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-arch" in the body of the message




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