Commit 1c12c334ed for frr
commit 1c12c334eda0f5a6a3f4c69ce99aef84c831ca8b
Author: Donald Sharp <sharpd@nvidia.com>
Date: Wed Sep 23 14:01:16 2026 -0400
isisd: Ignore LAN pseudonode LSP's in the TED
TED vertices are keyed by the 6-byte sysid alone. A LAN pseudonode
LSP reuses the DIS system ID, so isis_te_parse_lsp() treated r2.XX-00
as r2.00-00. The PSN has no Local/Remote IP sub-TLV's, outgoing edges
were parked ORPHAN, and ls_vertex_clean() dropped the real point-to-point
TE edges. isis_te_delete_lsp() also has the same problem, so aging out
a purged pseudonode deleted the router vertex even though the node LSP
was still in the LSDB.
Skip both parse and delete when LSP_PSEUDO_ID is non-zero.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
diff --git a/isisd/isis_te.c b/isisd/isis_te.c
index 71442c46b3..b931a332a6 100644
--- a/isisd/isis_te.c
+++ b/isisd/isis_te.c
@@ -1447,6 +1447,17 @@ static int lsp_to_subnet_cb(const struct prefix *prefix, uint32_t metric, bool e
return LSP_ITER_CONTINUE;
}
+/*
+ * A LAN pseudonode LSP reuses the DIS system ID. TED vertices are indexed
+ * by that system ID alone, so the pseudonode must not be parsed or deleted
+ * as the router node: the pseudonode carries no TE IP sub-TLVs, and doing
+ * so orphans or removes the real router's edges.
+ */
+static bool isis_te_lsp_is_pseudonode(const struct isis_lsp *lsp)
+{
+ return LSP_PSEUDO_ID(lsp->hdr.lsp_id) != 0;
+}
+
/**
* Parse ISIS LSP to fulfill the Link State Database
*
@@ -1466,6 +1477,12 @@ static void isis_te_parse_lsp(struct mpls_te_area *mta, struct isis_lsp *lsp)
if (!IS_MPLS_TE(mta) || !mta->ted || !lsp)
return;
+ if (isis_te_lsp_is_pseudonode(lsp)) {
+ te_debug("ISIS-TE(%s): Skip pseudonode LSP %pSY", lsp->area->area_tag,
+ lsp->hdr.lsp_id);
+ return;
+ }
+
ted = mta->ted;
te_debug("ISIS-TE(%s): Parse LSP %pSY", lsp->area->area_tag, lsp->hdr.lsp_id);
@@ -1543,6 +1560,12 @@ static void isis_te_delete_lsp(struct mpls_te_area *mta, struct isis_lsp *lsp)
if (!IS_MPLS_TE(mta) || !mta->ted || !lsp)
return;
+ if (isis_te_lsp_is_pseudonode(lsp)) {
+ te_debug("ISIS-TE(%s): Skip pseudonode LSP %pSY", lsp->area->area_tag,
+ lsp->hdr.lsp_id);
+ return;
+ }
+
te_debug("ISIS-TE(%s): Delete Link State TED objects from LSP %pSY", lsp->area->area_tag,
lsp->hdr.lsp_id);