bin/121895: rtsol/rtsold doesn't handle managed networks [patch]
Mark Andrews
marka at isc.org
Thu Mar 20 03:50:01 UTC 2008
>Number: 121895
>Category: bin
>Synopsis: rtsol/rtsold doesn't handle managed networks [patch]
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Mar 20 03:50:00 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Mark Andrews
>Release: FreeBSD 6.3-PRERELEASE i386
>Organization:
ISC
>Environment:
System: FreeBSD drugs.dv.isc.org 6.3-PRERELEASE FreeBSD 6.3-PRERELEASE #18: Mon Dec 10 14:45:13 EST 2007 marka at drugs.dv.isc.org:/usr/obj/usr/src/sys/DRUGS i386
>Description:
rtsol/rtsold doesn't handle managed networks
>How-To-Repeat:
>Fix:
Index: dump.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rtsold/dump.c,v
retrieving revision 1.9
diff -u -r1.9 dump.c
--- dump.c 14 Jan 2004 17:16:19 -0000 1.9
+++ dump.c 20 Mar 2008 03:09:04 -0000
@@ -77,6 +77,8 @@
ifinfo->active > 0 ? "active" : "inactive");
fprintf(fp, " other config: %s\n",
ifinfo->otherconfig ? "on" : "off");
+ fprintf(fp, " managed config: %s\n",
+ ifinfo->managedconfig ? "on" : "off");
fprintf(fp, " rtsold status: %s\n", ifstatstr[ifinfo->state]);
fprintf(fp, " carrier detection: %s\n",
ifinfo->mediareqok ? "available" : "unavailable");
Index: rtsol.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rtsold/rtsol.c,v
retrieving revision 1.11
diff -u -r1.11 rtsol.c
--- rtsol.c 14 Jan 2004 17:16:19 -0000 1.11
+++ rtsol.c 20 Mar 2008 03:35:38 -0000
@@ -339,6 +339,19 @@
nd_ra = (struct nd_router_advert *)icp;
+#define RABOTH (ND_RA_FLAG_OTHER|ND_RA_FLAG_MANAGED)
+ /*
+ * Having both O and M set is undefined.
+ */
+ if ((nd_ra->nd_ra_flags_reserved & RABOTH) == RABOTH) {
+ warnmsg(LOG_INFO, __func__,
+ "received RA from %s on IF(%s) with O and M set",
+ inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf,
+ INET6_ADDRSTRLEN),
+ if_indextoname(pi->ipi6_ifindex, ifnamebuf));
+ return;
+ }
+
/*
* Process the "O bit."
* If the value of OtherConfigFlag changes from FALSE to TRUE, the
@@ -346,12 +359,35 @@
* requesting information.
* [RFC 2462 Section 5.5.3]
*/
- if (((nd_ra->nd_ra_flags_reserved) & ND_RA_FLAG_OTHER) &&
- !ifi->otherconfig) {
- warnmsg(LOG_DEBUG, __func__,
- "OtherConfigFlag on %s is turned on", ifi->ifname);
- ifi->otherconfig = 1;
- call_script(otherconf_script, ifi->ifname);
+ if ((nd_ra->nd_ra_flags_reserved) & ND_RA_FLAG_OTHER) {
+ if (ifi->managedconfig)
+ warnmsg(LOG_DEBUG, __func__,
+ "ManagedConfigFlag on %s already turned on",
+ ifi->ifname);
+ else if (!ifi->otherconfig) {
+ warnmsg(LOG_DEBUG, __func__,
+ "OtherConfigFlag on %s is turned on",
+ ifi->ifname);
+ ifi->otherconfig = 1;
+ call_script(otherconf_script, ifi->ifname);
+ }
+ }
+
+ /*
+ * Process the "M bit."
+ */
+ if (nd_ra->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) {
+ if (ifi->otherconfig)
+ warnmsg(LOG_DEBUG, __func__,
+ "OtherConfigFlag on %s already turned on",
+ ifi->ifname);
+ else if (!ifi->managedconfig) {
+ warnmsg(LOG_DEBUG, __func__,
+ "ManagedConfigFlag on %s is turned on",
+ ifi->ifname);
+ ifi->managedconfig = 1;
+ call_script(managed_script, ifi->ifname);
+ }
}
ifi->racnt++;
Index: rtsold.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rtsold/rtsold.8,v
retrieving revision 1.15
diff -u -r1.15 rtsold.8
--- rtsold.8 9 Feb 2005 18:04:42 -0000 1.15
+++ rtsold.8 20 Mar 2008 03:12:17 -0000
@@ -40,6 +40,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl dDfFm1
+.Op Fl M Ar script-name
.Op Fl O Ar script-name
.Ar interface ...
.Nm
@@ -48,6 +49,7 @@
.Fl a
.Nm rtsol
.Op Fl dDF
+.Op Fl M Ar script-name
.Op Fl O Ar script-name
.Ar interface ...
.Nm rtsol
@@ -206,6 +208,20 @@
Advertisement packet has arrived on each
.Ar interface ,
then exit.
+.It Fl M Ar script-name
+Specifies a supplement script file to handle the Managed Configuration
+flag of the router advertisement.
+When the flag changes from FALSE to TRUE,
+.Nm
+will invoke
+.Ar script-name
+with a single argument of the receiving interface name,
+expecting the script will then start a protocol for the other
+configuration.
+.Ar script-name
+must be the absolute path from root to the script file, be a regular
+file, and be created by the same owner who runs
+.Nm .
.It Fl O Ar script-name
Specifies a supplement script file to handle the Other Configuration
flag of the router advertisement.
Index: rtsold.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rtsold/rtsold.c,v
retrieving revision 1.21
diff -u -r1.21 rtsold.c
--- rtsold.c 9 Jun 2005 09:28:35 -0000 1.21
+++ rtsold.c 20 Mar 2008 02:59:03 -0000
@@ -68,6 +68,7 @@
int dflag = 0;
char *otherconf_script;
+char *managed_script;
/* protocol constants */
#define MAX_RTR_SOLICITATION_DELAY 1 /* second */
@@ -127,9 +128,9 @@
if (argv0 && argv0[strlen(argv0) - 1] != 'd') {
fflag = 1;
once = 1;
- opts = "adDFO:";
+ opts = "adDFM:O:";
} else
- opts = "adDfFm1O:";
+ opts = "adDfFm1M:O:";
while ((ch = getopt(argc, argv, opts)) != -1) {
switch (ch) {
@@ -157,6 +158,9 @@
case 'O':
otherconf_script = optarg;
break;
+ case 'M':
+ managed_script = optarg;
+ break;
default:
usage(argv0);
/*NOTREACHED*/
@@ -191,6 +195,11 @@
otherconf_script);
}
+ if (managed_script && *managed_script != '/') {
+ errx(1, "configuration script (%s) must be an absolute path",
+ managed_script);
+ }
+
#ifndef HAVE_ARC4RANDOM
/* random value initialization */
srandom((u_long)time(NULL));
Index: rtsold.h
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rtsold/rtsold.h,v
retrieving revision 1.8
diff -u -r1.8 rtsold.h
--- rtsold.h 14 Jan 2004 17:42:03 -0000 1.8
+++ rtsold.h 20 Mar 2008 03:07:39 -0000
@@ -43,6 +43,8 @@
int mediareqok; /* wheter the IF supports SIOCGIFMEDIA */
int otherconfig; /* need a separate protocol for the "other"
* configuration */
+ int managedconfig; /* need a separate protocol for the "managed"
+ * configuration */
int state;
int probes;
int dadcount;
@@ -68,6 +70,7 @@
extern int dflag;
extern int aflag;
extern char *otherconf_script;
+extern char *managed_script;
extern int ifconfig __P((char *));
extern void iflist_init __P((void));
struct ifinfo *find_ifinfo __P((int));
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list