Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Jul 2011 06:54:21 +0000 (UTC)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r224055 - in user/hrs/ipv6/usr.sbin: rtadvctl rtadvd
Message-ID:  <201107150654.p6F6sLL7064747@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hrs
Date: Fri Jul 15 06:54:21 2011
New Revision: 224055
URL: http://svn.freebsd.org/changeset/base/224055

Log:
  Implement enable and disable subcommands.

Modified:
  user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8
  user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c
  user/hrs/ipv6/usr.sbin/rtadvd/control_server.c
  user/hrs/ipv6/usr.sbin/rtadvd/control_server.h
  user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c
  user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h

Modified: user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8	Fri Jul 15 05:57:09 2011	(r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8	Fri Jul 15 06:54:21 2011	(r224055)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 14, 2011
+.Dd July 15, 2011
 .Dt RTADVCTL 8
 .Os
 .Sh NAME
@@ -61,8 +61,22 @@ inactive interfaces and some statistics.
 The subcommands are as follows:
 .Bl -tag -width indent
 .\"
-.It reload
-Specifies to reload the configuration file.
+.It reload Op interfaces...
+Specifies to reload the configuration file.  If one or more
+.Ar interface
+is specified, configuration entries for the interfaces will be reloaded
+selectively.
+.It enable interfaces...
+Specifies to mark the interface as enable and to try to reload the
+configuration entry.
+This subcommand is useful for dynamically-added interfaces.
+.Pp
+The
+.Xr rtadvd 8
+daemon marks an interface as enable if the interface exists and the
+configuration file has a valid entry for that when it is invoked.
+.It disable interfaces...
+Specifies to mark the interface as disable.
 .It shutdown
 Makes the
 .Xr rtadvd 8

Modified: user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c	Fri Jul 15 05:57:09 2011	(r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c	Fri Jul 15 06:54:21 2011	(r224055)
@@ -107,9 +107,9 @@ static struct dispatch_table {
 	{ "show", action_show },
 	{ "reload", action_reload },
 	{ "shutdown", action_shutdown },
-	{ NULL, NULL },
 	{ "enable", action_enable },
 	{ "disable", action_disable },
+	{ NULL, NULL },
 	{ "echo", action_echo },
 	{ "version", action_version },
 	{ NULL, NULL },
@@ -294,33 +294,69 @@ action_propset(char *argv)
 	return (action_plgeneric(CM_TYPE_REQ_SET_PROP, argv, buf));
 }
 
-/* XXX */
 static int
-action_enable(int argc, char **argv)
+action_disable(int argc, char **argv)
 {
-	argc = argc;
-	argv = argv;
+	char *action_argv;
+	char argv_disable[IFNAMSIZ + sizeof(":disable=")];
+	int i;
+	int error;
 
-	return (0);
+	if (argc < 1)
+		return (1);
+
+	error = 0;
+	for (i = 0; i < argc; i++) {
+		sprintf(argv_disable, "%s:disable=", argv[i]);
+		action_argv = argv_disable;
+		error += action_propset(action_argv);
+	}
+
+	return(error);
 }
 
-/* XXX */
 static int
-action_disable(int argc, char **argv)
+action_enable(int argc, char **argv)
 {
-	argc = argc;
-	argv = argv;
+	char *action_argv;
+	char argv_enable[IFNAMSIZ + sizeof(":enable=")];
+	int i;
+	int error;
 
-	return (0);
+	if (argc < 1)
+		return (1);
+
+	error = 0;
+	for (i = 0; i < argc; i++) {
+		sprintf(argv_enable, "%s:enable=", argv[i]);
+		action_argv = argv_enable;
+		error += action_propset(action_argv);
+	}
+
+	return(error);
 }
 
 static int
-action_reload(int argc __unused, char **argv __unused)
+action_reload(int argc, char **argv)
 {
 	char *action_argv;
+	char argv_reload[IFNAMSIZ + sizeof(":reload=")];
+	int i;
+	int error;
 
-	action_argv = strdup("reload");
-	return(action_propset(action_argv));
+	if (argc == 0) {
+		action_argv = strdup(":reload=");
+		return(action_propset(action_argv));
+	}
+
+	error = 0;
+	for (i = 0; i < argc; i++) {
+		sprintf(argv_reload, "%s:reload=", argv[i]);
+		action_argv = argv_reload;
+		error += action_propset(action_argv);
+	}
+
+	return(error);
 }
 
 static int

Modified: user/hrs/ipv6/usr.sbin/rtadvd/control_server.c
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/control_server.c	Fri Jul 15 05:57:09 2011	(r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/control_server.c	Fri Jul 15 06:54:21 2011	(r224055)
@@ -55,15 +55,18 @@
 #include "control_server.h"
 #include "timer.h"
 
-static sig_atomic_t p_do_reload;
-static sig_atomic_t p_do_die;
-
-void set_do_reload(int sig __unused)	{ p_do_reload = 1; }
-void set_do_die(int sig __unused)	{ p_do_die = 1; }
-void reset_do_reload(void)	{ p_do_reload = 0; }
-void reset_do_die(void)		{ p_do_die = 0; }
-int do_reload(void)	{ return (p_do_reload); }
-int do_die(void)	{ return (p_do_die); }
+static char *do_reload_ifname;
+static int do_reload;
+static int do_shutdown;
+
+void set_do_reload(int sig __unused)	{ do_reload = 1; }
+void set_do_reload_ifname(char *ifname){ do_reload_ifname = ifname; }
+void set_do_shutdown(int sig __unused)	{ do_shutdown = 1; }
+void reset_do_reload(void)	{ do_reload = 0; do_reload_ifname = NULL; }
+void reset_do_shutdown(void)	{ do_shutdown = 0; }
+int is_do_reload(void)		{ return (do_reload); }
+int is_do_shutdown(void)	{ return (do_shutdown); }
+char *reload_ifname(void)	{ return (do_reload_ifname); }
 
 #define	DEF_PL_HANDLER(key)	{ #key, cmsg_getprop_##key }
 
@@ -78,6 +81,10 @@ static int cmsg_getprop_rdnss(struct ctr
 static int cmsg_getprop_dnssl(struct ctrl_msg_pl *);
 static int cmsg_getprop_rti(struct ctrl_msg_pl *);
 
+static int cmsg_setprop_reload(struct ctrl_msg_pl *);
+static int cmsg_setprop_enable(struct ctrl_msg_pl *);
+static int cmsg_setprop_disable(struct ctrl_msg_pl *);
+
 static struct dispatch_table {
 	const char	*dt_comm;
 	int		(*dt_act)(struct ctrl_msg_pl *cp);
@@ -535,10 +542,14 @@ cmsg_setprop(struct ctrl_msg_pl *cp)
 	if (cp == NULL || cp->cp_key == NULL)
 		return (1);
 
-	if (strncmp(cp->cp_key, "reload", 8) == 0)
-		set_do_reload(0);
-	else if (strncmp(cp->cp_key, "shutdown", 8) == 0)
-		set_do_die(0);
+	if (strncmp(cp->cp_key, "reload", sizeof("reload")) == 0)
+		cmsg_setprop_reload(cp);
+	else if (strncmp(cp->cp_key, "shutdown", sizeof("shutdown")) == 0)
+		set_do_shutdown(0);
+	else if (strncmp(cp->cp_key, "enable", sizeof("enable")) == 0)
+		cmsg_setprop_enable(cp);
+	else if (strncmp(cp->cp_key, "disable", sizeof("disable")) == 0)
+		cmsg_setprop_disable(cp);
 	else if (strncmp(cp->cp_key, "echo", 8) == 0)
 		; 		/* do nothing */
 	else
@@ -547,6 +558,64 @@ cmsg_setprop(struct ctrl_msg_pl *cp)
 	return (0);
 }
 
+static int
+cmsg_setprop_reload(struct ctrl_msg_pl *cp)
+{
+
+	syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+	set_do_reload_ifname(cp->cp_ifname);
+	set_do_reload(1);
+
+	return (0);
+}
+
+static int
+cmsg_setprop_enable(struct ctrl_msg_pl *cp)
+{
+	struct ifinfo *ifi;
+
+	syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+	TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+		if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+			break;
+	}
+	if (ifi == NULL) {
+		syslog(LOG_ERR, "<%s> %s not found", __func__,
+		    cp->cp_ifname);
+		return (1);
+	}
+
+	ifi->ifi_persist = 1;
+	set_do_reload_ifname(ifi->ifi_ifname);
+	set_do_reload(0);
+
+	return (0);
+}
+
+static int
+cmsg_setprop_disable(struct ctrl_msg_pl *cp)
+{
+	struct ifinfo *ifi;
+
+	syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+	TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+		if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+			break;
+	}
+	if (ifi == NULL) {
+		syslog(LOG_ERR, "<%s> %s not found", __func__,
+		    cp->cp_ifname);
+		return (1);
+	}
+
+	ifi->ifi_persist = 0;
+
+	return (0);
+}
+
 int
 cmsg_handler_server(int fd)
 {

Modified: user/hrs/ipv6/usr.sbin/rtadvd/control_server.h
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/control_server.h	Fri Jul 15 05:57:09 2011	(r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/control_server.h	Fri Jul 15 06:54:21 2011	(r224055)
@@ -33,8 +33,10 @@ int	cmsg_setprop(struct ctrl_msg_pl *);
 int	cmsg_handler_server(int);
 
 void	set_do_reload(int);
-void	set_do_die(int);
+void	set_do_reload_ifname(char *);
+void	set_do_shutdown(int);
 void	reset_do_reload(void);
-void	reset_do_die(void);
-int	do_reload(void);
-int	do_die(void);
+void	reset_do_shutdown(void);
+int	is_do_reload(void);
+char	*reload_ifname(void);
+int	is_do_shutdown(void);

Modified: user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c	Fri Jul 15 05:57:09 2011	(r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c	Fri Jul 15 06:54:21 2011	(r224055)
@@ -148,7 +148,7 @@ uint32_t ndopt_flags[] = {
 	[ND_OPT_DNSSL]			= NDOPT_FLAG_DNSSL,
 };
 
-static void	die(void);
+static void	rtadvd_shutdown(void);
 static void	sock_open(struct sockinfo *);
 static void	rtsock_open(struct sockinfo *);
 static void	rtadvd_input(struct sockinfo *);
@@ -282,8 +282,8 @@ main(int argc, char *argv[])
 		set[PFD_RTSOCK].fd = -1;
 	set[PFD_CSOCK].fd = ctrlsock.si_fd;
 	set[PFD_CSOCK].events = POLLIN;
-	signal(SIGTERM, set_do_die);
-	signal(SIGINT, set_do_die);
+	signal(SIGTERM, set_do_shutdown);
+	signal(SIGINT, set_do_shutdown);
 	signal(SIGHUP, set_do_reload);
 
 	error = csock_listen(&ctrlsock);
@@ -296,14 +296,19 @@ main(int argc, char *argv[])
 	set_do_reload(0);
 
 	while (1) {
-		if (do_die())
-			die();
+		if (is_do_shutdown())
+			rtadvd_shutdown();
 
-		if (do_reload()) {
+		if (is_do_reload()) {
+			loadconfig_ifname(reload_ifname());
+			if (reload_ifname() == NULL)
+				syslog(LOG_INFO,
+				    "configuration file reloaded.");
+			else
+				syslog(LOG_INFO,
+				    "configuration file for %s reloaded.",
+				    reload_ifname());
 			reset_do_reload();
-			loadconfig_ifname(NULL);
-			syslog(LOG_INFO,
-			    "configuration file reloaded.");
 		}
 
 		/* timeout handler update for active interfaces */
@@ -354,7 +359,7 @@ main(int argc, char *argv[])
 }
 
 static void
-die(void)
+rtadvd_shutdown(void)
 {
 	struct rainfo *rai;
 	struct rdnss *rdn;

Modified: user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h	Fri Jul 15 05:57:09 2011	(r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h	Fri Jul 15 06:54:21 2011	(r224055)
@@ -270,4 +270,4 @@ struct ifinfo		*if_indextoifinfo(int);
 struct prefix		*find_prefix(struct rainfo *,
 			    struct in6_addr *, int);
 void			rtadvd_set_reload(int);
-void			rtadvd_set_die(int);
+void			rtadvd_set_shutdown(int);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107150654.p6F6sLL7064747>