]> 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 a2184f61957499ee41e9cb418cfda8d912dbc043..d3f41fe86a6a29179fa084faf38d8c899a9fae23 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
 #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")
@@ -60,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);
@@ -75,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);
 
@@ -86,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);
@@ -103,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 */
@@ -111,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;
@@ -126,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;
 }
@@ -134,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;
@@ -155,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;
@@ -184,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;
 }
 
@@ -212,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";
@@ -288,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;
 }
 
@@ -415,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);
@@ -545,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. */
                }
@@ -559,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. */
        }
@@ -576,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;
 }
@@ -649,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?");
@@ -751,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)) {
@@ -780,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)) {
@@ -1089,7 +1126,7 @@ void ospf_opaque_config_write_router(struct vty *vty, struct ospf *ospf)
        struct list *funclist;
 
        if (CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE))
-               vty_out(vty, " capability opaque%s", VTY_NEWLINE);
+               vty_out(vty, " capability opaque\n");
 
        funclist = ospf_opaque_wildcard_funclist;
        opaque_lsa_config_write_router_callback(funclist, vty);
@@ -1154,14 +1191,13 @@ void show_opaque_info_detail(struct vty *vty, struct ospf_lsa *lsa)
 
        /* Switch output functionality by vty address. */
        if (vty != NULL) {
-               vty_out(vty, "  Opaque-Type %u (%s)%s", opaque_type,
-                       ospf_opaque_type_name(opaque_type), VTY_NEWLINE);
-               vty_out(vty, "  Opaque-ID   0x%x%s", opaque_id, VTY_NEWLINE);
+               vty_out(vty, "  Opaque-Type %u (%s)\n", opaque_type,
+                       ospf_opaque_type_name(opaque_type));
+               vty_out(vty, "  Opaque-ID   0x%x\n", opaque_id);
 
-               vty_out(vty, "  Opaque-Info: %u octets of data%s%s",
+               vty_out(vty, "  Opaque-Info: %u octets of data%s\n",
                        ntohs(lsah->length) - OSPF_LSA_HEADER_SIZE,
-                       VALID_OPAQUE_INFO_LEN(lsah) ? "" : "(Invalid length?)",
-                       VTY_NEWLINE);
+                       VALID_OPAQUE_INFO_LEN(lsah) ? "" : "(Invalid length?)");
        } else {
                zlog_debug("    Opaque-Type %u (%s)", opaque_type,
                           ospf_opaque_type_name(opaque_type));
@@ -1185,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;
 }
@@ -1302,8 +1338,9 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)
                        zlog_debug(
                                "Schedule Type-9 Opaque-LSA origination in %d ms later.",
                                delay);
-               oi->t_opaque_lsa_self = thread_add_timer_msec(
-                       master, ospf_opaque_type9_lsa_originate, oi, delay);
+               oi->t_opaque_lsa_self = NULL;
+               thread_add_timer_msec(master, ospf_opaque_type9_lsa_originate,
+                                     oi, delay, &oi->t_opaque_lsa_self);
                delay += top->min_ls_interval;
        }
 
@@ -1319,8 +1356,9 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)
                        zlog_debug(
                                "Schedule Type-10 Opaque-LSA origination in %d ms later.",
                                delay);
-               area->t_opaque_lsa_self = thread_add_timer_msec(
-                       master, ospf_opaque_type10_lsa_originate, area, delay);
+               area->t_opaque_lsa_self = NULL;
+               thread_add_timer_msec(master, ospf_opaque_type10_lsa_originate,
+                                     area, delay, &area->t_opaque_lsa_self);
                delay += top->min_ls_interval;
        }
 
@@ -1336,8 +1374,9 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)
                        zlog_debug(
                                "Schedule Type-11 Opaque-LSA origination in %d ms later.",
                                delay);
-               top->t_opaque_lsa_self = thread_add_timer_msec(
-                       master, ospf_opaque_type11_lsa_originate, top, delay);
+               top->t_opaque_lsa_self = NULL;
+               thread_add_timer_msec(master, ospf_opaque_type11_lsa_originate,
+                                     top, delay, &top->t_opaque_lsa_self);
                delay += top->min_ls_interval;
        }
 
@@ -1570,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?");
@@ -1596,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) {
@@ -1624,9 +1663,7 @@ struct ospf_lsa *ospf_opaque_lsa_refresh(struct ospf_lsa *lsa)
  * triggered by external interventions (vty session, signaling, etc).
  *------------------------------------------------------------------------*/
 
-#define OSPF_OPAQUE_TIMER_ON(T, F, L, V)                                       \
-       if (!(T))                                                              \
-       (T) = thread_add_timer_msec(master, (F), (L), (V))
+#define OSPF_OPAQUE_TIMER_ON(T,F,L,V) thread_add_timer_msec (master, (F), (L), (V), &(T))
 
 static struct ospf_lsa *pseudo_lsa(struct ospf_interface *oi,
                                   struct ospf_area *area, u_char lsa_type,
@@ -1639,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;
 
@@ -1740,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;
@@ -1788,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;
@@ -1805,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. */
@@ -2001,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);
@@ -2055,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) {