summaryrefslogtreecommitdiffstats
path: root/ospfd/ospf_sr.c
diff options
context:
space:
mode:
authorOlivier Dugeon <olivier.dugeon@orange.com>2020-10-14 14:17:58 +0200
committerOlivier Dugeon <olivier.dugeon@orange.com>2020-10-14 14:17:58 +0200
commitedb368e93023d0ad83e928f413a0ae94ef6495b8 (patch)
tree61c8441bc2e6dcc1be274e64fbbf859c689eabc9 /ospfd/ospf_sr.c
parentMerge pull request #7283 from donaldsharp/thread_off_semantics (diff)
downloadfrr-edb368e93023d0ad83e928f413a0ae94ef6495b8.tar.xz
frr-edb368e93023d0ad83e928f413a0ae94ef6495b8.zip
ospfd: Store neighbor Adjacency SID in SR database
For TI-LFA, it is necessay to known the Adjacency SID advetise by the nieghbor routers. However, the current Segment Routing code skip neighbor Adjacency SID and thus, don't store them into the Segment Routing database. This PR takes care of neighbor Adjacency SID by allowing to store them in the Segment Routing database. Corresponding MPLS table entry is only configured if the advertised Adjacency SID is global i.e. with L-Flag unset. Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
Diffstat (limited to 'ospfd/ospf_sr.c')
-rw-r--r--ospfd/ospf_sr.c40
1 files changed, 22 insertions, 18 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.