summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_spf.c39
-rw-r--r--isisd/isis_spf.h2
2 files changed, 19 insertions, 22 deletions
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c
index 592804f41c..a94ebbc014 100644
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@ -1158,9 +1158,9 @@ static void isis_spf_preload_tent(struct isis_spftree *spftree,
: VTYPE_NONPSEUDO_TE_IS,
sadj->id, sadj, metric, NULL,
parent);
- } else if (sadj->lan.lsp_pseudo) {
- isis_spf_process_lsp(spftree, sadj->lan.lsp_pseudo,
- metric, 0, spftree->sysid, parent);
+ } else if (sadj->lsp) {
+ isis_spf_process_lsp(spftree, sadj->lsp, metric, 0,
+ spftree->sysid, parent);
}
}
}
@@ -1243,12 +1243,24 @@ static void spf_adj_list_parse_tlv(struct isis_spftree *spftree,
struct isis_ext_subtlvs *subtlvs)
{
struct isis_spf_adj *sadj;
+ uint8_t lspid[ISIS_SYS_ID_LEN + 2];
+ struct isis_lsp *lsp;
uint8_t flags = 0;
/* Skip self in the pseudonode. */
if (desig_is_id && !memcmp(id, spftree->sysid, ISIS_SYS_ID_LEN))
return;
+ /* Find LSP from the adjacency. */
+ memcpy(lspid, id, ISIS_SYS_ID_LEN + 1);
+ LSP_FRAGMENT(lspid) = 0;
+ lsp = lsp_search(spftree->lspdb, lspid);
+ if (lsp == NULL || lsp->hdr.rem_lifetime == 0) {
+ zlog_warn("ISIS-SPF: No LSP found from root to L%d %s",
+ spftree->level, rawlspid_print(id));
+ return;
+ }
+
sadj = XCALLOC(MTYPE_ISIS_SPF_ADJ, sizeof(*sadj));
memcpy(sadj->id, id, sizeof(sadj->id));
if (desig_is_id) {
@@ -1260,6 +1272,7 @@ static void spf_adj_list_parse_tlv(struct isis_spftree *spftree,
sadj->metric = metric;
if (oldmetric)
SET_FLAG(flags, F_ISIS_SPF_ADJ_OLDMETRIC);
+ sadj->lsp = lsp;
sadj->subtlvs = subtlvs;
sadj->flags = flags;
@@ -1294,24 +1307,8 @@ static void spf_adj_list_parse_tlv(struct isis_spftree *spftree,
}
/* Parse pseudonode LSP too. */
- if (LSP_PSEUDO_ID(id)) {
- uint8_t lspid[ISIS_SYS_ID_LEN + 2];
- struct isis_lsp *lsp_pseudo;
-
- memcpy(lspid, id, ISIS_SYS_ID_LEN + 1);
- LSP_FRAGMENT(lspid) = 0;
- lsp_pseudo = lsp_search(spftree->lspdb, lspid);
- if (lsp_pseudo == NULL || lsp_pseudo->hdr.rem_lifetime == 0) {
- zlog_warn(
- "ISIS-SPF: No LSP found from root to L%d DR %s",
- spftree->level, rawlspid_print(id));
- return;
- }
-
- sadj->lan.lsp_pseudo = lsp_pseudo;
- spf_adj_list_parse_lsp(spftree, adj_list, lsp_pseudo, id,
- metric);
- }
+ if (LSP_PSEUDO_ID(id))
+ spf_adj_list_parse_lsp(spftree, adj_list, lsp, id, metric);
}
static void spf_adj_list_parse_lsp(struct isis_spftree *spftree,
diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h
index ad15d3e3c7..e11495df48 100644
--- a/isisd/isis_spf.h
+++ b/isisd/isis_spf.h
@@ -39,9 +39,9 @@ struct isis_spf_adj {
struct isis_adjacency *adj;
uint32_t metric;
struct isis_ext_subtlvs *subtlvs;
+ struct isis_lsp *lsp;
struct {
uint8_t desig_is_id[ISIS_SYS_ID_LEN + 1];
- struct isis_lsp *lsp_pseudo;
} lan;
uint8_t flags;
#define F_ISIS_SPF_ADJ_BROADCAST 0x01