]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospfd/ospf_opaque.c
OSPFd: Correct style 2nd round
[mirror_frr.git] / ospfd / ospf_opaque.c
index a2c40923b1d776d442b3f838890d9f0f195c2956..d3f41fe86a6a29179fa084faf38d8c899a9fae23 100644 (file)
 #include "ospfd/ospf_route.h"
 #include "ospfd/ospf_ase.h"
 #include "ospfd/ospf_zebra.h"
+#include "ospfd/ospf_te.h"
+#include "ospfd/ospf_sr.h"
+#include "ospfd/ospf_ri.h"
+#include "ospfd/ospf_ext.h"
 
 DEFINE_MTYPE_STATIC(OSPFD, OSPF_OPAQUE_FUNCTAB, "OSPF opaque function table")
 DEFINE_MTYPE_STATIC(OSPFD, OPAQUE_INFO_PER_TYPE, "OSPF opaque per-type info")
@@ -59,9 +63,6 @@ DEFINE_MTYPE_STATIC(OSPFD, OPAQUE_INFO_PER_ID, "OSPF opaque per-ID info")
  * Followings are initialize/terminate functions for Opaque-LSAs handling.
  *------------------------------------------------------------------------*/
 
-#include "ospfd/ospf_te.h"
-#include "ospfd/ospf_ri.h"
-
 #ifdef SUPPORT_OSPF_API
 int ospf_apiserver_init(void);
 void ospf_apiserver_term(void);
@@ -74,6 +75,7 @@ static void ospf_opaque_funclist_init(void);
 static void ospf_opaque_funclist_term(void);
 static void free_opaque_info_per_type(void *val);
 static void free_opaque_info_per_id(void *val);
+static void free_opaque_info_owner(void *val);
 static int ospf_opaque_lsa_install_hook(struct ospf_lsa *lsa);
 static int ospf_opaque_lsa_delete_hook(struct ospf_lsa *lsa);
 
@@ -85,9 +87,16 @@ void ospf_opaque_init(void)
        if (ospf_mpls_te_init() != 0)
                exit(1);
 
+       /* Segment Routing init */
+       if (ospf_sr_init() != 0)
+               exit(1);
+
        if (ospf_router_info_init() != 0)
                exit(1);
 
+       if (ospf_ext_init() != 0)
+               exit(1);
+
 #ifdef SUPPORT_OSPF_API
        if ((ospf_apiserver_enable) && (ospf_apiserver_init() != 0))
                exit(1);
@@ -102,6 +111,10 @@ void ospf_opaque_term(void)
 
        ospf_router_info_term();
 
+       ospf_ext_term();
+
+       ospf_sr_term();
+
 #ifdef SUPPORT_OSPF_API
        ospf_apiserver_term();
 #endif /* SUPPORT_OSPF_API */
@@ -110,10 +123,19 @@ void ospf_opaque_term(void)
        return;
 }
 
