summaryrefslogtreecommitdiff
path: root/ospfd/ospf_abr.c
diff options
context:
space:
mode:
authorPaul Jakma <paul.jakma@sun.com>2006-06-26 12:50:06 +0000
committerPaul Jakma <paul.jakma@sun.com>2006-06-26 12:50:06 +0000
commit9560fa8ac994966a8da0ba23c46c0299164b7112 (patch)
treefa1f10194a81da333af1bbe43664c73a5c1b5fc4 /ospfd/ospf_abr.c
parent9aecfae2ec82027fe1cf2740e6099397376a3f4f (diff)
[ospfd] NSSA translate-enabled ABR should declare itself as ASBR
2006-06-26 Paul Jakma <paul.jakma@sun.com> * ospf_abr.c: (general) NSSA translate-candidate ABRs need to be ASBRs, or other routers may rightfully refuse to install translated type-5s LSAs. reported by dendroot@gmail.com. (ospf_abr_nssa_check_status) Detect change in translator state when ABR, and inc/dec redistribute count as when we leave/enter the disabled state - so that translate-enabled ABR properly sets ASBR bit on non-NSSA areas. Run the resulting function through indent to clean it up. * ospf_lsa.c: (router_lsa_flags) For purposes of ASBR bit, NSSA area is same as stub area.
Diffstat (limited to 'ospfd/ospf_abr.c')
-rw-r--r--ospfd/ospf_abr.c109
1 files changed, 61 insertions, 48 deletions
diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c
index 225cf6ed..88636f1a 100644
--- a/ospfd/ospf_abr.c
+++ b/ospfd/ospf_abr.c
@@ -409,67 +409,80 @@ ospf_abr_nssa_check_status (struct ospf *ospf)
{
struct ospf_area *area;
struct listnode *lnode, *nnode;
-
+
for (ALL_LIST_ELEMENTS (ospf->areas, lnode, nnode, area))
{
-
+ u_char old_state = area->NSSATranslatorState;
+
if (area->external_routing != OSPF_AREA_NSSA)
continue;
-
+
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_debug ("ospf_abr_nssa_check_status: "
"checking area %s",
inet_ntoa (area->area_id));
-
+
if (!IS_OSPF_ABR (area->ospf))
{
if (IS_DEBUG_OSPF (nssa, NSSA))
- zlog_debug ("ospf_abr_nssa_check_status: "
- "not ABR");
+ zlog_debug ("ospf_abr_nssa_check_status: "
+ "not ABR");
area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
- continue;
}
-
- switch (area->NSSATranslatorRole)
- {
- case OSPF_NSSA_ROLE_NEVER:
- /* We never Translate Type-7 LSA. */
- /* TODO: check previous state and flush? */
- if (IS_DEBUG_OSPF (nssa, NSSA))
- zlog_debug ("ospf_abr_nssa_check_status: "
- "never translate");
- area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
- continue;
-
- case OSPF_NSSA_ROLE_ALWAYS:
- /* We always translate if we are an ABR
- * TODO: originate new LSAs if state change?
- * or let the nssa abr task take care of it?
- */
- if (IS_DEBUG_OSPF (nssa, NSSA))
- zlog_debug ("ospf_abr_nssa_check_status: "
- "translate always");
- area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
- continue;
-
- case OSPF_NSSA_ROLE_CANDIDATE:
- /* We are a candidate for Translation */
- if (ospf_abr_nssa_am_elected (area) > 0 )
- {
- area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
- if (IS_DEBUG_OSPF (nssa, NSSA))
- zlog_debug ("ospf_abr_nssa_check_status: "
- "elected translator");
- }
- else
- {
- area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
- if (IS_DEBUG_OSPF (nssa, NSSA))
- zlog_debug ("ospf_abr_nssa_check_status: "
- "not elected");
- }
- continue;
- }
+ else
+ {
+ switch (area->NSSATranslatorRole)
+ {
+ case OSPF_NSSA_ROLE_NEVER:
+ /* We never Translate Type-7 LSA. */
+ /* TODO: check previous state and flush? */
+ if (IS_DEBUG_OSPF (nssa, NSSA))
+ zlog_debug ("ospf_abr_nssa_check_status: "
+ "never translate");
+ area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
+ break;
+
+ case OSPF_NSSA_ROLE_ALWAYS:
+ /* We always translate if we are an ABR
+ * TODO: originate new LSAs if state change?
+ * or let the nssa abr task take care of it?
+ */
+ if (IS_DEBUG_OSPF (nssa, NSSA))
+ zlog_debug ("ospf_abr_nssa_check_status: "
+ "translate always");
+ area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
+ break;
+
+ case OSPF_NSSA_ROLE_CANDIDATE:
+ /* We are a candidate for Translation */
+ if (ospf_abr_nssa_am_elected (area) > 0)
+ {
+ area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
+ if (IS_DEBUG_OSPF (nssa, NSSA))
+ zlog_debug ("ospf_abr_nssa_check_status: "
+ "elected translator");
+ }
+ else
+ {
+ area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
+ if (IS_DEBUG_OSPF (nssa, NSSA))
+ zlog_debug ("ospf_abr_nssa_check_status: " "not elected");
+ }
+ break;
+ }
+ }
+ /* RFC3101, 3.1:
+ * All NSSA border routers must set the E-bit in the Type-1 router-LSAs
+ * of their directly attached non-stub areas, even when they are not
+ * translating.
+ */
+ if (old_state != area->NSSATranslatorState)
+ {
+ if (old_state == OSPF_NSSA_TRANSLATE_DISABLED)
+ ospf_asbr_status_update (ospf, ++ospf->redistribute);
+ else if (area->NSSATranslatorState == OSPF_NSSA_TRANSLATE_DISABLED)
+ ospf_asbr_status_update (ospf, --ospf->redistribute);
+ }
}
}