diff options
author | wollman <wollman@FreeBSD.org> | 1996-07-18 21:15:05 +0000 |
---|---|---|
committer | wollman <wollman@FreeBSD.org> | 1996-07-18 21:15:05 +0000 |
commit | 5bb50caa51fe4d82dbe45be6593a29adafbe27bc (patch) | |
tree | 9084023769e58c47f6dccd44e6a5c824ddeaf413 /usr.sbin | |
parent | 81a254ffb340d676c395c2607a726dc71785edfc (diff) | |
download | FreeBSD-src-5bb50caa51fe4d82dbe45be6593a29adafbe27bc.zip FreeBSD-src-5bb50caa51fe4d82dbe45be6593a29adafbe27bc.tar.gz |
These old files are no longer relevant to the current routed
implementation.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/routed/af.c | 171 | ||||
-rw-r--r-- | usr.sbin/routed/af.h | 65 | ||||
-rw-r--r-- | usr.sbin/routed/inet.c | 243 | ||||
-rw-r--r-- | usr.sbin/routed/interface.h | 90 | ||||
-rw-r--r-- | usr.sbin/routed/startup.c | 515 | ||||
-rw-r--r-- | usr.sbin/routed/tables.c | 428 | ||||
-rw-r--r-- | usr.sbin/routed/timer.c | 127 |
7 files changed, 0 insertions, 1639 deletions
diff --git a/usr.sbin/routed/af.c b/usr.sbin/routed/af.c deleted file mode 100644 index b78f771..0000000 --- a/usr.sbin/routed/af.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)af.c 8.1 (Berkeley) 6/5/93"; -#endif /* not lint */ - -#include "defs.h" - -/* - * Address family support routines - */ -int inet_hash(), inet_netmatch(), inet_output(), - inet_portmatch(), inet_portcheck(), - inet_checkhost(), inet_rtflags(), inet_sendroute(), inet_canon(); -char *inet_format(); - -#define NIL { 0 } -#define INET \ - { inet_hash, inet_netmatch, inet_output, \ - inet_portmatch, inet_portcheck, inet_checkhost, \ - inet_rtflags, inet_sendroute, inet_canon, \ - inet_format \ - } - -struct afswitch afswitch[AF_MAX] = { - NIL, /* 0- unused */ - NIL, /* 1- Unix domain, unused */ - INET, /* Internet */ -}; - -int af_max = sizeof(afswitch) / sizeof(afswitch[0]); - -struct sockaddr_in inet_default = { -#ifdef RTM_ADD - sizeof (inet_default), -#endif - AF_INET, INADDR_ANY }; - -inet_hash(sin, hp) - register struct sockaddr_in *sin; - struct afhash *hp; -{ - register u_long n; - - n = inet_netof(sin->sin_addr); - if (n) - while ((n & 0xff) == 0) - n >>= 8; - hp->afh_nethash = n; - hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); - hp->afh_hosthash &= 0x7fffffff; -} - -inet_netmatch(sin1, sin2) - struct sockaddr_in *sin1, *sin2; -{ - - return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr)); -} - -/* - * Verify the message is from the right port. - */ -inet_portmatch(sin) - register struct sockaddr_in *sin; -{ - - return (sin->sin_port == sp->s_port); -} - -/* - * Verify the message is from a "trusted" port. - */ -inet_portcheck(sin) - struct sockaddr_in *sin; -{ - - return (ntohs(sin->sin_port) <= IPPORT_RESERVED); -} - -/* - * Internet output routine. - */ -inet_output(s, flags, sin, size) - int s, flags; - struct sockaddr_in *sin; - int size; -{ - struct sockaddr_in dst; - - dst = *sin; - sin = &dst; - if (sin->sin_port == 0) - sin->sin_port = sp->s_port; - if (sin->sin_len == 0) - sin->sin_len = sizeof (*sin); - if (sendto(s, packet, size, flags, - (struct sockaddr *)sin, sizeof (*sin)) < 0) - perror("sendto"); -} - -/* - * Return 1 if the address is believed - * for an Internet host -- THIS IS A KLUDGE. - */ -inet_checkhost(sin) - struct sockaddr_in *sin; -{ - u_long i = ntohl(sin->sin_addr.s_addr); - -#ifndef IN_EXPERIMENTAL -#define IN_EXPERIMENTAL(i) (((long) (i) & 0xe0000000) == 0xe0000000) -#endif - - if (IN_EXPERIMENTAL(i) || sin->sin_port != 0) - return (0); - if (i != 0 && (i & 0xff000000) == 0) - return (0); - for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++) - if (sin->sin_zero[i]) - return (0); - return (1); -} - -inet_canon(sin) - struct sockaddr_in *sin; -{ - - sin->sin_port = 0; - sin->sin_len = sizeof(*sin); -} - -char * -inet_format(sin) - struct sockaddr_in *sin; -{ - char *inet_ntoa(); - - return (inet_ntoa(sin->sin_addr)); -} diff --git a/usr.sbin/routed/af.h b/usr.sbin/routed/af.h deleted file mode 100644 index 2fff298..0000000 --- a/usr.sbin/routed/af.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)af.h 8.1 (Berkeley) 6/5/93 - */ - -/* - * Routing table management daemon. - */ - -/* - * Per address family routines. - */ -struct afswitch { - int (*af_hash)(); /* returns keys based on address */ - int (*af_netmatch)(); /* verifies net # matching */ - int (*af_output)(); /* interprets address for sending */ - int (*af_portmatch)(); /* packet from some other router? */ - int (*af_portcheck)(); /* packet from privileged peer? */ - int (*af_checkhost)(); /* tells if address is valid */ - int (*af_rtflags)(); /* get flags for route (host or net) */ - int (*af_sendroute)(); /* check bounds of subnet broadcast */ - int (*af_canon)(); /* canonicalize address for compares */ - char *(*af_format)(); /* convert address to string */ -}; - -/* - * Structure returned by af_hash routines. - */ -struct afhash { - u_int afh_hosthash; /* host based hash */ - u_int afh_nethash; /* network based hash */ -}; - -extern struct afswitch afswitch[]; /* table proper */ -extern int af_max; /* number of entries in table */ diff --git a/usr.sbin/routed/inet.c b/usr.sbin/routed/inet.c deleted file mode 100644 index 9b1c9fd..0000000 --- a/usr.sbin/routed/inet.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)inet.c 8.2 (Berkeley) 8/14/93"; -#endif /* not lint */ - -/* - * Temporarily, copy these routines from the kernel, - * as we need to know about subnets. - */ -#include "defs.h" - -extern struct interface *ifnet; - -/* - * Formulate an Internet address from network + host. - */ -struct in_addr -inet_makeaddr(net, host) - u_long net, host; -{ - register struct interface *ifp; - register u_long mask; - u_long addr; - - if (IN_CLASSA(net)) - mask = IN_CLASSA_HOST; - else if (IN_CLASSB(net)) - mask = IN_CLASSB_HOST; - else - mask = IN_CLASSC_HOST; - for (ifp = ifnet; ifp; ifp = ifp->int_next) - if ((ifp->int_netmask & net) == ifp->int_net) { - mask = ~ifp->int_subnetmask; - break; - } - addr = net | (host & mask); - addr = htonl(addr); - return (*(struct in_addr *)&addr); -} - -/* - * Return the network number from an internet address. - */ -inet_netof(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - register u_long net; - register struct interface *ifp; - - if (IN_CLASSA(i)) - net = i & IN_CLASSA_NET; - else if (IN_CLASSB(i)) - net = i & IN_CLASSB_NET; - else - net = i & IN_CLASSC_NET; - - /* - * Check whether network is a subnet; - * if so, return subnet number. - */ - for (ifp = ifnet; ifp; ifp = ifp->int_next) - if ((ifp->int_netmask & net) == ifp->int_net) - return (i & ifp->int_subnetmask); - return (net); -} - -/* - * Return the host portion of an internet address. - */ -inet_lnaof(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - register u_long net, host; - register struct interface *ifp; - - if (IN_CLASSA(i)) { - net = i & IN_CLASSA_NET; - host = i & IN_CLASSA_HOST; - } else if (IN_CLASSB(i)) { - net = i & IN_CLASSB_NET; - host = i & IN_CLASSB_HOST; - } else { - net = i & IN_CLASSC_NET; - host = i & IN_CLASSC_HOST; - } - - /* - * Check whether network is a subnet; - * if so, use the modified interpretation of `host'. - */ - for (ifp = ifnet; ifp; ifp = ifp->int_next) - if ((ifp->int_netmask & net) == ifp->int_net) - return (host &~ ifp->int_subnetmask); - return (host); -} - -/* - * Return the netmask pertaining to an internet address. - */ -inet_maskof(inaddr) - u_long inaddr; -{ - register u_long i = ntohl(inaddr); - register u_long mask; - register struct interface *ifp; - - if (i == 0) { - mask = 0; - } else if (IN_CLASSA(i)) { - mask = IN_CLASSA_NET; - } else if (IN_CLASSB(i)) { - mask = IN_CLASSB_NET; - } else - mask = IN_CLASSC_NET; - - /* - * Check whether network is subnetted; - * if so, use the subnet's netmask. - */ - for (ifp = ifnet; ifp; ifp = ifp->int_next) - if ((ifp->int_netmask & i) == ifp->int_net) - mask = ifp->int_subnetmask; - return (htonl(mask)); -} - -/* - * Return RTF_HOST if the address is - * for an Internet host, RTF_SUBNET for a subnet, - * 0 for a network. - */ -inet_rtflags(sin) - struct sockaddr_in *sin; -{ - register u_long i = ntohl(sin->sin_addr.s_addr); - register u_long net, host; - register struct interface *ifp; - - if (IN_CLASSA(i)) { - net = i & IN_CLASSA_NET; - host = i & IN_CLASSA_HOST; - } else if (IN_CLASSB(i)) { - net = i & IN_CLASSB_NET; - host = i & IN_CLASSB_HOST; - } else { - net = i & IN_CLASSC_NET; - host = i & IN_CLASSC_HOST; - } - - /* - * Check whether this network is subnetted; - * if so, check whether this is a subnet or a host. - */ - for (ifp = ifnet; ifp; ifp = ifp->int_next) - if (net == ifp->int_net) { - if (host &~ ifp->int_subnetmask) - return (RTF_HOST); - else if (ifp->int_subnetmask != ifp->int_netmask) - return (RTF_SUBNET); - else - return (0); /* network */ - } - if (host == 0) - return (0); /* network */ - else - return (RTF_HOST); -} - -/* - * Return true if a route to subnet/host of route rt should be sent to dst. - * Send it only if dst is on the same logical network if not "internal", - * otherwise only if the route is the "internal" route for the logical net. - */ -inet_sendroute(rt, dst) - struct rt_entry *rt; - struct sockaddr_in *dst; -{ - register u_long r = - ntohl(((struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr); - register u_long d = ntohl(dst->sin_addr.s_addr); - - if (IN_CLASSA(r)) { - if ((r & IN_CLASSA_NET) == (d & IN_CLASSA_NET)) { - if ((r & IN_CLASSA_HOST) == 0) - return ((rt->rt_state & RTS_INTERNAL) == 0); - return (1); - } - if (r & IN_CLASSA_HOST) - return (0); - return ((rt->rt_state & RTS_INTERNAL) != 0); - } else if (IN_CLASSB(r)) { - if ((r & IN_CLASSB_NET) == (d & IN_CLASSB_NET)) { - if ((r & IN_CLASSB_HOST) == 0) - return ((rt->rt_state & RTS_INTERNAL) == 0); - return (1); - } - if (r & IN_CLASSB_HOST) - return (0); - return ((rt->rt_state & RTS_INTERNAL) != 0); - } else { - if ((r & IN_CLASSC_NET) == (d & IN_CLASSC_NET)) { - if ((r & IN_CLASSC_HOST) == 0) - return ((rt->rt_state & RTS_INTERNAL) == 0); - return (1); - } - if (r & IN_CLASSC_HOST) - return (0); - return ((rt->rt_state & RTS_INTERNAL) != 0); - } -} diff --git a/usr.sbin/routed/interface.h b/usr.sbin/routed/interface.h deleted file mode 100644 index fc576d4..0000000 --- a/usr.sbin/routed/interface.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)interface.h 8.1 (Berkeley) 6/5/93 - */ - -/* - * Routing table management daemon. - */ - -/* - * An ``interface'' is similar to an ifnet structure, - * except it doesn't contain q'ing info, and it also - * handles ``logical'' interfaces (remote gateways - * that we want to keep polling even if they go down). - * The list of interfaces which we maintain is used - * in supplying the gratuitous routing table updates. - */ -struct interface { - struct interface *int_next; - struct sockaddr int_addr; /* address on this host */ - union { - struct sockaddr intu_broadaddr; - struct sockaddr intu_dstaddr; - } int_intu; -#define int_broadaddr int_intu.intu_broadaddr /* broadcast address */ -#define int_dstaddr int_intu.intu_dstaddr /* other end of p-to-p link */ - int int_metric; /* init's routing entry */ - int int_flags; /* see below */ - /* START INTERNET SPECIFIC */ - u_long int_net; /* network # */ - u_long int_netmask; /* net mask for addr */ - u_long int_subnet; /* subnet # */ - u_long int_subnetmask; /* subnet mask for addr */ - /* END INTERNET SPECIFIC */ - struct ifdebug int_input, int_output; /* packet tracing stuff */ - int int_ipackets; /* input packets received */ - int int_opackets; /* output packets sent */ - char *int_name; /* from kernel if structure */ - u_short int_transitions; /* times gone up-down */ -}; - -/* - * 0x1 to 0x10 are reused from the kernel's ifnet definitions, - * the others agree with the RTS_ flags defined elsewhere. - */ -#define IFF_UP 0x1 /* interface is up */ -#define IFF_BROADCAST 0x2 /* broadcast address valid */ -#define IFF_DEBUG 0x4 /* turn on debugging */ -#define IFF_LOOPBACK 0x8 /* software loopback net */ -#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ - -#define IFF_SUBNET 0x100000 /* interface on subnetted network */ -#define IFF_PASSIVE 0x200000 /* can't tell if up/down */ -#define IFF_INTERFACE 0x400000 /* hardware interface */ -#define IFF_REMOTE 0x800000 /* interface isn't on this machine */ - -struct interface *if_ifwithaddr(); -struct interface *if_ifwithdstaddr(); -struct interface *if_ifwithnet(); -struct interface *if_iflookup(); diff --git a/usr.sbin/routed/startup.c b/usr.sbin/routed/startup.c deleted file mode 100644 index fc4195c..0000000 --- a/usr.sbin/routed/startup.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright (c) 1983, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)startup.c 8.1 (Berkeley) 6/5/93"; -#endif /* not lint */ - -/* - * Routing Table Management Daemon - */ -#include "defs.h" -#include <sys/ioctl.h> -#include <sys/sysctl.h> -#include <net/if.h> -#include <net/if_dl.h> -#include <syslog.h> -#include <stdlib.h> -#include "pathnames.h" - -struct interface *ifnet; -struct interface **ifnext = &ifnet; -int lookforinterfaces = 1; -int externalinterfaces = 0; /* # of remote and local interfaces */ -int foundloopback; /* valid flag for loopaddr */ -struct sockaddr loopaddr; /* our address on loopback */ - - -void -quit(s) - char *s; -{ - extern int errno; - int sverrno = errno; - - (void) fprintf(stderr, "route: "); - if (s) - (void) fprintf(stderr, "%s: ", s); - (void) fprintf(stderr, "%s\n", strerror(sverrno)); - exit(1); - /* NOTREACHED */ -} - -struct rt_addrinfo info; -/* Sleazy use of local variables throughout file, warning!!!! */ -#define netmask info.rti_info[RTAX_NETMASK] -#define ifaaddr info.rti_info[RTAX_IFA] -#define brdaddr info.rti_info[RTAX_BRD] - -#define ROUNDUP(a) \ - ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) -#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) - -void -rt_xaddrs(cp, cplim, rtinfo) - register caddr_t cp, cplim; - register struct rt_addrinfo *rtinfo; -{ - register struct sockaddr *sa; - register int i; - - bzero(rtinfo->rti_info, sizeof(rtinfo->rti_info)); - for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) { - if ((rtinfo->rti_addrs & (1 << i)) == 0) - continue; - rtinfo->rti_info[i] = sa = (struct sockaddr *)cp; - ADVANCE(cp, sa); - } -} - -/* - * Find the network interfaces which have configured themselves. - * If the interface is present but not yet up (for example an - * ARPANET IMP), set the lookforinterfaces flag so we'll - * come back later and look again. - */ -ifinit() -{ - struct interface ifs, *ifp; - size_t needed; - int mib[6], no_ipaddr = 0, flags = 0; - char *buf, *cplim, *cp; - register struct if_msghdr *ifm; - register struct ifa_msghdr *ifam; - struct sockaddr_dl *sdl; - struct sockaddr_in *sin; - u_long i; - - mib[0] = CTL_NET; - mib[1] = PF_ROUTE; - mib[2] = 0; - mib[3] = AF_INET; - mib[4] = NET_RT_IFLIST; - mib[5] = 0; - if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) - quit("route-sysctl-estimate"); - if ((buf = malloc(needed)) == NULL) - quit("malloc"); - if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) - quit("actual retrieval of interface table"); - lookforinterfaces = 0; - cplim = buf + needed; - for (cp = buf; cp < cplim; cp += ifm->ifm_msglen) { - ifm = (struct if_msghdr *)cp; - if (ifm->ifm_type == RTM_IFINFO) { - bzero(&ifs, sizeof(ifs)); - ifs.int_flags = flags = (0xffff & ifm->ifm_flags) | IFF_INTERFACE; - if ((flags & IFF_UP) == 0 || no_ipaddr) - lookforinterfaces = 1; - sdl = (struct sockaddr_dl *) (ifm + 1); - sdl->sdl_data[sdl->sdl_nlen] = 0; - no_ipaddr = 1; - continue; - } - if (ifm->ifm_type != RTM_NEWADDR) - quit("ifinit: out of sync"); - if ((flags & IFF_UP) == 0) - continue; - ifam = (struct ifa_msghdr *)ifm; - info.rti_addrs = ifam->ifam_addrs; - rt_xaddrs((char *)(ifam + 1), cp + ifam->ifam_msglen, &info); - if (ifaaddr == 0) { - syslog(LOG_ERR, "%s: (get addr)", sdl->sdl_data); - continue; - } - ifs.int_addr = *ifaaddr; - if (ifs.int_addr.sa_family != AF_INET) - continue; - no_ipaddr = 0; - if (ifs.int_flags & IFF_POINTOPOINT) { - if (brdaddr == 0) { - syslog(LOG_ERR, "%s: (get dstaddr)", - sdl->sdl_data); - continue; - } - if (brdaddr->sa_family == AF_UNSPEC) { - lookforinterfaces = 1; - continue; - } - ifs.int_dstaddr = *brdaddr; - } - /* - * already known to us? - * This allows multiple point-to-point links - * to share a source address (possibly with one - * other link), but assumes that there will not be - * multiple links with the same destination address. - */ - if (ifs.int_flags & IFF_POINTOPOINT) { - if (if_ifwithdstaddr(&ifs.int_dstaddr)) - continue; - } else if (if_ifwithaddr(&ifs.int_addr)) - continue; - if (ifs.int_flags & IFF_LOOPBACK) { - ifs.int_flags |= IFF_PASSIVE; - foundloopback = 1; - loopaddr = ifs.int_addr; - for (ifp = ifnet; ifp; ifp = ifp->int_next) - if (ifp->int_flags & IFF_POINTOPOINT) - add_ptopt_localrt(ifp); - } - if (ifs.int_flags & IFF_BROADCAST) { - if (brdaddr == 0) { - syslog(LOG_ERR, "%s: (get broadaddr)", - sdl->sdl_data); - continue; - } - ifs.int_dstaddr = *brdaddr; - } - /* - * Use a minimum metric of one; - * treat the interface metric (default 0) - * as an increment to the hop count of one. - */ - ifs.int_metric = ifam->ifam_metric + 1; - if (netmask == 0) { - syslog(LOG_ERR, "%s: (get netmask)", - sdl->sdl_data); - continue; - } - sin = (struct sockaddr_in *)netmask; - ifs.int_subnetmask = ntohl(sin->sin_addr.s_addr); - sin = (struct sockaddr_in *)&ifs.int_addr; - i = ntohl(sin->sin_addr.s_addr); - if (IN_CLASSA(i)) - ifs.int_netmask = IN_CLASSA_NET; - else if (IN_CLASSB(i)) - ifs.int_netmask = IN_CLASSB_NET; - else - ifs.int_netmask = IN_CLASSC_NET; - ifs.int_net = i & ifs.int_netmask; - ifs.int_subnet = i & ifs.int_subnetmask; - if (ifs.int_subnetmask != ifs.int_netmask) - ifs.int_flags |= IFF_SUBNET; - ifp = (struct interface *) - malloc(sdl->sdl_nlen + 1 + sizeof(ifs)); - if (ifp == 0) { - printf("routed: out of memory\n"); - lookforinterfaces = 1; - break; - } - *ifp = ifs; - /* - * Count the # of directly connected networks - * and point to point links which aren't looped - * back to ourself. This is used below to - * decide if we should be a routing ``supplier''. - */ - if ((ifs.int_flags & IFF_LOOPBACK) == 0 && - ((ifs.int_flags & IFF_POINTOPOINT) == 0 || - if_ifwithaddr(&ifs.int_dstaddr) == 0)) - externalinterfaces++; - /* - * If we have a point-to-point link, we want to act - * as a supplier even if it's our only interface, - * as that's the only way our peer on the other end - * can tell that the link is up. - */ - if ((ifs.int_flags & IFF_POINTOPOINT) && supplier < 0) - supplier = 1; - ifp->int_name = (char *)(ifp + 1); - strcpy(ifp->int_name, sdl->sdl_data); - *ifnext = ifp; - ifnext = &ifp->int_next; - traceinit(ifp); - addrouteforif(ifp); - } - if (externalinterfaces > 1 && supplier < 0) - supplier = 1; - free(buf); -} - -/* - * Add route for interface if not currently installed. - * Create route to other end if a point-to-point link, - * otherwise a route to this (sub)network. - * INTERNET SPECIFIC. - */ -addrouteforif(ifp) - register struct interface *ifp; -{ - struct sockaddr_in net; - struct sockaddr *dst; - int state; - register struct rt_entry *rt; - - 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); - if (rt && - (rt->rt_state & (RTS_INTERFACE | RTS_INTERNAL)) == RTS_INTERFACE) - return; - if (rt) - rtdelete(rt); - /* - * If interface on subnetted network, - * install route to network as well. - * This is meant for external viewers. - */ - if ((ifp->int_flags & (IFF_SUBNET|IFF_POINTOPOINT)) == IFF_SUBNET) { - struct in_addr subnet; - - subnet = net.sin_addr; - net.sin_addr = inet_makeaddr(ifp->int_net, INADDR_ANY); - rt = rtfind(dst); - if (rt == 0) - rtadd(dst, &ifp->int_addr, ifp->int_metric, - ((ifp->int_flags & (IFF_INTERFACE|IFF_REMOTE)) | - RTS_PASSIVE | RTS_INTERNAL | RTS_SUBNET)); - else if ((rt->rt_state & (RTS_INTERNAL|RTS_SUBNET)) == - (RTS_INTERNAL|RTS_SUBNET) && - ifp->int_metric < rt->rt_metric) - rtchange(rt, &rt->rt_router, ifp->int_metric); - net.sin_addr = subnet; - } - if (ifp->int_transitions++ > 0) - syslog(LOG_ERR, "re-installing interface %s", ifp->int_name); - state = ifp->int_flags & - (IFF_INTERFACE | IFF_PASSIVE | IFF_REMOTE | IFF_SUBNET); - if (ifp->int_flags & IFF_POINTOPOINT && - (ntohl(((struct sockaddr_in *)&ifp->int_dstaddr)->sin_addr.s_addr) & - ifp->int_netmask) != ifp->int_net) - state &= ~RTS_SUBNET; - if (ifp->int_flags & IFF_LOOPBACK) - state |= RTS_EXTERNAL; - rtadd(dst, &ifp->int_addr, ifp->int_metric, state); - if (ifp->int_flags & IFF_POINTOPOINT && foundloopback) - add_ptopt_localrt(ifp); -} - -/* - * Add route to local end of point-to-point using loopback. - * If a route to this network is being sent to neighbors on other nets, - * mark this route as subnet so we don't have to propagate it too. - */ -add_ptopt_localrt(ifp) - register struct interface *ifp; -{ - struct rt_entry *rt; - struct sockaddr *dst; - struct sockaddr_in net; - int state; - - state = RTS_INTERFACE | RTS_PASSIVE; - - /* look for route to logical network */ - bzero((char *)&net, sizeof (net)); - net.sin_family = AF_INET; - net.sin_addr = inet_makeaddr(ifp->int_net, INADDR_ANY); - dst = (struct sockaddr *)&net; - rt = rtfind(dst); - if (rt && rt->rt_state & RTS_INTERNAL) - state |= RTS_SUBNET; - - dst = &ifp->int_addr; - if (rt = rtfind(dst)) { - if (rt && rt->rt_state & RTS_INTERFACE) - return; - rtdelete(rt); - } - rtadd(dst, &loopaddr, 1, state); -} - -/* - * As a concession to the ARPANET we read a list of gateways - * from /etc/gateways and add them to our tables. This file - * exists at each ARPANET gateway and indicates a set of ``remote'' - * gateways (i.e. a gateway which we can't immediately determine - * if it's present or not as we can do for those directly connected - * 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. - * - * PASSIVE ENTRIES AREN'T NEEDED OR USED ON GATEWAYS RUNNING EGP. - */ -gwkludge() -{ - struct sockaddr_in dst, gate; - FILE *fp; - char *type, *dname, *gname, *qual, buf[BUFSIZ]; - struct interface *ifp; - int metric, n; - struct rt_entry route; - - fp = fopen(_PATH_GATEWAYS, "r"); - if (fp == NULL) - return; - qual = buf; - dname = buf + 64; - gname = buf + ((BUFSIZ - 64) / 3); - type = buf + (((BUFSIZ - 64) * 2) / 3); - bzero((char *)&dst, sizeof (dst)); - bzero((char *)&gate, sizeof (gate)); - bzero((char *)&route, sizeof(route)); -/* format: {net | host} XX gateway XX metric DD [passive | external]\n */ -#define readentry(fp) \ - fscanf((fp), "%s %s gateway %s metric %d %s\n", \ - type, dname, gname, &metric, qual) - for (;;) { - if ((n = readentry(fp)) == EOF) - break; - if (!getnetorhostname(type, dname, &dst)) - continue; - if (!gethostnameornumber(gname, &gate)) - continue; - if (metric == 0) /* XXX */ - metric = 1; - if (strcmp(qual, "passive") == 0) { - /* - * Passive entries aren't placed in our tables, - * only the kernel's, so we don't copy all of the - * external routing information within a net. - * Internal machines should use the default - * route to a suitable gateway (like us). - */ - route.rt_dst = *(struct sockaddr *) &dst; - route.rt_router = *(struct sockaddr *) &gate; - route.rt_flags = RTF_UP; - if (strcmp(type, "host") == 0) - route.rt_flags |= RTF_HOST; - if (metric) - route.rt_flags |= RTF_GATEWAY; - (void) rtioctl(ADD, &route.rt_rt); - continue; - } - if (strcmp(qual, "external") == 0) { - /* - * Entries marked external are handled - * by other means, e.g. EGP, - * and are placed in our tables only - * to prevent overriding them - * with something else. - */ - rtadd(&dst, &gate, metric, RTS_EXTERNAL|RTS_PASSIVE); - continue; - } - /* assume no duplicate entries */ - externalinterfaces++; - ifp = (struct interface *)malloc(sizeof (*ifp)); - bzero((char *)ifp, sizeof (*ifp)); - ifp->int_flags = IFF_REMOTE; - /* can't identify broadcast capability */ - ifp->int_net = inet_netof(dst.sin_addr); - if (strcmp(type, "host") == 0) { - ifp->int_flags |= IFF_POINTOPOINT; - ifp->int_dstaddr = *((struct sockaddr *)&dst); - } - ifp->int_addr = *((struct sockaddr *)&gate); - ifp->int_metric = metric; - ifp->int_next = ifnet; - ifnet = ifp; - addrouteforif(ifp); - } - fclose(fp); -} - -getnetorhostname(type, name, sin) - char *type, *name; - struct sockaddr_in *sin; -{ - - if (strcmp(type, "net") == 0) { - struct netent *np = getnetbyname(name); - int n; - - if (np == 0) - n = inet_network(name); - else { - if (np->n_addrtype != AF_INET) - return (0); - n = np->n_net; - /* - * getnetbyname returns right-adjusted value. - */ - if (n < 128) - n <<= IN_CLASSA_NSHIFT; - else if (n < 65536) - n <<= IN_CLASSB_NSHIFT; - else - n <<= IN_CLASSC_NSHIFT; - } - sin->sin_family = AF_INET; - sin->sin_addr = inet_makeaddr(n, INADDR_ANY); - return (1); - } - if (strcmp(type, "host") == 0) { - struct hostent *hp = gethostbyname(name); - - if (hp == 0) - sin->sin_addr.s_addr = inet_addr(name); - else { - if (hp->h_addrtype != AF_INET) - return (0); - bcopy(hp->h_addr, &sin->sin_addr, hp->h_length); - } - sin->sin_family = AF_INET; - return (1); - } - return (0); -} - -gethostnameornumber(name, sin) - char *name; - struct sockaddr_in *sin; -{ - struct hostent *hp; - - hp = gethostbyname(name); - if (hp) { - bcopy(hp->h_addr, &sin->sin_addr, hp->h_length); - sin->sin_family = hp->h_addrtype; - return (1); - } - sin->sin_addr.s_addr = inet_addr(name); - sin->sin_family = AF_INET; - return (sin->sin_addr.s_addr != -1); -} diff --git a/usr.sbin/routed/tables.c b/usr.sbin/routed/tables.c deleted file mode 100644 index baa9c39..0000000 --- a/usr.sbin/routed/tables.c +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 1983, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)tables.c 8.1 (Berkeley) 6/5/93"; -#endif /* not lint */ - -/* - * Routing Table Management Daemon - */ -#include "defs.h" -#include <sys/ioctl.h> -#include <errno.h> -#include <sys/syslog.h> - -#ifndef DEBUG -#define DEBUG 0 -#endif - -#ifdef RTM_ADD -#define FIXLEN(s) {if ((s)->sa_len == 0) (s)->sa_len = sizeof *(s);} -#else -#define FIXLEN(s) { } -#endif - -int install = !DEBUG; /* if 1 call kernel */ - -/* - * Lookup dst in the tables for an exact match. - */ -struct rt_entry * -rtlookup(dst) - struct sockaddr *dst; -{ - register struct rt_entry *rt; - register struct rthash *rh; - register u_int hash; - struct afhash h; - int doinghost = 1; - - if (dst->sa_family >= af_max) - return (0); - (*afswitch[dst->sa_family].af_hash)(dst, &h); - hash = h.afh_hosthash; - rh = &hosthash[hash & ROUTEHASHMASK]; -again: - for (rt = rh->rt_forw; rt != (struct rt_entry *)rh; rt = rt->rt_forw) { - if (rt->rt_hash != hash) - continue; - if (equal(&rt->rt_dst, dst)) - return (rt); - } - if (doinghost) { - doinghost = 0; - hash = h.afh_nethash; - rh = &nethash[hash & ROUTEHASHMASK]; - goto again; - } - return (0); -} - -struct sockaddr wildcard; /* zero valued cookie for wildcard searches */ - -/* - * Find a route to dst as the kernel would. - */ -struct rt_entry * -rtfind(dst) - struct sockaddr *dst; -{ - register struct rt_entry *rt; - register struct rthash *rh; - register u_int hash; - struct afhash h; - int af = dst->sa_family; - int doinghost = 1, (*match)(); - - if (af >= af_max) - return (0); - (*afswitch[af].af_hash)(dst, &h); - hash = h.afh_hosthash; - rh = &hosthash[hash & ROUTEHASHMASK]; - -again: - for (rt = rh->rt_forw; rt != (struct rt_entry *)rh; rt = rt->rt_forw) { - if (rt->rt_hash != hash) - continue; - if (doinghost) { - if (equal(&rt->rt_dst, dst)) - return (rt); - } else { - if (rt->rt_dst.sa_family == af && - (*match)(&rt->rt_dst, dst)) - return (rt); - } - } - if (doinghost) { - doinghost = 0; - hash = h.afh_nethash; - rh = &nethash[hash & ROUTEHASHMASK]; - match = afswitch[af].af_netmatch; - goto again; - } -#ifdef notyet - /* - * Check for wildcard gateway, by convention network 0. - */ - if (dst != &wildcard) { - dst = &wildcard, hash = 0; - goto again; - } -#endif - return (0); -} - -rtadd(dst, gate, metric, state) - struct sockaddr *dst, *gate; - int metric, state; -{ - struct afhash h; - register struct rt_entry *rt; - struct rthash *rh; - int af = dst->sa_family, flags; - u_int hash; - - if (af >= af_max) - return; - (*afswitch[af].af_hash)(dst, &h); - flags = (*afswitch[af].af_rtflags)(dst); - /* - * Subnet flag isn't visible to kernel, move to state. XXX - */ - FIXLEN(dst); - FIXLEN(gate); - if (flags & RTF_SUBNET) { - state |= RTS_SUBNET; - flags &= ~RTF_SUBNET; - } - if (flags & RTF_HOST) { - hash = h.afh_hosthash; - rh = &hosthash[hash & ROUTEHASHMASK]; - } else { - hash = h.afh_nethash; - rh = &nethash[hash & ROUTEHASHMASK]; - } - rt = (struct rt_entry *)malloc(sizeof (*rt)); - if (rt == 0) - return; - rt->rt_hash = hash; - rt->rt_dst = *dst; - rt->rt_router = *gate; - rt->rt_timer = 0; - rt->rt_flags = RTF_UP | flags; - rt->rt_state = state | RTS_CHANGED; - rt->rt_ifp = if_ifwithdstaddr(&rt->rt_dst); - if (rt->rt_ifp == 0) - rt->rt_ifp = if_ifwithnet(&rt->rt_router); - if ((state & RTS_INTERFACE) == 0) - rt->rt_flags |= RTF_GATEWAY; - rt->rt_metric = metric; - insque(rt, rh); - TRACE_ACTION("ADD", rt); - /* - * If the ioctl fails because the gateway is unreachable - * from this host, discard the entry. This should only - * occur because of an incorrect entry in /etc/gateways. - */ - if ((rt->rt_state & (RTS_INTERNAL | RTS_EXTERNAL)) == 0 && - rtioctl(ADD, &rt->rt_rt) < 0) { - if (errno != EEXIST && gate->sa_family < af_max) - syslog(LOG_ERR, - "adding route to net/host %s through gateway %s: %m\n", - (*afswitch[dst->sa_family].af_format)(dst), - (*afswitch[gate->sa_family].af_format)(gate)); - perror("ADD ROUTE"); - if (errno == ENETUNREACH) { - TRACE_ACTION("DELETE", rt); - remque(rt); - free((char *)rt); - } - } -} - -rtchange(rt, gate, metric) - struct rt_entry *rt; - struct sockaddr *gate; - short metric; -{ - int add = 0, delete = 0, newgateway = 0; - struct rtuentry oldroute; - - FIXLEN(gate); - FIXLEN(&(rt->rt_router)); - FIXLEN(&(rt->rt_dst)); - if (!equal(&rt->rt_router, gate)) { - newgateway++; - TRACE_ACTION("CHANGE FROM ", rt); - } else if (metric != rt->rt_metric) - TRACE_NEWMETRIC(rt, metric); - if ((rt->rt_state & RTS_INTERNAL) == 0) { - /* - * If changing to different router, we need to add - * new route and delete old one if in the kernel. - * If the router is the same, we need to delete - * the route if has become unreachable, or re-add - * it if it had been unreachable. - */ - if (newgateway) { - add++; - if (rt->rt_metric != HOPCNT_INFINITY) - delete++; - } else if (metric == HOPCNT_INFINITY) - delete++; - else if (rt->rt_metric == HOPCNT_INFINITY) - add++; - } - if (delete) - oldroute = rt->rt_rt; - if ((rt->rt_state & RTS_INTERFACE) && delete) { - rt->rt_state &= ~RTS_INTERFACE; - rt->rt_flags |= RTF_GATEWAY; - if (metric > rt->rt_metric && delete) - syslog(LOG_ERR, "%s route to interface %s (timed out)", - add? "changing" : "deleting", - rt->rt_ifp ? rt->rt_ifp->int_name : "?"); - } - if (add) { - rt->rt_router = *gate; - rt->rt_ifp = if_ifwithdstaddr(&rt->rt_router); - if (rt->rt_ifp == 0) - rt->rt_ifp = if_ifwithnet(&rt->rt_router); - } - rt->rt_metric = metric; - rt->rt_state |= RTS_CHANGED; - if (newgateway) - TRACE_ACTION("CHANGE TO ", rt); -#ifndef RTM_ADD - if (add && rtioctl(ADD, &rt->rt_rt) < 0) - perror("ADD ROUTE"); - if (delete && rtioctl(DELETE, &oldroute) < 0) - perror("DELETE ROUTE"); -#else - if (delete && !add) { - if (rtioctl(DELETE, &oldroute) < 0) - perror("DELETE ROUTE"); - } else if (!delete && add) { - if (rtioctl(ADD, &rt->rt_rt) < 0) - perror("ADD ROUTE"); - } else if (delete && add) { - if (rtioctl(CHANGE, &rt->rt_rt) < 0) - perror("CHANGE ROUTE"); - } -#endif -} - -rtdelete(rt) - struct rt_entry *rt; -{ - - TRACE_ACTION("DELETE", rt); - FIXLEN(&(rt->rt_router)); - FIXLEN(&(rt->rt_dst)); - if (rt->rt_metric < HOPCNT_INFINITY) { - if ((rt->rt_state & (RTS_INTERFACE|RTS_INTERNAL)) == RTS_INTERFACE) - syslog(LOG_ERR, - "deleting route to interface %s? (timed out?)", - rt->rt_ifp->int_name); - if ((rt->rt_state & (RTS_INTERNAL | RTS_EXTERNAL)) == 0 && - rtioctl(DELETE, &rt->rt_rt) < 0) - perror("rtdelete"); - } - remque(rt); - free((char *)rt); -} - -rtdeleteall(sig) - int sig; -{ - register struct rthash *rh; - register struct rt_entry *rt; - struct rthash *base = hosthash; - int doinghost = 1; - -again: - for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) { - rt = rh->rt_forw; - for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) { - if (rt->rt_state & RTS_INTERFACE || - rt->rt_metric >= HOPCNT_INFINITY) - continue; - TRACE_ACTION("DELETE", rt); - if ((rt->rt_state & (RTS_INTERNAL|RTS_EXTERNAL)) == 0 && - rtioctl(DELETE, &rt->rt_rt) < 0) - perror("rtdeleteall"); - } - } - if (doinghost) { - doinghost = 0; - base = nethash; - goto again; - } - exit(sig); -} - -/* - * If we have an interface to the wide, wide world, - * add an entry for an Internet default route (wildcard) to the internal - * tables and advertise it. This route is not added to the kernel routes, - * but this entry prevents us from listening to other people's defaults - * and installing them in the kernel here. - */ -rtdefault() -{ - extern struct sockaddr inet_default; - - rtadd(&inet_default, &inet_default, 1, - RTS_CHANGED | RTS_PASSIVE | RTS_INTERNAL); -} - -rtinit() -{ - register struct rthash *rh; - - for (rh = nethash; rh < &nethash[ROUTEHASHSIZ]; rh++) - rh->rt_forw = rh->rt_back = (struct rt_entry *)rh; - for (rh = hosthash; rh < &hosthash[ROUTEHASHSIZ]; rh++) - rh->rt_forw = rh->rt_back = (struct rt_entry *)rh; -} - -rtioctl(action, ort) - int action; - struct rtuentry *ort; -{ -#ifndef RTM_ADD - if (install == 0) - return (errno = 0); - ort->rtu_rtflags = ort->rtu_flags; - switch (action) { - - case ADD: - return (ioctl(s, SIOCADDRT, (char *)ort)); - - case DELETE: - return (ioctl(s, SIOCDELRT, (char *)ort)); - - default: - return (-1); - } -#else /* RTM_ADD */ - struct { - struct rt_msghdr w_rtm; - struct sockaddr_in w_dst; - struct sockaddr w_gate; - struct sockaddr_in w_netmask; - } w; -#define rtm w.w_rtm - - bzero((char *)&w, sizeof(w)); - rtm.rtm_msglen = sizeof(w); - rtm.rtm_version = RTM_VERSION; - rtm.rtm_type = (action == ADD ? RTM_ADD : - (action == DELETE ? RTM_DELETE : RTM_CHANGE)); -#undef rt_dst - rtm.rtm_flags = ort->rtu_flags; - rtm.rtm_seq = ++seqno; - rtm.rtm_addrs = RTA_DST|RTA_GATEWAY; - bcopy((char *)&ort->rtu_dst, (char *)&w.w_dst, sizeof(w.w_dst)); - bcopy((char *)&ort->rtu_router, (char *)&w.w_gate, sizeof(w.w_gate)); - w.w_dst.sin_family = AF_INET; - w.w_dst.sin_len = sizeof(w.w_dst); - w.w_gate.sa_family = AF_INET; - w.w_gate.sa_len = sizeof(w.w_gate); - if (rtm.rtm_flags & RTF_HOST) { - rtm.rtm_msglen -= sizeof(w.w_netmask); - } else { - register char *cp; - int len; - - rtm.rtm_addrs |= RTA_NETMASK; - w.w_netmask.sin_addr.s_addr = - inet_maskof(w.w_dst.sin_addr.s_addr); - for (cp = (char *)(1 + &w.w_netmask.sin_addr); - --cp > (char *) &w.w_netmask; ) - if (*cp) - break; - len = cp - (char *)&w.w_netmask; - if (len) { - len++; - w.w_netmask.sin_len = len; - len = 1 + ((len - 1) | (sizeof(long) - 1)); - } else - len = sizeof(long); - rtm.rtm_msglen -= (sizeof(w.w_netmask) - len); - } - errno = 0; - return (install ? write(r, (char *)&w, rtm.rtm_msglen) : (errno = 0)); -#endif /* RTM_ADD */ -} diff --git a/usr.sbin/routed/timer.c b/usr.sbin/routed/timer.c deleted file mode 100644 index 643e2f5..0000000 --- a/usr.sbin/routed/timer.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 1983, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)timer.c 8.1 (Berkeley) 6/5/93"; -#endif /* not lint */ - -/* - * Routing Table Management Daemon - */ -#include "defs.h" - -int faketime; - -/* - * Timer routine. Performs routing information supply - * duties and manages timers on routing table entries. - * Management of the RTS_CHANGED bit assumes that we broadcast - * each time called. - */ -void -timer() -{ - register struct rthash *rh; - register struct rt_entry *rt; - struct rthash *base = hosthash; - int doinghost = 1, timetobroadcast; - extern int externalinterfaces; - - (void) gettimeofday(&now, (struct timezone *)NULL); - faketime += TIMER_RATE; - if (lookforinterfaces && (faketime % CHECK_INTERVAL) == 0) - ifinit(); - timetobroadcast = supplier && (faketime % SUPPLY_INTERVAL) == 0; -again: - for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) { - rt = rh->rt_forw; - 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. - */ - if (!(rt->rt_state & RTS_PASSIVE) && - (supplier || !(rt->rt_state & RTS_INTERFACE))) - rt->rt_timer += TIMER_RATE; - if (rt->rt_timer >= GARBAGE_TIME) { - rt = rt->rt_back; - rtdelete(rt->rt_forw); - continue; - } - if (rt->rt_timer >= EXPIRE_TIME && - rt->rt_metric < HOPCNT_INFINITY) - rtchange(rt, &rt->rt_router, HOPCNT_INFINITY); - rt->rt_state &= ~RTS_CHANGED; - } - } - if (doinghost) { - doinghost = 0; - base = nethash; - goto again; - } - if (timetobroadcast) { - toall(supply, 0, (struct interface *)NULL); - lastbcast = now; - lastfullupdate = now; - needupdate = 0; /* cancel any pending dynamic update */ - nextbcast.tv_sec = 0; - } -} - -/* - * On hangup, let everyone know we're going away. - */ -hup() -{ - register struct rthash *rh; - register struct rt_entry *rt; - struct rthash *base = hosthash; - int doinghost = 1; - - if (supplier) { -again: - for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) { - rt = rh->rt_forw; - for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) - rt->rt_metric = HOPCNT_INFINITY; - } - if (doinghost) { - doinghost = 0; - base = nethash; - goto again; - } - toall(supply, 0, (struct interface *)NULL); - } - exit(1); -} |