Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Aug 2002 03:40:03 -0700 (PDT)
From:      Ruslan Ermilov <ru@FreeBSD.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/41494: static routes set with interface address as gateway are non-functional
Message-ID:  <200208131040.g7DAe3vl054414@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/41494; it has been noted by GNATS.

From: Ruslan Ermilov <ru@FreeBSD.org>
To: Qing Li <Qing.Li@windriver.com>
Cc: bug-followup@FreeBSD.org
Subject: Re: kern/41494: static routes set with interface address as gateway are non-functional
Date: Tue, 13 Aug 2002 13:27:58 +0300

 --xJK8B5Wah2CMJs8h
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 
 On Fri, Aug 09, 2002 at 04:47:52PM -0700, Qing Li wrote:
 >=20
 > 	My interface xl0 is assigned 147.11.38.218.
 >=20
 > 	=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > 	Routing tables
 >=20
 > 	Internet:
 > 	Destination        Gateway            Flags    Refs      Use  Netif Expi=
 re
 > 	default            147.11.38.1        UGSc        4        0    xl0
 > 	127.0.0.1          127.0.0.1          UH          1       22    lo0
 > 	147.11.38/24       link#5             UC          2        0    xl0
 > 	147.11.38.1        00:00:0c:07:ac:26  UHLW        5        0    xl0    7=
 83
 > 	147.11.38.15       147.11.38.218      UGHS        0        3    xl0
 > 	147.11.38.218      127.0.0.1          UGHS        1        0    lo0
 > 	147.11.38.254      00:02:7e:23:fa:80  UHLW        0        0    xl0     =
 49
 >=20
 > 	Internet6:
 > 	Destination                       Gateway                       Flags Ne=
 tif Expire
 > 	::1                               ::1                           UH    lo0
 > 	fe80::%xl0/64                     link#5                        UC    xl0
 > 	fe80::2b0:d0ff:fe84:c8bc%xl0      fe80::2c0:4fff:fe8d:63b9%xl0  UGHS  xl0
 > 	fe80::2c0:4fff:fe8d:63b9%xl0      00:c0:4f:8d:63:b9             UHL   lo0
 > 	fe80::2e0:ff:fe84:4237%xl0        00:e0:00:84:42:37             UHLW  xl0
 > 	fe80::%lo0/64                     fe80::1%lo0                   Uc    lo0
 > 	fe80::1%lo0                       link#8                        UHL   lo0
 > 	ff01::/32                         ::1                           U     lo0
 > 	ff02::%xl0/32                     link#5                        UC    xl0
 > 	ff02::%lo0/32                     ::1                           UC    lo0
 > 	=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 >=20
 > 	Now I add a host route:
 > 	"route add -host 147.11.38.15 147.11.38.218"
 >=20
 > 	Then "ping 147.11.38.15"  fails.
 >=20
 > 	This is due to the "G" flag in that static route entry with the gateway
 > 	address being one of the interface addresses.
 >=20
 Yep, this corresponds to what you typed: gateway 147.11.38.218.
 
 >       During transmission the
 > 	route lookup on the gateway address will point the output interface
 > 	to the loopback interface.
 >=20
 Yes, gwroute will point to the 147.11.38.218 route which is thru lo0.
 
 > 	This route addition should be allowed as a place holder
 > 	to be filled in later, similar to of an entry with RTF_LLINFO flag.
 >=20
 I disagree.  In your ``route add'', you specified a gateway and you
 get what you requested.  What would be a purpose of adding such a
 route?  ARP can already do this for you by cloning from the network
 route, adding route with the gateway of some of the local addresses
 has its own purpose; e.g. one can put a divert(4) daemon listetning
 on lo0 that would get these packets.  Or:
 
 # ifconfig rl0 inet
 rl0: flags=3D8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
         inet 192.168.4.115 netmask 0xffffff00 broadcast 192.168.4.255
 # ifconfig rl0 192.168.4.201/32 alias
 # route delete 192.168.4.201/32
 delete net 192.168.4.201
 # route add 192.168.4.201 192.168.4.115
 add host 192.168.4.201: gateway 192.168.4.115
 # ping -c1 192.168.4.201
 PING 192.168.4.201 (192.168.4.201): 56 data bytes
 64 bytes from 192.168.4.201: icmp_seq=3D0 ttl=3D64 time=3D0.088 ms
 --- 192.168.4.201 ping statistics ---
 1 packets transmitted, 1 packets received, 0% packet loss
 round-trip min/avg/max/stddev =3D 0.088/0.088/0.088/0.000 ms
 #
 
 > 	I put in the fixes, here is what the routing table shows after the fix
 > 	using the same route command,
 >=20
 > 	=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > 	147.11.38.15       link#5      UHLS        0        3    xl0
 > 	=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 >=20
 It's possible to create such an entry (though a bit tricky) even without
 patching sys/net/route.c:
 
 route -vn add -host 147.11.38.15 -link : -ifp rl0 -iface
 
 > 	"ping 147.11.38.15" now succeeds, that route entry is modified to be
 >=20
 > 	=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > 	147.11.38.15       8:0:20:d1:64:c6    UHLS        0        3    xl0
 > 	=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 >=20
 > 	Similar problem exists in IPv6.
 > 	Unlike "ping", "ping6" returns -1 with an error message
 > 	of "No route to host".
 >=20
 >=20
 > >How-To-Repeat:
 >=20
 > 	Add a static route entry to a host that is directely reachable, set
 > 	the gateway value using the interface address.
 >=20
 > 	For IPv4
 > 	--------
 > 	Step 1: route add -host 147.11.38.15 147.11.38.218
 > 	Step 2: ping 147.11.38.15
 >=20
 > 	For IPv6
 > 	--------
 > 	Step 1: route add -host -inet6 fe80::2b0:d0ff:fe84:c8bc%xl0 -inet6 \
 > 					      fe80::2c0:4fff:fe8d:63b9%xl0
 > 	Step 2: ping6 fe80::2b0:d0ff:fe84:c8bc%xl0
 >=20
 > >Fix:
 >=20
 > 	/usr/src/net/route.c
 >=20
 > *** route.c     Mon Aug  5 17:33:39 2002
 > --- route.c.new Fri Aug  9 15:18:04 2002
 > ***************
 > *** 1006,1011 ****
 > --- 1006,1018 ----
 >                         rt->rt_gwroute =3D 0;
 >                         return EDQUOT; /* failure */
 >                 }
 > +                 if (rt->rt_gwroute->rt_ifp &&
 > +                     (rt->rt_gwroute->rt_ifp->if_flags & IFF_LOOPBACK))
 > +                 {
 > +                     rt->rt_gwroute =3D 0;
 
 This leaks.  You need to RTFREE() it first.
 
 > +                     rt->rt_flags &=3D ~RTF_GATEWAY;
 > +                     rt->rt_flags |=3D RTF_LLINFO;
 > +                 }
 >         }
 >=20
 >         /*
 >=20
 >=20
 > 	/usr/src/netinet/if_ether.c
 >=20
 > *** if_ether.c  Mon Aug  5 17:33:44 2002
 > --- if_ether.c.new      Fri Aug  9 15:15:50 2002
 > ***************
 > *** 188,194 ****
 >                 if ((rt->rt_flags & RTF_HOST) =3D=3D 0 &&
 >                     SIN(rt_mask(rt))->sin_addr.s_addr !=3D 0xffffffff)
 >                         rt->rt_flags |=3D RTF_CLONING;
 > !               if (rt->rt_flags & RTF_CLONING) {
 >                         /*
 >                          * Case 1: This route should come from a route to
 > iface.
 >                          */
 > --- 188,194 ----
 >                 if ((rt->rt_flags & RTF_HOST) =3D=3D 0 &&
 >                     SIN(rt_mask(rt))->sin_addr.s_addr !=3D 0xffffffff)
 >                         rt->rt_flags |=3D RTF_CLONING;
 > !               if (rt->rt_flags & (RTF_CLONING | RTF_LLINFO)) {
 >                         /*
 >                          * Case 1: This route should come from a route to
 > iface.
 >                          */
 
 I think this might make the ``route add'' I quoted above to do
 what you want, though I disagree with the change in principle.
 
 > ***************
 > *** 198,204 ****
 >                         SDL(gate)->sdl_type =3D rt->rt_ifp->if_type;
 >                         SDL(gate)->sdl_index =3D rt->rt_ifp->if_index;
 >                         rt->rt_expire =3D time_second;
 > !                       break;
 >                 }
 >                 /* Announce a new entry if requested. */
 >                 if (rt->rt_flags & RTF_ANNOUNCE)
 > --- 198,205 ----
 >                         SDL(gate)->sdl_type =3D rt->rt_ifp->if_type;
 >                         SDL(gate)->sdl_index =3D rt->rt_ifp->if_index;
 >                         rt->rt_expire =3D time_second;
 > !                         if (rt->rt_flags & RTF_CLONING)
 > !                           break;
 >                 }
 >                 /* Announce a new entry if requested. */
 >                 if (rt->rt_flags & RTF_ANNOUNCE)
 >=20
 >=20
 > 	/usr/src/netinet6/nd6.c
 >=20
 > *** nd6.c       Tue Apr 30 14:09:54 2002
 > --- nd6.c.new   Fri Aug  9 15:20:11 2002
 > ***************
 > *** 1227,1233 ****
 >                 Bzero(ln, sizeof(*ln));
 >                 ln->ln_rt =3D rt;
 >                 /* this is required for "ndp" command. - shin */
 > !               if (req =3D=3D RTM_ADD) {
 >                         /*
 >                          * gate should have some valid AF_LINK entry,
 >                          * and ln->ln_expire should have some lifetime
 > --- 1227,1233 ----
 >                 Bzero(ln, sizeof(*ln));
 >                 ln->ln_rt =3D rt;
 >                 /* this is required for "ndp" command. - shin */
 > !                 if ((req =3D=3D RTM_ADD) && !(rt->rt_flags & RTF_LLINFO=
 )) {
 >                         /*
 >                          * gate should have some valid AF_LINK entry,
 >                          * and ln->ln_expire should have some lifetime
 
 --=20
 Ruslan Ermilov		Sysadmin and DBA,
 ru@sunbay.com		Sunbay Software AG,
 ru@FreeBSD.org		FreeBSD committer,
 +380.652.512.251	Simferopol, Ukraine
 
 http://www.FreeBSD.org	The Power To Serve
 http://www.oracle.com	Enabling The Information Age
 
 --xJK8B5Wah2CMJs8h
 Content-Type: application/pgp-signature
 Content-Disposition: inline
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.0.7 (FreeBSD)
 
 iD8DBQE9WN8uUkv4P6juNwoRAl5UAJ0bYxz0Qi+yTebpgcJmBGE6lqsujgCaAtbr
 m2LslPsR/llwJkTFs0RwCgg=
 =WApY
 -----END PGP SIGNATURE-----
 
 --xJK8B5Wah2CMJs8h--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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