Module Name: src Committed By: martin Date: Mon Nov 11 19:49:11 UTC 2019
Modified Files: src/usr.sbin/rtadvd [netbsd-9]: config.c rtadvd.8 rtadvd.c rtadvd.h Log Message: Pull up following revision(s) (requested by roy in ticket #417): usr.sbin/rtadvd/rtadvd.c: revision 1.70 usr.sbin/rtadvd/rtadvd.c: revision 1.71 usr.sbin/rtadvd/rtadvd.h: revision 1.20 usr.sbin/rtadvd/config.c: revision 1.42 usr.sbin/rtadvd/config.c: revision 1.43 usr.sbin/rtadvd/rtadvd.8: revision 1.27 rtadvd: Fix reloading configuration killing interface timers rtadvd: remove support for SIOCSIFINFO_IN6 It's been broken since we enabled dropping privs. It's also probably the wrong place to do this, and support for SIOCSIFINFO_IN6 will be in the next dhcpcd import. rtadvd: Add C flag to control the zeroing of the leaving configuration This is only intended to assist the testing of clients which consume Router Advertisement messages, such as dhcpcd(8). To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.41.2.1 src/usr.sbin/rtadvd/config.c cvs rdiff -u -r1.26 -r1.26.6.1 src/usr.sbin/rtadvd/rtadvd.8 cvs rdiff -u -r1.69 -r1.69.2.1 src/usr.sbin/rtadvd/rtadvd.c cvs rdiff -u -r1.19 -r1.19.4.1 src/usr.sbin/rtadvd/rtadvd.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/rtadvd/config.c diff -u src/usr.sbin/rtadvd/config.c:1.41 src/usr.sbin/rtadvd/config.c:1.41.2.1 --- src/usr.sbin/rtadvd/config.c:1.41 Fri Jun 14 09:06:45 2019 +++ src/usr.sbin/rtadvd/config.c Mon Nov 11 19:49:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: config.c,v 1.41 2019/06/14 09:06:45 roy Exp $ */ +/* $NetBSD: config.c,v 1.41.2.1 2019/11/11 19:49:11 martin Exp $ */ /* $KAME: config.c,v 1.93 2005/10/17 14:40:02 suz Exp $ */ /* @@ -507,34 +507,6 @@ getconfig(const char *intface, int exith goto errexit; } -#ifdef SIOCSIFINFO_IN6 - { - struct in6_ndireq ndi; - int s; - - if ((s = prog_socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { - logit(LOG_ERR, "<%s> socket: %m", __func__); - goto errexit; - } - memset(&ndi, 0, sizeof(ndi)); - strncpy(ndi.ifname, intface, IFNAMSIZ); - if (prog_ioctl(s, SIOCGIFINFO_IN6, &ndi) < 0) { - logit(LOG_INFO, "<%s> ioctl:SIOCGIFINFO_IN6 at %s: %m", - __func__, intface); - } - - /* reflect the RA info to the host variables in kernel */ - ndi.ndi.chlim = tmp->hoplimit; - ndi.ndi.retrans = tmp->retranstimer; - ndi.ndi.basereachable = tmp->reachabletime; - if (prog_ioctl(s, SIOCSIFINFO_IN6, &ndi) < 0) { - logit(LOG_INFO, "<%s> ioctl:SIOCSIFINFO_IN6 at %s: %m", - __func__, intface); - } - prog_close(s); - } -#endif - /* route information */ for (i = -1; i < MAXROUTE; i++) { struct rtinfo *rti; @@ -747,6 +719,11 @@ getconfig(const char *intface, int exith TAILQ_FOREACH(rai, &ralist, next) { if (rai->ifindex == tmp->ifindex) { TAILQ_REMOVE(&ralist, rai, next); + if (Cflag) { + free_rainfo(rai); + rai = NULL; + break; + } /* If we already have a leaving RA use that * as this config hasn't been advertised */ if (rai->leaving) { Index: src/usr.sbin/rtadvd/rtadvd.8 diff -u src/usr.sbin/rtadvd/rtadvd.8:1.26 src/usr.sbin/rtadvd/rtadvd.8:1.26.6.1 --- src/usr.sbin/rtadvd/rtadvd.8:1.26 Mon Nov 6 15:15:04 2017 +++ src/usr.sbin/rtadvd/rtadvd.8 Mon Nov 11 19:49:11 2019 @@ -1,4 +1,4 @@ -.\" $NetBSD: rtadvd.8,v 1.26 2017/11/06 15:15:04 christos Exp $ +.\" $NetBSD: rtadvd.8,v 1.26.6.1 2019/11/11 19:49:11 martin Exp $ .\" $KAME: rtadvd.8,v 1.24 2002/05/31 16:16:08 jinmei Exp $ .\" .\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -28,7 +28,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd November 6, 2017 +.Dd November 11, 2019 .Dt RTADVD 8 .Os .Sh NAME @@ -36,7 +36,7 @@ .Nd router advertisement daemon .Sh SYNOPSIS .Nm -.Op Fl DdfRs +.Op Fl CDdfRs .Op Fl c Ar configfile .Op Fl M Ar ifname .Op Fl p Ar pidfile @@ -112,6 +112,10 @@ advertising interface. The command line options are: .Bl -tag -width indent .\" +.It Fl C +Don't expire the existing configuration on receipt of SIGHUP. +This option is only intended to aid the testing of clients that consume +Router Advertisement messages. .It Fl c Ar configfile Specify an alternate location, .Ar configfile , @@ -175,7 +179,9 @@ to reload the configuration file .Pa /etc/rtadvd.conf . If an invalid parameter is found in the configuration file upon the reload, the entry will be ignored and the old configuration will be used. -When parameters in an existing entry are updated, +When parameters in an existing entry are updated and the +.Fl C +flag is not used, .Nm will send Router Advertisement messages with the old configuration but zero router lifetime to the interface first, and then start to send a new message. Index: src/usr.sbin/rtadvd/rtadvd.c diff -u src/usr.sbin/rtadvd/rtadvd.c:1.69 src/usr.sbin/rtadvd/rtadvd.c:1.69.2.1 --- src/usr.sbin/rtadvd/rtadvd.c:1.69 Fri Mar 29 21:51:52 2019 +++ src/usr.sbin/rtadvd/rtadvd.c Mon Nov 11 19:49:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rtadvd.c,v 1.69 2019/03/29 21:51:52 christos Exp $ */ +/* $NetBSD: rtadvd.c,v 1.69.2.1 2019/11/11 19:49:11 martin Exp $ */ /* $KAME: rtadvd.c,v 1.92 2005/10/17 14:40:02 suz Exp $ */ /* @@ -89,7 +89,7 @@ static char *mcastif; int sock; int rtsock = -1; int accept_rr = 0; -int dflag = 0, sflag = 0, Dflag; +int Cflag = 0, dflag = 0, sflag = 0, Dflag; static char **if_argv; static int if_argc; @@ -194,6 +194,9 @@ main(int argc, char *argv[]) case 'c': conffile = optarg; break; + case 'C': + Cflag++; + break; case 'd': dflag++; break; @@ -452,6 +455,18 @@ die(void) } static void +ra_timer_reset(struct rainfo *rai) +{ + + rtadvd_remove_timer(&rai->timer); + rai->timer = rtadvd_add_timer(ra_timeout, ra_timer_update, rai, rai); + ra_timer_update(rai, &rai->timer->tm); + rtadvd_set_timer(&rai->timer->tm, rai->timer); + rtadvd_remove_timer(&rai->timer_sol); + rai->timer_sol = rtadvd_add_timer(ra_timeout_sol, NULL, rai, NULL); +} + +static void rtmsg_input(void) { int n, type, ifindex = 0, plen; @@ -698,14 +713,7 @@ rtmsg_input(void) rai->initcounter = 0; /* reset the counter */ rai->waiting = 0; /* XXX */ - rtadvd_remove_timer(&rai->timer); - rai->timer = rtadvd_add_timer(ra_timeout, - ra_timer_update, rai, rai); - ra_timer_update(rai, &rai->timer->tm); - rtadvd_set_timer(&rai->timer->tm, rai->timer); - rtadvd_remove_timer(&rai->timer_sol); - rai->timer_sol = rtadvd_add_timer(ra_timeout_sol, - NULL, rai, NULL); + ra_timer_reset(rai); } else if (prefixchange && rai->ifflags & IFF_UP) { /* * An advertised prefix has been added or invalidated. @@ -1760,10 +1768,7 @@ ra_output(struct rainfo *rai, bool solic "%s: expired RA," " new config active for interface (%s)", __func__, rai->ifname); - rai->leaving_for->timer = rtadvd_add_timer(ra_timeout, - ra_timer_update, - rai->leaving_for, rai->leaving_for); - ra_timer_set_short_delay(rai->leaving_for, rai->timer); + ra_timer_reset(rai->leaving_for); rai->leaving_for->leaving = NULL; free_rainfo(rai); return NULL; Index: src/usr.sbin/rtadvd/rtadvd.h diff -u src/usr.sbin/rtadvd/rtadvd.h:1.19 src/usr.sbin/rtadvd/rtadvd.h:1.19.4.1 --- src/usr.sbin/rtadvd/rtadvd.h:1.19 Fri Apr 20 16:37:17 2018 +++ src/usr.sbin/rtadvd/rtadvd.h Mon Nov 11 19:49:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rtadvd.h,v 1.19 2018/04/20 16:37:17 roy Exp $ */ +/* $NetBSD: rtadvd.h,v 1.19.4.1 2019/11/11 19:49:11 martin Exp $ */ /* $KAME: rtadvd.h,v 1.30 2005/10/17 14:40:02 suz Exp $ */ /* @@ -197,3 +197,5 @@ void ra_timer_set_short_delay(struct rai int prefix_match(struct in6_addr *, int, struct in6_addr *, int); struct rainfo *if_indextorainfo(unsigned int); struct prefix *find_prefix(struct rainfo *, struct in6_addr *, int); + +extern int Cflag;