]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: delete label chunk upon release
authorfmihoub6WIND <farid.mihoub@yandex.com>
Fri, 25 Nov 2022 10:17:07 +0000 (11:17 +0100)
committerFarid Mihoub <farid.mihoub@6wind.com>
Fri, 29 Sep 2023 06:24:18 +0000 (08:24 +0200)
In zebra/label_manager.c the releasing of the label chunk is done by
disowning the chunk to the system. The presence of this system label
chunk will cause label assignment to fail for this use case example:

label chunk ospf: 300-320
label chunk system: 510-520
label chunk isis: 1200-1300

Then we try to allocate the chunk 500-530, we get this error:
  "Allocation of mpls label chunk [500/530] failed"

The error is raised when the below condition is true:
    /* if chunk is used, cannot honor request */
      if (lmc->proto != NO_PROTO)
      return NULL;

Delete the label chunk instead of disowning it when the label releasing
is done.

Signed-off-by: Farid MIHOUB <farid.mihoub@6wind.com>
zebra/label_manager.c

index bd0b53738c381b8bd84f7529a77dbe99e3799855..0be0b4e732fa11a5d09108cc85bf1d60777a97e8 100644 (file)
@@ -98,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;
@@ -108,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) {
@@ -419,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__);