]> git.proxmox.com Git - mirror_frr.git/blobdiff - ldpd/lde.c
bgpd: Allow 'no set community`
[mirror_frr.git] / ldpd / lde.c
index a7f933bbe56e597a4a98df2c99072c523d2c5fde..2aa96546ecfb269f23c4c7011f5baf99a1f15847 100644 (file)
@@ -56,7 +56,7 @@ 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 *);
 static void             lde_address_list_free(struct lde_nbr *);
-static void             zclient_sync_init(u_short instance);
+static void zclient_sync_init(unsigned short instance);
 static void             lde_label_list_init(void);
 static int              lde_get_label_chunk(void);
 static void             on_get_label_chunk_response(uint32_t start, uint32_t end);
@@ -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 */
@@ -1608,20 +1620,19 @@ lde_address_list_free(struct lde_nbr *ln)
 {
        struct lde_addr         *lde_addr;
 
-       while ((lde_addr = TAILQ_FIRST(&ln->addr_list)) != NULL) {
-               TAILQ_REMOVE(&ln->addr_list, lde_addr, entry);
+       while ((lde_addr = TAILQ_POP_FIRST(&ln->addr_list, entry)) != NULL)
                free(lde_addr);
-       }
 }
 
-static void
-zclient_sync_init(u_short instance)
+static void zclient_sync_init(unsigned short instance)
 {
        /* Initialize special zclient for synchronous message exchanges. */
-       zclient_sync = zclient_new(master);
+       zclient_sync = zclient_new(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);
@@ -1630,7 +1641,7 @@ zclient_sync_init(u_short instance)
        sock_set_nonblock(zclient_sync->sock);
 
        /* Connect to label manager */
-       while (lm_label_manager_connect(zclient_sync) != 0) {
+       while (lm_label_manager_connect(zclient_sync, 0) != 0) {
                log_warnx("Error connecting to label manager!");
                sleep(1);
        }