summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtsold/rtsold.c
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2011-09-12 23:55:23 +0000
committerhrs <hrs@FreeBSD.org>2011-09-12 23:55:23 +0000
commit06dd2030acf84db5a0d9e068e527ed1d2545df04 (patch)
tree66c57b6682385a59e22654da89d3b115c812a6c3 /usr.sbin/rtsold/rtsold.c
parent2652dfc6f92bbcd0c714b04442954911f1e5377a (diff)
downloadFreeBSD-src-06dd2030acf84db5a0d9e068e527ed1d2545df04.zip
FreeBSD-src-06dd2030acf84db5a0d9e068e527ed1d2545df04.tar.gz
- Add ":origin" label to the interface id for resolvconf(8). (r223149)
- Add -u option to enable adding :[RA-source-address] to the interface id. (r223149) - s/INET6_ADDRSTRLEN/sizeof(ntopbuf)/ (r223149) - Fix a bug that can prevent -D from being overridden by -d. (r223149) - /-P pidfile/-p pidfile/ for consistency with rtadvd(8). (r223149) - Fix -F flag handling to support receiving RAs even when ip6.forwarding=1. (r225150) Approved by: re (kib)
Diffstat (limited to 'usr.sbin/rtsold/rtsold.c')
-rw-r--r--usr.sbin/rtsold/rtsold.c49
1 files changed, 43 insertions, 6 deletions
diff --git a/usr.sbin/rtsold/rtsold.c b/usr.sbin/rtsold/rtsold.c
index 94046a1..7df0ec6 100644
--- a/usr.sbin/rtsold/rtsold.c
+++ b/usr.sbin/rtsold/rtsold.c
@@ -75,6 +75,7 @@ static int fflag = 0;
int Fflag = 0; /* force setting sysctl parameters */
int aflag = 0;
int dflag = 0;
+int uflag = 0;
const char *otherconf_script;
const char *resolvconf_script = "/sbin/resolvconf";
@@ -129,10 +130,10 @@ main(int argc, char **argv)
#ifndef SMALL
/* rtsold */
- opts = "adDfFm1O:P:R:";
+ opts = "adDfFm1O:p:R:u";
#else
/* rtsol */
- opts = "adDFO:P:R:";
+ opts = "adDFO:R:u";
fflag = 1;
once = 1;
#endif
@@ -144,10 +145,10 @@ main(int argc, char **argv)
aflag = 1;
break;
case 'd':
- dflag = 1;
+ dflag += 1;
break;
case 'D':
- dflag = 2;
+ dflag += 2;
break;
case 'f':
fflag = 1;
@@ -164,12 +165,15 @@ main(int argc, char **argv)
case 'O':
otherconf_script = optarg;
break;
- case 'P':
+ case 'p':
pidfilename = optarg;
break;
case 'R':
resolvconf_script = optarg;
break;
+ case 'u':
+ uflag = 1;
+ break;
default:
usage();
exit(1);
@@ -184,8 +188,13 @@ main(int argc, char **argv)
}
/* set log level */
- if (dflag == 0)
+ if (dflag > 1)
+ log_upto = LOG_DEBUG;
+ else if (dflag > 0)
+ log_upto = LOG_INFO;
+ else
log_upto = LOG_NOTICE;
+
if (!fflag) {
char *ident;
@@ -216,6 +225,7 @@ main(int argc, char **argv)
srandom((u_long)time(NULL));
#endif
+#if (__FreeBSD_version < 900000)
if (Fflag) {
setinet6sysctl(IPV6CTL_FORWARDING, 0);
} else {
@@ -223,6 +233,7 @@ main(int argc, char **argv)
if (getinet6sysctl(IPV6CTL_FORWARDING))
warnx("kernel is configured as a router, not a host");
}
+#endif
#ifndef SMALL
/* initialization to dump internal status to a file */
@@ -402,6 +413,32 @@ ifconfig(char *ifname)
return (-1);
}
+ if (Fflag) {
+ struct in6_ndireq nd;
+ int s;
+
+ if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
+ warnmsg(LOG_ERR, __func__, "socket() failed.");
+ return (-1);
+ }
+ memset(&nd, 0, sizeof(nd));
+ strlcpy(nd.ifname, ifname, sizeof(nd.ifname));
+ if (ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&nd) < 0) {
+ warnmsg(LOG_ERR, __func__,
+ "cannot get accept_rtadv flag");
+ close(s);
+ return (-1);
+ }
+ nd.ndi.flags |= ND6_IFF_ACCEPT_RTADV;
+ if (ioctl(s, SIOCSIFINFO_IN6, (caddr_t)&nd) < 0) {
+ warnmsg(LOG_ERR, __func__,
+ "cannot set accept_rtadv flag");
+ close(s);
+ return (-1);
+ }
+ close(s);
+ }
+
if ((ifi = malloc(sizeof(*ifi))) == NULL) {
warnmsg(LOG_ERR, __func__, "memory allocation failed");
free(sdl);
OpenPOWER on IntegriCloud