summaryrefslogtreecommitdiffstats
path: root/source/n/netkit-routed/routed.18.candidate.final.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/n/netkit-routed/routed.18.candidate.final.patch')
-rw-r--r--source/n/netkit-routed/routed.18.candidate.final.patch704
1 files changed, 704 insertions, 0 deletions
diff --git a/source/n/netkit-routed/routed.18.candidate.final.patch b/source/n/netkit-routed/routed.18.candidate.final.patch
new file mode 100644
index 000000000..dc403bd7f
--- /dev/null
+++ b/source/n/netkit-routed/routed.18.candidate.final.patch
@@ -0,0 +1,704 @@
+diff -ru netkit-routed-0.17/ChangeLog netkit-routed-0.18/ChangeLog
+--- netkit-routed-0.17/ChangeLog Sun Jul 23 01:25:08 2000
++++ netkit-routed-0.18/ChangeLog Mon Dec 25 14:18:04 2000
+@@ -1,3 +1,25 @@
++25-Dec-2000:
++ Bug fix - on newer kernels, don't attempt to add direct
++ interface-routes to KRT - assume they're always present.
++ Bug fix - corrected handling of direct interface-routes
++ in rtioctl(): use rt.rt_dev entry instead of rt.rt_gateway
++ for these (was old BSDism).
++ Bug fix - do not add routes to remote subnets with netmask
++ set to 255.255.255.255, when pointopoint interfaces whose
++ IP belongs to the same network class as IP of another
++ non-pointopoint interface, are in use.
++ Feature change - do not "timeout" interface-routes even if we
++ act as route supplier.
++ Feature change - removed arbitrary limit on number of interfaces
++ that routed can look up in rtinit().
++ New feature - introduced "announced" type of distant gateways
++ for use in "gateways" file.
++ New feature - introduced command-line flag "-p" to ignore
++ all interfaces with IFF_POINTOPOINT set.
++ New feature - introduced command-line flag "-i <dev>" to ignore
++ given network interface <dev>.
++ Routed manpage upgraded accordingly. (Jan Rafaj, rafaj@vabo.cz)
++
+ 22-Jul-2000:
+ Allow appending to an existing log file, as long as it's in
+ the log directory. Also some cosmetic fixes. (Dennis Reichel,
+diff -ru netkit-routed-0.17/README netkit-routed-0.18/README
+--- netkit-routed-0.17/README Mon Jul 31 01:53:25 2000
++++ netkit-routed-0.18/README Mon Dec 25 14:20:54 2000
+@@ -1,6 +1,6 @@
+-This is netkit-routed-0.17 for Linux.
++This is netkit-routed-0.18 for Linux.
+
+-This package updates netkit-routed-0.16.
++This package updates netkit-routed-0.17.
+
+ If you're reading this off a CD, go right away and check the net
+ archives for later versions and security fixes. As of this writing the
+@@ -16,7 +16,7 @@
+
+ Security:
+ This release contains no security fixes relative to
+- netkit-routed-0.16. However, netkit-routed-0.10 and older are
++ netkit-routed-0.17. However, netkit-routed-0.10 and older are
+ insecure and should not be used.
+
+ Installation:
+--- netkit-routed-0.17/routed/defs.h Sun Aug 1 21:19:16 1999
++++ netkit-routed-0.18/routed/defs.h Mon Dec 25 14:56:55 2000
+@@ -32,7 +32,7 @@
+ *
+ * from: @(#)defs.h 5.10 (Berkeley) 2/28/91
+ * from: @(#)defs.h 8.1 (Berkeley) 6/5/93
+- * $Id: defs.h,v 1.9 1999/08/01 19:19:16 dholland Exp $
++ * $Id: defs.h,v 1.10 2000/12/25 14:56:55 jr Exp $
+ */
+
+ /*
+@@ -76,7 +76,9 @@
+
+ extern int sock; /* source and sink of all data */
+ extern int supplier; /* process should supply updates */
++extern int ignoreptp; /* whether to ignore PTP devices */
+ extern int lookforinterfaces; /* if 1 probe kernel for new up interfaces */
++extern struct iflist igniflist; /* holds info about ignored devices */
+ extern struct timeval now; /* current idea of time */
+ extern struct timeval lastbcast; /* last time all/changes broadcast */
+ extern struct timeval lastfullupdate; /* last time full table broadcast */
+@@ -103,6 +105,7 @@
+ int inet_rtflags(struct sockaddr *);
+ int inet_sendroute(struct rt_entry *, struct sockaddr *);
+ void quit(char *);
++int is_ignored(char *);
+ void rip_input(struct sockaddr *, struct rip *, int);
+ void rtadd(struct sockaddr *, struct sockaddr *, int, int);
+ void rtchange(struct rt_entry *, struct sockaddr *, short);
+diff -ru netkit-routed-0.17/routed/inet.c netkit-routed-0.18/routed/inet.c
+--- netkit-routed-0.17/routed/inet.c Sun Apr 6 00:26:22 1997
++++ netkit-routed-0.18/routed/inet.c Mon Dec 25 14:01:30 2000
+@@ -36,7 +36,7 @@
+ * From: @(#)inet.c 8.2 (Berkeley) 8/14/93
+ */
+ char inet_rcsid[] =
+- "$Id: inet.c,v 1.5 1997/04/05 22:26:22 dholland Exp $";
++ "$Id: inet.c,v 1.6 2000/12/25 14:01:30 jr Exp $";
+
+
+ /*
+@@ -123,9 +123,12 @@
+ * Check whether network is a subnet;
+ * if so, use the modified interpretation of `host'.
+ */
+- for (ifp = ifnet; ifp; ifp = ifp->int_next)
++ for (ifp = ifnet; ifp; ifp = ifp->int_next) {
++ if (ifp->int_flags & IFF_POINTOPOINT)
++ continue;
+ if ((ifp->int_netmask & i) == ifp->int_net)
+ mask = ifp->int_subnetmask;
++ }
+ return (htonl(mask));
+ }
+
+diff -ru netkit-routed-0.17/routed/interface.h netkit-routed-0.18/routed/interface.h
+--- netkit-routed-0.17/routed/interface.h Sun Apr 6 00:26:22 1997
++++ netkit-routed-0.18/routed/interface.h Fri Dec 22 19:43:08 2000
+@@ -32,12 +32,20 @@
+ *
+ * From: @(#)interface.h 5.6 (Berkeley) 6/1/90
+ * From: @(#)interface.h 8.1 (Berkeley) 6/5/93
+- * $Id: interface.h,v 1.7 1997/04/05 22:26:22 dholland Exp $
++ * $Id: interface.h,v 1.8 2000/12/22 19:43:08 jr Exp $
+ */
+
+ /*
+ * Routing table management daemon.
+ */
++
++/*
++ * iflist describes array of ignored interface names
++ */
++struct iflist {
++ u_long length;
++ char *array;
++};
+
+ /*
+ * An ``interface'' is similar to an ifnet structure,
+diff -ru netkit-routed-0.17/routed/main.c netkit-routed-0.18/routed/main.c
+--- netkit-routed-0.17/routed/main.c Thu Jan 6 00:16:12 2000
++++ netkit-routed-0.18/routed/main.c Sat Dec 23 18:07:39 2000
+@@ -40,7 +40,7 @@
+ * From: @(#)main.c 8.1 (Berkeley) 6/5/93
+ */
+ char main_rcsid[] =
+- "$Id: main.c,v 1.16 2000/01/05 23:16:12 dholland Exp $";
++ "$Id: main.c,v 1.17 2000/12/23 18:07:39 jr Exp $";
+
+ #include "../version.h"
+
+@@ -68,12 +68,15 @@
+ int supplier = -1; /* process should supply updates */
+ int gateway = 0; /* 1 if we are a gateway to parts beyond */
+ int debug = 0;
++int ignoreptp = 0;
++struct iflist igniflist;
+ struct rip *msg = (struct rip *)packet;
+ int kernel_version;
+
+ static void getkversion(void);
+ static int getsocket(void);
+ static void process(int);
++void addignoredif(char *);
+
+ int
+ main(int argc, char *argv[])
+@@ -84,8 +87,9 @@
+ struct rip *query = msg;
+ fd_set ibits;
+ sigset_t sigset, osigset;
+-
+- while ((ch = getopt(argc, argv, "sqtdg")) != EOF) {
++
++ memset(&igniflist, 0, sizeof(struct iflist));
++ while ((ch = getopt(argc, argv, "sqtdgpi:")) != EOF) {
+ switch (ch) {
+ case 's': supplier = 1; break;
+ case 'q': supplier = 0; break;
+@@ -97,8 +101,12 @@
+ setlogmask(LOG_UPTO(LOG_DEBUG));
+ break;
+ case 'g': gateway = 1; break;
++ case 'p': ignoreptp = 1; break;
++ case 'i':
++ addignoredif(optarg);
++ break;
+ default:
+- fprintf(stderr, "usage: routed [ -sqtdg ]\n");
++ fprintf(stderr, "usage: routed [ -sqtdgp ] [ -i device ]\n");
+ exit(1);
+ }
+ }
+@@ -397,3 +405,27 @@
+
+ return (s);
+ }
++
++/*
++ * Add single interface name to the list of ignored interface names.
++ */
++void
++addignoredif(char *ifn)
++{
++ char *ifl = NULL;
++
++ /* avoiding realloc() */
++ ifl = calloc(1, igniflist.length * IFNAMSIZ + IFNAMSIZ);
++ if (ifl == NULL) {
++ syslog(LOG_ERR, "routed: addignoredif: out of memory\n");
++ return;
++ }
++ memcpy(ifl, igniflist.array, igniflist.length * IFNAMSIZ);
++ memcpy(ifl + igniflist.length++ * IFNAMSIZ,
++ ifn,
++ strlen(ifn) >= IFNAMSIZ ? IFNAMSIZ - 1 : strlen (ifn));
++ if (igniflist.array != NULL)
++ free(igniflist.array);
++ igniflist.array = ifl;
++}
++
+diff -ru netkit-routed-0.17/routed/routed.8 netkit-routed-0.18/routed/routed.8
+--- netkit-routed-0.17/routed/routed.8 Mon Jul 31 01:57:03 2000
++++ netkit-routed-0.18/routed/routed.8 Mon Dec 25 14:36:27 2000
+@@ -32,11 +32,11 @@
+ .\" From: @(#)routed.8 6.6 (Berkeley) 3/16/91
+ .\" From: @(#)routed.8 8.2 (Berkeley) 12/11/93
+ .\" From: NetBSD: routed.8,v 1.6 1995/03/18 15:00:38 cgd Exp
+-.\" $Id: routed.8,v 1.15 2000/07/30 23:57:03 dholland Exp $
++.\" $Id: routed.8,v 1.16 2000/12/25 14:36:27 jr Exp $
+ .\"
+ .Dd December 11, 1993
+ .Dt ROUTED 8
+-.Os "Linux NetKit (0.17)"
++.Os "Linux NetKit (0.18)"
+ .Sh NAME
+ .Nm routed
+ .Nd network routing daemon
+@@ -44,9 +44,11 @@
+ .Nm routed
+ .Op Fl d
+ .Op Fl g
+-.Op Fl q
+ .Op Fl s
++.Op Fl q
+ .Op Fl t
++.Op Fl p
++.Op Fl i Nm device
+ .Op Ar logfile
+ .Sh DESCRIPTION
+ .Nm Routed
+@@ -177,8 +179,8 @@
+ Supplying this
+ option forces
+ .Nm routed
+-to supply routing information whether it is acting as an internetwork
+-router or not.
++to supply routing information that it is acting as an internetwork
++router.
+ This is the default if multiple network interfaces are present,
+ or if a point-to-point link is in use.
+ .It Fl q
+@@ -194,23 +196,59 @@
+ .Nm routed
+ will not divorce itself from the controlling terminal
+ so that interrupts from the keyboard will kill the process.
++.It Fl p
++this option forces
++.Nm routed
++to ignore existence of all point-to-point network interfaces.
++.Nm Routed
++wont send nor receive routing updates through these interfaces
++and also wont propagate corresponding routes to remote endpoints directly
++reachable through them. Sometimes it is not desirable to send/receive
++routing information about routes through such interfaces, for example
++when point-to-point link with proxy-arp is in use.
++.It Fl i Nm dev
++this option forces
++.Nm routed
++to ignore existence of a specified network interface
++.Nm dev .
++Similarly to
++.Fl p
++flag, routed wont send nor receive routing updates through
++.Nm dev ,
++nor it will advertise direct routes via such interface.
+ .El
+ .Pp
+-Any other argument supplied is interpreted as the name
++Any other argument supplied is interpreted as the full path to and name
+ of file in which
+ .Nm routed Ns \'s
+ actions should be logged. This log contains information
+ about any changes to the routing tables and, if not tracing all packets,
+ a history of recent messages sent and received which are related to
+ the changed route.
++With first event to be logged,
++.Nm routed
++will create log file in "/var/log/routed" directory (which has to
++exist and be readable/writeable only by root). For security reasons,
++this argument has to begin with "/var/log/routed", as
++.Nm routed
++itself does not perform other security checks towards validity of the
++remote traceon/traceoff requests it may receive. Unless
++for debugging purposes, it is strongly recommended that the logging
++path itself does not exist nor is specified as
++.Nm routed
++parameter at all.
+ .Pp
+ In addition to the facilities described above,
+ .Nm routed
+ supports the notion of ``distant''
+ .Em passive
+-and
++,
+ .Em active
+-gateways. When
++,
++.Em external
++and
++.Em announced
++gateway types. When
+ .Nm routed
+ is started up, it reads the file
+ .Pa /etc/gateways
+@@ -225,27 +263,51 @@
+ they should have a
+ .Nm routed
+ process running on the machine).
+-Routes through passive gateways are installed in the
+-kernel's routing tables once upon startup.
+-Such routes are not included in
+-any routing information transmitted.
+-Active gateways are treated equally to network
++.Pp
++Routes through
++.Nm passive
++gateways are installed in the
++kernel's routing tables by
++.Nm routed
++once upon its startup. Such routes are not included
++in any routing information transmitted.
++.Pp
++.Nm Active
++gateways are treated equally to network
+ interfaces. Routing information is distributed
+-to the gateway and if no routing information is
+-received for a period of time, the associated
+-route is deleted.
++to the gateway and
++.Nm routed
++listens for updates on the interface that the gateway is
++reachable through.
++.Pp
+ Gateways marked
+-.Em external
++.Nm external
+ are also passive, but are not placed in the kernel
+ routing table nor are they included in routing updates.
+-The function of external entries is to inform
++The function of
++.Nm external
++entries is to inform
+ .Nm routed
+ that another routing process
+-will install such a route, and that alternate routes to that destination
+-should not be installed.
++will install such a route, so that it should not install
++alternate routes to that destination.
+ Such entries are only required when both routers may learn of routes
+ to the same destination.
+ .Pp
++Routes to networks through gateways marked as
++.Nm announced
++will be included in each routing advertisement, but won't be installed
++in the kernel routing table. This kind of entries is only required
++for the gateways that are directly reachable, but are unable
++to announce their routes, so that the rest of the RIP1 protocol-equipped
++network will know about such routes too. Entries of
++.Nm announced
++type can also be used to announce direct routes for own interfaces, that
++didn't exist at the time when
++.Nm routed
++has been started, but can be expected to come up later
++(such as routes for point-to-point interfaces).
++.Pp
+ The
+ .Pa /etc/gateways
+ is comprised of a series of lines, each in
+@@ -260,7 +322,8 @@
+ .Ar value
+ .Pf < Cm passive No \&|
+ .Cm active No \&|
+-.Cm external Ns >
++.Cm external No \&|
++.Cm announced Ns >
+ .Ed
+ .Pp
+ The
+@@ -291,25 +354,28 @@
+ .Pp
+ One of the keywords
+ .Cm passive ,
+-.Cm active
+-or
++.Cm active ,
+ .Cm external
++or
++.Cm announced
+ indicates if the gateway should be treated as
+ .Em passive
+ or
+ .Em active
+ (as described above),
+-or whether the gateway is
++whether the gateway is
+ .Em external
+ to the scope of the
+ .Nm routed
+-protocol.
++protocol, or whether
++the route reachable via such gateway should
++be included in the routing table announcements.
+ .Pp
+ Internetwork routers that are directly attached to the Arpanet or Milnet
+ should use the Exterior Gateway Protocol
+ .Pq Tn EGP
+ to gather routing information
+-rather then using a static routing table of passive gateways.
++rather than using a static routing table of passive gateways.
+ .Tn EGP
+ is required in order to provide routes for local networks to the rest
+ of the Internet system.
+@@ -320,15 +386,17 @@
+ .El
+ .Sh SEE ALSO
+ .Xr udp 7 ,
+-.Xr icmp 7
++.Xr icmp 7 .
+ .Rs
+ .%T Internet Transport Protocols
+ .%R XSIS 028112
+ .%Q Xerox System Integration Standard
+ .Re
+ .Sh BUGS
+-.Nm routed
+-is of dubious value. Consider using
++.Pp
++.Nm Routed
++is heavily 32bit architecture dependant. You should eventually
++consider using
+ .Xr gated 8
+ or
+ .Xr zebra 8 .
+@@ -341,6 +409,11 @@
+ the
+ .Tn ICMP
+ packets received via a raw socket.
++.Pp
++.Nm Routed
++also doesn't notice of any new interface, that didn't exist prior to
++its start, but has newly appeared and come to ``up'' state after
++routed has been started, and won't announce route for such interface.
+ .Pp
+ .Nm Routed
+ should incorporate other routing protocols.
+diff -ru netkit-routed-0.17/routed/startup.c netkit-routed-0.18/routed/startup.c
+--- netkit-routed-0.17/routed/startup.c Sun Dec 12 20:06:02 1999
++++ netkit-routed-0.18/routed/startup.c Mon Dec 25 14:32:34 2000
+@@ -36,7 +36,7 @@
+ * From: @(#)startup.c 8.1 (Berkeley) 6/5/93
+ */
+ char startup_rcsid[] =
+- "$Id: startup.c,v 1.10 1999/12/12 19:06:02 dholland Exp $";
++ "$Id: startup.c,v 1.11 2000/12/25 14:32:34 jr Exp $";
+
+
+ /*
+@@ -73,6 +73,17 @@
+ exit(1);
+ }
+
++int is_ignored(char *ifname)
++{
++ u_long i;
++
++ for (i = 0; i < igniflist.length; i++)
++ if (!(strcmp(ifname, igniflist.array + i * IFNAMSIZ)) )
++ return (1);
++
++ return (0);
++}
++
+ #define ROUNDUP(a) \
+ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
+ #define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
+@@ -87,8 +98,8 @@
+ void ifinit(void)
+ {
+ struct interface ifs, *ifp;
+- int s;
+- char buf[BUFSIZ], *cp, *cplim;
++ int s, maxifaces = 16;
++ char *cp;
+ struct ifconf ifc;
+ struct ifreq ifreq, *ifr;
+ struct sockaddr_in *sin;
+@@ -99,18 +110,26 @@
+ close(s);
+ return;
+ }
+- ifc.ifc_len = sizeof (buf);
+- ifc.ifc_buf = buf;
+- if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {
+- syslog(LOG_ERR, "ioctl (get interface configuration)");
+- close(s);
+- return;
++ for (;;) {
++ ifc.ifc_len = sizeof(struct ifreq) * maxifaces;
++ ifc.ifc_buf = malloc(ifc.ifc_len);
++ if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {
++ syslog(LOG_ERR, "ioctl (get interface configuration)");
++ return;
++ }
++ /*
++ * Assume overflow (more interfaces). Increase size/repeat.
++ */
++ if (ifc.ifc_len == (int) sizeof(struct ifreq) * maxifaces) {
++ maxifaces += 16;
++ free(ifc.ifc_buf);
++ continue;
++ }
++ break;
+ }
+- ifr = ifc.ifc_req;
+ lookforinterfaces = 0;
+- cplim = buf + ifc.ifc_len; /*skip over if's with big ifr_addr's */
+- for (cp = buf; cp < cplim;
+- cp += sizeof (ifr->ifr_name) + sizeof(ifr->ifr_ifru)) {
++ for (cp = ifc.ifc_buf; cp < (ifc.ifc_buf + ifc.ifc_len);
++ cp += sizeof(struct ifreq)) {
+ ifr = (struct ifreq *)cp;
+ bzero((char *)&ifs, sizeof(ifs));
+ ifs.int_addr = ifr->ifr_addr;
+@@ -130,7 +149,11 @@
+ /* argh, this'll have to change sometime */
+ if (ifs.int_addr.sa_family != AF_INET)
+ continue;
++ if (is_ignored(ifr->ifr_name))
++ continue;
+ if (ifs.int_flags & IFF_POINTOPOINT) {
++ if (ignoreptp)
++ continue;
+ if (ioctl(s, SIOCGIFDSTADDR, (char *)&ifreq) < 0) {
+ syslog(LOG_ERR, "%s: ioctl (get dstaddr)",
+ ifr->ifr_name);
+@@ -230,11 +253,10 @@
+ if ((ifs.int_flags & IFF_POINTOPOINT) && supplier < 0)
+ supplier = 1;
+ ifp->int_name = malloc(strlen(ifr->ifr_name) + 1);
+- if (ifp->int_name == 0) {
++ if (ifp->int_name == NULL) {
+ fprintf(stderr, "routed: ifinit: out of memory\n");
+ syslog(LOG_ERR, "routed: ifinit: out of memory\n");
+- close(s);
+- return;
++ goto escape;
+ }
+ strcpy(ifp->int_name, ifr->ifr_name);
+ *ifnext = ifp;
+@@ -244,7 +266,10 @@
+ }
+ if (externalinterfaces > 1 && supplier < 0)
+ supplier = 1;
++escape:
++ free(ifc.ifc_buf);
+ close(s);
++ return;
+ }
+
+ /*
+@@ -353,9 +378,9 @@
+ * at the hardware level). If a gateway is marked ``passive''
+ * in the file, then we assume it doesn't have a routing process
+ * of our design and simply assume it's always present. Those
+- * not marked passive are treated as if they were directly
+- * connected -- they're added into the interface list so we'll
+- * send them routing updates.
++ * not marked passive, external nor announced are treated as if they
++ * were directly connected -- they're added into the interface list
++ * so we'll send them routing updates.
+ *
+ * PASSIVE ENTRIES AREN'T NEEDED OR USED ON GATEWAYS RUNNING EGP.
+ */
+@@ -379,7 +404,10 @@
+ memset(&dst, 0, sizeof (dst));
+ memset(&gate, 0, sizeof (gate));
+ memset(&route, 0, sizeof(route));
+-/* format: {net | host} XX gateway XX metric DD [passive | external]\n */
++ /*
++ * format:
++ * {net | host} XX gateway XX metric DD [passive | external | announced]
++ */
+ #define readentry(fp) \
+ fscanf((fp), "%s %s gateway %s metric %d %s\n", \
+ type, dname, gname, &metric, qual)
+@@ -432,6 +460,21 @@
+ rtadd((struct sockaddr *)&dst,
+ (struct sockaddr *)&gate, metric,
+ RTS_EXTERNAL|RTS_PASSIVE);
++ continue;
++ }
++ if (strcmp(qual, "announced") == 0) {
++ /*
++ * Entries marked "announced" are added
++ * into our internal tables and advertised,
++ * but not added to the kernel routing table.
++ * This allows sort of route "injection" to RIP1
++ * network for routes through directly reachable
++ * gateways that arent capable of RIP1 advertising
++ * themselves.
++ */
++ rtadd((struct sockaddr *)&dst,
++ (struct sockaddr *)&gate, metric,
++ RTS_CHANGED|RTS_PASSIVE|RTS_INTERNAL);
+ continue;
+ }
+ /* assume no duplicate entries */
+diff -ru netkit-routed-0.17/routed/tables.c netkit-routed-0.18/routed/tables.c
+--- netkit-routed-0.17/routed/tables.c Sat Oct 2 18:36:39 1999
++++ netkit-routed-0.18/routed/tables.c Mon Dec 25 14:41:54 2000
+@@ -36,7 +36,7 @@
+ * From: @(#)tables.c 8.1 (Berkeley) 6/5/93
+ */
+ char tables_rcsid[] =
+- "$Id: tables.c,v 1.12 1999/10/02 16:36:39 dholland Exp $";
++ "$Id: tables.c,v 1.13 2000/12/25 14:41:54 jr Exp $";
+
+
+ /*
+@@ -365,10 +365,34 @@
+
+ rt.rt_flags = (ort->rtu_flags & (RTF_UP|RTF_GATEWAY|RTF_HOST));
+ rt.rt_metric = ort->rtu_metric;
+- rt.rt_dev = NULL;
+- rt.rt_dst = *(struct sockaddr *)&ort->rtu_dst;
++ /*
++ * SIOCADDRT ioctl in linux kernels v. 2.1.15 and up will no longer
++ * add direct route to subnet/host through interface, even if the
++ * specified gateway's IP is the same as IP of that interface (BSDism).
++ * -- if this is the case, assure that no matter what kernel we use,
++ * the subnet route to directly attached network is always added
++ * to KRT as direct one.
++ */
++ if (rt.rt_flags & RTF_GATEWAY) {
++ rt.rt_dev = NULL;
++ rt.rt_gateway = *(struct sockaddr *)&ort->rtu_router;
++ } else {
++ rt.rt_dev = ort->rtu_ifp->int_name;
++ /*
++ * We could add a direct route to the KRT this way
++ * on whatever kernel, but kernels v. 2.1.15 and up
++ * add such route immediately as soon as the interface
++ * is labelled with IFF_UP. However, the resulting route
++ * would be added twice, since kernel distinguishes
++ * between direct route it added itself and the one
++ * added explicitly by SIOCADDRT ioctl. So instead,
++ * we safely exit with "route successfully added" sign, here.
++ */
++ if (kernel_version >= 0x02010f)
++ return 0;
++ }
++ rt.rt_dst = *(struct sockaddr *)&ort->rtu_dst;
+ dst = ((struct sockaddr_in *)&rt.rt_dst)->sin_addr.s_addr;
+- rt.rt_gateway = *(struct sockaddr *)&ort->rtu_router;
+ if (rt.rt_flags & RTF_HOST)
+ netmask = 0xffffffff;
+ else
+diff -ru netkit-routed-0.17/routed/timer.c netkit-routed-0.18/routed/timer.c
+--- netkit-routed-0.17/routed/timer.c Mon Aug 2 00:39:59 1999
++++ netkit-routed-0.18/routed/timer.c Mon Dec 25 14:43:05 2000
+@@ -36,7 +36,7 @@
+ * From: @(#)timer.c 8.1 (Berkeley) 6/5/93
+ */
+ char timer_rcsid[] =
+- "$Id: timer.c,v 1.7 1999/08/01 22:39:59 dholland Exp $";
++ "$Id: timer.c,v 1.8 2000/12/25 14:43:05 jr Exp $";
+
+
+ /*
+@@ -73,11 +73,9 @@
+ for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
+ /*
+ * We don't advance time on a routing entry for
+- * a passive gateway, or any interface if we're
+- * not acting as supplier.
++ * a passive gateway or interface.
+ */
+- if (!(rt->rt_state & RTS_PASSIVE) &&
+- (supplier || !(rt->rt_state & RTS_INTERFACE)))
++ if ((rt->rt_state & (RTS_PASSIVE|RTS_INTERFACE)) == 0)
+ rt->rt_timer += TIMER_RATE;
+ if (rt->rt_timer >= GARBAGE_TIME) {
+ rt = rt->rt_back;
+diff -ru netkit-routed-0.17/version.h netkit-routed-0.18/version.h
+--- netkit-routed-0.17/version.h Mon Jul 31 01:57:02 2000
++++ netkit-routed-0.18/version.h Mon Dec 25 14:19:29 2000
+@@ -2,4 +2,4 @@
+ * String to embed in binaries to identify package
+ */
+
+-char pkg[]="$NetKit: netkit-routed-0.17 $";
++char pkg[]="$NetKit: netkit-routed-0.18 $";