]> git.proxmox.com Git - mirror_frr.git/blobdiff - ldpd/lde.c
*: remove --enable-tcp-zebra, rework ZAPI path
[mirror_frr.git] / ldpd / lde.c
index 859d47431b394c5855e72d234b9ef5c7e9fdb6db..11fcbfa46dba8af6d8fbd0f9893cd579c5214baa 100644 (file)
 #include "zclient.h"
 #include "stream.h"
 #include "network.h"
+#include "libfrr.h"
 
 static void             lde_shutdown(void);
 static int              lde_dispatch_imsg(struct thread *);
 static int              lde_dispatch_parent(struct thread *);
-static __inline        int      lde_nbr_compare(struct lde_nbr *,
-                           struct lde_nbr *);
+static __inline        int      lde_nbr_compare(const struct lde_nbr *,
+                           const struct lde_nbr *);
 static struct lde_nbr  *lde_nbr_new(uint32_t, struct lde_nbr *);
 static void             lde_nbr_del(struct lde_nbr *);
 static struct lde_nbr  *lde_nbr_find(uint32_t);
 static void             lde_nbr_clear(void);
 static void             lde_nbr_addr_update(struct lde_nbr *,
                            struct lde_addr *, int);
-static __inline int     lde_map_compare(struct lde_map *, struct lde_map *);
+static __inline int     lde_map_compare(const struct lde_map *,
+                           const struct lde_map *);
 static void             lde_map_free(void *);
 static int              lde_address_add(struct lde_nbr *, struct lde_addr *);
 static int              lde_address_del(struct lde_nbr *, struct lde_addr *);
@@ -130,7 +132,7 @@ lde(void)
        ldpd_process = PROC_LDE_ENGINE;
        log_procname = log_procnames[PROC_LDE_ENGINE];
 
-       master = thread_master_create();
+       master = thread_master_create(NULL);
 
        /* setup signal handler */
        signal_init(master, array_size(lde_signals), lde_signals);
@@ -140,8 +142,9 @@ lde(void)
                fatal(NULL);
        imsg_init(&iev_main->ibuf, LDPD_FD_ASYNC);
        iev_main->handler_read = lde_dispatch_parent;
-       iev_main->ev_read = thread_add_read(master, iev_main->handler_read,
-           iev_main, iev_main->ibuf.fd);
+       iev_main->ev_read = NULL;
+       thread_add_read(master, iev_main->handler_read, iev_main, iev_main->ibuf.fd,
+                       &iev_main->ev_read);
        iev_main->handler_write = ldp_write_handler;
 
        if ((iev_main_sync = calloc(1, sizeof(struct imsgev))) == NULL)
@@ -164,16 +167,12 @@ lde_init(struct ldpd_init *init)
        lde_privs.group = init->group;
        zprivs_init(&lde_privs);
 
-#ifdef HAVE_PLEDGE
-       if (pledge("stdio recvfd unix", NULL) == -1)
-               fatal("pledge");
-#endif
-
        /* start the LIB garbage collector */
        lde_gc_start_timer();
 
        /* Init synchronous zclient and label list */
-       zclient_serv_path_set(init->zclient_serv_path);
+       frr_zclient_addr(&zclient_addr, &zclient_addr_len,
+                        init->zclient_serv_path);
        zclient_sync_init(init->instance);
        lde_label_list_init();
 }
@@ -526,8 +525,9 @@ lde_dispatch_parent(struct thread *thread)
                                fatal(NULL);
                        imsg_init(&iev_ldpe->ibuf, fd);
                        iev_ldpe->handler_read = lde_dispatch_imsg;
-                       iev_ldpe->ev_read = thread_add_read(master,
-                           iev_ldpe->handler_read, iev_ldpe, iev_ldpe->ibuf.fd);
+                       iev_ldpe->ev_read = NULL;
+                       thread_add_read(master, iev_ldpe->handler_read, iev_ldpe, iev_ldpe->ibuf.fd,
+                                       &iev_ldpe->ev_read);
                        iev_ldpe->handler_write = ldp_write_handler;
                        iev_ldpe->ev_write = NULL;
                        break;
@@ -545,10 +545,10 @@ lde_dispatch_parent(struct thread *thread)
                                fatal(NULL);
                        memcpy(nconf, imsg.data, sizeof(struct ldpd_conf));
 
