vty_conf->flags |= F_LDPD_ENABLED;
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
if (disable) {
af_conf->flags &= ~F_LDPD_AF_ENABLED;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
}
af_conf->flags |= F_LDPD_AF_ENABLED;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
break;
}
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
break;
case LDP_IPV4_NODE:
case LDP_IPV6_NODE:
break;
}
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
break;
case LDP_IPV4_IFACE_NODE:
case LDP_IPV6_IFACE_NODE:
else
ia->hello_holdtime = secs;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
break;
default:
fatalx("ldp_vty_disc_holdtime: unexpected node");
break;
}
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
break;
case LDP_IPV4_NODE:
case LDP_IPV6_NODE:
break;
}
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
break;
case LDP_IPV4_IFACE_NODE:
case LDP_IPV6_IFACE_NODE:
else
ia->hello_interval = secs;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
break;
default:
fatalx("ldp_vty_disc_interval: unexpected node");
af_conf->acl_thello_accept_from[0] = '\0';
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
nbrp->flags |= F_NBRP_KEEPALIVE;
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
af_conf->keepalive = secs;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
ia->hello_holdtime = 0;
ia->hello_interval = 0;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_INSERT(iface_head, &vty_conf->iface_tree, iface);
QOBJ_REG(iface, iface);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
} else {
ia = iface_af_get(iface, af);
if (!ia->enabled) {
ia->enabled = 1;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
}
}
}
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_REMOVE(tnbr_head, &vty_conf->tnbr_tree, tnbr);
free(tnbr);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_INSERT(tnbr_head, &vty_conf->tnbr_tree, tnbr);
QOBJ_REG(tnbr, tnbr);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
af_conf->acl_label_advertise_for[0] = '\0';
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
sizeof(af_conf->acl_label_allocate_for));
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
af_conf->acl_label_expnull_for[0] = '\0';
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
af_conf->acl_label_accept_for[0] = '\0';
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
af_conf->flags |= F_LDPD_AF_NO_GTSM;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
}
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
vty_conf->flags |= F_LDPD_DS_CISCO_INTEROP;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
vty_conf->trans_pref = DUAL_STACK_LDPOV4;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
nbrp->auth.method = AUTH_MD5SIG;
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
nbrp->gtsm_enabled = 0;
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_REMOVE(l2vpn_head, &vty_conf->l2vpn_tree, l2vpn);
l2vpn_del(l2vpn);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
VTY_PUSH_CONTEXT(LDP_L2VPN_NODE, l2vpn);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
strlcpy(l2vpn->br_ifname, ifname, sizeof(l2vpn->br_ifname));
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
l2vpn->mtu = mtu;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
l2vpn->pw_type = pw_type;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_REMOVE(l2vpn_if_head, &l2vpn->if_tree, lif);
free(lif);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_INSERT(l2vpn_if_head, &l2vpn->if_tree, lif);
QOBJ_REG(lif, l2vpn_if);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_tree, pw);
free(pw);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
VTY_PUSH_CONTEXT_SUB(LDP_PSEUDOWIRE_NODE, pw);
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
pw->flags |= F_PW_CWORD_CONF;
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
pw->flags |= F_PW_STATIC_NBR_ADDR;
}
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
pw->lsr_id = lsr_id;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
pw->pwid = pwid;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
else
pw->flags &= ~F_PW_STATUSTLV_CONF;
- ldp_reload(vty_conf);
+ ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
static void main_imsg_send_net_socket(int, enum socket_type);
static int main_imsg_send_config(struct ldpd_conf *);
static void ldp_config_normalize(struct ldpd_conf *);
+static void ldp_config_reset(struct ldpd_conf *);
static void ldp_config_reset_main(struct ldpd_conf *);
static void ldp_config_reset_af(struct ldpd_conf *, int);
static void ldp_config_reset_l2vpns(struct ldpd_conf *);
{
log_info("SIGHUP received");
- /* reset vty_conf */
- ldp_config_reset_main(vty_conf);
- ldp_config_reset_l2vpns(vty_conf);
-
- /* read configuration file without applying any changes */
- global.sighup = 1;
- vty_read_config(ldpd_di.config_file, config_default);
- global.sighup = 0;
-
/*
- * Apply the new configuration all at once, this way merge_config()
- * will be the least disruptive as possible.
+ * Do a full configuration reload. In other words, reset vty_conf
+ * and build a new configuartion from scratch.
*/
- ldp_reload(vty_conf);
+ ldp_config_reset(vty_conf);
+ vty_read_config(ldpd_di.config_file, config_default);
+ ldp_config_apply(NULL, vty_conf);
}
/* SIGINT / SIGTERM handler. */
ldp_vty_init();
ldp_zebra_init(master);
- /* create base configuration with sane defaults */
- ldpd_conf = config_new_empty();
- ldp_config_reset_main(ldpd_conf);
-
/*
- * Create vty_conf as a duplicate of the main configuration. All
- * configuration requests (e.g. CLI) act on vty_conf and then call
- * ldp_reload() to merge the changes into ldpd_conf.
+ * Create base configuration with sane defaults. All configuration
+ * requests (e.g. CLI) act on vty_conf and then call ldp_config_apply()
+ * to merge the changes into ldpd_conf, which contains the actual
+ * running configuration.
*/
+ ldpd_conf = config_new_empty();
vty_conf = config_new_empty();
- ldp_config_reset_main(vty_conf);
QOBJ_REG(vty_conf, ldpd_conf);
/* read configuration file and daemonize */
frr_config_fork();
+ /* apply configuration */
+ ldp_config_apply(NULL, vty_conf);
+
/* setup pipes to children */
if ((iev_ldpe = calloc(1, sizeof(struct imsgev))) == NULL ||
(iev_ldpe_sync = calloc(1, sizeof(struct imsgev))) == NULL ||
config_clear(ldpd_conf);
- ldp_config_reset_main(vty_conf);
- ldp_config_reset_l2vpns(vty_conf);
+ ldp_config_reset(vty_conf);
QOBJ_UNREG(vty_conf);
free(vty_conf);
}
int
-ldp_reload(struct ldpd_conf *xconf)
+ldp_config_apply(struct vty *vty, struct ldpd_conf *xconf)
{
- if (global.sighup)
+ /*
+ * When reading from a configuration file (startup and sighup), we
+ * call merge_config() only once after the whole config has been read.
+ * This is the optimal and least disruptive way to update the running
+ * configuration.
+ */
+ if (vty && vty->type == VTY_FILE)
return (0);
ldp_config_normalize(xconf);
}
}
+static void
+ldp_config_reset(struct ldpd_conf *conf)
+{
+ ldp_config_reset_main(conf);
+ ldp_config_reset_l2vpns(conf);
+}
+
static void
ldp_config_reset_main(struct ldpd_conf *conf)
{
RB_INIT(&xconf->nbrp_tree);
RB_INIT(&xconf->l2vpn_tree);
+ /* set default values */
+ ldp_config_reset(xconf);
+
return (xconf);
}