diff options
author | itojun <itojun@FreeBSD.org> | 2000-07-05 02:14:16 +0000 |
---|---|---|
committer | itojun <itojun@FreeBSD.org> | 2000-07-05 02:14:16 +0000 |
commit | d248c0293a4942003e606154bf4dd3b7b1f7c605 (patch) | |
tree | 7d0685c48a5e1a9f88bb8157e6d33b34fd1614ef /usr.sbin/route6d | |
parent | 09cb0345854d08112b0c4c3e64c916884d617033 (diff) | |
download | FreeBSD-src-d248c0293a4942003e606154bf4dd3b7b1f7c605.zip FreeBSD-src-d248c0293a4942003e606154bf4dd3b7b1f7c605.tar.gz |
sync with latest kame tree. more stable, p2p advert is corrected
Diffstat (limited to 'usr.sbin/route6d')
-rw-r--r-- | usr.sbin/route6d/Makefile | 3 | ||||
-rw-r--r-- | usr.sbin/route6d/route6d.8 | 31 | ||||
-rw-r--r-- | usr.sbin/route6d/route6d.c | 537 | ||||
-rw-r--r-- | usr.sbin/route6d/route6d.h | 15 |
4 files changed, 445 insertions, 141 deletions
diff --git a/usr.sbin/route6d/Makefile b/usr.sbin/route6d/Makefile index 97b2d9d..02b1900 100644 --- a/usr.sbin/route6d/Makefile +++ b/usr.sbin/route6d/Makefile @@ -4,6 +4,7 @@ PROG= route6d MAN8= route6d.8 -CFLAGS+= -Dss_len=__ss_len -Dss_family=__ss_family -DINET6 +CFLAGS+= -Dss_len=__ss_len -Dss_family=__ss_family -DINET6 \ + -DHAVE_GETIFADDRS .include <bsd.prog.mk> diff --git a/usr.sbin/route6d/route6d.8 b/usr.sbin/route6d/route6d.8 index 5ccd611..1457878 100644 --- a/usr.sbin/route6d/route6d.8 +++ b/usr.sbin/route6d/route6d.8 @@ -1,3 +1,6 @@ +.\" $FreeBSD$ +.\" $KAME: route6d.8,v 1.8 2000/05/31 17:00:09 itojun Exp $ +.\" .\" Copyright (c) 1996 WIDE Project. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -11,9 +14,6 @@ .\" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT .\" LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR .\" A PARTICULAR PURPOSE. -.\" -.\" $FreeBSD$ -.\" .Dd January 31, 1997 .Dt ROUTE6D 8 .Os KAME @@ -23,13 +23,27 @@ .Sh SYNOPSIS .Nm route6d .Op Fl adDhlqsS +.Bk -words .Op Fl R Ar routelog +.Ek +.Bk -words .Op Fl A Ar prefix/preflen,if1[,if2...] +.Ek +.Bk -words .Op Fl L Ar prefix/preflen,if1[,if2...] +.Ek +.Bk -words .Op Fl N Ar if1[,if2...] +.Ek +.Bk -words .Op Fl O Ar prefix/preflen,if1[,if2...] +.Ek +.Bk -words .Op Fl T Ar if1[,if2...] +.Ek +.Bk -words .Op Fl t Ar tag +.Ek .\" .Sh DESCRIPTION The @@ -92,7 +106,8 @@ Disables the split horizon processing. By default, .Nm will not exchange site local routes for safety reasons. -This is because semantics of site local address space is rather vague, +This is because semantics of site local address space is rather vague +.Pq specification is still in being worked , and there is no good way to define site local boundary. With .Fl l @@ -185,11 +200,11 @@ or .Dv SIGUSR1 , .Nm will dump the current internal state into -.Pa /var/tmp/route6d_dump . +.Pa /var/run/route6d_dump . .\" .Sh FILES -.Bl -tag -width /var/tmp/route6d_dump -compact -.It Pa /var/tmp/route6d_dump +.Bl -tag -width /var/run/route6d_dump -compact +.It Pa /var/run/route6d_dump dumps internal state on .Dv SIGINT or @@ -220,7 +235,7 @@ and .Li ff02::xx .Pc so they will be visible on internal state dump file -.Pq Pa /var/tmp/route6d_dump . +.Pq Pa /var/run/route6d_dump . .Pp Routing table manipulation differs from IPv6 implementation to implementation. Currently diff --git a/usr.sbin/route6d/route6d.c b/usr.sbin/route6d/route6d.c index 7097485..80098bb 100644 --- a/usr.sbin/route6d/route6d.c +++ b/usr.sbin/route6d/route6d.c @@ -1,11 +1,10 @@ -/* - * $Header: /cvsroot/kame/kame/kame/kame/route6d/route6d.c,v 1.6 1999/09/10 08:20:59 itojun Exp $ - */ +/* $FreeBSD$ */ +/* $KAME: route6d.c,v 1.30 2000/06/04 06:48:03 itojun Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -17,7 +16,7 @@ * 3. Neither the name of the project 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 PROJECT 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 @@ -29,12 +28,10 @@ * 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. - * - * $FreeBSD$ */ #ifndef lint -static char _rcsid[] = "$Id: route6d.c,v 1.6 1999/09/10 08:20:59 itojun Exp $"; +static char _rcsid[] = "$KAME: route6d.c,v 1.30 2000/06/04 06:48:03 itojun Exp $"; #endif #include <stdio.h> @@ -51,6 +48,7 @@ static char _rcsid[] = "$Id: route6d.c,v 1.6 1999/09/10 08:20:59 itojun Exp $"; #endif #include <syslog.h> #include <stddef.h> +#include <errno.h> #include <err.h> #include <sys/types.h> @@ -59,16 +57,26 @@ static char _rcsid[] = "$Id: route6d.c,v 1.6 1999/09/10 08:20:59 itojun Exp $"; #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/sysctl.h> -#include <sys/errno.h> +#ifdef ADVAPI #include <sys/uio.h> +#endif #include <net/if.h> +#if defined(__FreeBSD__) && __FreeBSD__ >= 3 #include <net/if_var.h> +#endif /* __FreeBSD__ >= 3 */ +#define KERNEL 1 +#define _KERNEL 1 #include <net/route.h> +#undef KERNEL +#undef _KERNEL #include <netinet/in.h> #include <netinet/in_var.h> #include <netinet/ip6.h> #include <netinet/udp.h> #include <netdb.h> +#ifdef HAVE_GETIFADDRS +#include <ifaddrs.h> +#endif #include <arpa/inet.h> @@ -83,9 +91,9 @@ static char _rcsid[] = "$Id: route6d.c,v 1.6 1999/09/10 08:20:59 itojun Exp $"; #endif /* alignment constraint for routing socket */ -#define ROUNDUP(a) \ +#define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) -#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) /* * Following two macros are highly depending on KAME Release @@ -113,7 +121,7 @@ struct ifc { /* Configuration of an interface */ int ifc_joined; /* joined to ff02::9 */ }; -struct ifac { /* Adddress associated to an interface */ +struct ifac { /* Adddress associated to an interface */ struct ifc *ifa_conf; /* back pointer */ struct ifac *ifa_next; struct in6_addr ifa_addr; /* address */ @@ -157,7 +165,8 @@ struct riprt { struct riprt *rrt_same; /* same destination - future use */ struct netinfo6 rrt_info; /* network info */ struct in6_addr rrt_gw; /* gateway */ - u_long rrt_flags; + u_long rrt_flags; /* kernel routing table flags */ + u_long rrt_rflags; /* route6d routing table flags */ time_t rrt_t; /* when the route validated */ int rrt_index; /* ifindex from which this route got */ }; @@ -172,7 +181,7 @@ int hflag = 0; /* don't split horizon */ int lflag = 0; /* exchange site local routes */ int sflag = 0; /* announce static routes w/ split horizon */ int Sflag = 0; /* announce static routes to every interface */ -int routetag = 0; /* route tag attached on originating case */ +unsigned long routetag = 0; /* route tag attached on originating case */ char *filter[MAXFILTER]; int filtertype[MAXFILTER]; @@ -194,14 +203,11 @@ int logopened = 0; static u_long seq = 0; -#define RTF_AGGREGATE 0x08000000 -#define RTF_NOADVERTISE 0x10000000 -#define RTF_NH_NOT_LLADDR 0x20000000 -#define RTF_SENDANYWAY 0x40000000 -#define RTF_CHANGED 0x80000000 -#define RTF_ROUTE_H 0xffff - -extern int errno; +#define RRTF_AGGREGATE 0x08000000 +#define RRTF_NOADVERTISE 0x10000000 +#define RRTF_NH_NOT_LLADDR 0x20000000 +#define RRTF_SENDANYWAY 0x40000000 +#define RRTF_CHANGED 0x80000000 int main __P((int, char **)); void ripalarm __P((int)); @@ -210,7 +216,7 @@ void ripsend __P((struct ifc *, struct sockaddr_in6 *, int)); void init __P((void)); void sockopt __P((struct ifc *)); void ifconfig __P((void)); -void ifconfig1 __P((struct ifreq *, struct ifc *, int)); +void ifconfig1 __P((const char *, const struct sockaddr *, struct ifc *, int)); void rtrecv __P((void)); int rt_del __P((const struct sockaddr_in6 *, const struct sockaddr_in6 *, const struct sockaddr_in6 *)); @@ -222,6 +228,7 @@ const char *rttypes __P((struct rt_msghdr *rtm)); const char *rtflags __P((struct rt_msghdr *rtm)); const char *ifflags __P((int flags)); void ifrt __P((struct ifc *, int)); +void ifrt_p2p __P((struct ifc *, int)); void applymask __P((struct in6_addr *, struct in6_addr *)); void applyplen __P((struct in6_addr *, int)); void ifrtdump __P((int)); @@ -268,9 +275,8 @@ main(argc, argv) struct ifc *ifcp; sigset_t mask, omask; FILE *pidfile; - extern char *optarg; - extern int optind; char *progname; + char *ep; progname = strrchr(*argv, '/'); if (progname) @@ -286,35 +292,41 @@ main(argc, argv) case 'O': case 'T': case 'L': - if (nfilter >= MAXFILTER) + if (nfilter >= MAXFILTER) { fatal("Exceeds MAXFILTER"); + /*NOTREACHED*/ + } filtertype[nfilter] = ch; filter[nfilter++] = allocopy(optarg); break; case 't': - sscanf(optarg, "%i", &routetag); - if (routetag & ~0xffff) { + ep = NULL; + routetag = strtoul(optarg, &ep, 0); + if (!ep || *ep != '\0' || (routetag & ~0xffff) != 0) { fatal("invalid route tag"); /*NOTREACHED*/ } break; case 'R': - if ((rtlog = fopen(optarg, "w")) == NULL) + if ((rtlog = fopen(optarg, "w")) == NULL) { fatal("Can not write to routelog"); + /*NOTREACHED*/ + } break; -#define FLAG(c, flag, n) case c: flag = n; break - FLAG('a', aflag, 1); - FLAG('d', dflag, 1); - FLAG('D', dflag, 2); - FLAG('h', hflag, 1); - FLAG('l', lflag, 1); - FLAG('n', nflag, 1); - FLAG('q', qflag, 1); - FLAG('s', sflag, 1); - FLAG('S', Sflag, 1); +#define FLAG(c, flag, n) case c: do { flag = n; break; } while(0) + FLAG('a', aflag, 1); break; + FLAG('d', dflag, 1); break; + FLAG('D', dflag, 2); break; + FLAG('h', hflag, 1); break; + FLAG('l', lflag, 1); break; + FLAG('n', nflag, 1); break; + FLAG('q', qflag, 1); break; + FLAG('s', sflag, 1); break; + FLAG('S', Sflag, 1); break; #undef FLAG default: fatal("Invalid option specified, terminating"); + /*NOTREACHED*/ } } argc -= optind; @@ -351,8 +363,15 @@ main(argc, argv) ifrtdump(0); if (dflag == 0) { +#if 1 if (daemon(0, 0) < 0) fatal("daemon"); +#else + if (fork()) + exit(0); + if (setsid() < 0) + fatal("setid"); +#endif } pid = getpid(); if ((pidfile = fopen(ROUTE6D_PID, "w")) != NULL) { @@ -362,6 +381,7 @@ main(argc, argv) if ((ripbuf = (struct rip6 *)malloc(RIP6_MAXMTU)) == NULL) fatal("malloc"); + memset(ripbuf, 0, RIP6_MAXMTU); ripbuf->rip6_cmd = RIP6_RESPONSE; ripbuf->rip6_vers = RIP6_VERSION; ripbuf->rip6_res1[0] = 0; @@ -432,7 +452,7 @@ rtdexit(sig) alarm(0); for (rrt = riprt; rrt; rrt = rrt->rrt_next) { - if (rrt->rrt_flags & RTF_AGGREGATE) { + if (rrt->rrt_rflags & RRTF_AGGREGATE) { delroute(&rrt->rrt_info, &rrt->rrt_gw); } } @@ -496,7 +516,9 @@ ripalarm(sig) void init() { +#ifdef ADVAPI int i; +#endif int int0, int255, error; struct addrinfo hints, *res; char port[10]; @@ -529,9 +551,18 @@ init() if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &int0, sizeof(int0)) < 0) fatal("rip IPV6_MULTICAST_LOOP"); +#ifdef ADVAPI i = 1; - if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_PKTINFO, &i, sizeof(i)) < 0) +#ifdef IPV6_RECVPKTINFO + if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &i, + sizeof(i)) < 0) + fatal("rip IPV6_RECVPKTINFO"); +#else /* old adv. API */ + if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_PKTINFO, &i, + sizeof(i)) < 0) fatal("rip IPV6_PKTINFO"); +#endif +#endif /*ADVAPI*/ memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_INET6; @@ -558,7 +589,8 @@ init() rtsock = -1; /*just for safety */ } -#define RIPSIZE(n) (sizeof(struct rip6) + (n-1) * sizeof(struct netinfo6)) +#define RIPSIZE(n) \ + (sizeof(struct rip6) + ((n)-1) * sizeof(struct netinfo6)) /* * ripflush flushes the rip datagram stored in the rip buffer @@ -586,7 +618,7 @@ ripflush(ifcp, sin) for (i = 0; i < nrt; i++, np++) { if (np->rip6_metric == NEXTHOP_METRIC) { if (IN6_IS_ADDR_UNSPECIFIED(&np->rip6_dest)) - trace(2, " NextHop reset"); + trace(2, " NextHop reset"); else { trace(2, " NextHop %s", inet6_n2p(&np->rip6_dest)); @@ -634,13 +666,13 @@ ripsend(ifcp, sin, flag) * Request from non-link local address is not * a regular route6d update. */ - maxrte = (IFMINMTU - sizeof(struct ip6_hdr) - - sizeof(struct udphdr) - + maxrte = (IFMINMTU - sizeof(struct ip6_hdr) - + sizeof(struct udphdr) - sizeof(struct rip6) + sizeof(struct netinfo6)) / sizeof(struct netinfo6); nrt = 0; np = ripbuf->rip6_nets; nh = NULL; for (rrt = riprt; rrt; rrt = rrt->rrt_next) { - if (rrt->rrt_flags & RTF_NOADVERTISE) + if (rrt->rrt_rflags & RRTF_NOADVERTISE) continue; /* Put the route to the buffer */ *np = rrt->rrt_info; @@ -655,7 +687,7 @@ ripsend(ifcp, sin, flag) return; } - if ((flag & RTF_SENDANYWAY) == 0 && + if ((flag & RRTF_SENDANYWAY) == 0 && (qflag || (ifcp->ifc_flags & IFF_LOOPBACK))) return; if (iff_find(ifcp, 'N') != NULL) @@ -673,13 +705,13 @@ ripsend(ifcp, sin, flag) ripflush(ifcp, sin); return; } - maxrte = (ifcp->ifc_mtu - sizeof(struct ip6_hdr) - - sizeof(struct udphdr) - + maxrte = (ifcp->ifc_mtu - sizeof(struct ip6_hdr) - + sizeof(struct udphdr) - sizeof(struct rip6) + sizeof(struct netinfo6)) / sizeof(struct netinfo6); nrt = 0; np = ripbuf->rip6_nets; nh = NULL; for (rrt = riprt; rrt; rrt = rrt->rrt_next) { - if (rrt->rrt_flags & RTF_NOADVERTISE) + if (rrt->rrt_rflags & RRTF_NOADVERTISE) continue; /* Need to check filer here */ ok = 1; @@ -688,7 +720,7 @@ ripsend(ifcp, sin, flag) continue; if (rrt->rrt_info.rip6_plen <= iffp->iff_plen) continue; - ia = rrt->rrt_info.rip6_dest; + ia = rrt->rrt_info.rip6_dest; applyplen(&ia, iffp->iff_plen); if (IN6_ARE_ADDR_EQUAL(&ia, &iffp->iff_addr)) { ok = 0; @@ -703,7 +735,7 @@ ripsend(ifcp, sin, flag) ok = 0; if (rrt->rrt_info.rip6_plen < iffp->iff_plen) continue; - ia = rrt->rrt_info.rip6_dest; + ia = rrt->rrt_info.rip6_dest; applyplen(&ia, iffp->iff_plen); if (IN6_ARE_ADDR_EQUAL(&ia, &iffp->iff_addr)) { ok = 1; @@ -716,12 +748,13 @@ ripsend(ifcp, sin, flag) if (tobeadv(rrt, ifcp) == 0) continue; /* Only considers the routes with flag if specified */ - if ((flag & RTF_CHANGED) && (rrt->rrt_flags & RTF_CHANGED) == 0) + if ((flag & RRTF_CHANGED) && + (rrt->rrt_rflags & RRTF_CHANGED) == 0) continue; /* Check nexthop */ if (rrt->rrt_index == ifcp->ifc_index && !IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_gw) && - (rrt->rrt_flags & RTF_NH_NOT_LLADDR) == 0) { + (rrt->rrt_rflags & RRTF_NH_NOT_LLADDR) == 0) { if (nh == NULL || !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw)) { if (nrt == maxrte - 2) ripflush(ifcp, sin); @@ -736,7 +769,7 @@ ripsend(ifcp, sin, flag) } } else if (nh && (rrt->rrt_index != ifcp->ifc_index || !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw) || - rrt->rrt_flags & RTF_NH_NOT_LLADDR)) { + rrt->rrt_rflags & RRTF_NH_NOT_LLADDR)) { /* Reset nexthop */ if (nrt == maxrte - 2) ripflush(ifcp, sin); @@ -769,6 +802,10 @@ tobeadv(rrt, ifcp) /* Special care for static routes */ if (rrt->rrt_flags & RTF_STATIC) { + /* XXX don't advertise reject/blackhole routes */ + if (rrt->rrt_flags & (RTF_REJECT | RTF_BLACKHOLE)) + return 0; + if (Sflag) /* Yes, advertise it anyway */ return 1; if (sflag && rrt->rrt_index != ifcp->ifc_index) @@ -794,6 +831,7 @@ sendpacket(sin, len) * RIP6_REQUEST message. SO_DONTROUTE has been specified to * other sockets. */ +#ifdef ADVAPI struct msghdr m; struct cmsghdr *cm; struct iovec iov[2]; @@ -840,6 +878,13 @@ sendpacket(sin, len) trace(1, "sendmsg: %s\n", strerror(errno)); return errno; } +#else + if (sendto(ripsock, ripbuf, len, 0 /*MSG_DONTROUTE*/, + (struct sockaddr *)sin, sizeof(struct sockaddr_in6)) < 0) { + trace(1, "sendto: %s\n", strerror(errno)); + return errno; + } +#endif return 0; } @@ -857,18 +902,24 @@ riprecv() struct netinfo6 *np, *nq; struct riprt *rrt; int len, nn, need_trigger, index; +#ifndef ADVAPI + int flen; +#endif char buf[4 * RIP6_MAXMTU]; time_t t; +#ifdef ADVAPI struct msghdr m; struct cmsghdr *cm; struct iovec iov[2]; u_char cmsgbuf[256]; struct in6_pktinfo *pi; +#endif /*ADVAPI*/ struct iff *iffp; struct in6_addr ia; int ok; need_trigger = 0; +#ifdef ADVAPI m.msg_name = (caddr_t)&fsock; m.msg_namelen = sizeof(fsock); iov[0].iov_base = (caddr_t)buf; @@ -893,6 +944,16 @@ riprecv() } if (index && IN6_IS_ADDR_LINKLOCAL(&fsock.sin6_addr)) SET_IN6_LINKLOCAL_IFINDEX(fsock.sin6_addr, index); +#else + flen = sizeof(struct sockaddr_in6); + if ((len = recvfrom(ripsock, buf, sizeof(buf), 0, + (struct sockaddr *)&fsock, &flen)) < 0) + fatal("recvfrom"); + if (IN6_IS_ADDR_LINKLOCAL(&fsock.sin6_addr)) + index = IN6_LINKLOCAL_IFINDEX(fsock.sin6_addr); + else + index = 0; +#endif /*ADVAPI*/ nh = fsock.sin6_addr; nn = (len - sizeof(struct rip6) + sizeof(struct netinfo6)) / @@ -911,8 +972,8 @@ riprecv() } else { riprequest(NULL, np, nn, &fsock); } - return; - } + return; + } if (!IN6_IS_ADDR_LINKLOCAL(&fsock.sin6_addr)) { trace(1, "Packets from non-ll addr: %s\n", @@ -929,7 +990,7 @@ riprecv() return; /* The packet is from me; ignore */ if (rp->rip6_cmd != RIP6_RESPONSE) { trace(1, "Invalid command %d\n", rp->rip6_cmd); - return; + return; } if (iff_find(ifcp, 'N') != NULL) return; @@ -984,6 +1045,12 @@ riprecv() np->rip6_plen, np->rip6_metric); if (np->rip6_tag) trace(2, " tag=0x%04x", ntohs(np->rip6_tag) & 0xffff); + if (dflag >= 2) { + ia = np->rip6_dest; + applyplen(&ia, np->rip6_plen); + if (!IN6_ARE_ADDR_EQUAL(&ia, &np->rip6_dest)) + trace(2, " [junk outside prefix]"); + } /* Listen-only filter */ ok = 1; /* if there's no L filter, it is ok */ @@ -996,7 +1063,7 @@ riprecv() /* special rule: ::/0 means default, not "in /0" */ if (iffp->iff_plen == 0 && np->rip6_plen > 0) continue; - ia = np->rip6_dest; + ia = np->rip6_dest; applyplen(&ia, iffp->iff_plen); if (IN6_ARE_ADDR_EQUAL(&ia, &iffp->iff_addr)) { ok = 1; @@ -1033,7 +1100,7 @@ riprecv() *nq = *np; addroute(rrt, &nh, ifcp); } - rrt->rrt_flags |= RTF_CHANGED; + rrt->rrt_rflags |= RRTF_CHANGED; rrt->rrt_t = t; need_trigger = 1; } else if (nq->rip6_metric < np->rip6_metric && @@ -1042,7 +1109,7 @@ riprecv() /* Got worse route from same gw */ nq->rip6_metric = np->rip6_metric; rrt->rrt_t = t; - rrt->rrt_flags |= RTF_CHANGED; + rrt->rrt_rflags |= RRTF_CHANGED; need_trigger = 1; } else if (nq->rip6_metric == np->rip6_metric && rrt->rrt_index == ifcp->ifc_index && @@ -1051,7 +1118,7 @@ riprecv() /* same metric, same route from same gw */ rrt->rrt_t = t; } - /* + /* * if nq->rip6_metric == HOPCNT_INFINITY6 then * do not update age value. Do nothing. */ @@ -1059,6 +1126,7 @@ riprecv() /* Got a new valid route */ if ((rrt = MALLOC(struct riprt)) == NULL) fatal("malloc: struct riprt"); + memset(rrt, 0, sizeof(*rrt)); nq = &rrt->rrt_info; rrt->rrt_same = NULL; @@ -1075,7 +1143,7 @@ riprecv() riprt = rrt; /* Update routing table */ addroute(rrt, &nh, ifcp); - rrt->rrt_flags |= RTF_CHANGED; + rrt->rrt_rflags |= RRTF_CHANGED; need_trigger = 1; rrt->rrt_t = t; } @@ -1088,12 +1156,12 @@ riprecv() continue; if (ic->ifc_flags & IFF_UP) ripsend(ic, &ic->ifc_ripsin, - RTF_CHANGED); + RRTF_CHANGED); } } /* Reset the flag */ for (rrt = riprt; rrt; rrt = rrt->rrt_next) - rrt->rrt_flags &= ~RTF_CHANGED; + rrt->rrt_rflags &= ~RRTF_CHANGED; } } @@ -1155,7 +1223,7 @@ riprequest(ifcp, np, nn, sin) } /* Whole routing table dump */ trace(1, "\tRIP Request -- whole routing table\n"); - ripsend(ifcp, sin, RTF_SENDANYWAY); + ripsend(ifcp, sin, RRTF_SENDANYWAY); } /* @@ -1164,6 +1232,66 @@ riprequest(ifcp, np, nn, sin) void ifconfig() { +#ifdef HAVE_GETIFADDRS + struct ifaddrs *ifap, *ifa; + struct ifc *ifcp; + struct ipv6_mreq mreq; + int s; + + if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) + fatal("socket"); + + if (getifaddrs(&ifap) != 0) + fatal("getifaddrs"); + + for (ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr->sa_family != AF_INET6) + continue; + ifcp = ifc_find(ifa->ifa_name); + /* we are interested in multicast-capable interfaces */ + if ((ifa->ifa_flags & IFF_MULTICAST) == 0) + continue; + if (!ifcp) { + /* new interface */ + if ((ifcp = MALLOC(struct ifc)) == NULL) + fatal("malloc: struct ifc"); + memset(ifcp, 0, sizeof(*ifcp)); + ifcp->ifc_index = -1; + ifcp->ifc_next = ifc; + ifc = ifcp; + nifc++; + ifcp->ifc_name = allocopy(ifa->ifa_name); + ifcp->ifc_addr = 0; + ifcp->ifc_filter = 0; + ifcp->ifc_flags = ifa->ifa_flags; + trace(1, "newif %s <%s>\n", ifcp->ifc_name, + ifflags(ifcp->ifc_flags)); + if (!strcmp(ifcp->ifc_name, LOOPBACK_IF)) + loopifcp = ifcp; + } else { + /* update flag, this may be up again */ + if (ifcp->ifc_flags != ifa->ifa_flags) { + trace(1, "%s: <%s> -> ", ifcp->ifc_name, + ifflags(ifcp->ifc_flags)); + trace(1, "<%s>\n", ifflags(ifa->ifa_flags)); + } + ifcp->ifc_flags = ifa->ifa_flags; + } + ifconfig1(ifa->ifa_name, ifa->ifa_addr, ifcp, s); + if ((ifcp->ifc_flags & (IFF_LOOPBACK | IFF_UP)) == IFF_UP + && 0 < ifcp->ifc_index && !ifcp->ifc_joined) { + mreq.ipv6mr_multiaddr = ifcp->ifc_ripsin.sin6_addr; + mreq.ipv6mr_interface = ifcp->ifc_index; + if (setsockopt(ripsock, IPPROTO_IPV6, + IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) < 0) + fatal("IPV6_JOIN_GROUP"); + trace(1, "join %s %s\n", ifcp->ifc_name, RIP6_DEST); + ifcp->ifc_joined++; + } + } + close(s); + freeifaddrs(ifap); +#else int s, i; char *buf; struct ifconf ifconf; @@ -1191,6 +1319,8 @@ ifconfig() fatal("ioctl: SIOCGIFCONF"); i = ifconf.ifc_len; while (1) { + char *newbuf; + ifconf.ifc_buf = buf; ifconf.ifc_len = bufsiz; if (ioctl(s, SIOCGIFCONF, (char *)&ifconf) < 0) @@ -1199,8 +1329,11 @@ ifconfig() break; i = ifconf.ifc_len; bufsiz *= 2; - if ((buf = (char *)realloc(buf, bufsiz)) == NULL) + if ((newbuf = (char *)realloc(buf, bufsiz)) == NULL) { + free(buf); fatal("realloc"); + } + buf = newbuf; } for (i = 0; i < ifconf.ifc_len; ) { ifrp = (struct ifreq *)(buf + i); @@ -1215,7 +1348,8 @@ ifconfig() goto skip; if (!ifcp) { /* new interface */ - ifcp = (struct ifc *)malloc(sizeof(*ifcp)); + if ((ifcp = MALLOC(struct ifc)) == NULL) + fatal("malloc: struct ifc"); memset(ifcp, 0, sizeof(*ifcp)); ifcp->ifc_index = -1; ifcp->ifc_next = ifc; @@ -1238,7 +1372,7 @@ ifconfig() } ifcp->ifc_flags = ifr.ifr_flags; } - ifconfig1(ifrp, ifcp, s); + ifconfig1(ifrp->ifr_name, &ifrp->ifr_addr, ifcp, s); if ((ifcp->ifc_flags & (IFF_LOOPBACK | IFF_UP)) == IFF_UP && 0 < ifcp->ifc_index && !ifcp->ifc_joined) { mreq.ipv6mr_multiaddr = ifcp->ifc_ripsin.sin6_addr; @@ -1258,11 +1392,13 @@ skip: } close(s); free(buf); +#endif } void -ifconfig1(ifrp, ifcp, s) - struct ifreq *ifrp; +ifconfig1(name, sa, ifcp, s) + const char *name; + const struct sockaddr *sa; struct ifc *ifcp; int s; { @@ -1272,9 +1408,9 @@ ifconfig1(ifrp, ifcp, s) int plen; char buf[BUFSIZ]; - sin = (struct sockaddr_in6 *)&ifrp->ifr_addr; + sin = (struct sockaddr_in6 *)sa; ifr.ifr_addr = *sin; - strcpy(ifr.ifr_name, ifrp->ifr_name); + strcpy(ifr.ifr_name, name); if (ioctl(s, SIOCGIFNETMASK_IN6, (char *)&ifr) < 0) fatal("ioctl: SIOCGIFNETMASK_IN6"); plen = mask2len(&ifr.ifr_addr.sin6_addr, 16); @@ -1289,6 +1425,7 @@ ifconfig1(ifrp, ifcp, s) */ if ((ifa = MALLOC(struct ifac)) == NULL) fatal("malloc: struct ifac"); + memset(ifa, 0, sizeof(*ifa)); ifa->ifa_conf = ifcp; ifa->ifa_next = ifcp->ifc_addr; ifcp->ifc_addr = ifa; @@ -1440,7 +1577,7 @@ rtrecv() #if 0 if (rta[RTAX_DST] == NULL) { trace(1, "\tno destination, ignored\n"); - continue; + continue; } if (rta[RTAX_DST]->sin6_family != AF_INET6) { trace(1, "\taf mismatch, ignored\n"); @@ -1586,7 +1723,7 @@ rt_del(sdst, sgw, smask) gw = &in6addr_loopback; prefix = rrt->rrt_info.rip6_plen; } else { - trace(1, "\tunsupported af: (gw=%d, mask=%d)\n", + trace(1, "\tunsupported af: (gw=%d, mask=%d)\n", sgw->sin6_family, smask->sin6_family); return -1; } @@ -1738,20 +1875,39 @@ rt_deladdr(ifcp, sifa, smask) */ void ifrt(ifcp, again) - struct ifc *ifcp; + struct ifc *ifcp; int again; { - struct ifac *ifa; - struct riprt *rrt; - struct netinfo6 *np; + struct ifac *ifa; + struct riprt *rrt; + struct netinfo6 *np; if (ifcp->ifc_flags & IFF_LOOPBACK) return; /* ignore loopback */ + if (ifcp->ifc_flags & IFF_POINTOPOINT) { + ifrt_p2p(ifcp, again); + return; + } + for (ifa = ifcp->ifc_addr; ifa; ifa = ifa->ifa_next) { - if (IN6_IS_ADDR_LINKLOCAL(&ifa->ifa_addr)) - continue; /* don't advertise link local addr */ + if (IN6_IS_ADDR_LINKLOCAL(&ifa->ifa_addr)) { +#if 0 + trace(1, "route: %s on %s: " + "skip linklocal interface address\n", + inet6_n2p(&ifa->ifa_addr), ifcp->ifc_name); +#endif + continue; + } + if (IN6_IS_ADDR_UNSPECIFIED(&ifa->ifa_addr)) { +#if 0 + trace(1, "route: %s: skip unspec interface address\n", + ifcp->ifc_name); +#endif + continue; + } if ((rrt = MALLOC(struct riprt)) == NULL) fatal("malloc: struct riprt"); + memset(rrt, 0, sizeof(*rrt)); rrt->rrt_same = NULL; rrt->rrt_index = ifcp->ifc_index; rrt->rrt_t = 0; /* don't age */ @@ -1764,46 +1920,162 @@ ifrt(ifcp, again) np = &rrt->rrt_info; if (rtsearch(np) == NULL) { /* Attach the route to the list */ + trace(1, "route: %s/%d: register route (%s)\n", + inet6_n2p(&np->rip6_dest), np->rip6_plen, + ifcp->ifc_name); rrt->rrt_next = riprt; riprt = rrt; } else { /* Already found */ if (!again) { - trace(1, "route: %s/%d: already registered\n", - inet6_n2p(&np->rip6_dest), - np->rip6_plen); + trace(1, "route: %s/%d: " + "already registered (%s)\n", + inet6_n2p(&np->rip6_dest), np->rip6_plen, + ifcp->ifc_name); } free(rrt); } + } +} - if (ifcp->ifc_flags & IFF_POINTOPOINT) { +/* + * there are couple of p2p interface routing models. "behavior" lets + * you pick one. it looks that gated behavior fits best with BSDs, + * since BSD kernels does not look at prefix length on p2p interfaces. + */ +void +ifrt_p2p(ifcp, again) + struct ifc *ifcp; + int again; +{ + struct ifac *ifa; + struct riprt *rrt; + struct netinfo6 *np; + struct in6_addr addr, dest; + int advert, ignore, i; +#define P2PADVERT_NETWORK 1 +#define P2PADVERT_ADDR 2 +#define P2PADVERT_DEST 4 +#define P2PADVERT_MAX 4 + const enum { CISCO, GATED, ROUTE6D } behavior = GATED; + const char *category; + const char *noadv; + + for (ifa = ifcp->ifc_addr; ifa; ifa = ifa->ifa_next) { + addr = ifa->ifa_addr; + dest = ifa->ifa_raddr; + applyplen(&addr, ifa->ifa_plen); + applyplen(&dest, ifa->ifa_plen); + advert = ignore = 0; + switch (behavior) { + case CISCO: + /* + * honor addr/plen, just like normal shared medium + * interface. this may cause trouble if you reuse + * addr/plen on other interfaces. + * + * advertise addr/plen. + */ + advert |= P2PADVERT_NETWORK; + break; + case GATED: + /* + * prefixlen on p2p interface is meaningless. + * advertise addr/128 and dest/128. + * + * do not install network route to route6d routing + * table (if we do, it would prevent route installation + * for other p2p interface that shares addr/plen). + */ + advert |= P2PADVERT_ADDR; + advert |= P2PADVERT_DEST; + ignore |= P2PADVERT_NETWORK; + break; + case ROUTE6D: + /* + * just for testing... + */ + if (IN6_ARE_ADDR_EQUAL(&addr, &dest)) + advert |= P2PADVERT_NETWORK; + else { + advert |= P2PADVERT_ADDR; + advert |= P2PADVERT_DEST; + ignore |= P2PADVERT_NETWORK; + } + break; + } + + for (i = 1; i <= P2PADVERT_MAX; i *= 2) { + if ((ignore & i) != 0) + continue; if ((rrt = MALLOC(struct riprt)) == NULL) fatal("malloc: struct riprt"); + memset(rrt, 0, sizeof(*rrt)); rrt->rrt_same = NULL; rrt->rrt_index = ifcp->ifc_index; - rrt->rrt_t = 0; /* Don't age */ - rrt->rrt_info.rip6_dest = ifa->ifa_raddr; + rrt->rrt_t = 0; /* don't age */ + switch (i) { + case P2PADVERT_NETWORK: + rrt->rrt_info.rip6_dest = ifa->ifa_addr; + rrt->rrt_info.rip6_plen = ifa->ifa_plen; + applyplen(&rrt->rrt_info.rip6_dest, + ifa->ifa_plen); + category = "network"; + break; + case P2PADVERT_ADDR: + rrt->rrt_info.rip6_dest = ifa->ifa_addr; + rrt->rrt_info.rip6_plen = 128; + category = "addr"; + break; + case P2PADVERT_DEST: + rrt->rrt_info.rip6_dest = ifa->ifa_raddr; + rrt->rrt_info.rip6_plen = 128; + category = "dest"; + break; + } + if (IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_info.rip6_dest) || + IN6_IS_ADDR_LINKLOCAL(&rrt->rrt_info.rip6_dest)) { +#if 0 + trace(1, "route: %s: skip unspec/linklocal " + "(%s on %s)\n", category, ifcp->ifc_name); +#endif + free(rrt); + continue; + } + if ((advert & i) == 0) { + rrt->rrt_rflags |= RRTF_NOADVERTISE; + noadv = ", NO-ADV"; + } else + noadv = ""; rrt->rrt_info.rip6_tag = htons(routetag & 0xffff); - rrt->rrt_info.rip6_metric = 1; - rrt->rrt_info.rip6_plen = 128; - rrt->rrt_gw = ifa->ifa_addr; - rrt->rrt_flags |= RTF_NOADVERTISE; + rrt->rrt_info.rip6_metric = 1 + ifcp->ifc_metric; + memset(&rrt->rrt_gw, 0, sizeof(struct in6_addr)); np = &rrt->rrt_info; if (rtsearch(np) == NULL) { /* Attach the route to the list */ + trace(1, "route: %s/%d: register route " + "(%s on %s%s)\n", + inet6_n2p(&np->rip6_dest), np->rip6_plen, + category, ifcp->ifc_name, noadv); rrt->rrt_next = riprt; riprt = rrt; } else { /* Already found */ if (!again) { - trace(1, "route: %s/%d: already registered\n", - inet6_n2p(&np->rip6_dest), - np->rip6_plen); + trace(1, "route: %s/%d: " + "already registered (%s on %s%s)\n", + inet6_n2p(&np->rip6_dest), + np->rip6_plen, category, + ifcp->ifc_name, noadv); } free(rrt); } } } +#undef P2PADVERT_NETWORK +#undef P2PADVERT_ADDR +#undef P2PADVERT_DEST +#undef P2PADVERT_MAX } int @@ -1842,7 +2114,11 @@ const char * rttypes(rtm) struct rt_msghdr *rtm; { -#define RTTYPE(s, f) if (rtm->rtm_type == (f)) return (s) +#define RTTYPE(s, f) \ +do { \ + if (rtm->rtm_type == (f)) \ + return (s); \ +} while (0) RTTYPE("ADD", RTM_ADD); RTTYPE("DELETE", RTM_DELETE); RTTYPE("CHANGE", RTM_CHANGE); @@ -1868,7 +2144,11 @@ rtflags(rtm) static char buf[BUFSIZ]; strcpy(buf, ""); -#define RTFLAG(s, f) if (rtm->rtm_flags & (f)) strcat(buf, (s)) +#define RTFLAG(s, f) \ +do { \ + if (rtm->rtm_flags & (f)) \ + strcat(buf, (s)); \ +} while (0) RTFLAG("U", RTF_UP); RTFLAG("G", RTF_GATEWAY); RTFLAG("H", RTF_HOST); @@ -1897,8 +2177,14 @@ ifflags(flags) static char buf[BUFSIZ]; strcpy(buf, ""); -#define IFFLAG(s, f) \ - if (flags & f) { if (buf[0]) strcat(buf, ","); strcat(buf, s); } +#define IFFLAG(s, f) \ +do { \ + if (flags & f) { \ + if (buf[0]) \ + strcat(buf, ","); \ + strcat(buf, s); \ + } \ +} while (0) IFFLAG("UP", IFF_UP); IFFLAG("BROADCAST", IFF_BROADCAST); IFFLAG("DEBUG", IFF_DEBUG); @@ -1979,15 +2265,15 @@ rt_entry(rtm, again) struct sockaddr_in6 *sin6_dst, *sin6_gw, *sin6_mask; struct sockaddr_in6 *sin6_genmask, *sin6_ifp; char *rtmp, *ifname = NULL; - char buf[BUFSIZ]; struct riprt *rrt; struct netinfo6 *np; int s; sin6_dst = sin6_gw = sin6_mask = sin6_genmask = sin6_ifp = 0; if ((rtm->rtm_flags & RTF_UP) == 0 || rtm->rtm_flags & - (RTF_CLONING|RTF_XRESOLVE|RTF_LLINFO|RTF_BLACKHOLE)) + (RTF_CLONING|RTF_XRESOLVE|RTF_LLINFO|RTF_BLACKHOLE)) { return; /* not interested in the link route */ + } rtmp = (char *)(rtm + 1); /* Destination */ if ((rtm->rtm_addrs & RTA_DST) == 0) @@ -2023,6 +2309,7 @@ rt_entry(rtm, again) if ((rrt = MALLOC(struct riprt)) == NULL) fatal("malloc: struct riprt"); + memset(rrt, 0, sizeof(*rrt)); np = &rrt->rrt_info; rrt->rrt_same = NULL; rrt->rrt_t = time(NULL); @@ -2080,11 +2367,14 @@ rt_entry(rtm, again) ifname = index2ifc[s]->ifc_name; else { trace(1, " not configured\n"); + free(rrt); return; } - trace(1, " if %s sock %d\n", ifname, s); + trace(1, " if %s sock %d", ifname, s); rrt->rrt_index = s; + trace(1, "\n"); + /* Check gateway */ if (!IN6_IS_ADDR_LINKLOCAL(&rrt->rrt_gw) && !IN6_IS_ADDR_LOOPBACK(&rrt->rrt_gw) @@ -2092,13 +2382,11 @@ rt_entry(rtm, again) && (rrt->rrt_flags & RTF_LOCAL) == 0 #endif ) { - inet_ntop(AF_INET6, (void *)&rrt->rrt_info.rip6_dest, - buf, sizeof(buf)); trace(0, "***** Gateway %s is not a link-local address.\n", inet6_n2p(&rrt->rrt_gw)); trace(0, "***** dest(%s) if(%s) -- Not optimized.\n", - buf, ifname); - rrt->rrt_flags |= RTF_NH_NOT_LLADDR; + inet6_n2p(&rrt->rrt_info.rip6_dest), ifname); + rrt->rrt_rflags |= RRTF_NH_NOT_LLADDR; } /* Put it to the route list */ @@ -2137,7 +2425,7 @@ addroute(rrt, gw, ifcp) rtm->rtm_version = RTM_VERSION; rtm->rtm_seq = ++seq; rtm->rtm_pid = pid; - rtm->rtm_flags = rrt->rrt_flags & RTF_ROUTE_H; + rtm->rtm_flags = rrt->rrt_flags; rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK; rtm->rtm_rmx.rmx_hopcount = np->rip6_metric - 1; rtm->rtm_inits = RTV_HOPCOUNT; @@ -2439,9 +2727,9 @@ rtdump(sig) fprintf(dump, " tag(0x%04x)", ntohs(rrt->rrt_info.rip6_tag) & 0xffff); } - if (rrt->rrt_flags & RTF_NH_NOT_LLADDR) + if (rrt->rrt_rflags & RRTF_NH_NOT_LLADDR) fprintf(dump, " NOT-LL"); - if (rrt->rrt_flags & RTF_NOADVERTISE) + if (rrt->rrt_rflags & RRTF_NOADVERTISE) fprintf(dump, " NO-ADV"); fprintf(dump, "\n"); } @@ -2519,7 +2807,8 @@ ifonly: rrt->rrt_info.rip6_metric = 1; rrt->rrt_info.rip6_tag = htons(routetag & 0xffff); rrt->rrt_gw = in6addr_loopback; - rrt->rrt_flags = RTF_UP | RTF_REJECT | RTF_AGGREGATE; + rrt->rrt_flags = RTF_UP | RTF_REJECT; + rrt->rrt_rflags = RRTF_AGGREGATE; rrt->rrt_t = 0; rrt->rrt_index = loopifindex; /* Put the route to the list */ @@ -2534,7 +2823,7 @@ ifonly: if (getroute(&rrt->rrt_info, &gw)) { /* * When the address has already been registered in the - * kernel routing table, it should be removed + * kernel routing table, it should be removed */ delroute(&rrt->rrt_info, &gw); } @@ -2592,7 +2881,7 @@ mask2len(addr, lenlim) { int i = 0, j; u_char *p = (u_char *)addr; - + for (j = 0; j < lenlim; j++, p++) { if (*p != 0xff) break; @@ -2600,14 +2889,14 @@ mask2len(addr, lenlim) } if (j < lenlim) { switch (*p) { -#define MASKLEN(m, l) case m: i += l; break - MASKLEN(0xfe, 7); - MASKLEN(0xfc, 6); - MASKLEN(0xf8, 5); - MASKLEN(0xf0, 4); - MASKLEN(0xe0, 3); - MASKLEN(0xc0, 2); - MASKLEN(0x80, 1); +#define MASKLEN(m, l) case m: do { i += l; break; } while (0) + MASKLEN(0xfe, 7); break; + MASKLEN(0xfc, 6); break; + MASKLEN(0xf8, 5); break; + MASKLEN(0xf0, 4); break; + MASKLEN(0xe0, 3); break; + MASKLEN(0xc0, 2); break; + MASKLEN(0x80, 1); break; #undef MASKLEN } } @@ -2716,7 +3005,7 @@ ripsuptrig() time_t t; double r = rand(); - t = (int)(RIP_TRIG_INT6_MIN + + t = (int)(RIP_TRIG_INT6_MIN + (RIP_TRIG_INT6_MAX - RIP_TRIG_INT6_MIN) * (r / RAND_MAX )); sup_trig_update = time(NULL) + t; return t; @@ -2852,6 +3141,7 @@ setindex2ifc(index, ifcp) struct ifc *ifcp; { int n; + struct ifc **p; if (!index2ifc) { nindex2ifc = 5; /*initial guess*/ @@ -2865,10 +3155,11 @@ setindex2ifc(index, ifcp) while (nindex2ifc <= index) nindex2ifc *= 2; if (n != nindex2ifc) { - index2ifc = (struct ifc **) - realloc(index2ifc, sizeof(*index2ifc) * nindex2ifc); - if (index2ifc == NULL) + p = (struct ifc **)realloc(index2ifc, + sizeof(*index2ifc) * nindex2ifc); + if (p == NULL) fatal("realloc"); + index2ifc = p; } index2ifc[index] = ifcp; } diff --git a/usr.sbin/route6d/route6d.h b/usr.sbin/route6d/route6d.h index 7808c04..b3a353f 100644 --- a/usr.sbin/route6d/route6d.h +++ b/usr.sbin/route6d/route6d.h @@ -1,11 +1,10 @@ -/* - * $Header: /cvsroot/kame/kame/kame/kame/route6d/route6d.h,v 1.1.1.1 1999/08/08 23:31:35 itojun Exp $ - */ +/* $FreeBSD$ */ +/* $KAME: route6d.h,v 1.3 2000/02/25 06:15:06 itojun Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -17,7 +16,7 @@ * 3. Neither the name of the project 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 PROJECT 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 @@ -29,15 +28,13 @@ * 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. - * - * $FreeBSD$ */ -/* not yet in use +/* not yet in use #define ROUTE6D_CONF "/usr/local/v6/etc/route6d.conf" */ -#define ROUTE6D_DUMP "/var/tmp/route6d_dump" +#define ROUTE6D_DUMP "/var/run/route6d_dump" #define ROUTE6D_PID "/var/run/route6d.pid" #define RIP6_VERSION 1 |