]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospfd/ospf_te.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / ospfd / ospf_te.c
index f3be77195a12a264c361ea7289e634219838bb6c..3efc219fcb8c38063bd46152636f178f939bb5ed 100644 (file)
@@ -104,7 +104,7 @@ int ospf_mpls_te_init(void)
                NULL /* ospf_mpls_te_del_lsa_hook */);
        if (rc != 0) {
                flog_warn(
-                       OSPF_WARN_OPAQUE_REGISTRATION,
+                       EC_OSPF_OPAQUE_REGISTRATION,
                        "ospf_mpls_te_init: Failed to register Traffic Engineering functions");
                return rc;
        }
@@ -142,7 +142,7 @@ static int ospf_mpls_te_register(enum inter_as_mode mode)
 
        if (rc != 0) {
                flog_warn(
-                       OSPF_WARN_OPAQUE_REGISTRATION,
+                       EC_OSPF_OPAQUE_REGISTRATION,
                        "ospf_router_info_init: Failed to register Inter-AS functions");
                return rc;
        }
@@ -169,7 +169,7 @@ static int ospf_mpls_te_unregister()
 
 void ospf_mpls_te_term(void)
 {
-       list_delete_and_null(&OspfMplsTE.iflist);
+       list_delete(&OspfMplsTE.iflist);
 
        ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA,
                                   OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA);
@@ -820,19 +820,19 @@ static int is_mandated_params_set(struct mpls_te_link *lp)
 
        if (ntohs(OspfMplsTE.router_addr.header.type) == 0) {
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "MPLS-TE(is_mandated_params_set) Missing Router Address");
                return rc;
        }
 
        if (ntohs(lp->link_type.header.type) == 0) {
-               flog_warn(OSPF_WARN_TE_UNEXPECTED,
+               flog_warn(EC_OSPF_TE_UNEXPECTED,
                          "MPLS-TE(is_mandated_params_set) Missing Link Type");
                return rc;
        }
 
        if (!IS_INTER_AS(lp->type) && (ntohs(lp->link_id.header.type) == 0)) {
-               flog_warn(OSPF_WARN_TE_UNEXPECTED,
+               flog_warn(EC_OSPF_TE_UNEXPECTED,
                          "MPLS-TE(is_mandated_params_set) Missing Link ID");
                return rc;
        }
@@ -897,10 +897,6 @@ static int ospf_mpls_te_del_if(struct interface *ifp)
                /* Dequeue listnode entry from the list. */
                listnode_delete(iflist, lp);
 
-               /* Avoid misjudgement in the next lookup. */
-               if (listcount(iflist) == 0)
-                       iflist->head = iflist->tail = NULL;
-
                XFREE(MTYPE_OSPF_MPLS_TE, lp);
        }
 
@@ -925,7 +921,7 @@ void ospf_mpls_te_update_if(struct interface *ifp)
        /* Get Link context from interface */
        if ((lp = lookup_linkparams_by_ifp(ifp)) == NULL) {
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "OSPF MPLS-TE Update: Did not find Link Parameters context for interface %s",
                        ifp->name);
                return;
@@ -970,7 +966,7 @@ static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_state)
 
        if ((lp = lookup_linkparams_by_ifp(oi->ifp)) == NULL) {
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "ospf_mpls_te_ism_change: Cannot get linkparams from OI(%s)?",
                        IF_NAME(oi));
                return;
@@ -978,7 +974,7 @@ static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_state)
 
        if (oi->area == NULL || oi->area->ospf == NULL) {
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "ospf_mpls_te_ism_change: Cannot refer to OSPF from OI(%s)?",
                        IF_NAME(oi));
                return;
@@ -989,7 +985,7 @@ static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_state)
            || (lp->area != NULL && oi->area == NULL)) {
                /* How should we consider this case? */
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "MPLS-TE: Area for OI(%s) has changed to [%s], flush previous LSAs",
                        IF_NAME(oi),
                        oi->area ? inet_ntoa(oi->area->area_id) : "N/A");
