]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib, bgpd: Enhance `srv6_locator_chunk_free()` API
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Sat, 29 Oct 2022 15:04:35 +0000 (17:04 +0200)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Sat, 29 Oct 2022 15:04:35 +0000 (17:04 +0200)
A programmer can use the `srv6_locator_chunk_free()` function to free
the memory allocated for a `struct srv6_locator_chunk`.

The programmer invokes `srv6_locator_chunk_free()` by passing a single
pointer to the `struct srv6_locator_chunk` to be freed.
`srv6_locator_chunk_free()` uses `XFREE()` to free the memory.
It is the responsibility of the programmer to set the
`struct srv6_locator_chunk` pointer to NULL after freeing memory with
`srv6_locator_chunk_free()`.

This commit modifies the `srv6_locator_chunk_free()` function to take a
double pointer instead of a single pointer. In this way, setting the
`struct srv6_locator_chunk` pointer to NULL is no longer the
programmer's responsibility but is the responsibility of
`srv6_locator_chunk_free()`. This prevents programmers from making
mistakes such as forgetting to set the pointer to NULL after invoking
`srv6_locator_chunk_free()`.

Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
bgpd/bgp_mplsvpn.c
bgpd/bgp_vty.c
bgpd/bgp_zebra.c
lib/srv6.c
lib/srv6.h

index a68167977de870f99dd2ceb21505649a39068e34..ad4221d1345fbc509069ca1f779617ab12263787 100644 (file)
@@ -779,7 +779,7 @@ void ensure_vrf_tovpn_sid_per_af(struct bgp *bgp_vpn, struct bgp *bgp_vrf,
                        zlog_debug(
                                "%s: not allocated new sid for vrf %s: afi %s",
                                __func__, bgp_vrf->name_pretty, afi2str(afi));
-               srv6_locator_chunk_free(tovpn_sid_locator);
+               srv6_locator_chunk_free(&tovpn_sid_locator);
                XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid);
                return;
        }
@@ -844,7 +844,7 @@ void ensure_vrf_tovpn_sid_per_vrf(struct bgp *bgp_vpn, struct bgp *bgp_vrf)
                if (debug)
                        zlog_debug("%s: not allocated new sid for vrf %s",
                                   __func__, bgp_vrf->name_pretty);
-               srv6_locator_chunk_free(tovpn_sid_locator);
+               srv6_locator_chunk_free(&tovpn_sid_locator);
                XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid);
                return;
        }
