summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authorrgirada <rgirada@vmware.com>2021-04-25 07:40:33 +0200
committerrgirada <rgirada@vmware.com>2021-06-21 10:51:00 +0200
commita4d9009d47eec3df039938fc4cad6c0ffb8e9bf2 (patch)
tree4d17a9aa8c0ed950173e72594ff8babcf5f46121 /ospfd
parentMerge pull request #8841 from volta-networks/fix_ospf6_bad_seqnum (diff)
downloadfrr-a4d9009d47eec3df039938fc4cad6c0ffb8e9bf2.tar.xz
frr-a4d9009d47eec3df039938fc4cad6c0ffb8e9bf2.zip
ospfd: External lsa handling in opaque capabilities enable/disable
Description: When opaque capability disabled/enabled , all the self-originated lsa will be flushed and it will make the neighbours to renegotiate. But here, external lsas are not being re-originated after negotiation Fix: Refresh/re-originate external lsas(Type-5 and Type-7) explicitly after re-negotiation. Signed-off-by: Rajesh Girada <rgirada@vmware.com>
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_lsa.c40
-rw-r--r--ospfd/ospf_neighbor.c3
2 files changed, 36 insertions, 7 deletions
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index 49829d86f..c850df55b 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -2084,6 +2084,8 @@ void ospf_external_lsa_rid_change(struct ospf *ospf)
{
struct external_info *ei;
struct ospf_external_aggr_rt *aggr;
+ struct ospf_lsa *lsa = NULL;
+ int force;
int type;
for (type = 0; type < ZEBRA_ROUTE_MAX; type++) {
@@ -2112,24 +2114,48 @@ void ospf_external_lsa_rid_change(struct ospf *ospf)
continue;
if (is_prefix_default(
- (struct prefix_ipv4 *)&ei->p))
+ (struct prefix_ipv4 *)&ei->p))
continue;
- if (!ospf_redistribute_check(ospf, ei, NULL))
- continue;
+ lsa = ospf_external_info_find_lsa(ospf, &ei->p);
aggr = ospf_external_aggr_match(ospf, &ei->p);
if (aggr) {
+
+ if (!ospf_redistribute_check(ospf, ei,
+ NULL))
+ continue;
+
if (IS_DEBUG_OSPF(lsa, EXTNL_LSA_AGGR))
zlog_debug(
"Originate Summary LSA after reset/router-ID change");
+
/* Here the LSA is originated as new */
ospf_originate_summary_lsa(ospf, aggr,
ei);
- } else if (!ospf_external_lsa_originate(ospf,
- ei))
- flog_warn(EC_OSPF_LSA_INSTALL_FAILURE,
- "LSA: AS-external-LSA was not originated.");
+ } else if (lsa) {
+ /* LSA needs to be refreshed even if
+ * there is no change in the route
+ * params if the LSA is in maxage.
+ */
+ if (IS_LSA_MAXAGE(lsa))
+ force = LSA_REFRESH_FORCE;
+ else
+ force = LSA_REFRESH_IF_CHANGED;
+
+ ospf_external_lsa_refresh(ospf, lsa,
+ ei, force, 0);
+ } else {
+ if (!ospf_redistribute_check(ospf, ei,
+ NULL))
+ continue;
+
+ if (!ospf_external_lsa_originate(ospf,
+ NULL))
+ flog_warn(
+ EC_OSPF_LSA_INSTALL_FAILURE,
+ "LSA: AS-external-LSA was not originated.");
+ }
}
}
}
diff --git a/ospfd/ospf_neighbor.c b/ospfd/ospf_neighbor.c
index a1b35b2fc..8725497f2 100644
--- a/ospfd/ospf_neighbor.c
+++ b/ospfd/ospf_neighbor.c
@@ -407,6 +407,9 @@ void ospf_renegotiate_optional_capabilities(struct ospf *top)
}
}
+ /* Refresh/Re-originate external LSAs (Type-7 and Type-5).*/
+ ospf_external_lsa_rid_change(top);
+
return;
}