-                       RB_INIT(&nconf->iface_tree);
-                       RB_INIT(&nconf->tnbr_tree);
-                       RB_INIT(&nconf->nbrp_tree);
-                       RB_INIT(&nconf->l2vpn_tree);
+                       RB_INIT(iface_head, &nconf->iface_tree);
+                       RB_INIT(tnbr_head, &nconf->tnbr_tree);
+                       RB_INIT(nbrp_head, &nconf->nbrp_tree);
+                       RB_INIT(l2vpn_head, &nconf->l2vpn_tree);
                        break;
                case IMSG_RECONF_IFACE:
                        if ((niface = malloc(sizeof(struct iface))) == NULL)
@@ -576,9 +576,9 @@ lde_dispatch_parent(struct thread *thread)
                                fatal(NULL);
                        memcpy(nl2vpn, imsg.data, sizeof(struct l2vpn));
 
-                       RB_INIT(&nl2vpn->if_tree);
-                       RB_INIT(&nl2vpn->pw_tree);
-                       RB_INIT(&nl2vpn->pw_inactive_tree);
+                       RB_INIT(l2vpn_if_head, &nl2vpn->if_tree);
+                       RB_INIT(l2vpn_pw_head, &nl2vpn->pw_tree);
+                       RB_INIT(l2vpn_pw_head, &nl2vpn->pw_inactive_tree);
 
                        RB_INSERT(l2vpn_head, &nconf->l2vpn_tree, nl2vpn);
                        break;
@@ -1192,7 +1192,7 @@ lde_send_notification_eol_pwid(struct lde_nbr *ln, uint16_t pw_type)
 }
 
 static __inline int
-lde_nbr_compare(struct lde_nbr *a, struct lde_nbr *b)
+lde_nbr_compare(const struct lde_nbr *a, const struct lde_nbr *b)
 {
        return (a->peerid - b->peerid);
 }
@@ -1317,7 +1317,7 @@ lde_nbr_clear(void)
 {
        struct lde_nbr  *ln;
 
-        while ((ln = RB_ROOT(&lde_nbrs)) != NULL)
+        while ((ln = RB_ROOT(nbr_tree, &lde_nbrs)) != NULL)
                lde_nbr_del(ln);
 }
 
@@ -1330,7 +1330,6 @@ lde_nbr_addr_update(struct lde_nbr *ln, struct lde_addr *lde_addr, int removed)
        struct lde_map          *me;
 
        RB_FOREACH(fec, fec_tree, &ln->recv_map) {
-               fn = (struct fec_node *)fec_find(&ft, fec);
                switch (fec->type) {
                case FEC_TYPE_IPV4:
                        if (lde_addr->af != AF_INET)
@@ -1344,6 +1343,11 @@ lde_nbr_addr_update(struct lde_nbr *ln, struct lde_addr *lde_addr, int removed)
                        continue;
                }
 
+               fn = (struct fec_node *)fec_find(&ft, fec);
+               if (fn == NULL)
+                       /* shouldn't happen */
+                       continue;
+
                LIST_FOREACH(fnh, &fn->nexthops, entry) {
                        if (ldp_addrcmp(fnh->af, &fnh->nexthop,
                            &lde_addr->addr))
@@ -1363,7 +1367,7 @@ lde_nbr_addr_update(struct lde_nbr *ln, struct lde_addr *lde_addr, int removed)
 }
 
 static __inline int
-lde_map_compare(struct lde_map *a, struct lde_map *b)
+lde_map_compare(const struct lde_map *a, const struct lde_map *b)
 {
        return (ldp_addrcmp(AF_INET, (union ldpd_addr *)&a->nexthop->id,
            (union ldpd_addr *)&b->nexthop->id));
@@ -1621,6 +1625,8 @@ zclient_sync_init(u_short instance)
                log_warnx("Error connecting synchronous zclient!");
                sleep(1);
        }
+       /* make socket non-blocking */
+       sock_set_nonblock(zclient_sync->sock);
 
        /* Connect to label manager */
        while (lm_label_manager_connect(zclient_sync) != 0) {
@@ -1645,8 +1651,6 @@ lde_get_label_chunk(void)
        ret = lm_get_label_chunk(zclient_sync, 0, CHUNK_SIZE, &start, &end);
        if (ret < 0) {
                log_warnx("Error getting label chunk!");
-               close(zclient_sync->sock);
-               zclient_sync->sock = -1;
                return -1;
        }