summaryrefslogtreecommitdiffstats
path: root/ospf6d/ospf6_nssa.c
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2021-10-06 02:25:55 +0200
committerRenato Westphal <renato@opensourcerouting.org>2021-10-06 02:25:55 +0200
commit05da1cbfefe165a639ab52b66d0a06745e9cdb4b (patch)
tree5e5706d3ca28466764d5b1b389f6ea73a1a400bd /ospf6d/ospf6_nssa.c
parentospf6d: be careful to not refresh translated Type-5 LSAs twice (diff)
downloadfrr-05da1cbfefe165a639ab52b66d0a06745e9cdb4b.tar.xz
frr-05da1cbfefe165a639ab52b66d0a06745e9cdb4b.zip
ospf6d: fix processing of translated AS-external LSAs
The iteration performed on ospf6_abr_unapprove_translates() was wrong since AS-external LSAs are stored in the global LSDB and not in the area LSDBs. As such, the "unapproved" flag wasn't being set in any translated AS-external LSA, leading them to linger forever. Fix the LSDB iteration and make the required changes to unset the "unapproved" flag for AS-external LSAs that shouldn't be removed. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ospf6d/ospf6_nssa.c')
-rw-r--r--ospf6d/ospf6_nssa.c34
1 files changed, 14 insertions, 20 deletions
diff --git a/ospf6d/ospf6_nssa.c b/ospf6d/ospf6_nssa.c
index de0c39ba2..8ea48ace3 100644
--- a/ospf6d/ospf6_nssa.c
+++ b/ospf6d/ospf6_nssa.c
@@ -379,22 +379,18 @@ static void ospf6_abr_unapprove_translates(struct ospf6 *ospf6)
{
struct ospf6_lsa *lsa;
uint16_t type;
- struct ospf6_area *oa;
- struct listnode *node;
if (IS_OSPF6_DEBUG_NSSA)
zlog_debug("ospf6_abr_unapprove_translates(): Start");
type = htons(OSPF6_LSTYPE_AS_EXTERNAL);
- for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, node, oa)) {
- for (ALL_LSDB_TYPED(oa->lsdb, type, lsa)) {
- if (CHECK_FLAG(lsa->flag, OSPF6_LSA_LOCAL_XLT)) {
- SET_FLAG(lsa->flag, OSPF6_LSA_UNAPPROVED);
- if (IS_OSPF6_DEBUG_NSSA)
- zlog_debug(
- "%s : approved unset on link id %pI4",
- __func__, &lsa->header->id);
- }
+ for (ALL_LSDB_TYPED(ospf6->lsdb, type, lsa)) {
+ if (CHECK_FLAG(lsa->flag, OSPF6_LSA_LOCAL_XLT)) {
+ SET_FLAG(lsa->flag, OSPF6_LSA_UNAPPROVED);
+ if (IS_OSPF6_DEBUG_NSSA)
+ zlog_debug(
+ "%s : approved unset on link id %pI4",
+ __func__, &lsa->header->id);
}
}
@@ -600,6 +596,7 @@ struct ospf6_lsa *ospf6_translated_nssa_refresh(struct ospf6_area *area,
__func__, &type7->header->id);
return NULL;
}
+ UNSET_FLAG(new->flag, OSPF6_LSA_UNAPPROVED);
}
if (IS_OSPF6_DEBUG_NSSA)
@@ -692,16 +689,13 @@ int ospf6_abr_translate_nssa(struct ospf6_area *area, struct ospf6_lsa *lsa)
ospf6->lsdb);
}
- if (old) {
- /* Do not continue if type 5 LSA not approved */
- if (CHECK_FLAG(old->flag, OSPF6_LSA_UNAPPROVED)) {
- if (IS_OSPF6_DEBUG_NSSA)
- zlog_debug(
- "%s : LSA Id %pI4 type 5 is not approved",
- __func__, &old->header->id);
- return 1;
- }
+ if (OSPF6_LSA_IS_MAXAGE(lsa)) {
+ if (old)
+ ospf6_lsa_premature_aging(old);
+ return;
+ }
+ if (old) {
if (IS_OSPF6_DEBUG_NSSA)
zlog_debug(
"%s : found old translated LSA Id %pI4, refreshing",