summaryrefslogtreecommitdiff
path: root/ospfd/ospf_gr.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_gr.c')
-rw-r--r--ospfd/ospf_gr.c66
1 files changed, 21 insertions, 45 deletions
diff --git a/ospfd/ospf_gr.c b/ospfd/ospf_gr.c
index c108040303..8276ccb89c 100644
--- a/ospfd/ospf_gr.c
+++ b/ospfd/ospf_gr.c
@@ -150,7 +150,7 @@ static struct ospf_lsa *ospf_gr_lsa_new(struct ospf_interface *oi)
}
/* Originate and install Grace-LSA for a given interface. */
-static void ospf_gr_lsa_originate(struct ospf_interface *oi)
+static void ospf_gr_lsa_originate(struct ospf_interface *oi, bool maxage)
{
struct ospf_lsa *lsa, *old;
@@ -164,6 +164,9 @@ static void ospf_gr_lsa_originate(struct ospf_interface *oi)
return;
}
+ if (maxage)
+ lsa->data->ls_age = htons(OSPF_LSA_MAXAGE);
+
/* Find the old LSA and increase the seqno. */
old = ospf_gr_lsa_lookup(oi->ospf, oi->area);
if (old)
@@ -183,37 +186,6 @@ static void ospf_gr_lsa_originate(struct ospf_interface *oi)
ospf_flood_through_interface(oi, NULL, lsa);
}
-/* Flush a given self-originated Grace-LSA. */
-static struct ospf_lsa *ospf_gr_flush_grace_lsa(struct ospf_interface *oi,
- struct ospf_lsa *old)
-{
- struct ospf_lsa *lsa;
-
- if (ospf_interface_neighbor_count(oi) == 0)
- return NULL;
-
- if (IS_DEBUG_OSPF_GR)
- zlog_debug(
- "GR: flushing self-originated Grace-LSAs [interface %s]",
- oi->ifp->name);
-
- lsa = ospf_lsa_dup(old);
- lsa->data->ls_age = htons(OSPF_LSA_MAXAGE);
- lsa->data->ls_seqnum = lsa_seqnum_increment(lsa);
-
- /* Install updated LSA into LSDB. */
- if (ospf_lsa_install(oi->ospf, oi, lsa) == NULL) {
- zlog_warn("%s: ospf_lsa_install() failed", __func__);
- ospf_lsa_unlock(&lsa);
- return NULL;
- }
-
- /* Flood the LSA through out the interface */
- ospf_flood_through_interface(oi, NULL, lsa);
-
- return lsa;
-}
-
/* Flush all self-originated Grace-LSAs. */
static void ospf_gr_flush_grace_lsas(struct ospf *ospf)
{
@@ -221,7 +193,6 @@ static void ospf_gr_flush_grace_lsas(struct ospf *ospf)
struct listnode *anode;
for (ALL_LIST_ELEMENTS_RO(ospf->areas, anode, area)) {
- struct ospf_lsa *lsa;
struct ospf_interface *oi;
struct listnode *inode;
@@ -230,15 +201,8 @@ static void ospf_gr_flush_grace_lsas(struct ospf *ospf)
"GR: flushing self-originated Grace-LSAs [area %pI4]",
&area->area_id);
- lsa = ospf_gr_lsa_lookup(ospf, area);
- if (!lsa) {
- zlog_warn("%s: Grace-LSA not found [area %pI4]",
- __func__, &area->area_id);
- continue;
- }
-
for (ALL_LIST_ELEMENTS_RO(area->oiflist, inode, oi))
- ospf_gr_flush_grace_lsa(oi, lsa);
+ ospf_gr_lsa_originate(oi, true);
}
}
@@ -584,7 +548,7 @@ static void ospf_gr_nvm_update(struct ospf *ospf)
json_object *json_instance;
filepath = ospf_gr_nvm_filepath(ospf);
- inst_name = ospf->name ? ospf->name : VRF_DEFAULT_NAME;
+ inst_name = ospf_get_name(ospf);
json = json_object_from_file(filepath);
if (json == NULL)
@@ -630,7 +594,7 @@ static void ospf_gr_nvm_delete(struct ospf *ospf)
json_object *json_instances;
filepath = ospf_gr_nvm_filepath(ospf);
- inst_name = ospf->name ? ospf->name : VRF_DEFAULT_NAME;
+ inst_name = ospf_get_name(ospf);
json = json_object_from_file(filepath);
if (json == NULL)
@@ -663,7 +627,7 @@ void ospf_gr_nvm_read(struct ospf *ospf)
time_t timestamp = 0;
filepath = ospf_gr_nvm_filepath(ospf);
- inst_name = ospf->name ? ospf->name : VRF_DEFAULT_NAME;
+ inst_name = ospf_get_name(ospf);
json = json_object_from_file(filepath);
if (json == NULL)
@@ -750,7 +714,7 @@ static void ospf_gr_prepare(void)
/* Send a Grace-LSA to all neighbors. */
for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, inode, oi))
- ospf_gr_lsa_originate(oi);
+ ospf_gr_lsa_originate(oi, false);
/* Record end of the grace period in non-volatile memory. */
ospf_gr_nvm_update(ospf);
@@ -770,6 +734,18 @@ DEFPY(graceful_restart_prepare, graceful_restart_prepare_cmd,
IP_STR
"Prepare to restart the OSPF process")
{
+ struct ospf *ospf;
+ struct listnode *node;
+
+ for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
+ if (!CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) {
+ vty_out(vty,
+ "%% Can't start graceful restart: opaque capability not enabled (VRF %s)\n\n",
+ ospf_get_name(ospf));
+ return CMD_WARNING;
+ }
+ }
+
ospf_gr_prepare();
return CMD_SUCCESS;