summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authorAlexander Chernavin <achernavin@netgate.com>2023-07-19 14:03:46 +0200
committerAlexander Chernavin <achernavin@netgate.com>2023-07-19 15:12:40 +0200
commitb1f759133b6b909dde73f474f3411fc569fff16d (patch)
tree83d584f177ce11c455ae5f1817b3778f8af35d2b /ospfd
parentMerge pull request #14049 from opensourcerouting/fix/initialize_some_bools (diff)
downloadfrr-b1f759133b6b909dde73f474f3411fc569fff16d.tar.xz
frr-b1f759133b6b909dde73f474f3411fc569fff16d.zip
ospfd: fix default-metric change if external LSAs already sent
Currently, when redistribution of routes was configured, external LSAs were already advertised to peers, and then default-metric is changed, external LSAs refresh will not occur. In other words, the peers will not receive the refreshed external LSAs with the new metric. With this fix, changing default-metric will cause external LSAs to be refreshed and flooded. There is a similar task to refresh external LSAs when NSSA settings are changed. And there is a function that accomplishes it - ospf_schedule_asbr_nssa_redist_update(). Since the function does the general work of refreshing external LSAs and is not specific to NSSA settings, the idea is to give it a more general name and call it when default-metric changes in order to fix the problem. Signed-off-by: Alexander Chernavin <achernavin@netgate.com>
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_asbr.c18
-rw-r--r--ospfd/ospf_asbr.h4
-rw-r--r--ospfd/ospf_vty.c6
-rw-r--r--ospfd/ospfd.c2
-rw-r--r--ospfd/ospfd.h4
5 files changed, 19 insertions, 15 deletions
diff --git a/ospfd/ospf_asbr.c b/ospfd/ospf_asbr.c
index 1b68f6e02..bf6f0b161 100644
--- a/ospfd/ospf_asbr.c
+++ b/ospfd/ospf_asbr.c
@@ -265,17 +265,17 @@ void ospf_asbr_status_update(struct ospf *ospf, uint8_t status)
}
/* If there's redistribution configured, we need to refresh external
- * LSAs in order to install Type-7 and flood to all NSSA Areas
+ * LSAs (e.g. when default-metric changes or NSSA settings change).
*/
-static void ospf_asbr_nssa_redist_update_timer(struct event *thread)
+static void ospf_asbr_redist_update_timer(struct event *thread)
{
struct ospf *ospf = EVENT_ARG(thread);
int type;
- ospf->t_asbr_nssa_redist_update = NULL;
+ ospf->t_asbr_redist_update = NULL;
if (IS_DEBUG_OSPF_EVENT)
- zlog_debug("Running ASBR NSSA redistribution update on timer");
+ zlog_debug("Running ASBR redistribution update on timer");
for (type = 0; type < ZEBRA_ROUTE_MAX; type++) {
struct list *red_list;
@@ -295,14 +295,14 @@ static void ospf_asbr_nssa_redist_update_timer(struct event *thread)
ospf_external_lsa_refresh_default(ospf);
}
-void ospf_schedule_asbr_nssa_redist_update(struct ospf *ospf)
+void ospf_schedule_asbr_redist_update(struct ospf *ospf)
{
if (IS_DEBUG_OSPF_EVENT)
- zlog_debug("Scheduling ASBR NSSA redistribution update");
+ zlog_debug("Scheduling ASBR redistribution update");
- event_add_timer(master, ospf_asbr_nssa_redist_update_timer, ospf,
- OSPF_ASBR_NSSA_REDIST_UPDATE_DELAY,
- &ospf->t_asbr_nssa_redist_update);
+ event_add_timer(master, ospf_asbr_redist_update_timer, ospf,
+ OSPF_ASBR_REDIST_UPDATE_DELAY,
+ &ospf->t_asbr_redist_update);
}
void ospf_redistribute_withdraw(struct ospf *ospf, uint8_t type,
diff --git a/ospfd/ospf_asbr.h b/ospfd/ospf_asbr.h
index dfb9d965c..6158d65f2 100644
--- a/ospfd/ospf_asbr.h
+++ b/ospfd/ospf_asbr.h
@@ -95,7 +95,7 @@ struct ospf_external_aggr_rt {
};
#define OSPF_ASBR_CHECK_DELAY 30
-#define OSPF_ASBR_NSSA_REDIST_UPDATE_DELAY 9
+#define OSPF_ASBR_REDIST_UPDATE_DELAY 9
extern void ospf_external_route_remove(struct ospf *, struct prefix_ipv4 *);
extern struct external_info *ospf_external_info_new(struct ospf *, uint8_t,
@@ -113,7 +113,7 @@ extern struct external_info *ospf_external_info_lookup(struct ospf *, uint8_t,
unsigned short,
struct prefix_ipv4 *);
extern void ospf_asbr_status_update(struct ospf *, uint8_t);
-extern void ospf_schedule_asbr_nssa_redist_update(struct ospf *ospf);
+extern void ospf_schedule_asbr_redist_update(struct ospf *ospf);
extern void ospf_redistribute_withdraw(struct ospf *, uint8_t, unsigned short);
extern void ospf_asbr_check(void);
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index a23802719..31982aa0e 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -1529,7 +1529,7 @@ DEFPY (ospf_area_nssa,
/* Flush the external LSA for the specified area */
ospf_flush_lsa_from_area(ospf, area_id, OSPF_AS_EXTERNAL_LSA);
ospf_schedule_abr_task(ospf);
- ospf_schedule_asbr_nssa_redist_update(ospf);
+ ospf_schedule_asbr_redist_update(ospf);
return CMD_SUCCESS;
}
@@ -9619,6 +9619,8 @@ DEFUN (ospf_default_metric,
ospf->default_metric = metric;
+ ospf_schedule_asbr_redist_update(ospf);
+
return CMD_SUCCESS;
}
@@ -9633,6 +9635,8 @@ DEFUN (no_ospf_default_metric,
ospf->default_metric = -1;
+ ospf_schedule_asbr_redist_update(ospf);
+
return CMD_SUCCESS;
}
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 3bafc313f..172356895 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -816,7 +816,7 @@ static void ospf_finish_final(struct ospf *ospf)
EVENT_OFF(ospf->t_abr_task);
EVENT_OFF(ospf->t_abr_fr);
EVENT_OFF(ospf->t_asbr_check);
- EVENT_OFF(ospf->t_asbr_nssa_redist_update);
+ EVENT_OFF(ospf->t_asbr_redist_update);
EVENT_OFF(ospf->t_distribute_update);
EVENT_OFF(ospf->t_lsa_refresher);
EVENT_OFF(ospf->t_opaque_lsa_self);
diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h
index 860140cb7..2ab7db119 100644
--- a/ospfd/ospfd.h
+++ b/ospfd/ospfd.h
@@ -268,8 +268,8 @@ struct ospf {
struct event *t_abr_task; /* ABR task timer. */
struct event *t_abr_fr; /* ABR FR timer. */
struct event *t_asbr_check; /* ASBR check timer. */
- struct event *t_asbr_nssa_redist_update; /* ASBR NSSA redistribution
- update timer. */
+ struct event *t_asbr_redist_update; /* ASBR redistribution update
+ timer. */
struct event *t_distribute_update; /* Distirbute list update timer. */
struct event *t_spf_calc; /* SPF calculation timer. */
struct event *t_ase_calc; /* ASE calculation timer. */