diff options
author | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-10-17 19:17:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-17 19:17:50 +0200 |
commit | 2d9b665e54c26f96ce25042f70d81f0f7f1a6c4a (patch) | |
tree | 831be4ca799a52403d77bb1a9ff6acb91a6188a9 | |
parent | Merge pull request #7317 from pjdruddy/pr-fix-evpn-prefix2string (diff) | |
parent | ospfd: Store neighbor Adjacency SID in SR database (diff) | |
download | frr-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.c | 40 | ||||
-rw-r--r-- | ospfd/ospf_sr.h | 2 |
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; |