summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-10-17 19:17:50 +0200
committerGitHub <noreply@github.com>2020-10-17 19:17:50 +0200
commit2d9b665e54c26f96ce25042f70d81f0f7f1a6c4a (patch)
tree831be4ca799a52403d77bb1a9ff6acb91a6188a9
parentMerge pull request #7317 from pjdruddy/pr-fix-evpn-prefix2string (diff)
parentospfd: Store neighbor Adjacency SID in SR database (diff)
downloadfrr-2d9b665e54c26f96ce25042f70d81f0f7f1a6c4a.tar.xz
frr-2d9b665e54c26f96ce25042f70d81f0f7f1a6c4a.zip
Merge pull request #7322 from Orange-OpenSource/ospf-sr
ospfd: Store neighbor Adjacency SID in SR database
-rw-r--r--ospfd/ospf_sr.c40
-rw-r--r--ospfd/ospf_sr.h2
2 files changed, 23 insertions, 19 deletions
diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c
index eb882c5d0..64d7b39ac 100644
--- a/ospfd/ospf_sr.c
+++ b/ospfd/ospf_sr.c
@@ -1046,6 +1046,7 @@ static void update_ext_link_sid(struct sr_node *srn, struct sr_link *srl,
struct listnode *node;
struct sr_link *lk;
bool found = false;
+ bool config = true;
/* Sanity check */
if ((srn == NULL) || (srl == NULL))
@@ -1053,11 +1054,11 @@ static void update_ext_link_sid(struct sr_node *srn, struct sr_link *srl,
osr_debug(" |- Process Extended Link Adj/Lan-SID");
- /* Skip Local Adj/Lan_Adj SID coming from neighbors */
+ /* Detect if Adj/Lan_Adj SID must be configured */
if (!CHECK_FLAG(lsa_flags, OSPF_LSA_SELF)
&& (CHECK_FLAG(srl->flags[0], EXT_SUBTLV_LINK_ADJ_SID_LFLG)
|| CHECK_FLAG(srl->flags[1], EXT_SUBTLV_LINK_ADJ_SID_LFLG)))
- return;
+ config = false;
/* Search for existing Segment Link */
for (ALL_LIST_ELEMENTS_RO(srn->ext_link, node, lk))
@@ -1077,28 +1078,31 @@ static void update_ext_link_sid(struct sr_node *srn, struct sr_link *srl,
IPV4_ADDR_COPY(&srl->adv_router, &srn->adv_router);
listnode_add(srn->ext_link, srl);
/* Try to set MPLS table */
- if (compute_link_nhlfe(srl)) {
+ if (config && compute_link_nhlfe(srl)) {
add_adj_sid(srl->nhlfe[0]);
add_adj_sid(srl->nhlfe[1]);
}
} else {
+ /* Update SR-Link if they are different */
if (sr_link_cmp(lk, srl)) {
- if (compute_link_nhlfe(srl)) {
- update_adj_sid(lk->nhlfe[0], srl->nhlfe[0]);
- update_adj_sid(lk->nhlfe[1], srl->nhlfe[1]);
- /* Replace Segment List */
- listnode_delete(srn->ext_link, lk);
- XFREE(MTYPE_OSPF_SR_PARAMS, lk);
- srl->srn = srn;
- IPV4_ADDR_COPY(&srl->adv_router,
- &srn->adv_router);
- listnode_add(srn->ext_link, srl);
- } else {
- /* New NHLFE was not found.
- * Just free the SR Link
- */
- XFREE(MTYPE_OSPF_SR_PARAMS, srl);
+ /* Try to set MPLS table */
+ if (config) {
+ if (compute_link_nhlfe(srl)) {
+ update_adj_sid(lk->nhlfe[0],
+ srl->nhlfe[0]);
+ update_adj_sid(lk->nhlfe[1],
+ srl->nhlfe[1]);
+ } else {
+ del_adj_sid(lk->nhlfe[0]);
+ del_adj_sid(lk->nhlfe[1]);
+ }
}
+ /* Replace SR-Link in SR-Node Adjacency List */
+ listnode_delete(srn->ext_link, lk);
+ XFREE(MTYPE_OSPF_SR_PARAMS, lk);
+ srl->srn = srn;
+ IPV4_ADDR_COPY(&srl->adv_router, &srn->adv_router);
+ listnode_add(srn->ext_link, srl);
} else {
/*
* This is just an LSA refresh.
diff --git a/ospfd/ospf_sr.h b/ospfd/ospf_sr.h
index c54d2dcc3..222675944 100644
--- a/ospfd/ospf_sr.h
+++ b/ospfd/ospf_sr.h
@@ -269,7 +269,7 @@ struct sr_node {
/* List of Prefix & Link advertise by this node */
struct list *ext_prefix; /* For Node SID */
- struct list *ext_link; /* For Adj and LAN SID */
+ struct list *ext_link; /* For Adjacency SID */
/* Pointer to FRR SR-Node or NULL if it is not a neighbor */
struct sr_node *neighbor;