#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,
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;
if (dryrun)
exit(0);
+ QOBJ_REG (ldpd_conf, ldpd_conf);
+
if (daemon_mode && daemon(0, 0) < 0) {
log_warn("LDPd daemon failed");
exit(1);
/* 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);
}
}
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;
}
/* 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;
}
}
}
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;
}
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);
if (nbr_session_active_role(nbr))
nbr_establish_connection(nbr);
}
+ break;
+ case PROC_MAIN:
+ QOBJ_UNREG (nbrp);
+ break;
}
LIST_REMOVE(nbrp, entry);
free(nbrp);
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);
if (nbr_session_active_role(nbr))
nbr_establish_connection(nbr);
}
+ break;
+ case PROC_MAIN:
+ QOBJ_REG (xn, nbr_params);
+ break;
}
continue;
}
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 */
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);
ldpe_l2vpn_init(xl);
break;
case PROC_MAIN:
+ QOBJ_REG (xl, l2vpn);
break;
}
continue;
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);
}
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;
}
ldpe_l2vpn_pw_exit(pw);
break;
case PROC_MAIN:
+ QOBJ_UNREG (pw);
break;
}
ldpe_l2vpn_pw_init(xp);
break;
case PROC_MAIN:
+ QOBJ_REG (xp, l2vpn_pw);
break;
}
continue;
/* 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);
}
}
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;
}
xconf->trans_pref = conf->trans_pref;
xconf->flags = conf->flags;
merge_config(conf, xconf);
+ if (ldpd_process == PROC_MAIN)
+ QOBJ_UNREG (conf);
free(conf);
}
#include "openbsd-tree.h"
#include "imsg.h"
#include "thread.h"
+#include "qobj.h"
#include "ldp.h"
uint16_t flags;
struct iface_af ipv4;
struct iface_af ipv6;
+ QOBJ_FIELDS
};
+DECLARE_QOBJ_TYPE(iface)
/* source of targeted hellos */
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
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
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;
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 */
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
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