summaryrefslogtreecommitdiffstats
path: root/ospfd/ospf_sr.c
diff options
context:
space:
mode:
authorOlivier Dugeon <olivier.dugeon@orange.com>2021-03-09 11:00:32 +0100
committerOlivier Dugeon <olivier.dugeon@orange.com>2021-03-09 11:14:32 +0100
commit270e66a2ceaeca0e6e3fde0150c36e2252de641f (patch)
treec2ebe5567287791e4e2c301e107b6f98da9dad11 /ospfd/ospf_sr.c
parentMerge pull request #8180 from kuldeepkash/topojson_framework (diff)
downloadfrr-270e66a2ceaeca0e6e3fde0150c36e2252de641f.tar.xz
frr-270e66a2ceaeca0e6e3fde0150c36e2252de641f.zip
ospfd: Correct Segment Routing prefix bugs
This patch solves 2 Segment Routing prefix bugs: - If Segment Routing is not enabled in the initial configuration, Extended Prefix Opaque LSA is not flood. This is due to a control flag which is set only when Segment Routing is enabled at startup and not latter. - Attempting to modify Segment Routing prefix flag e.g. adding or removing no-php or explicit-null flag, doesn't work as expected: Corresponding entry in the MPLS table is not updated, Extended Prefix Opaque LSA carry wrong flag value, and neighbor set a wrong configuration in the MPLS table for this Segment Routing prefix. The first bug is corrected in ospfd/ospf_ext.c: - Flag setting is moved from ospf_ext_ism_change() to set_ext_prefix() function The seconf one is corrected in ospfd/ospf_sr.c: - For self node, previous MPLS entry is removed if needed and flag reset before setting the new Segment Routing prefix configuration - For neighbor node, srnext field of sr_prefix structure is always set and not only for new SR Prefix. Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
Diffstat (limited to 'ospfd/ospf_sr.c')
-rw-r--r--ospfd/ospf_sr.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c
index 7b2d79421..a7a2e0363 100644
--- a/ospfd/ospf_sr.c
+++ b/ospfd/ospf_sr.c
@@ -1202,16 +1202,22 @@ static void update_ext_prefix_sid(struct sr_node *srn, struct sr_prefix *srp)
found ? "Update" : "Add", GET_OPAQUE_ID(srp->instance),
&srn->adv_router);
+ /* Complete SR-Prefix */
+ srp->srn = srn;
+ IPV4_ADDR_COPY(&srp->adv_router, &srn->adv_router);
+
/* if not found, add new Segment Prefix and install NHLFE */
if (!found) {
- /* Complete SR-Prefix and add it to SR-Node list */
- srp->srn = srn;
- IPV4_ADDR_COPY(&srp->adv_router, &srn->adv_router);
+ /* Add it to SR-Node list ... */
listnode_add(srn->ext_prefix, srp);
- /* Try to set MPLS table */
+ /* ... and try to set MPLS table */
if (compute_prefix_nhlfe(srp) == 1)
ospf_zebra_update_prefix_sid(srp);
} else {
+ /*
+ * An old SR prefix exist. Check if something changes or if it
+ * is just a refresh.
+ */
if (sr_prefix_cmp(pref, srp)) {
if (compute_prefix_nhlfe(srp) == 1) {
ospf_zebra_delete_prefix_sid(pref);
@@ -2462,10 +2468,18 @@ DEFUN (sr_prefix_sid,
new->type = LOCAL_SID;
}
+ /* First, remove old NHLFE if installed */
+ if (srp == new && CHECK_FLAG(srp->flags, EXT_SUBTLV_PREFIX_SID_NPFLG)
+ && !CHECK_FLAG(srp->flags, EXT_SUBTLV_PREFIX_SID_EFLG))
+ ospf_zebra_delete_prefix_sid(srp);
+ /* Then, reset Flag & labels to handle flag update */
+ new->flags = 0;
+ new->label_in = 0;
+ new->nhlfe.label_out = 0;
+
/* Set NO PHP flag if present and compute NHLFE */
if (argv_find(argv, argc, "no-php-flag", &idx)) {
SET_FLAG(new->flags, EXT_SUBTLV_PREFIX_SID_NPFLG);
- UNSET_FLAG(new->flags, EXT_SUBTLV_PREFIX_SID_EFLG);
new->label_in = index2label(new->sid, OspfSR.self->srgb);
new->nhlfe.label_out = MPLS_LABEL_IMPLICIT_NULL;
}
@@ -2505,7 +2519,7 @@ DEFUN (sr_prefix_sid,
if (srp != new)
listnode_add(OspfSR.self->ext_prefix, new);
- /* Install Prefix SID if SR is UP and a valid input label set */
+ /* Update Prefix SID if SR is UP */
if (OspfSR.status == SR_UP) {
if (CHECK_FLAG(new->flags, EXT_SUBTLV_PREFIX_SID_NPFLG)
&& !CHECK_FLAG(new->flags, EXT_SUBTLV_PREFIX_SID_EFLG))