diff options
author | rgirada <rgirada@vmware.com> | 2021-04-25 07:40:33 +0200 |
---|---|---|
committer | rgirada <rgirada@vmware.com> | 2021-06-21 10:51:00 +0200 |
commit | a4d9009d47eec3df039938fc4cad6c0ffb8e9bf2 (patch) | |
tree | 4d17a9aa8c0ed950173e72594ff8babcf5f46121 /ospfd | |
parent | Merge pull request #8841 from volta-networks/fix_ospf6_bad_seqnum (diff) | |
download | frr-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.c | 40 | ||||
-rw-r--r-- | ospfd/ospf_neighbor.c | 3 |
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; } |