Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zebra: delete label chunk upon release #12409

Merged
merged 2 commits into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions doc/user/zebra.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 27 additions & 6 deletions zebra/label_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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",
ton31337 marked this conversation as resolved.
Show resolved Hide resolved
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)
*/
Expand All @@ -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 */
Expand Down Expand Up @@ -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__);
Expand Down
1 change: 1 addition & 0 deletions zebra/subdir.am
Original file line number Diff line number Diff line change
Expand Up @@ -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 += \
Expand Down
Loading