]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospfd/ospf_abr.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / ospfd / ospf_abr.c
index c6d4364fa3c1adefe9e9f8309dbe22ba03e6cd0a..c8b8b611efcbd9fdc06ac55af6223e2f50336920 100644 (file)
@@ -49,6 +49,7 @@
 #include "ospfd/ospf_ase.h"
 #include "ospfd/ospf_zebra.h"
 #include "ospfd/ospf_dump.h"
+#include "ospfd/ospf_errors.h"
 
 static struct ospf_area_range *ospf_area_range_new(struct prefix_ipv4 *p)
 {
@@ -76,6 +77,7 @@ static void ospf_area_range_add(struct ospf_area *area,
        p.family = AF_INET;
        p.prefixlen = range->masklen;
        p.prefix = range->addr;
+       apply_mask_ipv4(&p);
 
        rn = route_node_get(area->ranges, (struct prefix *)&p);
        if (rn->info)
@@ -90,7 +92,7 @@ static void ospf_area_range_delete(struct ospf_area *area,
        struct ospf_area_range *range = rn->info;
 
        if (range->specifics != 0)
-               ospf_delete_discard_route(area->ospf->new_table,
+               ospf_delete_discard_route(area->ospf, area->ospf->new_table,
                                          (struct prefix_ipv4 *)&rn->p);
 
        ospf_area_range_free(range);
@@ -123,6 +125,7 @@ struct ospf_area_range *ospf_area_range_lookup_next(struct ospf_area *area,
        p.family = AF_INET;
        p.prefixlen = IPV4_MAX_BITLEN;
        p.prefix = *range_net;
+       apply_mask_ipv4(&p);
 
        if (first)
                rn = route_top(area->ranges);
@@ -193,6 +196,8 @@ int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
 
        range = ospf_area_range_lookup(area, p);
        if (range != NULL) {
+               if (!CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
+                       range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
                if ((CHECK_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE)
                     && !CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
                    || (!CHECK_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE)
@@ -206,14 +211,16 @@ int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
 
        if (CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
                SET_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE);
-       else
+       else {
                UNSET_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE);
+               range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
+       }
 
        return 1;
 }
 
 int ospf_area_range_cost_set(struct ospf *ospf, struct in_addr area_id,
-                            struct prefix_ipv4 *p, u_int32_t cost)
+                            struct prefix_ipv4 *p, uint32_t cost)
 {
        struct ospf_area *area;
        struct ospf_area_range *range;
@@ -325,8 +332,7 @@ static int ospf_abr_nssa_am_elected(struct ospf_area *area)
        struct router_lsa *rlsa;
        struct in_addr *best = NULL;
 
-       LSDB_LOOP(ROUTER_LSDB(area), rn, lsa)
-       {
+       LSDB_LOOP (ROUTER_LSDB(area), rn, lsa) {
                /* sanity checks */
                if (!lsa || (lsa->data->type != OSPF_ROUTER_LSA)
                    || IS_LSA_SELF(lsa))
@@ -378,7 +384,7 @@ static void ospf_abr_nssa_check_status(struct ospf *ospf)
        struct listnode *lnode, *nnode;
 
        for (ALL_LIST_ELEMENTS(ospf->areas, lnode, nnode, area)) {
-               u_char old_state = area->NSSATranslatorState;
+               uint8_t old_state = area->NSSATranslatorState;
 
                if (area->external_routing != OSPF_AREA_NSSA)
                        continue;
@@ -470,7 +476,7 @@ void ospf_check_abr_status(struct ospf *ospf)
        int bb_act_attached = 0;
        int areas_configured = 0;
        int areas_act_attached = 0;
-       u_char new_flags = ospf->flags;
+       uint8_t new_flags = ospf->flags;
 
        if (IS_DEBUG_OSPF_EVENT)
                zlog_debug("ospf_check_abr_status(): Start");
@@ -584,12 +590,12 @@ static void ospf_abr_update_aggregate(struct ospf_area_range *range,
        range->specifics++;
 }
 
-static void set_metric(struct ospf_lsa *lsa, u_int32_t metric)
+static void set_metric(struct ospf_lsa *lsa, uint32_t metric)
 {
        struct summary_lsa *header;
-       u_char *mp;
+       uint8_t *mp;
        metric = htonl(metric);
-       mp = (u_char *)&metric;
+       mp = (uint8_t *)&metric;
        mp++;
        header = (struct summary_lsa *)lsa->data;
        memcpy(header->metric, mp, 3);
@@ -682,18 +688,18 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa)
        return 0;
 }
 
-static void ospf_abr_translate_nssa_range(struct prefix_ipv4 *p, u_int32_t cost)
+static void ospf_abr_translate_nssa_range(struct prefix_ipv4 *p, uint32_t cost)
 {
        /* The Type-7 is created from the aggregated prefix and forwarded
           for lsa installation and flooding... to be added... */
 }
 
-void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, u_int32_t cost,
+void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, uint32_t cost,
                                       struct ospf_area *area)
 {
        struct ospf_lsa *lsa, *old = NULL;
        struct summary_lsa *sl = NULL;
-       u_int32_t full_cost;
+       uint32_t full_cost;
 
        if (IS_DEBUG_OSPF_EVENT)
                zlog_debug("ospf_abr_announce_network_to_area(): Start");
@@ -741,7 +747,8 @@ void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, u_int32_t cost,
 
                                prefix2str((struct prefix *)p, buf,
                                           sizeof(buf));
-                               zlog_warn("%s: Could not refresh %s to %s",
+                               flog_warn(EC_OSPF_LSA_MISSING,
+                                         "%s: Could not refresh %s to %s",
                                          __func__, buf,
                                          inet_ntoa(area->area_id));
                                return;
@@ -763,7 +770,8 @@ void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, u_int32_t cost,
                        char buf[PREFIX2STR_BUFFER];
 
                        prefix2str((struct prefix *)p, buf, sizeof(buf));
-                       zlog_warn("%s: Could not originate %s to %s", __func__,
+                       flog_warn(EC_OSPF_LSA_MISSING,
+                                 "%s: Could not originate %s to %s", __func__,
                                  buf, inet_ntoa(area->area_id));
                        return;
                }
@@ -975,8 +983,8 @@ static void ospf_abr_process_nssa_translates(struct ospf *ospf)
                                "looking at area %s",
                                inet_ntoa(area->area_id));
 
-               LSDB_LOOP(NSSA_LSDB(area), rn, lsa)
-               ospf_abr_translate_nssa(area, lsa);
+               LSDB_LOOP (NSSA_LSDB(area), rn, lsa)
+                       ospf_abr_translate_nssa(area, lsa);
        }
 
        if (IS_DEBUG_OSPF_NSSA)
@@ -1088,7 +1096,7 @@ static void ospf_abr_process_network_rt(struct ospf *ospf,
                zlog_debug("ospf_abr_process_network_rt(): Stop");
 }
 
-static void ospf_abr_announce_rtr_to_area(struct prefix_ipv4 *p, u_int32_t cost,
+static void ospf_abr_announce_rtr_to_area(struct prefix_ipv4 *p, uint32_t cost,
                                          struct ospf_area *area)
 {
        struct ospf_lsa *lsa, *old = NULL;
@@ -1131,7 +1139,8 @@ static void ospf_abr_announce_rtr_to_area(struct prefix_ipv4 *p, u_int32_t cost,
                        char buf[PREFIX2STR_BUFFER];
 
                        prefix2str((struct prefix *)p, buf, sizeof(buf));
-                       zlog_warn("%s: Could not refresh/originate %s to %s",
+                       flog_warn(EC_OSPF_LSA_MISSING,
+                                 "%s: Could not refresh/originate %s to %s",
                                  __func__, buf, inet_ntoa(area->area_id));
                        return;
                }
@@ -1322,15 +1331,15 @@ ospf_abr_unapprove_translates(struct ospf *ospf) /* For NSSA Translations */
        /* NSSA Translator is not checked, because it may have gone away,
          and we would want to flush any residuals anyway */
 
-       LSDB_LOOP(EXTERNAL_LSDB(ospf), rn, lsa)
-       if (CHECK_FLAG(lsa->flags, OSPF_LSA_LOCAL_XLT)) {
-               UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED);
-               if (IS_DEBUG_OSPF_NSSA)
-                       zlog_debug(
-                               "ospf_abr_unapprove_translates(): "
-                               "approved unset on link id %s",
-                               inet_ntoa(lsa->data->id));
-       }
+       LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa)
+               if (CHECK_FLAG(lsa->flags, OSPF_LSA_LOCAL_XLT)) {
+                       UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED);
+                       if (IS_DEBUG_OSPF_NSSA)
+                               zlog_debug(
+                                       "ospf_abr_unapprove_translates(): "
+                                       "approved unset on link id %s",
+                                       inet_ntoa(lsa->data->id));
+               }
 
        if (IS_DEBUG_OSPF_NSSA)
                zlog_debug("ospf_abr_unapprove_translates(): Stop");
@@ -1352,25 +1361,25 @@ static void ospf_abr_unapprove_summaries(struct ospf *ospf)
                                "ospf_abr_unapprove_summaries(): "
                                "considering area %s",
                                inet_ntoa(area->area_id));
-               LSDB_LOOP(SUMMARY_LSDB(area), rn, lsa)
-               if (ospf_lsa_is_self_originated(ospf, lsa)) {
-                       if (IS_DEBUG_OSPF_EVENT)
-                               zlog_debug(
-                                       "ospf_abr_unapprove_summaries(): "
-                                       "approved unset on summary link id %s",
-                                       inet_ntoa(lsa->data->id));
-                       UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED);
-               }
+               LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa)
+                       if (ospf_lsa_is_self_originated(ospf, lsa)) {
+                               if (IS_DEBUG_OSPF_EVENT)
+                                       zlog_debug(
+                                               "ospf_abr_unapprove_summaries(): "
+                                               "approved unset on summary link id %s",
+                                               inet_ntoa(lsa->data->id));
+                               UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED);
+                       }
 
-               LSDB_LOOP(ASBR_SUMMARY_LSDB(area), rn, lsa)
-               if (ospf_lsa_is_self_originated(ospf, lsa)) {
-                       if (IS_DEBUG_OSPF_EVENT)
-                               zlog_debug(
-                                       "ospf_abr_unapprove_summaries(): "
-                                       "approved unset on asbr-summary link id %s",
-                                       inet_ntoa(lsa->data->id));
-                       UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED);
-               }
+               LSDB_LOOP (ASBR_SUMMARY_LSDB(area), rn, lsa)
+                       if (ospf_lsa_is_self_originated(ospf, lsa)) {
+                               if (IS_DEBUG_OSPF_EVENT)
+                                       zlog_debug(
+                                               "ospf_abr_unapprove_summaries(): "
+                                               "approved unset on asbr-summary link id %s",
+                                               inet_ntoa(lsa->data->id));
+                               UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED);
+                       }
        }
 
        if (IS_DEBUG_OSPF_EVENT)
