]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospf6d: do not allow an area to be stub and NSSA at the same time
authorRenato Westphal <renato@opensourcerouting.org>
Thu, 19 Aug 2021 15:14:47 +0000 (12:14 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Tue, 24 Aug 2021 14:53:36 +0000 (11:53 -0300)
That should not be allowed under any circumstance.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ospf6d/ospf6_area.c
ospf6d/ospf6_area.h
ospf6d/ospf6_nssa.c
ospf6d/ospf6_nssa.h

index 0f1f0612250b1406980665a7c86cd18cd6ee1bd2..098132b1f6c0b9e1f8bc4d04450379c5d11f2156 100644 (file)
@@ -189,6 +189,9 @@ static void ospf6_area_stub_update(struct ospf6_area *area)
 static int ospf6_area_stub_set(struct ospf6 *ospf6, struct ospf6_area *area)
 {
        if (!IS_AREA_STUB(area)) {
+               /* Disable NSSA first. */
+               ospf6_area_nssa_unset(ospf6, area);
+
                SET_FLAG(area->flag, OSPF6_AREA_STUB);
                ospf6_area_stub_update(area);
        }
@@ -196,7 +199,7 @@ static int ospf6_area_stub_set(struct ospf6 *ospf6, struct ospf6_area *area)
        return 1;
 }
 
-static void ospf6_area_stub_unset(struct ospf6 *ospf6, struct ospf6_area *area)
+void ospf6_area_stub_unset(struct ospf6 *ospf6, struct ospf6_area *area)
 {
        if (IS_AREA_STUB(area)) {
                UNSET_FLAG(area->flag, OSPF6_AREA_STUB);
@@ -1266,6 +1269,8 @@ DEFUN(ospf6_area_nssa, ospf6_area_nssa_cmd,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
+       ospf6_area_no_summary_unset(ospf6, area);
+
        return CMD_SUCCESS;
 }
 
index dd4d019015caf440656b711d2debd59021d5b4a7..b2a275d745bedb0a5e27804de516e74b0bcf9704 100644 (file)
@@ -154,6 +154,7 @@ extern void ospf6_area_delete(struct ospf6_area *);
 extern struct ospf6_area *ospf6_area_lookup(uint32_t, struct ospf6 *);
 extern struct ospf6_area *ospf6_area_lookup_by_area_id(uint32_t area_id);
 
+extern void ospf6_area_stub_unset(struct ospf6 *ospf6, struct ospf6_area *area);
 extern void ospf6_area_enable(struct ospf6_area *);
 extern void ospf6_area_disable(struct ospf6_area *);
 
index cda92054a2bb3c4af862e5258143a5ce567f7681..10b7d2d9f65addd7f2d75e74f20818be02f0dfd5 100644 (file)
@@ -1198,7 +1198,7 @@ static void ospf6_check_and_originate_type7_lsa(struct ospf6_area *area)
 
 }
 
-static void ospf6_area_nssa_update(struct ospf6_area *area)
+void ospf6_area_nssa_update(struct ospf6_area *area)
 {
        if (IS_AREA_NSSA(area)) {
                OSPF6_OPT_CLEAR(area->options, OSPF6_OPT_E);
@@ -1246,6 +1246,9 @@ int ospf6_area_nssa_set(struct ospf6 *ospf6, struct ospf6_area *area)
 {
 
        if (!IS_AREA_NSSA(area)) {
+               /* Disable stub first. */
+               ospf6_area_stub_unset(ospf6, area);
+
                SET_FLAG(area->flag, OSPF6_AREA_NSSA);
                if (IS_OSPF6_DEBUG_NSSA)
                        zlog_debug("area %s nssa set", area->name);
index a171d76d4413f456c228f129d34b63aaed2842b0..454bdd7fe2eb692185b5dbbea599e7d48abd85e3 100644 (file)
@@ -61,6 +61,7 @@ extern struct ospf6_lsa *ospf6_translated_nssa_originate(struct ospf6_area *,
 extern void ospf6_asbr_nssa_redist_task(struct ospf6 *ospf6);
 
 extern void ospf6_schedule_abr_task(struct ospf6 *ospf6);
+extern void ospf6_area_nssa_update(struct ospf6_area *area);
 void ospf6_asbr_prefix_readvertise(struct ospf6 *ospf6);
 extern void ospf6_nssa_lsa_originate(struct ospf6_route *route,
                                     struct ospf6_area *area);