+void ospf_opaque_finish(void)
+{
+       ospf_router_info_finish();
+
+       ospf_ext_finish();
+
+       ospf_sr_finish();
+}
+
 int ospf_opaque_type9_lsa_init(struct ospf_interface *oi)
 {
        if (oi->opaque_lsa_self != NULL)
-               list_delete(oi->opaque_lsa_self);
+               list_delete_and_null(&oi->opaque_lsa_self);
 
        oi->opaque_lsa_self = list_new();
        oi->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -125,7 +147,7 @@ void ospf_opaque_type9_lsa_term(struct ospf_interface *oi)
 {
        OSPF_TIMER_OFF(oi->t_opaque_lsa_self);
        if (oi->opaque_lsa_self != NULL)
-               list_delete(oi->opaque_lsa_self);
+               list_delete_and_null(&oi->opaque_lsa_self);
        oi->opaque_lsa_self = NULL;
        return;
 }
@@ -133,7 +155,7 @@ void ospf_opaque_type9_lsa_term(struct ospf_interface *oi)
 int ospf_opaque_type10_lsa_init(struct ospf_area *area)
 {
        if (area->opaque_lsa_self != NULL)
-               list_delete(area->opaque_lsa_self);
+               list_delete_and_null(&area->opaque_lsa_self);
 
        area->opaque_lsa_self = list_new();
        area->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -154,15 +176,14 @@ void ospf_opaque_type10_lsa_term(struct ospf_area *area)
 
        OSPF_TIMER_OFF(area->t_opaque_lsa_self);
        if (area->opaque_lsa_self != NULL)
-               list_delete(area->opaque_lsa_self);
-       area->opaque_lsa_self = NULL;
+               list_delete_and_null(&area->opaque_lsa_self);
        return;
 }
 
 int ospf_opaque_type11_lsa_init(struct ospf *top)
 {
        if (top->opaque_lsa_self != NULL)
-               list_delete(top->opaque_lsa_self);
+               list_delete_and_null(&top->opaque_lsa_self);
 
        top->opaque_lsa_self = list_new();
        top->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -183,8 +204,7 @@ void ospf_opaque_type11_lsa_term(struct ospf *top)
 
        OSPF_TIMER_OFF(top->t_opaque_lsa_self);
        if (top->opaque_lsa_self != NULL)
-               list_delete(top->opaque_lsa_self);
-       top->opaque_lsa_self = NULL;
+               list_delete_and_null(&top->opaque_lsa_self);
        return;
 }
 
@@ -211,6 +231,12 @@ static const char *ospf_opaque_type_name(u_char opaque_type)
        case OPAQUE_TYPE_ROUTER_INFORMATION_LSA:
                name = "Router Information LSA";
                break;
+       case OPAQUE_TYPE_EXTENDED_PREFIX_LSA:
+               name = "Extended Prefix Opaque LSA";
+               break;
+       case OPAQUE_TYPE_EXTENDED_LINK_LSA:
+               name = "Extended Link Opaque LSA";
+               break;
        default:
                if (OPAQUE_TYPE_RANGE_UNASSIGNED(opaque_type))
                        name = "Unassigned";
@@ -287,16 +313,16 @@ static void ospf_opaque_funclist_term(void)
        struct list *funclist;
 
        funclist = ospf_opaque_wildcard_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
 
        funclist = ospf_opaque_type9_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
 
        funclist = ospf_opaque_type10_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
 
        funclist = ospf_opaque_type11_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
        return;
 }
 
@@ -414,9 +440,11 @@ void ospf_delete_opaque_functab(u_char lsa_type, u_char opaque_type)
                        if (functab->opaque_type == opaque_type) {
                                /* Cleanup internal control information, if it
                                 * still remains. */
-                               if (functab->oipt != NULL)
+                               if (functab->oipt != NULL) {
                                        free_opaque_info_per_type(
                                                functab->oipt);
+                                       free_opaque_info_owner(functab->oipt);
+                               }
 
                                /* Dequeue listnode entry from the list. */
                                listnode_delete(funclist, functab);
@@ -544,9 +572,10 @@ register_opaque_info_per_type(struct ospf_opaque_functab *functab,
                listnode_add(new->area->opaque_lsa_self, oipt);
                break;
        case OSPF_OPAQUE_AS_LSA:
-               top = ospf_lookup();
+               top = ospf_lookup_by_vrf_id(new->vrf_id);
                if (new->area != NULL && (top = new->area->ospf) == NULL) {
                        free_opaque_info_per_type((void *)oipt);
+                       free_opaque_info_owner(oipt);
                        oipt = NULL;
                        goto out; /* This case may not exist. */
                }
@@ -558,6 +587,7 @@ register_opaque_info_per_type(struct ospf_opaque_functab *functab,
                        "register_opaque_info_per_type: Unexpected LSA-type(%u)",
                        new->data->type);
                free_opaque_info_per_type((void *)oipt);
+               free_opaque_info_owner(oipt);
                oipt = NULL;
                goto out; /* This case may not exist. */
        }
@@ -575,48 +605,56 @@ out:
        return oipt;
 }
 
