From: Renato Westphal Date: Wed, 22 Jun 2016 12:59:28 +0000 (-0300) Subject: ldpd: qobj: register everything X-Git-Tag: frr-2.0-rc1~178 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=4af8997d5594d097abf3978b20843412ac7db1c6;p=matthieu%2Ffrr.git ldpd: qobj: register everything Place the appropriate QOBJ_* calls. A bit more complicated for ldpd due to the dup-merge config scheme. Signed-off-by: David Lamparter --- diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index ca503e0d6a..7120bed110 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -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); } diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h index 67e66ab545..630b192489 100644 --- a/ldpd/ldpd.h +++ b/ldpd/ldpd.h @@ -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