@@ -1224,14 +1220,14 @@ static int ospf_mpls_te_lsa_originate1(struct ospf_area *area,
        new = ospf_mpls_te_lsa_new(area->ospf, area, lp);
        if (new == NULL) {
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "ospf_mpls_te_lsa_originate1: ospf_mpls_te_lsa_new() ?");
                return rc;
        }
 
        /* Install this LSA into LSDB. */
        if (ospf_lsa_install(area->ospf, NULL /*oi*/, new) == NULL) {
-               flog_warn(OSPF_WARN_LSA_INSTALL_FAILURE,
+               flog_warn(EC_OSPF_LSA_INSTALL_FAILURE,
                          "ospf_mpls_te_lsa_originate1: ospf_lsa_install() ?");
                ospf_lsa_unlock(&new);
                return rc;
@@ -1326,7 +1322,7 @@ static int ospf_mpls_te_lsa_originate2(struct ospf *top,
        new = ospf_mpls_te_lsa_new(top, NULL, lp);
        if (new == NULL) {
                flog_warn(
-                       OSPF_WARN_LSA_UNEXPECTED,
+                       EC_OSPF_LSA_UNEXPECTED,
                        "ospf_mpls_te_lsa_originate2: ospf_router_info_lsa_new() ?");
                return rc;
        }
@@ -1334,7 +1330,7 @@ static int ospf_mpls_te_lsa_originate2(struct ospf *top,
 
        /* Install this LSA into LSDB. */
        if (ospf_lsa_install(top, NULL /*oi */, new) == NULL) {
-               flog_warn(OSPF_WARN_LSA_INSTALL_FAILURE,
+               flog_warn(EC_OSPF_LSA_INSTALL_FAILURE,
                          "ospf_mpls_te_lsa_originate2: ospf_lsa_install() ?");
                ospf_lsa_unlock(&new);
                return rc;
@@ -1390,7 +1386,7 @@ static int ospf_mpls_te_lsa_originate_as(void *arg)
 
                if (!is_mandated_params_set(lp)) {
                        flog_warn(
-                               OSPF_WARN_TE_UNEXPECTED,
+                               EC_OSPF_TE_UNEXPECTED,
                                "ospf_mpls_te_lsa_originate_as: Link(%s) lacks some mandated MPLS-TE parameters.",
                                lp->ifp ? lp->ifp->name : "?");
                        continue;
@@ -1437,7 +1433,7 @@ static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa)
 
        /* At first, resolve lsa/lp relationship. */
        if ((lp = lookup_linkparams_by_instance(lsa)) == NULL) {
-               flog_warn(OSPF_WARN_TE_UNEXPECTED,
+               flog_warn(EC_OSPF_TE_UNEXPECTED,
                          "ospf_mpls_te_lsa_refresh: Invalid parameter?");
                lsa->data->ls_age =
                        htons(OSPF_LSA_MAXAGE); /* Flush it anyway. */
@@ -1448,7 +1444,7 @@ static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa)
        /* Check if lp was not disable in the interval */
        if (!CHECK_FLAG(lp->flags, LPFLG_LSA_ACTIVE)) {
                flog_warn(
-                       OSPF_WARN_TE_UNEXPECTED,
+                       EC_OSPF_TE_UNEXPECTED,
                        "ospf_mpls_te_lsa_refresh: lp was disabled: Flush it!");
                lsa->data->ls_age =
                        htons(OSPF_LSA_MAXAGE); /* Flush it anyway. */
@@ -1464,7 +1460,7 @@ static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa)
        /* Create new Opaque-LSA/MPLS-TE instance. */
        new = ospf_mpls_te_lsa_new(top, area, lp);
        if (new == NULL) {
-               flog_warn(OSPF_WARN_TE_UNEXPECTED,
+               flog_warn(EC_OSPF_TE_UNEXPECTED,
                          "ospf_mpls_te_lsa_refresh: ospf_mpls_te_lsa_new() ?");
                return NULL;
        }
@@ -1478,7 +1474,7 @@ static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa)
                top = area->ospf;
 
        if (ospf_lsa_install(top, NULL /*oi */, new) == NULL) {
-               flog_warn(OSPF_WARN_LSA_INSTALL_FAILURE,
+               flog_warn(EC_OSPF_LSA_INSTALL_FAILURE,
                          "ospf_mpls_te_lsa_refresh: ospf_lsa_install() ?");
                ospf_lsa_unlock(&new);
                return NULL;
@@ -1534,7 +1530,7 @@ void ospf_mpls_te_lsa_schedule(struct mpls_te_link *lp, enum lsa_opcode opcode)
                        /* Unable to set the area context. Abort! */
                        if (lp->area == NULL) {
                                flog_warn(
-                                       OSPF_WARN_TE_UNEXPECTED,
+                                       EC_OSPF_TE_UNEXPECTED,
                                        "MPLS-TE(ospf_mpls_te_lsa_schedule) Area context is null. Abort !");
                                return;
                        }
@@ -1577,7 +1573,7 @@ void ospf_mpls_te_lsa_schedule(struct mpls_te_link *lp, enum lsa_opcode opcode)
                ospf_opaque_lsa_flush_schedule(&lsa);
                break;
        default:
-               flog_warn(OSPF_WARN_TE_UNEXPECTED,
+               flog_warn(EC_OSPF_TE_UNEXPECTED,
                          "ospf_mpls_te_lsa_schedule: Unknown opcode (%u)",
                          opcode);
                break;
@@ -2402,16 +2398,16 @@ DEFUN (no_ospf_mpls_te_inter_as,
                zlog_debug("MPLS-TE: Inter-AS support OFF");
 
        if ((OspfMplsTE.enabled) && (OspfMplsTE.inter_as != Off)) {
-               OspfMplsTE.inter_as = Off;
                /* Flush all Inter-AS LSA */
                for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp))
                        if (IS_INTER_AS(lp->type)
                            && CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED))
                                ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA);
-       }
 
-       /* Deregister the Callbacks for Inter-AS suport */
-       ospf_mpls_te_unregister();
+               /* Deregister the Callbacks for Inter-AS support */
+               ospf_mpls_te_unregister();
+               OspfMplsTE.inter_as = Off;
+       }
 
        return CMD_SUCCESS;
 }
@@ -2534,8 +2530,8 @@ DEFUN (show_ip_ospf_mpls_te_link,
        "Interface name\n")
 {
        struct vrf *vrf;
-       int idx_interface = 5;
-       struct interface *ifp;
+       int idx_interface = 0;
+       struct interface *ifp = NULL;
        struct listnode *node;
        char *vrf_name = NULL;
        bool all_vrf;
@@ -2547,7 +2543,7 @@ DEFUN (show_ip_ospf_mpls_te_link,
                vrf_name = argv[idx_vrf + 1]->arg;
                all_vrf = strmatch(vrf_name, "all");
        }
-
+       argv_find(argv, argc, "INTERFACE", &idx_interface);
        /* vrf input is provided could be all or specific vrf*/
        if (vrf_name) {
                if (all_vrf) {
@@ -2561,32 +2557,31 @@ DEFUN (show_ip_ospf_mpls_te_link,
                        return CMD_SUCCESS;
                }
                ospf = ospf_lookup_by_inst_name(inst, vrf_name);
-               if (ospf == NULL || !ospf->oi_running)
-                       return CMD_SUCCESS;
-               vrf = vrf_lookup_by_id(ospf->vrf_id);
-               FOR_ALL_INTERFACES (vrf, ifp)
-                       show_mpls_te_link_sub(vty, ifp);
+       } else
+               ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
+       if (ospf == NULL || !ospf->oi_running)
                return CMD_SUCCESS;
-       }
-       /* Show All Interfaces. */
-       if (argc == 5) {
-               for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
-                       if (!ospf->oi_running)
-                               continue;
-                       vrf = vrf_lookup_by_id(ospf->vrf_id);
-                       FOR_ALL_INTERFACES (vrf, ifp)
-                               show_mpls_te_link_sub(vty, ifp);
+
+       vrf = vrf_lookup_by_id(ospf->vrf_id);
+       if (!vrf)
+               return CMD_SUCCESS;
+       if (idx_interface) {
+               ifp = if_lookup_by_name(
+                                       argv[idx_interface]->arg,
+                                       ospf->vrf_id);
+               if (ifp == NULL) {
+                       vty_out(vty, "No such interface name in vrf %s\n",
+                               vrf->name);
+                       return CMD_SUCCESS;
                }
        }
-       /* Interface name is specified. */
-       else {
-               ifp = if_lookup_by_name_all_vrf(argv[idx_interface]->arg);
-               if (ifp == NULL)
-                       vty_out(vty, "No such interface name\n");
-               else
+       if (!ifp) {
+               FOR_ALL_INTERFACES (vrf, ifp)
                        show_mpls_te_link_sub(vty, ifp);
+               return CMD_SUCCESS;
        }
 
+       show_mpls_te_link_sub(vty, ifp);
        return CMD_SUCCESS;
 }