@@ -1630,8 +1639,8 @@ static void ospf_abr_remove_unapproved_translates(struct ospf *ospf)
        if (IS_DEBUG_OSPF_NSSA)
                zlog_debug("ospf_abr_remove_unapproved_translates(): Start");
 
-       LSDB_LOOP(EXTERNAL_LSDB(ospf), rn, lsa)
-       ospf_abr_remove_unapproved_translates_apply(ospf, lsa);
+       LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa)
+               ospf_abr_remove_unapproved_translates_apply(ospf, lsa);
 
        if (IS_DEBUG_OSPF_NSSA)
                zlog_debug("ospf_abr_remove_unapproved_translates(): Stop");
@@ -1654,15 +1663,15 @@ static void ospf_abr_remove_unapproved_summaries(struct ospf *ospf)
                                "looking at area %s",
                                inet_ntoa(area->area_id));
 
-               LSDB_LOOP(SUMMARY_LSDB(area), rn, lsa)
-               if (ospf_lsa_is_self_originated(ospf, lsa))
-                       if (!CHECK_FLAG(lsa->flags, OSPF_LSA_APPROVED))
-                               ospf_lsa_flush_area(lsa, area);
+               LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa)
+                       if (ospf_lsa_is_self_originated(ospf, lsa))
+                               if (!CHECK_FLAG(lsa->flags, OSPF_LSA_APPROVED))
+                                       ospf_lsa_flush_area(lsa, area);
 
