summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-06-10 12:35:17 -0400
committerGitHub <noreply@github.com>2020-06-10 12:35:17 -0400
commitb71ca5ae42878fffa387cad0ab9af4782e3bcd44 (patch)
treecac61bcf9311a17e9df1118f7ce3eef3a70e92b9
parent71af56b1905a37922cfc03db3c40105901ccf95e (diff)
parent64f46c22682fd4cc74084fedc0062985d1459c86 (diff)
Merge pull request #6460 from rgirada/ospf_external_lsa
ospfd: External LSA lookup in LSDB failed in a specific scenario
-rw-r--r--ospfd/ospf_asbr.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/ospfd/ospf_asbr.c b/ospfd/ospf_asbr.c
index 3682b4cdd3..1480b0e391 100644
--- a/ospfd/ospf_asbr.c
+++ b/ospfd/ospf_asbr.c
@@ -213,25 +213,35 @@ struct ospf_lsa *ospf_external_info_find_lsa(struct ospf *ospf,
struct as_external_lsa *al;
struct in_addr mask, id;
- lsa = ospf_lsdb_lookup_by_id(ospf->lsdb, OSPF_AS_EXTERNAL_LSA,
- p->prefix, ospf->router_id);
-
- if (!lsa)
- return NULL;
-
- al = (struct as_external_lsa *)lsa->data;
+ /* Fisrt search the lsdb with address specifc LSID
+ * where all the host bits are set, if there a matched
+ * LSA, return.
+ * Ex: For route 10.0.0.0/16, LSID is 10.0.255.255
+ * If no lsa with above LSID, use received address as
+ * LSID and check if any LSA in LSDB.
+ * If LSA found, check if the mask is same b/w the matched
+ * LSA and received prefix, if same then it is the LSA for
+ * this prefix.
+ * Ex: For route 10.0.0.0/16, LSID is 10.0.0.0
+ */
masklen2ip(p->prefixlen, &mask);
+ id.s_addr = p->prefix.s_addr | (~mask.s_addr);
+ lsa = ospf_lsdb_lookup_by_id(ospf->lsdb, OSPF_AS_EXTERNAL_LSA, id,
+ ospf->router_id);
+ if (lsa)
+ return lsa;
- if (mask.s_addr != al->mask.s_addr) {
- id.s_addr = p->prefix.s_addr | (~mask.s_addr);
- lsa = ospf_lsdb_lookup_by_id(ospf->lsdb, OSPF_AS_EXTERNAL_LSA,
- id, ospf->router_id);
- if (!lsa)
- return NULL;
+ lsa = ospf_lsdb_lookup_by_id(ospf->lsdb, OSPF_AS_EXTERNAL_LSA,
+ p->prefix, ospf->router_id);
+
+ if (lsa) {
+ al = (struct as_external_lsa *)lsa->data;
+ if (mask.s_addr == al->mask.s_addr)
+ return lsa;
}
- return lsa;
+ return NULL;
}