summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtadvd/control_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/rtadvd/control_server.c')
-rw-r--r--usr.sbin/rtadvd/control_server.c147
1 files changed, 106 insertions, 41 deletions
diff --git a/usr.sbin/rtadvd/control_server.c b/usr.sbin/rtadvd/control_server.c
index 4432994..7d2ddc5 100644
--- a/usr.sbin/rtadvd/control_server.c
+++ b/usr.sbin/rtadvd/control_server.c
@@ -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 }
@@ -71,14 +74,16 @@ static int cmsg_getprop_echo(struct ctrl_msg_pl *);
static int cmsg_getprop_version(struct ctrl_msg_pl *);
static int cmsg_getprop_ifilist(struct ctrl_msg_pl *);
static int cmsg_getprop_ifi(struct ctrl_msg_pl *);
+static int cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *);
static int cmsg_getprop_rai(struct ctrl_msg_pl *);
-static int cmsg_getprop_rai_timer(struct ctrl_msg_pl *);
static int cmsg_getprop_pfx(struct ctrl_msg_pl *);
static int cmsg_getprop_rdnss(struct ctrl_msg_pl *);
static int cmsg_getprop_dnssl(struct ctrl_msg_pl *);
-#ifdef ROUTEINFO
static int cmsg_getprop_rti(struct ctrl_msg_pl *);
-#endif
+
+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;
@@ -89,11 +94,9 @@ static struct dispatch_table {
DEF_PL_HANDLER(version),
DEF_PL_HANDLER(ifilist),
DEF_PL_HANDLER(ifi),
+ DEF_PL_HANDLER(ifi_ra_timer),
DEF_PL_HANDLER(rai),
- DEF_PL_HANDLER(rai_timer),
-#ifdef ROUTEINFO
DEF_PL_HANDLER(rti),
-#endif
DEF_PL_HANDLER(pfx),
DEF_PL_HANDLER(rdnss),
DEF_PL_HANDLER(dnssl),
@@ -135,7 +138,7 @@ cmsg_getprop_ifilist(struct ctrl_msg_pl *cp)
len += strlen(ifi->ifi_ifname) + 1;
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -179,7 +182,7 @@ cmsg_getprop_ifi(struct ctrl_msg_pl *cp)
exit(1);
len = cmsg_str2bin(p, ifi, sizeof(*ifi));
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
if (len == 0)
return (1);
@@ -220,7 +223,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp)
exit(1);
len = cmsg_str2bin(p, rai, sizeof(*rai));
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
if (len == 0)
return (1);
@@ -232,7 +235,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp)
}
static int
-cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
+cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp)
{
struct ifinfo *ifi;
struct rainfo *rai;
@@ -256,8 +259,8 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
cp->cp_ifname);
return (1);
}
- if ((rtimer = rai->rai_timer) == NULL) {
- syslog(LOG_ERR, "<%s> %s has no rai_timer", __func__,
+ if ((rtimer = ifi->ifi_ra_timer) == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no ifi_ra_timer", __func__,
cp->cp_ifname);
return (1);
}
@@ -266,7 +269,7 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
exit(1);
len = cmsg_str2bin(p, rtimer, sizeof(*rtimer));
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
if (len == 0)
return (1);
@@ -277,7 +280,6 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
return (0);
}
-#ifdef ROUTEINFO
static int
cmsg_getprop_rti(struct ctrl_msg_pl *cp)
{
@@ -309,7 +311,7 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp)
len += sizeof(*rti);
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -326,7 +328,6 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp)
return (0);
}
-#endif
static int
cmsg_getprop_pfx(struct ctrl_msg_pl *cp)
@@ -359,7 +360,7 @@ cmsg_getprop_pfx(struct ctrl_msg_pl *cp)
len += sizeof(*pfx);
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -386,8 +387,8 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
struct rdnss_addr *rda;
char *p;
size_t len;
- u_int16_t *rdn_cnt;
- u_int16_t *rda_cnt;
+ uint16_t *rdn_cnt;
+ uint16_t *rda_cnt;
syslog(LOG_DEBUG, "<%s> enter", __func__);
@@ -417,7 +418,7 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
}
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -425,14 +426,14 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
memset(p, 0, len);
cp->cp_val = p;
- rdn_cnt = (u_int16_t *)p;
+ rdn_cnt = (uint16_t *)p;
p += sizeof(*rdn_cnt);
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
*rdn_cnt += 1;
memcpy(p, rdn, sizeof(*rdn));
p += sizeof(*rdn);
- rda_cnt = (u_int16_t *)p;
+ rda_cnt = (uint16_t *)p;
p += sizeof(*rda_cnt);
TAILQ_FOREACH(rda, &rdn->rd_list, ra_next) {
*rda_cnt += 1;
@@ -455,8 +456,8 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
struct dnssl_addr *dna;
char *p;
size_t len;
- u_int16_t *dns_cnt;
- u_int16_t *dna_cnt;
+ uint16_t *dns_cnt;
+ uint16_t *dna_cnt;
syslog(LOG_DEBUG, "<%s> enter", __func__);
@@ -486,7 +487,7 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
}
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -494,14 +495,14 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
memset(p, 0, len);
cp->cp_val = p;
- dns_cnt = (u_int16_t *)cp->cp_val;
+ dns_cnt = (uint16_t *)cp->cp_val;
p += sizeof(*dns_cnt);
TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
(*dns_cnt)++;
memcpy(p, dns, sizeof(*dns));
p += sizeof(*dns);
- dna_cnt = (u_int16_t *)p;
+ dna_cnt = (uint16_t *)p;
p += sizeof(*dna_cnt);
TAILQ_FOREACH(dna, &dns->dn_list, da_next) {
(*dna_cnt)++;
@@ -541,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
@@ -553,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)
{
@@ -626,7 +689,7 @@ cmsg_handler_server(int fd)
syslog(LOG_DEBUG,
"<%s> cm->cm_type = %d", __func__, cm->cm_type);
syslog(LOG_DEBUG,
- "<%s> cm->cm_len = %d", __func__, cm->cm_len);
+ "<%s> cm->cm_len = %zu", __func__, cm->cm_len);
switch (cm->cm_type) {
case CM_TYPE_EOM:
@@ -646,6 +709,8 @@ cmsg_handler_server(int fd)
cm->cm_len = sizeof(*cm);
cm->cm_len += cmsg_pl2bin(msg, &cp);
}
+ if (cp.cp_val != NULL)
+ free(cp.cp_val);
break;
case CM_TYPE_REQ_SET_PROP:
cmsg_bin2pl(msg, &cp);
OpenPOWER on IntegriCloud