From 0124b46b949effbd90ceb2aa129753f64e86c1a3 Mon Sep 17 00:00:00 2001 From: ckishimo Date: Wed, 18 Nov 2020 23:23:14 -0800 Subject: [PATCH] ospfd: fix NSSA translator Having 2 ABR in NSSA area where R3 is the elected translator R3# show ip ospf We are an ABR and the NSSA Elected Translator. R2# show ip ospf We are an ABR, but not the NSSA Elected Translator. When R3 loses the Border condition by shutting down the interface to the backbone, we end up with no translator in the NSSA area. It is expected R2 to take over the translator role R3# sh ip ospf It is not ABR, therefore not Translator. R2# show ip ospf We are an ABR, but not the NSSA Elected Translator. This PR forces the ABR to reevaluate the translator condition, so R2 becomes the elected Translator Signed-off-by: ckishimo --- ospfd/ospf_abr.c | 2 +- ospfd/ospf_abr.h | 1 + ospfd/ospf_spf.c | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c index 634418ec5a..f3c4798906 100644 --- a/ospfd/ospf_abr.c +++ b/ospfd/ospf_abr.c @@ -379,7 +379,7 @@ static int ospf_abr_nssa_am_elected(struct ospf_area *area) /* Check NSSA ABR status * assumes there are nssa areas */ -static void ospf_abr_nssa_check_status(struct ospf *ospf) +void ospf_abr_nssa_check_status(struct ospf *ospf) { struct ospf_area *area; struct listnode *lnode, *nnode; diff --git a/ospfd/ospf_abr.h b/ospfd/ospf_abr.h index b3007622c4..e15f4a6bf7 100644 --- a/ospfd/ospf_abr.h +++ b/ospfd/ospf_abr.h @@ -83,4 +83,5 @@ extern void ospf_schedule_abr_task(struct ospf *); extern void ospf_abr_announce_network_to_area(struct prefix_ipv4 *, uint32_t, struct ospf_area *); +extern void ospf_abr_nssa_check_status(struct ospf *ospf); #endif /* _ZEBRA_OSPF_ABR_H */ diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c index b53719a402..78814cb288 100644 --- a/ospfd/ospf_spf.c +++ b/ospfd/ospf_spf.c @@ -1432,8 +1432,11 @@ static int ospf_spf_calculate_schedule_worker(struct thread *thread) /* ABRs may require additional changes, see RFC 2328 16.7. */ monotime(&start_time); - if (IS_OSPF_ABR(ospf)) + if (IS_OSPF_ABR(ospf)) { + if (ospf->anyNSSA) + ospf_abr_nssa_check_status(ospf); ospf_abr_task(ospf); + } abr_time = monotime_since(&start_time, NULL); /* Schedule Segment Routing update */