From 56b8a8d231bf36a7011eb97eb115a148b3395635 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Thu, 23 Mar 2017 14:49:28 -0300 Subject: [PATCH] ldpd: simplify handling of configuration commands The logic to make configuration changes in ldpd is as follows: 1 - duplicate the current configuration; 2 - modify the duplicated configuration (delta); 3 - merge the duplicated configuration into the current configuration. We can however change things a little bit in order to simplify the code. If we provide a global vty_conf variable and make sure that it's always an up-to-date duplicate of ldpd_conf, then we don't need to call ldp_dup_config() in the callback of each configuration command. Instead of that, we just need to duplicate ldpd_conf in the startup of the daemon and in the end of the ldp_reload() function. Doing this is safe because, due to the single-threaded nature of the parent process, it's impossible to have multiple requests to change the configuration at the same time. Also, we can remove the *_ref() functions and do something much simpler instead. The problem we have to deal with here is that VTY_GET_CONTEXT() returns a pointer to an element of ldpd_conf, and what we want is a pointer to an element of vty_conf (e.g. an l2vpn). To solve this, we just need to look for the equivalent element inside vty_conf using standard functions from ldpd like l2vpn_find() and others. Signed-off-by: Renato Westphal --- ldpd/ldp_vty_conf.c | 214 +++++++++++++------------------------------- ldpd/ldpd.c | 123 ++++++++++--------------- ldpd/ldpd.h | 4 +- 3 files changed, 109 insertions(+), 232 deletions(-) diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index f313bc147b..68e3a36013 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -449,11 +449,8 @@ ldp_iface_is_configured(struct ldpd_conf *xconf, const char *ifname) int ldp_vty_mpls_ldp(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; int disable; - vty_conf = ldp_dup_config(ldpd_conf); - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; if (disable) @@ -471,7 +468,6 @@ ldp_vty_mpls_ldp(struct vty *vty, struct vty_arg *args[]) int ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *af_str; @@ -480,17 +476,14 @@ ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) disable = (vty_get_arg_value(args, "no")) ? 1 : 0; af_str = vty_get_arg_value(args, "address-family"); - vty_conf = ldp_dup_config(ldpd_conf); if (strcmp(af_str, "ipv4") == 0) { af = AF_INET; af_conf = &vty_conf->ipv4; } else if (strcmp(af_str, "ipv6") == 0) { af = AF_INET6; af_conf = &vty_conf->ipv6; - } else { - ldp_clear_config(vty_conf); + } else return (CMD_WARNING); - } if (disable) { af_conf->flags &= ~F_LDPD_AF_ENABLED; @@ -518,7 +511,6 @@ ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) int ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; struct iface *iface; struct iface_af *ia; @@ -547,7 +539,6 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) switch (vty->node) { case LDP_NODE: - vty_conf = ldp_dup_config(ldpd_conf); if (disable) { switch (hello_type) { case HELLO_LINK: @@ -572,7 +563,6 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) break; case LDP_IPV4_NODE: case LDP_IPV6_NODE: - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -601,14 +591,13 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) case LDP_IPV6_IFACE_NODE: af = ldp_vty_get_af(vty); iface = VTY_GET_CONTEXT(iface); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&iface); ia = iface_af_get(iface, af); if (disable) ia->hello_holdtime = 0; else ia->hello_holdtime = secs; - ldp_reload_ref(vty_conf, (void **)&iface); + ldp_reload(vty_conf); break; default: fatalx("ldp_vty_disc_holdtime: unexpected node"); @@ -620,7 +609,6 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) int ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; struct iface *iface; struct iface_af *ia; @@ -650,7 +638,6 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) switch (vty->node) { case LDP_NODE: - vty_conf = ldp_dup_config(ldpd_conf); if (disable) { switch (hello_type) { case HELLO_LINK: @@ -675,7 +662,6 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) break; case LDP_IPV4_NODE: case LDP_IPV6_NODE: - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -704,14 +690,13 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) case LDP_IPV6_IFACE_NODE: af = ldp_vty_get_af(vty); iface = VTY_GET_CONTEXT(iface); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&iface); ia = iface_af_get(iface, af); if (disable) ia->hello_interval = 0; else ia->hello_interval = secs; - ldp_reload_ref(vty_conf, (void **)&iface); + ldp_reload(vty_conf); break; default: fatalx("ldp_vty_disc_interval: unexpected node"); @@ -723,14 +708,11 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) int ldp_vty_targeted_hello_accept(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *acl_from_str; int disable; - vty_conf = ldp_dup_config(ldpd_conf); - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; acl_from_str = vty_get_arg_value(args, "from_acl"); @@ -757,7 +739,6 @@ ldp_vty_targeted_hello_accept(struct vty *vty, struct vty_arg *args[]) static int ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; char *ep; long int secs; struct in_addr lsr_id; @@ -776,18 +757,17 @@ ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); } - vty_conf = ldp_dup_config(ldpd_conf); nbrp = nbr_params_find(vty_conf, lsr_id); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_KEEPALIVE || secs > MAX_KEEPALIVE) { vty_out(vty, "%% Invalid holdtime%s", VTY_NEWLINE); - goto cancel; + return (CMD_SUCCESS); } if (disable) { if (nbrp == NULL) - goto cancel; + return (CMD_SUCCESS); nbrp->keepalive = 0; nbrp->flags &= ~F_NBRP_KEEPALIVE; @@ -796,7 +776,7 @@ ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) nbrp = nbr_params_new(lsr_id); RB_INSERT(nbrp_head, &vty_conf->nbrp_tree, nbrp); } else if (nbrp->keepalive == secs) - goto cancel; + return (CMD_SUCCESS); nbrp->keepalive = secs; nbrp->flags |= F_NBRP_KEEPALIVE; @@ -805,16 +785,11 @@ ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) ldp_reload(vty_conf); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } static int ldp_vty_af_session_holdtime(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; char *ep; @@ -831,7 +806,6 @@ ldp_vty_af_session_holdtime(struct vty *vty, struct vty_arg *args[]) return (CMD_SUCCESS); } - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -862,7 +836,6 @@ ldp_vty_session_holdtime(struct vty *vty, struct vty_arg *args[]) int ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; int af; struct iface *iface; struct iface_af *ia; @@ -874,17 +847,16 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) disable = (vty_get_arg_value(args, "no")) ? 1 : 0; ifname = vty_get_arg_value(args, "ifname"); - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); iface = if_lookup_name(vty_conf, ifname); if (disable) { if (iface == NULL) - goto cancel; + return (CMD_SUCCESS); ia = iface_af_get(iface, af); if (ia->enabled == 0) - goto cancel; + return (CMD_SUCCESS); ia->enabled = 0; ia->hello_holdtime = 0; @@ -897,7 +869,7 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) if (ldp_iface_is_configured(vty_conf, ifname)) { vty_out(vty, "%% Interface is already in use%s", VTY_NEWLINE); - goto cancel; + return (CMD_SUCCESS); } ifp = if_lookup_by_name(ifname, VRF_DEFAULT); @@ -912,7 +884,7 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) ia = iface_af_get(iface, af); ia->enabled = 1; RB_INSERT(iface_head, &vty_conf->iface_tree, iface); - ldp_reload_ref(vty_conf, (void **)&iface); + ldp_reload(vty_conf); } else { memset(&kif, 0, sizeof(kif)); strlcpy(kif.ifname, ifname, sizeof(kif.ifname)); @@ -920,9 +892,8 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) ia = iface_af_get(iface, af); if (!ia->enabled) { ia->enabled = 1; - ldp_reload_ref(vty_conf, (void **)&iface); - } else - ldp_clear_config(vty_conf); + ldp_reload(vty_conf); + } } switch (af) { @@ -937,16 +908,11 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) } return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *addr_str; @@ -955,7 +921,6 @@ ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) disable = (vty_get_arg_value(args, "no")) ? 1 : 0; addr_str = vty_get_arg_value(args, "addr"); - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -965,23 +930,18 @@ ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) if (inet_pton(af, addr_str, &af_conf->trans_addr) != 1 || bad_addr(af, &af_conf->trans_addr)) { vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); - goto cancel; + return (CMD_SUCCESS); } } ldp_reload(vty_conf); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; int af; union ldpd_addr addr; struct tnbr *tnbr; @@ -1003,12 +963,11 @@ ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); } - vty_conf = ldp_dup_config(ldpd_conf); tnbr = tnbr_find(vty_conf, af, &addr); if (disable) { if (tnbr == NULL) - goto cancel; + return (CMD_SUCCESS); RB_REMOVE(tnbr_head, &vty_conf->tnbr_tree, tnbr); free(tnbr); @@ -1017,7 +976,7 @@ ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) } if (tnbr) - goto cancel; + return (CMD_SUCCESS); tnbr = tnbr_new(af, &addr); tnbr->flags |= F_TNBR_CONFIGURED; @@ -1026,16 +985,11 @@ ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) ldp_reload(vty_conf); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *acl_to_str; @@ -1046,7 +1000,6 @@ ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) acl_to_str = vty_get_arg_value(args, "to_acl"); acl_for_str = vty_get_arg_value(args, "for_acl"); - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1074,7 +1027,6 @@ ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) int ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *acl_for_str; @@ -1085,7 +1037,6 @@ ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) acl_for_str = vty_get_arg_value(args, "for_acl"); host_routes_str = vty_get_arg_value(args, "host-routes"); - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1107,7 +1058,6 @@ ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) int ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *acl_for_str; @@ -1116,7 +1066,6 @@ ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) disable = (vty_get_arg_value(args, "no")) ? 1 : 0; acl_for_str = vty_get_arg_value(args, "for_acl"); - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1140,7 +1089,6 @@ ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) int ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; const char *acl_from_str; @@ -1151,7 +1099,6 @@ ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) acl_from_str = vty_get_arg_value(args, "from_acl"); acl_for_str = vty_get_arg_value(args, "for_acl"); - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1179,14 +1126,12 @@ ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) int ldp_vty_ttl_security(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct ldpd_af_conf *af_conf; int af; int disable; disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - vty_conf = ldp_dup_config(ldpd_conf); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1203,44 +1148,34 @@ ldp_vty_ttl_security(struct vty *vty, struct vty_arg *args[]) int ldp_vty_router_id(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; const char *addr_str; int disable; disable = (vty_get_arg_value(args, "no")) ? 1 : 0; addr_str = vty_get_arg_value(args, "addr"); - vty_conf = ldp_dup_config(ldpd_conf); - if (disable) vty_conf->rtr_id.s_addr = INADDR_ANY; else { if (inet_pton(AF_INET, addr_str, &vty_conf->rtr_id) != 1 || bad_addr_v4(vty_conf->rtr_id)) { vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); - goto cancel; + return (CMD_SUCCESS); } } ldp_reload(vty_conf); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_ds_cisco_interop(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; int disable; disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - vty_conf = ldp_dup_config(ldpd_conf); - if (disable) vty_conf->flags &= ~F_LDPD_DS_CISCO_INTEROP; else @@ -1254,13 +1189,10 @@ ldp_vty_ds_cisco_interop(struct vty *vty, struct vty_arg *args[]) int ldp_vty_trans_pref_ipv4(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; int disable; disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - vty_conf = ldp_dup_config(ldpd_conf); - if (disable) vty_conf->trans_pref = DUAL_STACK_LDPOV6; else @@ -1274,7 +1206,6 @@ ldp_vty_trans_pref_ipv4(struct vty *vty, struct vty_arg *args[]) int ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct in_addr lsr_id; size_t password_len; struct nbr_params *nbrp; @@ -1292,12 +1223,11 @@ ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); } - vty_conf = ldp_dup_config(ldpd_conf); nbrp = nbr_params_find(vty_conf, lsr_id); if (disable) { if (nbrp == NULL) - goto cancel; + return (CMD_SUCCESS); memset(&nbrp->auth, 0, sizeof(nbrp->auth)); nbrp->auth.method = AUTH_NONE; @@ -1307,7 +1237,7 @@ ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) RB_INSERT(nbrp_head, &vty_conf->nbrp_tree, nbrp); } else if (nbrp->auth.method == AUTH_MD5SIG && strcmp(nbrp->auth.md5key, password_str) == 0) - goto cancel; + return (CMD_SUCCESS); password_len = strlcpy(nbrp->auth.md5key, password_str, sizeof(nbrp->auth.md5key)); @@ -1321,16 +1251,11 @@ ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) ldp_reload(vty_conf); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct in_addr lsr_id; struct nbr_params *nbrp; long int hops = 0; @@ -1357,12 +1282,11 @@ ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) } } - vty_conf = ldp_dup_config(ldpd_conf); nbrp = nbr_params_find(vty_conf, lsr_id); if (disable) { if (nbrp == NULL) - goto cancel; + return (CMD_SUCCESS); nbrp->flags &= ~(F_NBRP_GTSM|F_NBRP_GTSM_HOPS); nbrp->gtsm_enabled = 0; @@ -1386,16 +1310,11 @@ ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) ldp_reload(vty_conf); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct l2vpn *l2vpn; const char *name_str; int disable; @@ -1403,12 +1322,11 @@ ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) disable = (vty_get_arg_value(args, "no")) ? 1 : 0; name_str = vty_get_arg_value(args, "name"); - vty_conf = ldp_dup_config(ldpd_conf); l2vpn = l2vpn_find(vty_conf, name_str); if (disable) { if (l2vpn == NULL) - goto cancel; + return (CMD_SUCCESS); RB_REMOVE(l2vpn_head, &vty_conf->l2vpn_tree, l2vpn); l2vpn_del(l2vpn); @@ -1418,27 +1336,22 @@ ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) if (l2vpn) { VTY_PUSH_CONTEXT(LDP_L2VPN_NODE, l2vpn); - goto cancel; + return (CMD_SUCCESS); } l2vpn = l2vpn_new(name_str); l2vpn->type = L2VPN_TYPE_VPLS; RB_INSERT(l2vpn_head, &vty_conf->l2vpn_tree, l2vpn); - ldp_reload_ref(vty_conf, (void **)&l2vpn); + ldp_reload(vty_conf); VTY_PUSH_CONTEXT(LDP_L2VPN_NODE, l2vpn); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct l2vpn *l2vpn; const char *ifname; int disable; @@ -1447,14 +1360,14 @@ ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) ifname = vty_get_arg_value(args, "ifname"); l2vpn = VTY_GET_CONTEXT(l2vpn); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); if (disable) memset(l2vpn->br_ifname, 0, sizeof(l2vpn->br_ifname)); else strlcpy(l2vpn->br_ifname, ifname, sizeof(l2vpn->br_ifname)); - ldp_reload_ref(vty_conf, (void **)&l2vpn); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1462,7 +1375,6 @@ ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct l2vpn *l2vpn; char *ep; int mtu; @@ -1479,14 +1391,14 @@ ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) } l2vpn = VTY_GET_CONTEXT(l2vpn); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); if (disable) l2vpn->mtu = DEFAULT_L2VPN_MTU; else l2vpn->mtu = mtu; - ldp_reload_ref(vty_conf, (void **)&l2vpn); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1494,7 +1406,6 @@ ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct l2vpn *l2vpn; int pw_type; const char *type_str; @@ -1509,14 +1420,14 @@ ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) pw_type = PW_TYPE_ETHERNET_TAGGED; l2vpn = VTY_GET_CONTEXT(l2vpn); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); if (disable) l2vpn->pw_type = DEFAULT_PW_TYPE; else l2vpn->pw_type = pw_type; - ldp_reload_ref(vty_conf, (void **)&l2vpn); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1524,7 +1435,6 @@ ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct l2vpn *l2vpn; struct l2vpn_if *lif; struct interface *ifp; @@ -1536,13 +1446,12 @@ ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) ifname = vty_get_arg_value(args, "ifname"); l2vpn = VTY_GET_CONTEXT(l2vpn); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&l2vpn); l2vpn = l2vpn_find(vty_conf, l2vpn->name); lif = l2vpn_if_find_name(l2vpn, ifname); if (disable) { if (lif == NULL) - goto cancel; + return (CMD_SUCCESS); RB_REMOVE(l2vpn_if_head, &l2vpn->if_tree, lif); free(lif); @@ -1551,11 +1460,11 @@ ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) } if (lif) - goto cancel; + return (CMD_SUCCESS); if (ldp_iface_is_configured(vty_conf, ifname)) { vty_out(vty, "%% Interface is already in use%s", VTY_NEWLINE); - goto cancel; + return (CMD_SUCCESS); } ifp = if_lookup_by_name(ifname, VRF_DEFAULT); @@ -1569,19 +1478,14 @@ ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) lif = l2vpn_if_new(l2vpn, &kif); RB_INSERT(l2vpn_if_head, &l2vpn->if_tree, lif); - ldp_reload_ref(vty_conf, (void **)&l2vpn); - - return (CMD_SUCCESS); + ldp_reload(vty_conf); -cancel: - ldp_clear_config(vty_conf); return (CMD_SUCCESS); } int ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; struct l2vpn *l2vpn; struct l2vpn_pw *pw; struct interface *ifp; @@ -1593,12 +1497,12 @@ ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) ifname = vty_get_arg_value(args, "ifname"); l2vpn = VTY_GET_CONTEXT(l2vpn); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); pw = l2vpn_pw_find_name(l2vpn, ifname); if (disable) { if (pw == NULL) - goto cancel; + return (CMD_SUCCESS); RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_inactive_tree, pw); free(pw); @@ -1608,12 +1512,12 @@ ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) if (pw) { VTY_PUSH_CONTEXT_SUB(LDP_PSEUDOWIRE_NODE, pw); - goto cancel; + return (CMD_SUCCESS); } if (ldp_iface_is_configured(vty_conf, ifname)) { vty_out(vty, "%% Interface is already in use%s", VTY_NEWLINE); - goto cancel; + return (CMD_SUCCESS); } ifp = if_lookup_by_name(ifname, VRF_DEFAULT); @@ -1628,20 +1532,16 @@ ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) pw->flags = F_PW_STATUSTLV_CONF|F_PW_CWORD_CONF; RB_INSERT(l2vpn_pw_head, &l2vpn->pw_inactive_tree, pw); - ldp_reload_ref(vty_conf, (void **)&pw); + ldp_reload(vty_conf); VTY_PUSH_CONTEXT_SUB(LDP_PSEUDOWIRE_NODE, pw); return (CMD_SUCCESS); - -cancel: - ldp_clear_config(vty_conf); - return (CMD_SUCCESS); } int ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; + struct l2vpn *l2vpn; struct l2vpn_pw *pw; const char *preference_str; int disable; @@ -1649,8 +1549,10 @@ ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) disable = (vty_get_arg_value(args, "no")) ? 1 : 0; preference_str = vty_get_arg_value(args, "preference"); + l2vpn = VTY_GET_CONTEXT(l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); pw = VTY_GET_CONTEXT_SUB(l2vpn_pw); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&pw); + pw = l2vpn_pw_find_name(l2vpn, pw->ifname); if (disable) pw->flags |= F_PW_CWORD_CONF; @@ -1661,7 +1563,7 @@ ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) pw->flags |= F_PW_CWORD_CONF; } - ldp_reload_ref(vty_conf, (void **)&pw); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1669,7 +1571,7 @@ ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; + struct l2vpn *l2vpn; struct l2vpn_pw *pw; int af; union ldpd_addr addr; @@ -1685,8 +1587,10 @@ ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); } + l2vpn = VTY_GET_CONTEXT(l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); pw = VTY_GET_CONTEXT_SUB(l2vpn_pw); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&pw); + pw = l2vpn_pw_find_name(l2vpn, pw->ifname); if (disable) { pw->af = AF_UNSPEC; @@ -1698,7 +1602,7 @@ ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) pw->flags |= F_PW_STATIC_NBR_ADDR; } - ldp_reload_ref(vty_conf, (void **)&pw); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1706,7 +1610,7 @@ ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; + struct l2vpn *l2vpn; struct l2vpn_pw *pw; struct in_addr lsr_id; const char *lsr_id_str; @@ -1721,15 +1625,17 @@ ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); } + l2vpn = VTY_GET_CONTEXT(l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); pw = VTY_GET_CONTEXT_SUB(l2vpn_pw); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&pw); + pw = l2vpn_pw_find_name(l2vpn, pw->ifname); if (disable) pw->lsr_id.s_addr = INADDR_ANY; else pw->lsr_id = lsr_id; - ldp_reload_ref(vty_conf, (void **)&pw); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1737,7 +1643,7 @@ ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; + struct l2vpn *l2vpn; struct l2vpn_pw *pw; char *ep; uint32_t pwid; @@ -1753,15 +1659,17 @@ ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); } + l2vpn = VTY_GET_CONTEXT(l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); pw = VTY_GET_CONTEXT_SUB(l2vpn_pw); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&pw); + pw = l2vpn_pw_find_name(l2vpn, pw->ifname); if (disable) pw->pwid = 0; else pw->pwid = pwid; - ldp_reload_ref(vty_conf, (void **)&pw); + ldp_reload(vty_conf); return (CMD_SUCCESS); } @@ -1769,21 +1677,23 @@ ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) int ldp_vty_l2vpn_pw_pwstatus(struct vty *vty, struct vty_arg *args[]) { - struct ldpd_conf *vty_conf; + struct l2vpn *l2vpn; struct l2vpn_pw *pw; int disable; disable = (vty_get_arg_value(args, "no")) ? 1 : 0; + l2vpn = VTY_GET_CONTEXT(l2vpn); + l2vpn = l2vpn_find(vty_conf, l2vpn->name); pw = VTY_GET_CONTEXT_SUB(l2vpn_pw); - vty_conf = ldp_dup_config_ref(ldpd_conf, (void **)&pw); + pw = l2vpn_pw_find_name(l2vpn, pw->ifname); if (disable) pw->flags |= F_PW_STATUSTLV_CONF; else pw->flags &= ~F_PW_STATUSTLV_CONF; - ldp_reload_ref(vty_conf, (void **)&pw); + ldp_reload(vty_conf); return (CMD_SUCCESS); } diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index f8218ec4da..c3d72d022a 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -53,20 +53,19 @@ static int main_imsg_send_ipc_sockets(struct imsgbuf *, static void main_imsg_send_net_sockets(int); 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 *, void **); -static void ldp_config_reset_main(struct ldpd_conf *, void **); -static void ldp_config_reset_af(struct ldpd_conf *, int, void **); -static void merge_config_ref(struct ldpd_conf *, struct ldpd_conf *, void **); +static void ldp_config_normalize(struct ldpd_conf *); +static void ldp_config_reset_main(struct ldpd_conf *); +static void ldp_config_reset_af(struct ldpd_conf *, int); static void merge_global(struct ldpd_conf *, struct ldpd_conf *); static void merge_af(int, struct ldpd_af_conf *, struct ldpd_af_conf *); -static void merge_ifaces(struct ldpd_conf *, struct ldpd_conf *, void **); +static void merge_ifaces(struct ldpd_conf *, struct ldpd_conf *); static void merge_iface_af(struct iface_af *, struct iface_af *); -static void merge_tnbrs(struct ldpd_conf *, struct ldpd_conf *, void **); -static void merge_nbrps(struct ldpd_conf *, struct ldpd_conf *, void **); -static void merge_l2vpns(struct ldpd_conf *, struct ldpd_conf *, void **); +static void merge_tnbrs(struct ldpd_conf *, struct ldpd_conf *); +static void merge_nbrps(struct ldpd_conf *, struct ldpd_conf *); +static void merge_l2vpns(struct ldpd_conf *, struct ldpd_conf *); static void merge_l2vpn(struct ldpd_conf *, struct l2vpn *, - struct l2vpn *, void **); + struct l2vpn *); DEFINE_QOBJ_TYPE(iface) DEFINE_QOBJ_TYPE(tnbr) @@ -77,7 +76,7 @@ DEFINE_QOBJ_TYPE(l2vpn) DEFINE_QOBJ_TYPE(ldpd_conf) struct ldpd_global global; -struct ldpd_conf *ldpd_conf; +struct ldpd_conf *ldpd_conf, *vty_conf; static struct imsgev *iev_ldpe, *iev_ldpe_sync; static struct imsgev *iev_lde, *iev_lde_sync; @@ -324,10 +323,19 @@ main(int argc, char *argv[]) ldp_vty_if_init(); ldp_zebra_init(master); - /* Get configuration file. */ + /* create base configuration with sane defaults */ ldpd_conf = config_new_empty(); - ldp_config_reset_main(ldpd_conf, NULL); + ldp_config_reset_main(ldpd_conf); QOBJ_REG(ldpd_conf, 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. + */ + vty_conf = ldp_dup_config(ldpd_conf); + + /* read configuration file and daemonize */ frr_config_fork(); /* setup pipes to children */ @@ -955,37 +963,33 @@ main_imsg_send_config(struct ldpd_conf *xconf) } int -ldp_reload_ref(struct ldpd_conf *xconf, void **ref) +ldp_reload(struct ldpd_conf *xconf) { - ldp_config_normalize(xconf, ref); + ldp_config_normalize(xconf); if (main_imsg_send_config(xconf) == -1) return (-1); - merge_config_ref(ldpd_conf, xconf, ref); + merge_config(ldpd_conf, xconf); - return (0); -} + vty_conf = ldp_dup_config(ldpd_conf); -int -ldp_reload(struct ldpd_conf *xconf) -{ - return ldp_reload_ref(xconf, NULL); + return (0); } static void -ldp_config_normalize(struct ldpd_conf *xconf, void **ref) +ldp_config_normalize(struct ldpd_conf *xconf) { struct l2vpn *l2vpn; struct l2vpn_pw *pw; if (!(xconf->flags & F_LDPD_ENABLED)) - ldp_config_reset_main(xconf, ref); + ldp_config_reset_main(xconf); else { if (!(xconf->ipv4.flags & F_LDPD_AF_ENABLED)) - ldp_config_reset_af(xconf, AF_INET, ref); + ldp_config_reset_af(xconf, AF_INET); if (!(xconf->ipv6.flags & F_LDPD_AF_ENABLED)) - ldp_config_reset_af(xconf, AF_INET6, ref); + ldp_config_reset_af(xconf, AF_INET6); } RB_FOREACH(l2vpn, l2vpn_head, &xconf->l2vpn_tree) { @@ -1007,28 +1011,24 @@ ldp_config_normalize(struct ldpd_conf *xconf, void **ref) } static void -ldp_config_reset_main(struct ldpd_conf *conf, void **ref) +ldp_config_reset_main(struct ldpd_conf *conf) { struct iface *iface; struct nbr_params *nbrp; while ((iface = RB_ROOT(&conf->iface_tree)) != NULL) { - if (ref && *ref == iface) - *ref = NULL; RB_REMOVE(iface_head, &conf->iface_tree, iface); free(iface); } while ((nbrp = RB_ROOT(&conf->nbrp_tree)) != NULL) { - if (ref && *ref == nbrp) - *ref = NULL; RB_REMOVE(nbrp_head, &conf->nbrp_tree, nbrp); free(nbrp); } conf->rtr_id.s_addr = INADDR_ANY; - ldp_config_reset_af(conf, AF_INET, ref); - ldp_config_reset_af(conf, AF_INET6, ref); + ldp_config_reset_af(conf, AF_INET); + ldp_config_reset_af(conf, AF_INET6); conf->lhello_holdtime = LINK_DFLT_HOLDTIME; conf->lhello_interval = DEFAULT_HELLO_INTERVAL; conf->thello_holdtime = TARGETED_DFLT_HOLDTIME; @@ -1038,7 +1038,7 @@ ldp_config_reset_main(struct ldpd_conf *conf, void **ref) } static void -ldp_config_reset_af(struct ldpd_conf *conf, int af, void **ref) +ldp_config_reset_af(struct ldpd_conf *conf, int af) { struct ldpd_af_conf *af_conf; struct iface *iface; @@ -1054,8 +1054,6 @@ ldp_config_reset_af(struct ldpd_conf *conf, int af, void **ref) if (tnbr->af != af) continue; - if (ref && *ref == tnbr) - *ref = NULL; RB_REMOVE(tnbr_head, &conf->tnbr_tree, tnbr); free(tnbr); } @@ -1071,7 +1069,7 @@ ldp_config_reset_af(struct ldpd_conf *conf, int af, void **ref) } struct ldpd_conf * -ldp_dup_config_ref(struct ldpd_conf *conf, void **ref) +ldp_dup_config(struct ldpd_conf *conf) { struct ldpd_conf *xconf; struct iface *iface, *xi; @@ -1086,7 +1084,6 @@ ldp_dup_config_ref(struct ldpd_conf *conf, void **ref) if (a == NULL) \ fatal(__func__); \ *a = *b; \ - if (ref && *ref == b) *ref = a; \ } while (0) COPY(xconf, conf); @@ -1137,12 +1134,6 @@ ldp_dup_config_ref(struct ldpd_conf *conf, void **ref) return (xconf); } -struct ldpd_conf * -ldp_dup_config(struct ldpd_conf *conf) -{ - return ldp_dup_config_ref(conf, NULL); -} - void ldp_clear_config(struct ldpd_conf *xconf) { @@ -1171,27 +1162,19 @@ ldp_clear_config(struct ldpd_conf *xconf) free(xconf); } -static void -merge_config_ref(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) +void +merge_config(struct ldpd_conf *conf, struct ldpd_conf *xconf) { merge_global(conf, xconf); merge_af(AF_INET, &conf->ipv4, &xconf->ipv4); merge_af(AF_INET6, &conf->ipv6, &xconf->ipv6); - merge_ifaces(conf, xconf, ref); - merge_tnbrs(conf, xconf, ref); - merge_nbrps(conf, xconf, ref); - merge_l2vpns(conf, xconf, ref); - if (ref && *ref == xconf) - *ref = conf; + merge_ifaces(conf, xconf); + merge_tnbrs(conf, xconf); + merge_nbrps(conf, xconf); + merge_l2vpns(conf, xconf); free(xconf); } -void -merge_config(struct ldpd_conf *conf, struct ldpd_conf *xconf) -{ - merge_config_ref(conf, xconf, NULL); -} - static void merge_global(struct ldpd_conf *conf, struct ldpd_conf *xconf) { @@ -1326,7 +1309,7 @@ merge_af(int af, struct ldpd_af_conf *af_conf, struct ldpd_af_conf *xa) } static void -merge_ifaces(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) +merge_ifaces(struct ldpd_conf *conf, struct ldpd_conf *xconf) { struct iface *iface, *itmp, *xi; @@ -1366,8 +1349,6 @@ merge_ifaces(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) merge_iface_af(&iface->ipv4, &xi->ipv4); merge_iface_af(&iface->ipv6, &xi->ipv6); RB_REMOVE(iface_head, &xconf->iface_tree, xi); - if (ref && *ref == xi) - *ref = iface; free(xi); } } @@ -1385,7 +1366,7 @@ merge_iface_af(struct iface_af *ia, struct iface_af *xi) } static void -merge_tnbrs(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) +merge_tnbrs(struct ldpd_conf *conf, struct ldpd_conf *xconf) { struct tnbr *tnbr, *ttmp, *xt; @@ -1435,14 +1416,12 @@ merge_tnbrs(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) if (!(tnbr->flags & F_TNBR_CONFIGURED)) tnbr->flags |= F_TNBR_CONFIGURED; RB_REMOVE(tnbr_head, &xconf->tnbr_tree, xt); - if (ref && *ref == xt) - *ref = tnbr; free(xt); } } static void -merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) +merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf) { struct nbr_params *nbrp, *ntmp, *xn; struct nbr *nbr; @@ -1554,14 +1533,12 @@ merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) } } RB_REMOVE(nbrp_head, &xconf->nbrp_tree, xn); - if (ref && *ref == xn) - *ref = nbrp; free(xn); } } static void -merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) +merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf) { struct l2vpn *l2vpn, *ltmp, *xl; struct l2vpn_if *lif; @@ -1613,16 +1590,14 @@ merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref) } /* update existing l2vpns */ - merge_l2vpn(conf, l2vpn, xl, ref); + merge_l2vpn(conf, l2vpn, xl); RB_REMOVE(l2vpn_head, &xconf->l2vpn_tree, xl); - if (ref && *ref == xl) - *ref = l2vpn; free(xl); } } static void -merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void **ref) +merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl) { struct l2vpn_if *lif, *ftmp, *xf; struct l2vpn_pw *pw, *ptmp, *xp; @@ -1656,8 +1631,6 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void } RB_REMOVE(l2vpn_if_head, &xl->if_tree, xf); - if (ref && *ref == xf) - *ref = lif; free(xf); } @@ -1788,8 +1761,6 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void } RB_REMOVE(l2vpn_pw_head, &xl->pw_tree, xp); - if (ref && *ref == xp) - *ref = pw; free(xp); } @@ -1842,8 +1813,6 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void } RB_REMOVE(l2vpn_pw_head, &xl->pw_inactive_tree, xp); - if (ref && *ref == xp) - *ref = pw; free(xp); } diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h index a8279ebf66..69235556f8 100644 --- a/ldpd/ldpd.h +++ b/ldpd/ldpd.h @@ -645,7 +645,7 @@ struct ctl_pw { uint32_t status; }; -extern struct ldpd_conf *ldpd_conf; +extern struct ldpd_conf *ldpd_conf, *vty_conf; extern struct ldpd_global global; /* parse.y */ @@ -705,8 +705,6 @@ struct ldpd_af_global *ldp_af_global_get(struct ldpd_global *, int); int ldp_is_dual_stack(struct ldpd_conf *); in_addr_t ldp_rtr_id_get(struct ldpd_conf *); int ldp_reload(struct ldpd_conf *); -int ldp_reload_ref(struct ldpd_conf *, void **); -struct ldpd_conf *ldp_dup_config_ref(struct ldpd_conf *, void **ref); struct ldpd_conf *ldp_dup_config(struct ldpd_conf *); void ldp_clear_config(struct ldpd_conf *); void merge_config(struct ldpd_conf *, struct ldpd_conf *); -- 2.39.5