summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2023-09-29 11:54:43 +0200
committerGitHub <noreply@github.com>2023-09-29 11:54:43 +0200
commit969e3a6ccf91d02d47090523bb11ae4cd10d4b75 (patch)
tree7ff201650b69cd33511c470b02ecd81b8eb5b49a
parentMerge pull request #14507 from qlyoung/fix-doc-more-doc-more (diff)
parentzebra: delete label chunk upon release (diff)
downloadfrr-969e3a6ccf91d02d47090523bb11ae4cd10d4b75.tar.xz
frr-969e3a6ccf91d02d47090523bb11ae4cd10d4b75.zip
Merge pull request #12409 from FRIDM636/master
zebra: delete label chunk upon release
-rw-r--r--doc/user/zebra.rst13
-rw-r--r--zebra/label_manager.c33
-rw-r--r--zebra/subdir.am1
3 files changed, 41 insertions, 6 deletions
diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst
index 7918fbd9d..ba6e3bf37 100644
--- a/doc/user/zebra.rst
+++ b/doc/user/zebra.rst
@@ -783,6 +783,19 @@ presence of the entry.
21 Static 10.125.0.2 IPv4 Explicit Null
+Allocated label chunks table can be dumped using the command
+
+.. clicmd:: show debugging label-table
+
+::
+
+ zebra# show debugging label-table
+ Proto ospf: [300/350]
+ Proto srte: [500/500]
+ Proto isis: [1200/1300]
+ Proto ospf: [20000/21000]
+ Proto isis: [22000/23000]
+
.. _zebra-srv6:
Segment-Routing IPv6
diff --git a/zebra/label_manager.c b/zebra/label_manager.c
index c77470a70..0be0b4e73 100644
--- a/zebra/label_manager.c
+++ b/zebra/label_manager.c
@@ -28,6 +28,8 @@
#include "zebra/zapi_msg.h"
#include "zebra/debug.h"
+#include "zebra/label_manager_clippy.c"
+
#define CONNECTION_DELAY 5
struct label_manager lbl_mgr;
@@ -96,7 +98,7 @@ void delete_label_chunk(void *val)
*/
int release_daemon_label_chunks(struct zserv *client)
{
- struct listnode *node;
+ struct listnode *node, *nnode;
struct label_manager_chunk *lmc;
int count = 0;
int ret;
@@ -106,7 +108,7 @@ int release_daemon_label_chunks(struct zserv *client)
__func__, zebra_route_string(client->proto),
client->instance, client->session_id);
- for (ALL_LIST_ELEMENTS_RO(lbl_mgr.lc_list, node, lmc)) {
+ for (ALL_LIST_ELEMENTS(lbl_mgr.lc_list, node, nnode, lmc)) {
if (lmc->proto == client->proto &&
lmc->instance == client->instance &&
lmc->session_id == client->session_id && lmc->keep == 0) {
@@ -145,6 +147,22 @@ void lm_hooks_unregister(void)
hook_unregister(lm_release_chunk, label_manager_release_label_chunk);
}
+DEFPY(show_label_table, show_label_table_cmd, "show debugging label-table",
+ SHOW_STR
+ DEBUG_STR
+ "Display allocated label chunks\n")
+{
+ struct label_manager_chunk *lmc;
+ struct listnode *node;
+
+ for (ALL_LIST_ELEMENTS_RO(lbl_mgr.lc_list, node, lmc)) {
+ vty_out(vty, "Proto %s: [%u/%u]\n",
+ zebra_route_string(lmc->proto), lmc->start, lmc->end);
+ }
+
+ return CMD_SUCCESS;
+}
+
/**
* Init label manager (or proxy to an external one)
*/
@@ -159,6 +177,8 @@ void label_manager_init(void)
/* notify any external module that we are done */
hook_call(lm_cbs_inited);
+
+ install_element(VIEW_NODE, &show_label_table_cmd);
}
/* alloc and fill a label chunk */
@@ -399,13 +419,14 @@ int release_label_chunk(uint8_t proto, unsigned short instance,
"%s: Daemon mismatch!!", __func__);
continue;
}
- lmc->proto = NO_PROTO;
- lmc->instance = 0;
- lmc->session_id = 0;
- lmc->keep = 0;
ret = 0;
break;
}
+ if (lmc) {
+ list_delete_node(lbl_mgr.lc_list, node);
+ delete_label_chunk(lmc);
+ }
+
if (ret != 0)
flog_err(EC_ZEBRA_LM_UNRELEASED_CHUNK,
"%s: Label chunk not released!!", __func__);
diff --git a/zebra/subdir.am b/zebra/subdir.am
index 1060e3878..b3bd9be9c 100644
--- a/zebra/subdir.am
+++ b/zebra/subdir.am
@@ -124,6 +124,7 @@ clippy_scan += \
zebra/zebra_srv6_vty.c \
zebra/zebra_vrf.c \
zebra/dpdk/zebra_dplane_dpdk_vty.c \
+ zebra/label_manager.c \
# end
noinst_HEADERS += \