-static void free_opaque_info_per_type(void *val)
+/* Remove "oipt" from its owner's self-originated LSA list. */
+static void free_opaque_info_owner(void *val)
 {
        struct opaque_info_per_type *oipt = (struct opaque_info_per_type *)val;
-       struct opaque_info_per_id *oipi;
-       struct ospf_lsa *lsa;
-       struct listnode *node, *nnode;
 
-       /* Control information per opaque-id may still exist. */
-       for (ALL_LIST_ELEMENTS(oipt->id_list, node, nnode, oipi)) {
-               if ((lsa = oipi->lsa) == NULL)
-                       continue;
-               if (IS_LSA_MAXAGE(lsa))
-                       continue;
-               ospf_opaque_lsa_flush_schedule(lsa);
-       }
-
-       /* Remove "oipt" from its owner's self-originated LSA list. */
        switch (oipt->lsa_type) {
        case OSPF_OPAQUE_LINK_LSA: {
                struct ospf_interface *oi =
                        (struct ospf_interface *)(oipt->owner);
+
                listnode_delete(oi->opaque_lsa_self, oipt);
                break;
        }
        case OSPF_OPAQUE_AREA_LSA: {
                struct ospf_area *area = (struct ospf_area *)(oipt->owner);
+
                listnode_delete(area->opaque_lsa_self, oipt);
                break;
        }
        case OSPF_OPAQUE_AS_LSA: {
                struct ospf *top = (struct ospf *)(oipt->owner);
+
                listnode_delete(top->opaque_lsa_self, oipt);
                break;
        }
        default:
-               zlog_warn("free_opaque_info_per_type: Unexpected LSA-type(%u)",
-                         oipt->lsa_type);
+               zlog_warn("%s: Unexpected LSA-type(%u)", __func__,
+                       oipt->lsa_type);
                break; /* This case may not exist. */
        }
+}
+
+static void free_opaque_info_per_type(void *val)
+{
+       struct opaque_info_per_type *oipt = (struct opaque_info_per_type *)val;
+       struct opaque_info_per_id *oipi;
+       struct ospf_lsa *lsa;
+       struct listnode *node, *nnode;
+
+       /* Control information per opaque-id may still exist. */
+       for (ALL_LIST_ELEMENTS(oipt->id_list, node, nnode, oipi)) {
+               if ((lsa = oipi->lsa) == NULL)
+                       continue;
+               if (IS_LSA_MAXAGE(lsa))
+                       continue;
+               ospf_opaque_lsa_flush_schedule(lsa);
+       }
 
        OSPF_TIMER_OFF(oipt->t_opaque_lsa_self);
-       list_delete(oipt->id_list);
+       list_delete_and_null(&oipt->id_list);
        XFREE(MTYPE_OPAQUE_INFO_PER_TYPE, oipt);
        return;
 }
@@ -648,7 +686,7 @@ lookup_opaque_info_by_type(struct ospf_lsa *lsa)
                                "Type-10 Opaque-LSA: Reference to AREA is missing?");
                break;
        case OSPF_OPAQUE_AS_LSA:
