]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_northbound.c
bgpd: [7.1] add addpath ID to adj_out tree sort (#5691)
[mirror_frr.git] / isisd / isis_northbound.c
index 95595e37b9d904183ebb5d3a8467f912861e9274..d5cdec154b4d3c5817a8fc776016ea881f378abb 100644 (file)
@@ -25,7 +25,6 @@
 #include "libfrr.h"
 #include "linklist.h"
 #include "log.h"
-#include "isisd/dict.h"
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
 #include "isisd/isis_flags.h"
@@ -1365,19 +1364,40 @@ isis_instance_log_adjacency_changes_modify(enum nb_event event,
 }
 
 /*
- * XPath: /frr-isisd:isis/mpls-te
+ * XPath: /frr-isisd:isis/instance/mpls-te
  */
-static int isis_mpls_te_create(enum nb_event event,
+static int isis_instance_mpls_te_create(enum nb_event event,
                               const struct lyd_node *dnode,
                               union nb_resource *resource)
 {
        struct listnode *node;
+       struct isis_area *area;
        struct isis_circuit *circuit;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       isisMplsTE.status = enable;
+       area = nb_running_get_entry(dnode, NULL, true);
+       if (area->mta == NULL) {
+
+               struct mpls_te_area *new;
+
+               zlog_debug("ISIS MPLS-TE: Initialize area %s",
+                       area->area_tag);
+
+               new = XCALLOC(MTYPE_ISIS_MPLS_TE, sizeof(struct mpls_te_area));
+
+               /* Initialize MPLS_TE structure */
+               new->status = enable;
+               new->level = 0;
+               new->inter_as = off;
+               new->interas_areaid.s_addr = 0;
+               new->router_id.s_addr = 0;
+
+               area->mta = new;
+       } else {
+               area->mta->status = enable;
+       }
 
        /*
         * Following code is intended to handle two cases;
@@ -1387,11 +1407,11 @@ static int isis_mpls_te_create(enum nb_event event,
         * MPLS_TE flag
         * 2) MPLS-TE was once enabled then disabled, and now enabled again.
         */
-       for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
+       for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
                if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type))
                        continue;
 
-               if ((circuit->mtc->status == disable)
+               if (!IS_MPLS_TE(circuit->mtc)
                    && HAS_LINK_PARAMS(circuit->interface))
                        circuit->mtc->status = enable;
                else
@@ -1406,19 +1426,24 @@ static int isis_mpls_te_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_mpls_te_destroy(enum nb_event event,
+static int isis_instance_mpls_te_destroy(enum nb_event event,
                               const struct lyd_node *dnode)
 {
        struct listnode *node;
+       struct isis_area *area;
        struct isis_circuit *circuit;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       isisMplsTE.status = disable;
+       area = nb_running_get_entry(dnode, NULL, true);
+       if (IS_MPLS_TE(area->mta))
+               area->mta->status = disable;
+       else
+               return NB_OK;
 
        /* Flush LSP if circuit engage */
-       for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
+       for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
                if (circuit->mtc == NULL || (circuit->mtc->status == disable))
                        continue;
 
@@ -1435,55 +1460,53 @@ static int isis_mpls_te_destroy(enum nb_event event,
 }
 
 /*
- * XPath: /frr-isisd:isis/mpls-te/router-address
+ * XPath: /frr-isisd:isis/instance/mpls-te/router-address
  */
-static int isis_mpls_te_router_address_modify(enum nb_event event,
+static int isis_instance_mpls_te_router_address_modify(enum nb_event event,
                                              const struct lyd_node *dnode,
                                              union nb_resource *resource)
 {
        struct in_addr value;
-       struct listnode *node;
        struct isis_area *area;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       yang_dnode_get_ipv4(&value, dnode, NULL);
-       isisMplsTE.router_id.s_addr = value.s_addr;
+       area = nb_running_get_entry(dnode, NULL, true);
        /* only proceed if MPLS-TE is enabled */
-       if (isisMplsTE.status == disable)
+       if (!IS_MPLS_TE(area->mta))
                return NB_OK;
 
-       /* Update main Router ID in isis global structure */
-       isis->router_id = value.s_addr;
+       /* Update Area Router ID */
+       yang_dnode_get_ipv4(&value, dnode, NULL);
+       area->mta->router_id.s_addr = value.s_addr;
+
        /* And re-schedule LSP update */
-       for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
-               if (listcount(area->area_addrs) > 0)
-                       lsp_regenerate_schedule(area, area->is_type, 0);
+       if (listcount(area->area_addrs) > 0)
+               lsp_regenerate_schedule(area, area->is_type, 0);
 
        return NB_OK;
 }
 
-static int isis_mpls_te_router_address_destroy(enum nb_event event,
+static int isis_instance_mpls_te_router_address_destroy(enum nb_event event,
                                              const struct lyd_node *dnode)
 {
-       struct listnode *node;
        struct isis_area *area;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       isisMplsTE.router_id.s_addr = INADDR_ANY;
+       area = nb_running_get_entry(dnode, NULL, true);
        /* only proceed if MPLS-TE is enabled */
-       if (isisMplsTE.status == disable)
+       if (!IS_MPLS_TE(area->mta))
                return NB_OK;
 
-       /* Update main Router ID in isis global structure */
-       isis->router_id = 0;
+       /* Reset Area Router ID */
+       area->mta->router_id.s_addr = INADDR_ANY;
+
        /* And re-schedule LSP update */
-       for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
-               if (listcount(area->area_addrs) > 0)
-                       lsp_regenerate_schedule(area, area->is_type, 0);
+       if (listcount(area->area_addrs) > 0)
+               lsp_regenerate_schedule(area, area->is_type, 0);
 
        return NB_OK;
 }
@@ -3015,15 +3038,15 @@ const struct frr_yang_module_info frr_isisd_info = {
                        .cbs.cli_show = cli_show_isis_log_adjacency,
                },
                {
-                       .xpath = "/frr-isisd:isis/mpls-te",
-                       .cbs.create = isis_mpls_te_create,
-                       .cbs.destroy = isis_mpls_te_destroy,
+                       .xpath = "/frr-isisd:isis/instance/mpls-te",
+                       .cbs.create = isis_instance_mpls_te_create,
+                       .cbs.destroy = isis_instance_mpls_te_destroy,
                        .cbs.cli_show = cli_show_isis_mpls_te,
                },
                {
-                       .xpath = "/frr-isisd:isis/mpls-te/router-address",
-                       .cbs.modify = isis_mpls_te_router_address_modify,
-                       .cbs.destroy = isis_mpls_te_router_address_destroy,
+                       .xpath = "/frr-isisd:isis/instance/mpls-te/router-address",
+                       .cbs.modify = isis_instance_mpls_te_router_address_modify,
+                       .cbs.destroy = isis_instance_mpls_te_router_address_destroy,
                        .cbs.cli_show = cli_show_isis_mpls_te_router_addr,
                },
                {