]> git.proxmox.com Git - mirror_frr.git/blobdiff - ldpd/lde.c
*: Make assignment from RB_ROOT in while loop work better
[mirror_frr.git] / ldpd / lde.c
index a7f933bbe56e597a4a98df2c99072c523d2c5fde..5aa53fd39e01dbec2653b13dc513417b671719d1 100644 (file)
@@ -77,7 +77,7 @@ struct thread_master *master;
 /* lde privileges */
 static zebra_capabilities_t _caps_p [] =
 {
-       /* none */
+       ZCAP_NET_ADMIN
 };
 
 static struct zebra_privs_t lde_privs =
@@ -702,20 +702,20 @@ lde_update_label(struct fec_node *fn)
                switch (fn->fec.type) {
                case FEC_TYPE_IPV4:
                        if (!(ldeconf->ipv4.flags & F_LDPD_AF_EXPNULL))
-                               return (MPLS_LABEL_IMPLNULL);
+                               return (MPLS_LABEL_IMPLICIT_NULL);
                        if (lde_acl_check(ldeconf->ipv4.acl_label_expnull_for,
                            AF_INET, (union ldpd_addr *)&fn->fec.u.ipv4.prefix,
                            fn->fec.u.ipv4.prefixlen) != FILTER_PERMIT)
-                               return (MPLS_LABEL_IMPLNULL);
-                       return (MPLS_LABEL_IPV4NULL);
+                               return (MPLS_LABEL_IMPLICIT_NULL);
+                       return MPLS_LABEL_IPV4_EXPLICIT_NULL;
                case FEC_TYPE_IPV6:
                        if (!(ldeconf->ipv6.flags & F_LDPD_AF_EXPNULL))
-                               return (MPLS_LABEL_IMPLNULL);
+                               return (MPLS_LABEL_IMPLICIT_NULL);
                        if (lde_acl_check(ldeconf->ipv6.acl_label_expnull_for,
                            AF_INET6, (union ldpd_addr *)&fn->fec.u.ipv6.prefix,
                            fn->fec.u.ipv6.prefixlen) != FILTER_PERMIT)
-                               return (MPLS_LABEL_IMPLNULL);
-                       return (MPLS_LABEL_IPV6NULL);
+                               return (MPLS_LABEL_IMPLICIT_NULL);
+                       return MPLS_LABEL_IPV6_EXPLICIT_NULL;
                default:
                        fatalx("lde_update_label: unexpected fec type");
                        break;
@@ -767,11 +767,12 @@ lde_send_change_klabel(struct fec_node *fn, struct fec_nh *fnh)
                    sizeof(kr));
                break;
        case FEC_TYPE_PWID:
-               if (fn->local_label == NO_LABEL ||
+               pw = (struct l2vpn_pw *) fn->data;
+               if (!pw || fn->local_label == NO_LABEL ||
                    fnh->remote_label == NO_LABEL)
                        return;
 
-               pw = (struct l2vpn_pw *) fn->data;
+               pw->enabled = true;
                pw2zpw(pw, &zpw);
                zpw.local_label = fn->local_label;
                zpw.remote_label = fnh->remote_label;
@@ -818,6 +819,10 @@ lde_send_delete_klabel(struct fec_node *fn, struct fec_nh *fnh)
                break;
        case FEC_TYPE_PWID:
                pw = (struct l2vpn_pw *) fn->data;
+               if (!pw)
+                       return;
+
+               pw->enabled = false;
                pw2zpw(pw, &zpw);
                zpw.local_label = fn->local_label;
                zpw.remote_label = fnh->remote_label;
@@ -1319,8 +1324,11 @@ lde_nbr_clear(void)
 {
        struct lde_nbr  *ln;
 
-        while ((ln = RB_ROOT(nbr_tree, &lde_nbrs)) != NULL)
+       while (!RB_EMPTY(nbr_tree, &lde_nbrs)) {
+               ln = RB_ROOT(nbr_tree, &lde_nbrs);
+
                lde_nbr_del(ln);
+       }
 }
 
 static void
@@ -1517,11 +1525,15 @@ lde_change_egress_label(int af)
 
        /* explicitly withdraw all null labels */
        RB_FOREACH(ln, nbr_tree, &lde_nbrs) {
-               lde_send_labelwithdraw_wcard(ln, MPLS_LABEL_IMPLNULL);
+               lde_send_labelwithdraw_wcard(ln, MPLS_LABEL_IMPLICIT_NULL);
                if (ln->v4_enabled)
-                       lde_send_labelwithdraw_wcard(ln, MPLS_LABEL_IPV4NULL);
+                       lde_send_labelwithdraw_wcard(
+                               ln,
+                               MPLS_LABEL_IPV4_EXPLICIT_NULL);
                if (ln->v6_enabled)
-                       lde_send_labelwithdraw_wcard(ln, MPLS_LABEL_IPV6NULL);
+                       lde_send_labelwithdraw_wcard(
+                               ln,
+                               MPLS_LABEL_IPV6_EXPLICIT_NULL);
        }
 
        /* update label of connected routes */
@@ -1618,10 +1630,12 @@ static void
 zclient_sync_init(u_short instance)
 {
        /* Initialize special zclient for synchronous message exchanges. */
-       zclient_sync = zclient_new(master);
+       zclient_sync = zclient_new_notify(master, &zclient_options_default);
        zclient_sync->sock = -1;
        zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
        zclient_sync->instance = instance;
+       zclient_sync->privs = &lde_privs;
+
        while (zclient_socket_connect(zclient_sync) < 0) {
                log_warnx("Error connecting synchronous zclient!");
                sleep(1);