-               LSDB_LOOP(ASBR_SUMMARY_LSDB(area), rn, lsa)
-               if (ospf_lsa_is_self_originated(ospf, lsa))
-                       if (!CHECK_FLAG(lsa->flags, OSPF_LSA_APPROVED))
-                               ospf_lsa_flush_area(lsa, area);
+               LSDB_LOOP (ASBR_SUMMARY_LSDB(area), rn, lsa)
+                       if (ospf_lsa_is_self_originated(ospf, lsa))
+                               if (!CHECK_FLAG(lsa->flags, OSPF_LSA_APPROVED))
+                                       ospf_lsa_flush_area(lsa, area);
        }
 
        if (IS_DEBUG_OSPF_EVENT)
@@ -1683,12 +1692,13 @@ static void ospf_abr_manage_discard_routes(struct ospf *ospf)
                                               OSPF_AREA_RANGE_ADVERTISE)) {
                                        if (range->specifics)
                                                ospf_add_discard_route(
-                                                       ospf->new_table, area,
+                                                       ospf, ospf->new_table,
+                                                       area,
                                                        (struct prefix_ipv4
                                                                 *)&rn->p);
                                        else
                                                ospf_delete_discard_route(
-                                                       ospf->new_table,
+                                                       ospf, ospf->new_table,
                                                        (struct prefix_ipv4
                                                                 *)&rn->p);
                                }