@@ -891,7 +891,7 @@ void delete_vrf_tovpn_sid_per_af(struct bgp *bgp_vpn, struct bgp *bgp_vrf,
        if (tovpn_sid_index != 0 || tovpn_sid_auto)
                return;
 
-       srv6_locator_chunk_free(bgp_vrf->vpn_policy[afi].tovpn_sid_locator);
+       srv6_locator_chunk_free(&bgp_vrf->vpn_policy[afi].tovpn_sid_locator);
        bgp_vrf->vpn_policy[afi].tovpn_sid_locator = NULL;
 
        if (bgp_vrf->vpn_policy[afi].tovpn_sid) {
@@ -919,7 +919,7 @@ void delete_vrf_tovpn_sid_per_vrf(struct bgp *bgp_vpn, struct bgp *bgp_vrf)
        if (tovpn_sid_index != 0 || tovpn_sid_auto)
                return;
 
-       srv6_locator_chunk_free(bgp_vrf->tovpn_sid_locator);
+       srv6_locator_chunk_free(&bgp_vrf->tovpn_sid_locator);
        bgp_vrf->tovpn_sid_locator = NULL;
 
        if (bgp_vrf->tovpn_sid) {
index f380460a95731d64ce4a58e11ff6fcc5ddea265e..09f4fada8027ce74b68c6d890b2516efecd1463d 100644 (file)
@@ -310,7 +310,7 @@ static int bgp_srv6_locator_unset(struct bgp *bgp)
        /* refresh chunks */
        for (ALL_LIST_ELEMENTS(bgp->srv6_locator_chunks, node, nnode, chunk)) {
                listnode_delete(bgp->srv6_locator_chunks, chunk);
-               srv6_locator_chunk_free(chunk);
+               srv6_locator_chunk_free(&chunk);
        }
 
        /* refresh functions */
@@ -348,7 +348,8 @@ static int bgp_srv6_locator_unset(struct bgp *bgp)
                tovpn_sid_locator =
                        bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator;
                if (tovpn_sid_locator) {
-                       srv6_locator_chunk_free(tovpn_sid_locator);
+                       srv6_locator_chunk_free(
+                               &bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator);
                        bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator = NULL;
                }
 
@@ -356,12 +357,13 @@ static int bgp_srv6_locator_unset(struct bgp *bgp)
                tovpn_sid_locator =
                        bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator;
                if (tovpn_sid_locator) {
-                       srv6_locator_chunk_free(tovpn_sid_locator);
+                       srv6_locator_chunk_free(&bgp_vrf->vpn_policy[AFI_IP6]
+                                                        .tovpn_sid_locator);
                        bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator = NULL;
                }
 
                /* refresh per-vrf tovpn_sid_locator */
-               srv6_locator_chunk_free(bgp_vrf->tovpn_sid_locator);
+               srv6_locator_chunk_free(&bgp_vrf->tovpn_sid_locator);
        }
 
        /* clear locator name */
index f7dda74cce2bc5ad27a69ffae94461ad1fa73d76..f6c0863241b9faadff6b0a48e4cd1b467aa69f2c 100644 (file)
@@ -3219,13 +3219,13 @@ static int bgp_zebra_process_srv6_locator_chunk(ZAPI_CALLBACK_ARGS)
        if (strcmp(bgp->srv6_locator_name, chunk->locator_name) != 0) {
                zlog_err("%s: Locator name unmatch %s:%s", __func__,
                         bgp->srv6_locator_name, chunk->locator_name);
-               srv6_locator_chunk_free(chunk);
+               srv6_locator_chunk_free(&chunk);
                return 0;
        }
 
        for (ALL_LIST_ELEMENTS_RO(bgp->srv6_locator_chunks, node, c)) {
                if (!prefix_cmp(&c->prefix, &chunk->prefix)) {
-                       srv6_locator_chunk_free(chunk);
+                       srv6_locator_chunk_free(&chunk);
                        return 0;
                }
        }
@@ -3272,7 +3272,7 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
                if (prefix_match((struct prefix *)&loc.prefix,
                                 (struct prefix *)&chunk->prefix)) {
                        listnode_delete(bgp->srv6_locator_chunks, chunk);
-                       srv6_locator_chunk_free(chunk);
+                       srv6_locator_chunk_free(&chunk);
                }
 
        // refresh functions
@@ -3344,7 +3344,9 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
                        tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix;
                        if (prefix_match((struct prefix *)&loc.prefix,
                                         (struct prefix *)&tmp_prefi)) {
-                               srv6_locator_chunk_free(tovpn_sid_locator);
+                               srv6_locator_chunk_free(
+                                       &bgp_vrf->vpn_policy[AFI_IP]
+                                                .tovpn_sid_locator);
                                bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator =
                                        NULL;
                        }
@@ -3359,7 +3361,9 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
                        tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix;
                        if (prefix_match((struct prefix *)&loc.prefix,
                                         (struct prefix *)&tmp_prefi)) {
-                               srv6_locator_chunk_free(tovpn_sid_locator);
+                               srv6_locator_chunk_free(
+                                       &bgp_vrf->vpn_policy[AFI_IP6]
+                                                .tovpn_sid_locator);
                                bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator =
                                        NULL;
                        }
@@ -3373,7 +3377,8 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
                        tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix;
                        if (prefix_match((struct prefix *)&loc.prefix,
                                         (struct prefix *)&tmp_prefi))
-                               srv6_locator_chunk_free(tovpn_sid_locator);
+                               srv6_locator_chunk_free(
+                                       &bgp_vrf->tovpn_sid_locator);
                }
        }
 
index 306d92ae303bfabcbc1d47a7b77bb9af44a5adc9..a8ec6f2b71d9cdeaf86f45ed009a404b6164a839 100644 (file)
@@ -157,9 +157,9 @@ void srv6_locator_free(struct srv6_locator *locator)
        }
 }
 
-void srv6_locator_chunk_free(struct srv6_locator_chunk *chunk)
+void srv6_locator_chunk_free(struct srv6_locator_chunk **chunk)
 {
-       XFREE(MTYPE_SRV6_LOCATOR_CHUNK, chunk);
+       XFREE(MTYPE_SRV6_LOCATOR_CHUNK, *chunk);
 }
 
 json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk)
index 6e0c3ce99d1d94643ffe291f6655677ba84b0685..18d5bdebc2e44981bf814a53c396fb721da029ae 100644 (file)
@@ -187,7 +187,7 @@ int snprintf_seg6_segs(char *str,
 extern struct srv6_locator *srv6_locator_alloc(const char *name);
 extern struct srv6_locator_chunk *srv6_locator_chunk_alloc(void);
 extern void srv6_locator_free(struct srv6_locator *locator);
-extern void srv6_locator_chunk_free(struct srv6_locator_chunk *chunk);
+extern void srv6_locator_chunk_free(struct srv6_locator_chunk **chunk);
 json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk);
 json_object *srv6_locator_json(const struct srv6_locator *loc);
 json_object *srv6_locator_detailed_json(const struct srv6_locator *loc);