summaryrefslogtreecommitdiffstats
path: root/isisd/isis_lsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'isisd/isis_lsp.c')
-rw-r--r--isisd/isis_lsp.c104
1 files changed, 71 insertions, 33 deletions
diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c
index c98cee06..d588af31 100644
--- a/isisd/isis_lsp.c
+++ b/isisd/isis_lsp.c
@@ -482,13 +482,19 @@ static void lsp_update_data(struct isis_lsp *lsp, struct isis_lsp_hdr *hdr,
lsp->tlvs = tlvs;
- if (area->dynhostname && lsp->tlvs->hostname
- && lsp->hdr.rem_lifetime) {
- isis_dynhn_insert(
- area->isis, lsp->hdr.lsp_id, lsp->tlvs->hostname,
- (lsp->hdr.lsp_bits & LSPBIT_IST) == IS_LEVEL_1_AND_2
- ? IS_LEVEL_2
- : IS_LEVEL_1);
+ if (area->dynhostname && lsp->hdr.rem_lifetime) {
+ if (lsp->tlvs->hostname) {
+ isis_dynhn_insert(area->isis, lsp->hdr.lsp_id,
+ lsp->tlvs->hostname,
+ (lsp->hdr.lsp_bits & LSPBIT_IST) ==
+ IS_LEVEL_1_AND_2
+ ? IS_LEVEL_2
+ : IS_LEVEL_1);
+ } else {
+ if (!LSP_PSEUDO_ID(lsp->hdr.lsp_id) &&
+ !LSP_FRAGMENT(lsp->hdr.lsp_id))
+ isis_dynhn_remove(area->isis, lsp->hdr.lsp_id);
+ }
}
return;
@@ -705,10 +711,6 @@ void lsp_print_common(struct isis_lsp *lsp, struct vty *vty, struct json_object
}
}
-#if CONFDATE > 20240916
-CPP_NOTICE("Remove JSON in '-' format")
-#endif
-
void lsp_print_json(struct isis_lsp *lsp, struct json_object *json,
char dynhost, struct isis *isis)
{
@@ -722,19 +724,11 @@ void lsp_print_json(struct isis_lsp *lsp, struct json_object *json,
own_json = json_object_new_object();
json_object_object_add(json, "lsp", own_json);
json_object_string_add(own_json, "id", LSPid);
-#if CONFDATE > 20240916
- CPP_NOTICE("remove own key")
-#endif
json_object_string_add(own_json, "own", lsp->own_lsp ? "*" : " ");
if (lsp->own_lsp)
json_object_boolean_add(own_json, "ownLSP", true);
- json_object_int_add(json, "pdu-len", lsp->hdr.pdu_len);
json_object_int_add(json, "pduLen", lsp->hdr.pdu_len);
snprintfrr(buf, sizeof(buf), "0x%08x", lsp->hdr.seqno);
-#if CONFDATE > 20240916
- CPP_NOTICE("remove seq-number key")
-#endif
- json_object_string_add(json, "seq-number", buf);
json_object_string_add(json, "seqNumber", buf);
snprintfrr(buf, sizeof(buf), "0x%04hx", lsp->hdr.checksum);
json_object_string_add(json, "chksum", buf);
@@ -745,11 +739,6 @@ void lsp_print_json(struct isis_lsp *lsp, struct json_object *json,
} else {
json_object_int_add(json, "holdtime", lsp->hdr.rem_lifetime);
}
-#if CONFDATE > 20240916
- CPP_NOTICE("remove att-p-ol key")
-#endif
- json_object_string_add(
- json, "att-p-ol", lsp_bits2string(lsp->hdr.lsp_bits, b, sizeof(b)));
json_object_string_add(json, "attPOl",
lsp_bits2string(lsp->hdr.lsp_bits, b, sizeof(b)));
}
@@ -1222,17 +1211,11 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
}
/* Add SRv6 Locator TLV. */
- if (area->srv6db.config.enabled &&
- !list_isempty(area->srv6db.srv6_locator_chunks)) {
+ if (area->srv6db.config.enabled && area->srv6db.srv6_locator) {
struct isis_srv6_locator locator = {};
- struct srv6_locator_chunk *chunk;
-
- /* TODO: support more than one locator */
- chunk = (struct srv6_locator_chunk *)listgetdata(
- listhead(area->srv6db.srv6_locator_chunks));
locator.metric = 0;
- locator.prefix = chunk->prefix;
+ locator.prefix = area->srv6db.srv6_locator->prefix;
locator.flags = 0;
locator.algorithm = 0;
@@ -1252,7 +1235,8 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
isis_tlvs_add_ipv6_reach(lsp->tlvs,
isis_area_ipv6_topology(area),
- &chunk->prefix, 0, false, NULL);
+ &area->srv6db.srv6_locator->prefix, 0,
+ false, NULL);
}
/* IPv4 address and TE router ID TLVs.
@@ -2225,6 +2209,10 @@ void lsp_tick(struct event *thread)
&area->lspdb[level],
next);
+ if (!LSP_PSEUDO_ID(lsp->hdr.lsp_id))
+ isis_dynhn_remove(area->isis,
+ lsp->hdr.lsp_id);
+
lspdb_del(&area->lspdb[level], lsp);
lsp_destroy(lsp);
lsp = NULL;
@@ -2336,6 +2324,56 @@ static int lsp_handle_adj_state_change(struct isis_adjacency *adj)
}
/*
+ * Iterate over all SRv6 locator TLVs
+ */
+int isis_lsp_iterate_srv6_locator(struct isis_lsp *lsp, uint16_t mtid,
+ lsp_ip_reach_iter_cb cb, void *arg)
+{
+ bool pseudo_lsp = LSP_PSEUDO_ID(lsp->hdr.lsp_id);
+ struct isis_lsp *frag;
+ struct listnode *node;
+
+ if (lsp->hdr.seqno == 0 || lsp->hdr.rem_lifetime == 0)
+ return LSP_ITER_CONTINUE;
+
+ /* Parse LSP */
+ if (lsp->tlvs) {
+ if (!pseudo_lsp) {
+ struct isis_item_list *srv6_locator_reachs;
+ struct isis_srv6_locator_tlv *r;
+
+ srv6_locator_reachs =
+ isis_lookup_mt_items(&lsp->tlvs->srv6_locator,
+ mtid);
+
+ for (r = srv6_locator_reachs
+ ? (struct isis_srv6_locator_tlv *)
+ srv6_locator_reachs->head
+ : NULL;
+ r; r = r->next) {
+ if ((*cb)((struct prefix *)&r->prefix,
+ r->metric, false /* ignore */,
+ r->subtlvs, arg) == LSP_ITER_STOP)
+ return LSP_ITER_STOP;
+ }
+ }
+ }
+
+ /* Parse LSP fragments if it is not a fragment itself */
+ if (!LSP_FRAGMENT(lsp->hdr.lsp_id))
+ for (ALL_LIST_ELEMENTS_RO(lsp->lspu.frags, node, frag)) {
+ if (!frag->tlvs)
+ continue;
+
+ if (isis_lsp_iterate_srv6_locator(frag, mtid, cb,
+ arg) == LSP_ITER_STOP)
+ return LSP_ITER_STOP;
+ }
+
+ return LSP_ITER_CONTINUE;
+}
+
+/*
* Iterate over all IP reachability TLVs in a LSP (all fragments) of the given
* address-family and MT-ID.
*/