From 7a7c4bc80ac413d4841c31abb3e22c590ad4cdb2 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Thu, 5 Oct 2023 15:49:10 +0200 Subject: [PATCH] zebra: rework dynamic label request algorithm The label chunk algorithm needs to be revisited to support a configured dynamic-block or the default one. Reuse the 'lbl_mgr.dynamic_block_[start/end]' variables, whereever needed, and simplify the algorithm. Signed-off-by: Philippe Guibert --- zebra/label_manager.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/zebra/label_manager.c b/zebra/label_manager.c index 3fc1ee5bae..bb722f4313 100644 --- a/zebra/label_manager.c +++ b/zebra/label_manager.c @@ -399,7 +399,7 @@ assign_label_chunk(uint8_t proto, unsigned short instance, uint32_t session_id, { struct label_manager_chunk *lmc; struct listnode *node; - uint32_t prev_end = MPLS_LABEL_UNRESERVED_MIN - 1; + uint32_t prev_end = lbl_mgr.dynamic_block_start - 1; /* handle chunks request with a specific base label * - static label requests: BGP hardset value, Pathd @@ -414,8 +414,9 @@ assign_label_chunk(uint8_t proto, unsigned short instance, uint32_t session_id, /* first check if there's one available */ for (ALL_LIST_ELEMENTS_RO(lbl_mgr.lc_list, node, lmc)) { - if (lmc->proto == NO_PROTO - && lmc->end - lmc->start + 1 == size) { + if (lmc->start <= prev_end) + continue; + if (lmc->proto == NO_PROTO && lmc->end - lmc->start + 1 == size) { lmc->proto = proto; lmc->instance = instance; lmc->session_id = session_id; @@ -425,7 +426,7 @@ assign_label_chunk(uint8_t proto, unsigned short instance, uint32_t session_id, } /* check if we hadve a "hole" behind us that we can squeeze into */ - if ((lmc->start > prev_end) && (lmc->start - prev_end > size)) { + if (lmc->start - prev_end > size) { lmc = create_label_chunk(proto, instance, session_id, keep, prev_end + 1, prev_end + size, true); @@ -438,14 +439,14 @@ assign_label_chunk(uint8_t proto, unsigned short instance, uint32_t session_id, uint32_t start_free; if (list_isempty(lbl_mgr.lc_list)) - start_free = MPLS_LABEL_UNRESERVED_MIN; + start_free = lbl_mgr.dynamic_block_start; else start_free = ((struct label_manager_chunk *)listgetdata( listtail(lbl_mgr.lc_list))) ->end + 1; - if (start_free > MPLS_LABEL_UNRESERVED_MAX - size + 1) { + if (start_free > lbl_mgr.dynamic_block_end - size + 1) { flog_err(EC_ZEBRA_LM_EXHAUSTED_LABELS, "Reached max labels. Start: %u, size: %u", start_free, size); -- 2.39.5