add -a flag: automatically probe an interface, works only if there's
only single external non-p2p interface. idea from thopej. $KAME$. (sync with kame)
This commit is contained in:
parent
4915bd101e
commit
ba6d02ed0c
|
@ -1,4 +1,5 @@
|
||||||
/* $NetBSD: dump.c,v 1.2 2000/02/25 09:19:07 itojun Exp $ */
|
/* $NetBSD: dump.c,v 1.3 2000/08/13 06:20:02 itojun Exp $ */
|
||||||
|
/* $KAME: dump.c,v 1.7 2000/08/13 06:14:59 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1999 WIDE Project.
|
* Copyright (C) 1999 WIDE Project.
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/* $NetBSD: if.c,v 1.5 2000/02/25 09:19:07 itojun Exp $ */
|
/* $NetBSD: if.c,v 1.6 2000/08/13 06:20:02 itojun Exp $ */
|
||||||
|
/* $KAME: if.c,v 1.13 2000/08/13 06:14:59 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/queue.h>
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/* $NetBSD: probe.c,v 1.4 2000/02/28 07:20:43 itojun Exp $ */
|
/* $NetBSD: probe.c,v 1.5 2000/08/13 06:20:02 itojun Exp $ */
|
||||||
|
/* $KAME: probe.c,v 1.10 2000/08/13 06:14:59 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1998 WIDE Project.
|
* Copyright (C) 1998 WIDE Project.
|
||||||
|
@ -34,6 +35,7 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
|
#include <sys/queue.h>
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/* $NetBSD: rtsol.c,v 1.6 2000/02/28 07:20:44 itojun Exp $ */
|
/* $NetBSD: rtsol.c,v 1.7 2000/08/13 06:20:03 itojun Exp $ */
|
||||||
|
/* $KAME: rtsol.c,v 1.11 2000/08/13 06:14:59 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/queue.h>
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
.\" $NetBSD: rtsold.8,v 1.8 2000/08/13 06:20:03 itojun Exp $
|
||||||
|
.\" $KAME: rtsold.8,v 1.12 2000/08/13 06:17:59 itojun Exp $
|
||||||
|
.\"
|
||||||
.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||||
.\" All rights reserved.
|
.\" All rights reserved.
|
||||||
.\"
|
.\"
|
||||||
.\" Redistribution and use in source and binary forms, with or without
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
.\" modification, are permitted provided that the following conditions
|
.\" modification, are permitted provided that the following conditions
|
||||||
.\" are met:
|
.\" are met:
|
||||||
|
@ -12,7 +15,7 @@
|
||||||
.\" 3. Neither the name of the project nor the names of its contributors
|
.\" 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
|
.\" may be used to endorse or promote products derived from this software
|
||||||
.\" without specific prior written permission.
|
.\" without specific prior written permission.
|
||||||
.\"
|
.\"
|
||||||
.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
||||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
@ -25,9 +28,6 @@
|
||||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.\" $NetBSD: rtsold.8,v 1.7 2000/01/02 06:30:15 itojun Exp $
|
|
||||||
.\" KAME Id: rtsold.8,v 1.8 2000/01/02 06:25:14 itojun Exp
|
|
||||||
.\"
|
|
||||||
.Dd May 17, 1998
|
.Dd May 17, 1998
|
||||||
.Dt RTSOLD 8
|
.Dt RTSOLD 8
|
||||||
.Os
|
.Os
|
||||||
|
@ -40,12 +40,18 @@
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl dDfm1
|
.Op Fl dDfm1
|
||||||
.Ar interface ...
|
.Ar interface ...
|
||||||
|
.Nm ""
|
||||||
|
.Op Fl dDfm1
|
||||||
|
.Fl a
|
||||||
.Nm rtsol
|
.Nm rtsol
|
||||||
.Op Fl dD
|
.Op Fl dD
|
||||||
.Ar interface ...
|
.Ar interface ...
|
||||||
|
.Nm rtsol
|
||||||
|
.Op Fl dD
|
||||||
|
.Fl a
|
||||||
.\"
|
.\"
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
.Nm Rtsold
|
.Nm
|
||||||
is the daemon program to send ICMPv6 Router Solicitation messages
|
is the daemon program to send ICMPv6 Router Solicitation messages
|
||||||
on the specified interfaces.
|
on the specified interfaces.
|
||||||
If a node (re)attaches to a link,
|
If a node (re)attaches to a link,
|
||||||
|
@ -80,7 +86,7 @@ Just after invocation of
|
||||||
daemon.
|
daemon.
|
||||||
.It
|
.It
|
||||||
The interface is up after a temporary interface failure.
|
The interface is up after a temporary interface failure.
|
||||||
.Nm Rtsold
|
.Nm
|
||||||
detects such failures by periodically probing to see if the status
|
detects such failures by periodically probing to see if the status
|
||||||
of the interface is active or not.
|
of the interface is active or not.
|
||||||
Note that some network cards and drivers do not allow the extraction
|
Note that some network cards and drivers do not allow the extraction
|
||||||
|
@ -122,6 +128,15 @@ will dump the current internal state into
|
||||||
.\"
|
.\"
|
||||||
.Sh OPTIONS
|
.Sh OPTIONS
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
.It Fl a
|
||||||
|
Autoprobe outgoing interface.
|
||||||
|
.Nm
|
||||||
|
will try to find a non-loopback, non-p2p and IPv6-capable, interface.
|
||||||
|
If
|
||||||
|
.Nm
|
||||||
|
finds multiple interfaces, it will fail.
|
||||||
|
This is because IPv6 specification talks about single interface node,
|
||||||
|
in autoconfiguration spec.
|
||||||
.\"
|
.\"
|
||||||
.It Fl d
|
.It Fl d
|
||||||
Enable debugging.
|
Enable debugging.
|
||||||
|
@ -177,5 +192,16 @@ command, which first appeared in WIDE/KAME IPv6 protocol stack kit.
|
||||||
.Nm rtsol
|
.Nm rtsol
|
||||||
is now integrated into
|
is now integrated into
|
||||||
.Xr rtsold 8 .
|
.Xr rtsold 8 .
|
||||||
.\" .Sh BUGS
|
.\"
|
||||||
.\" (to be written)
|
.Sh BUGS
|
||||||
|
In some operating systems, when a PCMCIA network card is removed
|
||||||
|
and reinserted, the corresponding interface index is changed.
|
||||||
|
However,
|
||||||
|
.Nm
|
||||||
|
does not assume such changes, and always uses the index that
|
||||||
|
it got at invocation. As a result,
|
||||||
|
.Nm
|
||||||
|
may not work if you reinsert a network card.
|
||||||
|
In such a case,
|
||||||
|
.Nm
|
||||||
|
should be killed and restarted.
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/* $NetBSD: rtsold.c,v 1.6 2000/02/25 09:19:08 itojun Exp $ */
|
/* $NetBSD: rtsold.c,v 1.7 2000/08/13 06:20:03 itojun Exp $ */
|
||||||
|
/* $KAME: rtsold.c,v 1.22 2000/08/13 06:14:59 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||||
|
@ -48,11 +49,13 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
#include "rtsold.h"
|
#include "rtsold.h"
|
||||||
|
|
||||||
struct ifinfo *iflist;
|
struct ifinfo *iflist;
|
||||||
struct timeval tm_max = {0x7fffffff, 0x7fffffff};
|
struct timeval tm_max = {0x7fffffff, 0x7fffffff};
|
||||||
int dflag;
|
int aflag = 0;
|
||||||
|
int dflag = 0;
|
||||||
static int log_upto = 999;
|
static int log_upto = 999;
|
||||||
static int fflag = 0;
|
static int fflag = 0;
|
||||||
|
|
||||||
|
@ -99,6 +102,7 @@ static void TIMEVAL_SUB __P((struct timeval *a, struct timeval *b,
|
||||||
|
|
||||||
static void rtsold_set_dump_file __P((void));
|
static void rtsold_set_dump_file __P((void));
|
||||||
static void usage __P((char *progname));
|
static void usage __P((char *progname));
|
||||||
|
static char **autoifprobe __P((void));
|
||||||
|
|
||||||
int
|
int
|
||||||
main(argc, argv)
|
main(argc, argv)
|
||||||
|
@ -121,35 +125,60 @@ main(argc, argv)
|
||||||
if (argv0 && argv0[strlen(argv0) - 1] != 'd') {
|
if (argv0 && argv0[strlen(argv0) - 1] != 'd') {
|
||||||
fflag = 1;
|
fflag = 1;
|
||||||
once = 1;
|
once = 1;
|
||||||
opts = "dD";
|
opts = "adD";
|
||||||
} else
|
} else
|
||||||
opts = "dDfm1";
|
opts = "adDfm1";
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, opts)) != -1) {
|
while ((ch = getopt(argc, argv, opts)) != -1) {
|
||||||
switch(ch) {
|
switch (ch) {
|
||||||
case 'd':
|
case 'a':
|
||||||
dflag = 1;
|
aflag = 1;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'd':
|
||||||
dflag = 2;
|
dflag = 1;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'D':
|
||||||
fflag = 1;
|
dflag = 2;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'f':
|
||||||
mobile_node = 1;
|
fflag = 1;
|
||||||
break;
|
break;
|
||||||
case '1':
|
case 'm':
|
||||||
once = 1;
|
mobile_node = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
case '1':
|
||||||
usage(argv0);
|
once = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(argv0);
|
||||||
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
if (argc == 0)
|
|
||||||
|
if (aflag) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (argc != 0) {
|
||||||
|
usage(argv0);
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
|
argv = autoifprobe();
|
||||||
|
if (!argv) {
|
||||||
|
errx(1, "could not autoprobe interface");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; argv[i]; i++)
|
||||||
|
;
|
||||||
|
argc = i;
|
||||||
|
}
|
||||||
|
if (argc == 0) {
|
||||||
usage(argv0);
|
usage(argv0);
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
/* set log level */
|
/* set log level */
|
||||||
if (dflag == 0)
|
if (dflag == 0)
|
||||||
|
@ -176,29 +205,39 @@ main(argc, argv)
|
||||||
warnx("kernel is configured not to accept RAs");
|
warnx("kernel is configured not to accept RAs");
|
||||||
|
|
||||||
/* initialization to dump internal status to a file */
|
/* initialization to dump internal status to a file */
|
||||||
if (signal(SIGUSR1, (void *)rtsold_set_dump_file) < 0)
|
if (signal(SIGUSR1, (void *)rtsold_set_dump_file) < 0) {
|
||||||
errx(1, "failed to set signal for dump status");
|
errx(1, "failed to set signal for dump status");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open a socket for sending RS and receiving RA.
|
* Open a socket for sending RS and receiving RA.
|
||||||
* This should be done before calling ifinit(), since the function
|
* This should be done before calling ifinit(), since the function
|
||||||
* uses the socket.
|
* uses the socket.
|
||||||
*/
|
*/
|
||||||
if ((s = sockopen()) < 0)
|
if ((s = sockopen()) < 0) {
|
||||||
errx(1, "failed to open a socket");
|
errx(1, "failed to open a socket");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
/* configuration per interface */
|
/* configuration per interface */
|
||||||
if (ifinit())
|
if (ifinit()) {
|
||||||
errx(1, "failed to initilizatoin interfaces");
|
errx(1, "failed to initilizatoin interfaces");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
while (argc--) {
|
while (argc--) {
|
||||||
if (ifconfig(*argv))
|
if (ifconfig(*argv)) {
|
||||||
errx(1, "failed to initialize %s", *argv);
|
errx(1, "failed to initialize %s", *argv);
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup for probing default routers */
|
/* setup for probing default routers */
|
||||||
if (probe_init())
|
if (probe_init()) {
|
||||||
errx(1, "failed to setup for probing routers");
|
errx(1, "failed to setup for probing routers");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
if (!fflag)
|
if (!fflag)
|
||||||
daemon(0, 0); /* act as a daemon */
|
daemon(0, 0); /* act as a daemon */
|
||||||
|
@ -432,7 +471,7 @@ rtsol_check_timer()
|
||||||
"state = %d", ifinfo->ifname,
|
"state = %d", ifinfo->ifname,
|
||||||
ifinfo->state);
|
ifinfo->state);
|
||||||
|
|
||||||
switch(ifinfo->state) {
|
switch (ifinfo->state) {
|
||||||
case IFS_DOWN:
|
case IFS_DOWN:
|
||||||
case IFS_TENTATIVE:
|
case IFS_TENTATIVE:
|
||||||
/* interface_up returns 0 on success */
|
/* interface_up returns 0 on success */
|
||||||
|
@ -630,10 +669,13 @@ rtsold_set_dump_file()
|
||||||
static void
|
static void
|
||||||
usage(char *progname)
|
usage(char *progname)
|
||||||
{
|
{
|
||||||
if (progname && progname[strlen(progname) - 1] != 'd')
|
if (progname && progname[strlen(progname) - 1] != 'd') {
|
||||||
fprintf(stderr, "usage: rtsol [-dD] interfaces\n");
|
fprintf(stderr, "usage: rtsol [-dD] interfaces...\n");
|
||||||
else
|
fprintf(stderr, "usage: rtsol [-dD] -a\n");
|
||||||
fprintf(stderr, "usage: rtsold [-dDfm1] interfaces\n");
|
} else {
|
||||||
|
fprintf(stderr, "usage: rtsold [-adDfm1] interfaces...\n");
|
||||||
|
fprintf(stderr, "usage: rtsold [-dDfm1] -a\n");
|
||||||
|
}
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -663,3 +705,58 @@ warnmsg(priority, func, msg, va_alist)
|
||||||
}
|
}
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char **
|
||||||
|
autoifprobe()
|
||||||
|
{
|
||||||
|
static char ifname[IFNAMSIZ + 1];
|
||||||
|
static char *argv[2];
|
||||||
|
struct ifaddrs *ifap, *ifa, *target;
|
||||||
|
|
||||||
|
if (getifaddrs(&ifap) != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
target = NULL;
|
||||||
|
/* find an ethernet */
|
||||||
|
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||||
|
if ((ifa->ifa_flags & IFF_UP) == 0)
|
||||||
|
continue;
|
||||||
|
if ((ifa->ifa_flags & IFF_POINTOPOINT) != 0)
|
||||||
|
continue;
|
||||||
|
if ((ifa->ifa_flags & IFF_LOOPBACK) != 0)
|
||||||
|
continue;
|
||||||
|
if ((ifa->ifa_flags & IFF_MULTICAST) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ifa->ifa_addr->sa_family != AF_INET6)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (target && strcmp(target->ifa_name, ifa->ifa_name) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!target)
|
||||||
|
target = ifa;
|
||||||
|
else {
|
||||||
|
/* if we find multiple candidates, failure. */
|
||||||
|
if (dflag > 1)
|
||||||
|
warnx("multiple interfaces found");
|
||||||
|
target = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
strncpy(ifname, target->ifa_name, sizeof(ifname) - 1);
|
||||||
|
ifname[sizeof(ifname) - 1] = '\0';
|
||||||
|
argv[0] = ifname;
|
||||||
|
argv[1] = NULL;
|
||||||
|
|
||||||
|
if (dflag > 0)
|
||||||
|
warnx("probing %s", argv[0]);
|
||||||
|
}
|
||||||
|
freeifaddrs(ifap);
|
||||||
|
if (target)
|
||||||
|
return argv;
|
||||||
|
else
|
||||||
|
return (char **)NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/* $NetBSD: rtsold.h,v 1.4 2000/02/25 09:19:10 itojun Exp $ */
|
/* $NetBSD: rtsold.h,v 1.5 2000/08/13 06:20:03 itojun Exp $ */
|
||||||
|
/* $KAME: rtsold.h,v 1.9 2000/08/13 06:15:00 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||||
|
|
Loading…
Reference in New Issue