]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ldpd: qobj: register everything
authorRenato Westphal <renato@opensourcerouting.org>
Wed, 22 Jun 2016 12:59:28 +0000 (09:59 -0300)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 7 Oct 2016 13:09:52 +0000 (09:09 -0400)
Place the appropriate QOBJ_* calls.  A bit more complicated for ldpd due
to the dup-merge config scheme.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
ldpd/ldpd.c
ldpd/ldpd.h

index ca503e0d6a687e07d1805cdd92a9c527f544bab8..7120bed110f318052b3b8ad8c3978bf56c2a5830 100644 (file)
@@ -39,6 +39,7 @@
 #include "sigevent.h"
 #include "zclient.h"
 #include "vrf.h"
+#include "qobj.h"
 
 static void             ldpd_shutdown(void);
 static pid_t            start_child(enum ldpd_process, char *, int,
@@ -65,6 +66,14 @@ static void           merge_l2vpns(struct ldpd_conf *, struct ldpd_conf *, void **);
 static void             merge_l2vpn(struct ldpd_conf *, struct l2vpn *,
                            struct l2vpn *, void **);
 
+DEFINE_QOBJ_TYPE(iface)
+DEFINE_QOBJ_TYPE(tnbr)
+DEFINE_QOBJ_TYPE(nbr_params)
+DEFINE_QOBJ_TYPE(l2vpn_if)
+DEFINE_QOBJ_TYPE(l2vpn_pw)
+DEFINE_QOBJ_TYPE(l2vpn)
+DEFINE_QOBJ_TYPE(ldpd_conf)
+
 struct ldpd_global      global;
 struct ldpd_conf       *ldpd_conf;
 
@@ -328,6 +337,8 @@ main(int argc, char *argv[])
        if (dryrun)
                exit(0);
 
+       QOBJ_REG (ldpd_conf, ldpd_conf);
+
        if (daemon_mode && daemon(0, 0) < 0) {
                log_warn("LDPd daemon failed");
                exit(1);
@@ -1228,8 +1239,17 @@ merge_ifaces(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                /* find deleted interfaces */
                if ((xi = if_lookup_name(xconf, iface->name)) == NULL) {
                        LIST_REMOVE(iface, entry);
-                       if (ldpd_process == PROC_LDP_ENGINE)
+
+                       switch (ldpd_process) {
+                       case PROC_LDE_ENGINE:
+                               break;
+                       case PROC_LDP_ENGINE:
                                if_exit(iface);
+                               break;
+                       case PROC_MAIN:
+                               QOBJ_UNREG (iface);
+                               break;
+                       }
                        free(iface);
                }
        }
@@ -1239,9 +1259,11 @@ merge_ifaces(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                        LIST_REMOVE(xi, entry);
                        LIST_INSERT_HEAD(&conf->iface_list, xi, entry);
 
-                       /* resend addresses to activate new interfaces */
-                       if (ldpd_process == PROC_MAIN)
+                       if (ldpd_process == PROC_MAIN) {
+                               QOBJ_REG (xi, iface);
+                               /* resend addresses to activate new interfaces */
                                kif_redistribute(xi->name);
+                       }
                        continue;
                }
 
@@ -1278,12 +1300,20 @@ merge_tnbrs(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
 
                /* find deleted tnbrs */
                if ((xt = tnbr_find(xconf, tnbr->af, &tnbr->addr)) == NULL) {
-                       if (ldpd_process == PROC_LDP_ENGINE) {
+                       switch (ldpd_process) {
+                       case PROC_LDE_ENGINE:
+                               LIST_REMOVE(tnbr, entry);
+                               free(tnbr);
+                               break;
+                       case PROC_LDP_ENGINE:
                                tnbr->flags &= ~F_TNBR_CONFIGURED;
                                tnbr_check(tnbr);
-                       } else {
+                               break;
+                       case PROC_MAIN:
                                LIST_REMOVE(tnbr, entry);
+                               QOBJ_UNREG (tnbr);
                                free(tnbr);
+                               break;
                        }
                }
        }
@@ -1293,8 +1323,16 @@ merge_tnbrs(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                        LIST_REMOVE(xt, entry);
                        LIST_INSERT_HEAD(&conf->tnbr_list, xt, entry);
 
-                       if (ldpd_process == PROC_LDP_ENGINE)
+                       switch (ldpd_process) {
+                       case PROC_LDE_ENGINE:
+                               break;
+                       case PROC_LDP_ENGINE:
                                tnbr_update(xt);
+                               break;
+                       case PROC_MAIN:
+                               QOBJ_REG (xt, tnbr);
+                               break;
+                       }
                        continue;
                }
 
@@ -1318,7 +1356,10 @@ merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
        LIST_FOREACH_SAFE(nbrp, &conf->nbrp_list, entry, ntmp) {
                /* find deleted nbrps */
                if ((xn = nbr_params_find(xconf, nbrp->lsr_id)) == NULL) {
-                       if (ldpd_process == PROC_LDP_ENGINE) {
+                       switch (ldpd_process) {
+                       case PROC_LDE_ENGINE:
+                               break;
+                       case PROC_LDP_ENGINE:
                                nbr = nbr_find_ldpid(nbrp->lsr_id.s_addr);
                                if (nbr) {
                                        session_shutdown(nbr, S_SHUTDOWN, 0, 0);
@@ -1333,6 +1374,10 @@ merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                                        if (nbr_session_active_role(nbr))
                                                nbr_establish_connection(nbr);
                                }
+                               break;
+                       case PROC_MAIN:
+                               QOBJ_UNREG (nbrp);
+                               break;
                        }
                        LIST_REMOVE(nbrp, entry);
                        free(nbrp);
@@ -1344,7 +1389,10 @@ merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                        LIST_REMOVE(xn, entry);
                        LIST_INSERT_HEAD(&conf->nbrp_list, xn, entry);
 
-                       if (ldpd_process == PROC_LDP_ENGINE) {
+                       switch (ldpd_process) {
+                       case PROC_LDE_ENGINE:
+                               break;
+                       case PROC_LDP_ENGINE:
                                nbr = nbr_find_ldpid(xn->lsr_id.s_addr);
                                if (nbr) {
                                        session_shutdown(nbr, S_SHUTDOWN, 0, 0);
@@ -1361,6 +1409,10 @@ merge_nbrps(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                                        if (nbr_session_active_role(nbr))
                                                nbr_establish_connection(nbr);
                                }
+                               break;
+                       case PROC_MAIN:
+                               QOBJ_REG (xn, nbr_params);
+                               break;
                        }
                        continue;
                }
@@ -1413,6 +1465,8 @@ static void
 merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
 {
        struct l2vpn            *l2vpn, *ltmp, *xl;
+       struct l2vpn_if         *lif;
+       struct l2vpn_pw         *pw;
 
        LIST_FOREACH_SAFE(l2vpn, &conf->l2vpn_list, entry, ltmp) {
                /* find deleted l2vpns */
@@ -1427,6 +1481,13 @@ merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                                ldpe_l2vpn_exit(l2vpn);
                                break;
                        case PROC_MAIN:
+                               LIST_FOREACH(lif, &l2vpn->if_list, entry)
+                                       QOBJ_UNREG (lif);
+                               LIST_FOREACH(pw, &l2vpn->pw_list, entry)
+                                       QOBJ_UNREG (pw);
+                               LIST_FOREACH(pw, &l2vpn->pw_inactive_list, entry)
+                                       QOBJ_UNREG (pw);
+                               QOBJ_UNREG (l2vpn);
                                break;
                        }
                        l2vpn_del(l2vpn);
@@ -1446,6 +1507,7 @@ merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf, void **ref)
                                ldpe_l2vpn_init(xl);
                                break;
                        case PROC_MAIN:
+                               QOBJ_REG (xl, l2vpn);
                                break;
                        }
                        continue;
@@ -1477,6 +1539,8 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void
        LIST_FOREACH_SAFE(lif, &l2vpn->if_list, entry, ftmp) {
                /* find deleted interfaces */
                if ((xf = l2vpn_if_find_name(xl, lif->ifname)) == NULL) {
+                       if (ldpd_process == PROC_MAIN)
+                               QOBJ_UNREG (lif);
                        LIST_REMOVE(lif, entry);
                        free(lif);
                }
@@ -1487,6 +1551,8 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void
                        LIST_REMOVE(xf, entry);
                        LIST_INSERT_HEAD(&l2vpn->if_list, xf, entry);
                        xf->l2vpn = l2vpn;
+                       if (ldpd_process == PROC_MAIN)
+                               QOBJ_REG (xf, l2vpn_if);
                        continue;
                }
 
@@ -1509,6 +1575,7 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void
                                ldpe_l2vpn_pw_exit(pw);
                                break;
                        case PROC_MAIN:
+                               QOBJ_UNREG (pw);
                                break;
                        }
 
@@ -1531,6 +1598,7 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void
                                ldpe_l2vpn_pw_init(xp);
                                break;
                        case PROC_MAIN:
+                               QOBJ_REG (xp, l2vpn_pw);
                                break;
                        }
                        continue;
@@ -1631,6 +1699,8 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void
                /* find deleted inactive pseudowires */
                if ((xp = l2vpn_pw_find_name(xl, pw->ifname)) == NULL) {
                        LIST_REMOVE(pw, entry);
+                       if (ldpd_process == PROC_MAIN)
+                               QOBJ_UNREG (pw);
                        free(pw);
                }
        }
@@ -1640,6 +1710,8 @@ merge_l2vpn(struct ldpd_conf *xconf, struct l2vpn *l2vpn, struct l2vpn *xl, void
                        LIST_REMOVE(xp, entry);
                        LIST_INSERT_HEAD(&l2vpn->pw_inactive_list, xp, entry);
                        xp->l2vpn = l2vpn;
+                       if (ldpd_process == PROC_MAIN)
+                               QOBJ_REG (xp, l2vpn_pw);
                        continue;
                }
 
@@ -1723,5 +1795,7 @@ config_clear(struct ldpd_conf *conf)
        xconf->trans_pref = conf->trans_pref;
        xconf->flags = conf->flags;
        merge_config(conf, xconf);
+       if (ldpd_process == PROC_MAIN)
+               QOBJ_UNREG (conf);
        free(conf);
 }
index 67e66ab5454e8f4b25241b728da0a069eed7814d..630b192489d2625d9a758fb8fbfc6c9cfb316459 100644 (file)
@@ -26,6 +26,7 @@
 #include "openbsd-tree.h"
 #include "imsg.h"
 #include "thread.h"
+#include "qobj.h"
 
 #include "ldp.h"
 
@@ -272,7 +273,9 @@ struct iface {
        uint16_t                 flags;
        struct iface_af          ipv4;
        struct iface_af          ipv6;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(iface)
 
 /* source of targeted hellos */
 struct tnbr {
@@ -284,7 +287,9 @@ struct tnbr {
        int                      state;
        uint16_t                 pw_count;
        uint8_t                  flags;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(tnbr)
 #define F_TNBR_CONFIGURED       0x01
 #define F_TNBR_DYNAMIC          0x02
 
@@ -306,7 +311,9 @@ struct nbr_params {
                uint8_t                  md5key_len;
        } auth;
        uint8_t                  flags;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(nbr_params)
 #define F_NBRP_KEEPALIVE        0x01
 #define F_NBRP_GTSM             0x02
 #define F_NBRP_GTSM_HOPS        0x04
@@ -317,7 +324,9 @@ struct l2vpn_if {
        char                     ifname[IF_NAMESIZE];
        unsigned int             ifindex;
        uint16_t                 flags;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(l2vpn_if)
 
 struct l2vpn_pw {
        LIST_ENTRY(l2vpn_pw)     entry;
@@ -332,7 +341,9 @@ struct l2vpn_pw {
        uint16_t                 remote_mtu;
        uint32_t                 remote_status;
        uint8_t                  flags;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(l2vpn_pw)
 #define F_PW_STATUSTLV_CONF    0x01    /* status tlv configured */
 #define F_PW_STATUSTLV         0x02    /* status tlv negotiated */
 #define F_PW_CWORD_CONF                0x04    /* control word configured */
@@ -351,7 +362,9 @@ struct l2vpn {
        LIST_HEAD(, l2vpn_if)    if_list;
        LIST_HEAD(, l2vpn_pw)    pw_list;
        LIST_HEAD(, l2vpn_pw)    pw_inactive_list;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(l2vpn)
 #define L2VPN_TYPE_VPWS                1
 #define L2VPN_TYPE_VPLS                2
 
@@ -401,7 +414,9 @@ struct ldpd_conf {
        uint16_t                 thello_interval;
        uint16_t                 trans_pref;
        int                      flags;
+       QOBJ_FIELDS
 };
+DECLARE_QOBJ_TYPE(ldpd_conf)
 #define        F_LDPD_NO_FIB_UPDATE    0x0001
 #define        F_LDPD_DS_CISCO_INTEROP 0x0002
 #define        F_LDPD_ENABLED          0x0004