From 50ec09db3951d04359d7a447d683ed6808da4c65 Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Fri, 12 Feb 2021 18:47:36 +0100 Subject: opsfd: Correct MPLS-TE bug with LSA Flush When an interface goes down, if it is MPLS-TE enabled, the corresponding TE Opaque LSA is not flushed and continue to be advertised. The problem is due to bugs in ISM and NSM handler functions of ospf_te.c file: - ospf_mpls_te_ism_change(): - flag associated with Link Parameters is reset - ISM_Down state is not correctly handle - ospf_mpls_te_nsm_change(): - flag associated with Link Parameters is reset - NSM_Down and NSM_Delete states are not handle This patch correct this problem. Signed-off-by: Olivier Dugeon --- ospfd/ospf_te.c | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) (limited to 'ospfd/ospf_te.c') diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index f4e7cda60..6901771d9 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -939,9 +939,6 @@ static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_state) /* Keep Area information in combination with linkparams. */ lp->area = oi->area; - /* Keep interface MPLS-TE status */ - lp->flags = HAS_LINK_PARAMS(oi->ifp); - switch (oi->state) { case ISM_PointToPoint: case ISM_DROther: @@ -952,10 +949,17 @@ static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_state) set_linkparams_lclif_ipaddr(lp, oi->address->u.prefix4); break; - default: - /* State is undefined: Flush LSA if engaged */ - if (CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) + case ISM_Down: + /* Interface goes Down: Flush LSA if engaged */ + if (CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) { + ote_debug( + "MPLS-TE (%s): Interface %s goes down: flush LSA", + __func__, IF_NAME(oi)); ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); + return; + } + break; + default: break; } @@ -997,12 +1001,21 @@ static void ospf_mpls_te_nsm_change(struct ospf_neighbor *nbr, int old_state) return; } + /* Flush TE Opaque LSA if Neighbor State goes Down or Deleted */ + if (OspfMplsTE.enabled + && (nbr->state == NSM_Down || nbr->state == NSM_Deleted)) { + if (CHECK_FLAG(lp->flags, EXT_LPFLG_LSA_ENGAGED)) { + ote_debug( + "MPLS-TE (%s): Interface %s goes down: flush LSA", + __func__, IF_NAME(oi)); + ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); + } + return; + } + /* Keep Area information in combination with SR info. */ lp->area = oi->area; - /* Keep interface MPLS-TE status */ - lp->flags = HAS_LINK_PARAMS(oi->ifp); - /* * The Link ID is identical to the contents of the Link ID field * in the Router LSA for these link types. @@ -1022,12 +1035,19 @@ static void ospf_mpls_te_nsm_change(struct ospf_neighbor *nbr, int old_state) set_linkparams_link_id(lp, DR(oi)); break; - default: - /* State is undefined: Flush LSA if engaged */ + case ISM_Down: + /* State goes Down: Flush LSA if engaged */ if (OspfMplsTE.enabled && - CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) + CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) { + ote_debug( + "MPLS-TE (%s): Interface %s goes down: flush LSA", + __func__, IF_NAME(oi)); ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); + } return; + break; + default: + break; } ote_debug("MPLS-TE (%s): Add Link-ID %pI4 for interface %s ", __func__, @@ -1173,7 +1193,7 @@ static struct ospf_lsa *ospf_mpls_te_lsa_new(struct ospf *ospf, } ote_debug( - "MPLS-TE (%s): LSA[Type%d:%pI4]: Create an Opaque-LSA/MPLS-TE instance", + "MPLS-TE (%s): LSA[Type%d:%pI4]: Create an Opaque-LSA/MPLS-TE instance", __func__, lsa_type, &lsa_id); /* Set opaque-LSA body fields. */ -- cgit v1.2.3