From owner-freebsd-net@FreeBSD.ORG Wed Nov 17 23:07:21 2004 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2B48716A4CE; Wed, 17 Nov 2004 23:07:21 +0000 (GMT) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.191]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6B55743D4C; Wed, 17 Nov 2004 23:07:20 +0000 (GMT) (envelope-from max@love2party.net) Received: from [212.227.126.206] (helo=mrelayng.kundenserver.de) by moutng.kundenserver.de with esmtp (Exim 3.35 #1) id 1CUYtT-0004l1-00; Thu, 18 Nov 2004 00:07:19 +0100 Received: from [217.83.7.105] (helo=donor.laier.local) by mrelayng.kundenserver.de with asmtp (TLSv1:RC4-MD5:128) (Exim 3.35 #1) id 1CUYtS-0000z9-00; Thu, 18 Nov 2004 00:07:19 +0100 From: Max Laier To: freebsd-net@freebsd.org Date: Thu, 18 Nov 2004 00:07:30 +0100 User-Agent: KMail/1.7.1 References: <200411112124.12616.max@love2party.net> <1100710232.47346.5.camel@localhost> <20041117220247.GA60793@ip.net.ua> In-Reply-To: <20041117220247.GA60793@ip.net.ua> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart7242309.1ZlrrbEUC1"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <200411180007.39802.max@love2party.net> X-Provags-ID: kundenserver.de abuse@kundenserver.de auth:61c499deaeeba3ba5be80f48ecc83056 cc: Vladimir Grebenschikov cc: freebsd-arch@freebsd.org Subject: Re: in.c autoadding prefix route [PATCH] X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Nov 2004 23:07:21 -0000 --nextPart7242309.1ZlrrbEUC1 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On Wednesday 17 November 2004 23:02, Ruslan Ermilov wrote: > On Wed, Nov 17, 2004 at 07:50:32PM +0300, Vladimir Grebenschikov wrote: > > =D0=92 =D1=87=D1=82, 11/11/2004 =D0=B2 21:24 +0100, Max Laier =D0=BF=D0= =B8=D1=88=D0=B5=D1=82: > > > All, > > > > > > I know I have sent this a couple of times before, but never got > > > anywhere. This time I am set to commit! > > > > > > The attached patch (http://people.freebsd.org/~mlaier/in.c.patch) > > > derived from WIDE via OpenBSD in.c, rev 1.21 improves the handling of > > > automatic prefix routes. > > > > > > Right now you can't have two legs into the same network. If you want > > > to, you must give on of the interfaces a host address only (netmask > > > /32). This way it is not possible to hand over the route if one of the > > > interfaces is "removed" (however this is done in the special case). > > > > > > The patch allows to add more than on IPv4 address with the same prefi= x. > > > In the case that there is a route already, we leave it alone and add > > > the new address without the IFA_ROUTE flag. When we remove an address > > > later on, that has a route associated, we try to find an alternative > > > address to use for the route and hand it over. > > > > > > This is required for CARP, but should be helpful for other situations > > > as well. > > > > > > Any objections? > > > > This change actually broke one simple thing: > > > > # ifconfig lo0 alias 10.0.16.111/32 > > # ping 10.0.16.111 > > PING 10.0.16.111 (10.0.16.111): 56 data bytes > > ping: sendto: No route to host > > ^C > > # > > > > You should (anyway should) add routing of interface address itself to > > loop-back interface, like it usually done in all other cases. > > > > Please fix. > > This bug was borrowed from OpenBSD (they still have it). > The problem is that in "struct in_ifaddr", initially > > ia_ifa.ifa_addr points to ia_addr > - and - > ia_ifa.ifa_dstaddr points to ia_dstaddr > > and the IFF_LOOPBACK code in in_ifinit() just resets > the ia_ifa.ifa_dstaddr pointer to point to ia_ifa.ifa_addr. > But new in_addprefix() code ignores this fact, and just > uses INET fields directly, i.e., ia_dstaddr (which happens > to be 0.0.0.0). Then all the havoc happens (it matches > another interface address (ia_addr=3D127.0.0.1, ia_dstaddr=3D0) > and refuses to install a host route. > > The fix is a one line change, and as I later found out, > it also corresponds to NetBSD revision 1.83: > > http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet/in.c.diff?r1=3D1.82= &r2=3D >1.83&cvsroot=3Dnetbsd > > %%% > Index: in.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > RCS file: /home/ncvs/src/sys/netinet/in.c,v > retrieving revision 1.78 > diff -u -p -r1.78 in.c > --- in.c 12 Nov 2004 20:53:51 -0000 1.78 > +++ in.c 17 Nov 2004 21:42:44 -0000 > @@ -759,7 +759,7 @@ in_ifinit(ifp, ia, sin, scrub) > ia->ia_netbroadcast.s_addr =3D > htonl(ia->ia_net | ~ ia->ia_netmask); > } else if (ifp->if_flags & IFF_LOOPBACK) { > - ia->ia_ifa.ifa_dstaddr =3D ia->ia_ifa.ifa_addr; > + ia->ia_dstaddr =3D ia->ia_addr; > flags |=3D RTF_HOST; > } else if (ifp->if_flags & IFF_POINTOPOINT) { > if (ia->ia_dstaddr.sin_family !=3D AF_INET) > %%% > > An alternative would be to fix in_addprefix() to pay > attention to ia_ifa pointers, but as this bug shows, > this is error prone. It's much easier to just > initialize the ia_dstaddr as appropriate. Thanks. Good analysis ... I failed to see it :-\ I agree that setting ia_dstaddr is the less painful option. Again, thanks a lot and sorry for the mess! =2D-=20 /"\ Best regards, | mlaier@freebsd.org \ / Max Laier | ICQ #67774661 X http://pf4freebsd.love2party.net/ | mlaier@EFnet / \ ASCII Ribbon Campaign | Against HTML Mail and News --nextPart7242309.1ZlrrbEUC1 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.6 (FreeBSD) iD8DBQBBm9m7XyyEoT62BG0RAnI0AJ4rLuIe3rkQDhBla5REG+U3X5ZlBgCfVeLd cmuE1BIz9XdLzFOjq6lW8TU= =aShL -----END PGP SIGNATURE----- --nextPart7242309.1ZlrrbEUC1--