Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Nov 2004 00:02:47 +0200
From:      Ruslan Ermilov <ru@FreeBSD.org>
To:        Vladimir Grebenschikov <vova@fbsd.ru>
Cc:        freebsd-net@FreeBSD.org
Subject:   Re: in.c autoadding prefix route [PATCH]
Message-ID:  <20041117220247.GA60793@ip.net.ua>
In-Reply-To: <1100710232.47346.5.camel@localhost>
References:  <200411112124.12616.max@love2party.net> <1100710232.47346.5.camel@localhost>

next in thread | previous in thread | raw e-mail | index | archive | help

--VS++wcV0S1rZb1Fb
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Wed, Nov 17, 2004 at 07:50:32PM +0300, Vladimir Grebenschikov wrote:
> =F7 =DE=D4, 11/11/2004 =D7 21:24 +0100, Max Laier =D0=C9=DB=C5=D4:=20
> > All,
> >=20
> > I know I have sent this a couple of times before, but never got anywher=
e. This=20
> > time I am set to commit!
> >=20
> > The attached patch (http://people.freebsd.org/~mlaier/in.c.patch) deriv=
ed from=20
> > WIDE via OpenBSD in.c, rev 1.21 improves the handling of automatic pref=
ix=20
> > routes.
> >=20
> > Right now you can't have two legs into the same network. If you want to=
, you=20
> > must give on of the interfaces a host address only (netmask /32). This =
way it=20
> > is not possible to hand over the route if one of the interfaces is=20
> > "removed" (however this is done in the special case).
> >=20
> > The patch allows to add more than on IPv4 address with the same prefix.=
 In the=20
> > case that there is a route already, we leave it alone and add the new a=
ddress=20
> > without the IFA_ROUTE flag. When we remove an address later on, that ha=
s a=20
> > route associated, we try to find an alternative address to use for the =
route=20
> > and hand it over.
> >=20
> > This is required for CARP, but should be helpful for other situations a=
s well.
> >=20
> > Any objections?
>=20
> This change actually broke one simple thing:
>=20
> # 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
> #
>=20
> You should (anyway should) add routing of interface address itself to
> loop-back interface, like it usually done in all other cases.
>=20
> Please fix.
>=20
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&r=
2=3D1.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.
=09

Cheers,
--=20
Ruslan Ermilov
ru@FreeBSD.org
FreeBSD committer

--VS++wcV0S1rZb1Fb
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (FreeBSD)

iD8DBQFBm8qHqRfpzJluFF4RAjApAJ9/D86FqpwPvb6oLRmyd41zjyWZQQCeKXuy
A6+YwAicxvtMT+7Os1KcZvk=
=I3CA
-----END PGP SIGNATURE-----

--VS++wcV0S1rZb1Fb--



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