-               top = ospf_lookup();
+               top = ospf_lookup_by_vrf_id(lsa->vrf_id);
                if ((area = lsa->area) != NULL && (top = area->ospf) == NULL) {
                        zlog_warn(
                                "Type-11 Opaque-LSA: Reference to OSPF is missing?");
@@ -750,7 +788,7 @@ DEFUN (capability_opaque,
        "Enable specific OSPF feature\n"
        "Opaque LSA\n")
 {
-       VTY_DECLVAR_CONTEXT(ospf, ospf);
+       VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
 
        /* Turn on the "master switch" of opaque-lsa capability. */
        if (!CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) {
@@ -779,7 +817,7 @@ DEFUN (no_capability_opaque,
        "Enable specific OSPF feature\n"
        "Opaque LSA\n")
 {
-       VTY_DECLVAR_CONTEXT(ospf, ospf);
+       VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
 
        /* Turn off the "master switch" of opaque-lsa capability. */
        if (CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) {
@@ -1183,7 +1221,7 @@ void ospf_opaque_lsa_dump(struct stream *s, u_int16_t length)
 {
        struct ospf_lsa lsa;
 
-       lsa.data = (struct lsa_header *)STREAM_PNT(s);
+       lsa.data = (struct lsa_header *)stream_pnt(s);
        show_opaque_info_detail(NULL, &lsa);
        return;
 }
@@ -1571,7 +1609,7 @@ struct ospf_lsa *ospf_opaque_lsa_install(struct ospf_lsa *lsa, int rt_recalc)
                }
                break;
        case OSPF_OPAQUE_AS_LSA:
-               top = ospf_lookup();
+               top = ospf_lookup_by_vrf_id(lsa->vrf_id);
                if (lsa->area != NULL && (top = lsa->area->ospf) == NULL) {
                        /* Above conditions must have passed. */
                        zlog_warn("ospf_opaque_lsa_install: Sonmething wrong?");
@@ -1597,7 +1635,7 @@ struct ospf_lsa *ospf_opaque_lsa_refresh(struct ospf_lsa *lsa)
        struct ospf_opaque_functab *functab;
        struct ospf_lsa *new = NULL;
 
-       ospf = ospf_lookup();
+       ospf = ospf_lookup_by_vrf_id(lsa->vrf_id);
 
        if ((functab = ospf_opaque_functab_lookup(lsa)) == NULL
            || functab->lsa_refresher == NULL) {
@@ -1638,7 +1676,7 @@ static int ospf_opaque_lsa_refresh_timer(struct thread *t);
 void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,
                                          u_char lsa_type, u_char opaque_type)
 {
-       struct ospf *top;
+       struct ospf *top = NULL;
        struct ospf_area dummy, *area = NULL;
        struct ospf_interface *oi = NULL;
 
@@ -1739,6 +1777,7 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,
 
        /* Generate a dummy lsa to be passed for a lookup function. */
        lsa = pseudo_lsa(oi, area, lsa_type, opaque_type);
+       lsa->vrf_id = top->vrf_id;
 
        if ((oipt = lookup_opaque_info_by_type(lsa)) == NULL) {
                struct ospf_opaque_functab *functab;
@@ -1787,7 +1826,7 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,
                        lsa_type, delay,
                        GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)));
 
-       OSPF_OPAQUE_TIMER_ON(oipt->t_opaque_lsa_self, func, oipt, delay * 1000);
+       OSPF_OPAQUE_TIMER_ON(oipt->t_opaque_lsa_self, func, oipt, delay);
 
 out:
        return;
@@ -1804,6 +1843,7 @@ static struct ospf_lsa *pseudo_lsa(struct ospf_interface *oi,
        lsa.oi = oi;
        lsa.area = area;
        lsa.data = &lsah;
+       lsa.vrf_id = VRF_DEFAULT;
 
        lsah.type = lsa_type;
        tmp = SET_OPAQUE_LSID(opaque_type, 0); /* Opaque-ID is unused here. */
@@ -2000,7 +2040,7 @@ void ospf_opaque_lsa_refresh_schedule(struct ospf_lsa *lsa0)
                ospf_ls_retransmit_delete_nbr_area(lsa->area, lsa);
                break;
        case OSPF_OPAQUE_AS_LSA:
-               top = ospf_lookup();
+               top = ospf_lookup_by_vrf_id(lsa0->vrf_id);
                if ((lsa0->area != NULL) && (lsa0->area->ospf != NULL))
                        top = lsa0->area->ospf;
                ospf_ls_retransmit_delete_nbr_as(top, lsa);
@@ -2054,7 +2094,7 @@ void ospf_opaque_lsa_flush_schedule(struct ospf_lsa *lsa0)
        struct ospf_lsa *lsa;
        struct ospf *top;
 
-       top = ospf_lookup();
+       top = ospf_lookup_by_vrf_id(lsa0->vrf_id);
 
        if ((oipt = lookup_opaque_info_by_type(lsa0)) == NULL
            || (oipi = lookup_opaque_info_by_id(oipt, lsa0)) == NULL) {