Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!ucbvax!ultra.UUCP!beau From: beau@ultra.UUCP (Beau James {Manager - SW Development - Ultra Networks}) Newsgroups: comp.protocols.tcp-ip Subject: BSD "routed" & gateways query Message-ID: <8909140228.AA19727@ultra.com> Date: 14 Sep 89 02:28:58 GMT Sender: daemon@ucbvax.BERKELEY.EDU Organization: The Internet Lines: 73 I'd appreciate any insight available from those who are more familiar with the internals of the BSD routing daemon than I. My questions are based on the 4.3BSD-tahoe network release sources, although the same problem occurs with the binary releases of SunOS though 4.0.3. The routing daemon provides the /etc/gateways file as a mechanism for declaring routes to host machines or networks via gateways that do not participate in the BSD routing protocol (passive gateways) or that can participate, but can't be located via broadcast (active gateways). Information about passive gateways is not redistributed by the routing daemon; active gateways are redistributed. Question 1: What is the benefit of hiding passive gateways from users on the "internal" net? The code comments that "internal machines should use the default route to a suitable gateway (like us)". But that means that the internal machines will forward ALL traffic to otherwise-unreachable nets to the gateway, not just traffic for nets that the gateway knows how to reach. The internal machines will never see ENETUNREACH; they will always have to wait for a timeout. As an aside, the BSD route daemon behaves this way and is documented this way. The Sun route daemon behaves this way, but is documented to distribute both the active and passive entries from the gateways file. Question 2: Why are all active gateways entered by the route daemon as paths to the default network (0.0.0.0)? This certainly seems like a bug. They should be entered as paths to the network cited in the /etc/gateways file. But the code initializes each active gateway entry of type "net" quite deliberately. In the routine "addrouteforif": if (ifp->int_flags & IFF_POINTOPOINT) dst = &ifp->int_dstaddr; else { bzero((char *)&net, sizeof (net)); net.sin_family = AF_INET; net.sin_addr = inet_makeaddr(ifp->int_subnet, INADDR_ANY); dst = (struct sockaddr *)&net; } rt = rtfind(dst); The gateway machine ends up with a route to the "default" network (0.0.0.0) for each active gateway in the /etc/gateways file, instead of a route to the network identified in the file. And it then propogates that bogus route to other machines on the net. Any BSD routing/network intimates out there who can explain what's supposed to be going on here, or explain which of these behaviors is a bug and how to fix it? Beau James beau@Ultra.COM Ultra Network Technologies, Inc. {sun,ames}!ultra!beau P.S. A further note: if an entry in the /etc/gateways file happens to unintentionally use the "host" keyword for a network, e.g. host Really-A-Net gateway Gateway-To-That-Net metric 1 active then the route daemon will interpret (and redistribute) that as a route to network 255.255.255.255, due to an untested possible error return in the routine "getnetorhostname".