sync with more recent kame.

- fix memory leak with realloc()
- warn if we see packets with junk outside of IPv6 prefix length
- cosmetic
This commit is contained in:
itojun 2000-07-09 03:06:18 +00:00
parent 18c0283349
commit f85b415274
2 changed files with 81 additions and 37 deletions

View File

@ -1,5 +1,5 @@
.\" $NetBSD: route6d.8,v 1.6 2000/05/16 14:04:32 itojun Exp $
.\" $KAME: route6d.8,v 1.6 2000/05/13 01:29:47 itojun Exp $
.\" $NetBSD: route6d.8,v 1.7 2000/07/09 03:06:18 itojun Exp $
.\" $KAME: route6d.8,v 1.8 2000/05/31 17:00:09 itojun Exp $
.\"
.\" Copyright (c) 1996 WIDE Project. All rights reserved.
.\"
@ -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

View File

@ -1,5 +1,5 @@
/* $NetBSD: route6d.c,v 1.13 2000/05/18 13:23:43 itojun Exp $ */
/* $KAME: route6d.c,v 1.25 2000/05/17 09:05:36 itojun Exp $ */
/* $NetBSD: route6d.c,v 1.14 2000/07/09 03:06:18 itojun Exp $ */
/* $KAME: route6d.c,v 1.30 2000/06/04 06:48:03 itojun Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: route6d.c,v 1.13 2000/05/18 13:23:43 itojun Exp $");
__RCSID("$NetBSD: route6d.c,v 1.14 2000/07/09 03:06:18 itojun Exp $");
#endif
#include <stdio.h>
@ -182,7 +182,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];
@ -277,6 +277,7 @@ main(argc, argv)
sigset_t mask, omask;
FILE *pidfile;
char *progname;
char *ep;
progname = strrchr(*argv, '/');
if (progname)
@ -292,35 +293,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;
@ -583,7 +590,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
@ -611,7 +619,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));
@ -1038,6 +1046,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 */
@ -2101,7 +2115,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);
@ -2127,7 +2145,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);
@ -2156,8 +2178,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);
@ -2862,14 +2890,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
}
}
@ -3114,6 +3142,7 @@ setindex2ifc(index, ifcp)
struct ifc *ifcp;
{
int n;
struct ifc **p;
if (!index2ifc) {
nindex2ifc = 5; /*initial guess*/
@ -3127,10 +3156,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;
}