Date: Fri, 05 Apr 2002 01:19:25 +0100 From: Brian Somers <brian@freebsd-services.com> To: stephen macmanus <stephenm@bayarea.net> Cc: Doug Ambrisko <ambrisko@ambrisko.com>, "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: <200204050019.g350JPq7042133@hak.lan.Awfulhak.org> In-Reply-To: Message from stephen macmanus <stephenm@bayarea.net> of "Thu, 04 Apr 2002 13:10:44 -0800." <200204042110.NAA05062@shell4.bayarea.net>
next in thread | previous in thread | raw e-mail | index | archive | help
> > 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).
>
>
> One effect of the masked EEXIST is to suppress the spurious error
> which occurs when adding an alias IP address (SIOCAIFADDR) on the
> same logical subnet as an existing IP address. Users have no way
> of knowing that it's actually safe to simply ignore the error in
> that situation, so the masking should probably be preserved.
Hmm, thanks for the pointer.
I think this now works - where it didn't before (although see
the new patch posted in response to Joergs mention of the sppp
problem).
The lack of the EEXIST hack in my patch means that this will work as
before:
ifconfig dc0 inet 172.16.0.5 netmask 0xffffff00
ifconfig dc0 inet 172.16.0.11 netmask 0xfffffff8
Where connections to 172.16.0.1-172.16.0.7 and 172.16.0.16-172.16.0.255
come from 172.16.0.5 and connections to 172.16.0.8-172.16.0.15 come from
172.16.0.11.
After the above however,
ifconfig dc0 inet 172.16.0.14 netmask 0xfffffff8
will (correctly) fail in the patched code. It fails because the
gateway/netmask combination produces a duplicate key in the routing
table, returning an error from rtinit(). Previously, this failure
was masked by the EEXIST hack, allowing the interface address update
without a corresponding host route.
I believe the old behaviour becomes obviously wrong when someone then
deletes the 172.16.0.11 interface address, blowing away the
associated host route and leaving no routing table entry to talk to
the 172.16.0.14 address.
So I don't think the old was was really safe after all :-/
> Stephen
> ------------------
> Stephen Macmanus #include <std_disclaimer.h>
> stephenm@bayarea.net
>
> - - - 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"
--
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>
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?200204050019.g350JPq7042133>
