]> git.proxmox.com Git - mirror_frr.git/commitdiff
ldpd: simplify handling of configuration commands
authorRenato Westphal <renato@opensourcerouting.org>
Thu, 23 Mar 2017 17:49:28 +0000 (14:49 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 27 Mar 2017 17:54:28 +0000 (14:54 -0300)
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 <renato@opensourcerouting.org>
ldpd/ldp_vty_conf.c
ldpd/ldpd.c
ldpd/ldpd.h

index f313bc147b4ffa558d38d1ab0eb9a9d40e432c55..68e3a3601389dad6308ddedacb9cf6136866fcfe 100644 (file)
@@ -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);
 }
index f8218ec4da870fcb432a0cb408f7dc391ebd19fc..c3d72d022a600a756520d5fb769c0fc7d7236c9f 100644 (file)
@@ -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);
        }
 
index a8279ebf66615b00205cb5c4eb6c2048bc6d9a82..69235556f8f674094b46e357d0473aac806c2dc2 100644 (file)
@@ -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 *);