summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-10-29 20:05:27 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-11-02 16:13:44 -0400
commit63265b5c1f9fb28946376b535a814bec1dbd19ed (patch)
treee244c4ed35ac29185f6d77092f646f19fa704b65
parent7a6fc8774ddf74df312c7d4ce0bbdbb5ac01c5fa (diff)
*: Convert prefix_free to double pointer
Have the prefix_free code take a double pointer to free the data. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--bgpd/bgp_debug.c14
-rw-r--r--bgpd/bgp_route.c2
-rw-r--r--bgpd/bgpd.c2
-rw-r--r--bgpd/rfapi/rfapi_import.c4
-rw-r--r--bgpd/rfapi/vnc_import_bgp.c12
-rw-r--r--eigrpd/eigrp_network.c3
-rw-r--r--eigrpd/eigrp_topology.c2
-rw-r--r--isisd/isis_circuit.c10
-rw-r--r--lib/if.c6
-rw-r--r--lib/prefix.c20
-rw-r--r--lib/prefix.h10
-rw-r--r--pbrd/pbr_vty.c12
-rw-r--r--pimd/pim_neighbor.c2
-rw-r--r--pimd/pim_tlv.c3
-rw-r--r--staticd/static_zebra.c2
15 files changed, 53 insertions, 51 deletions
diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c
index f476b16188..0e4c3a3e12 100644
--- a/bgpd/bgp_debug.c
+++ b/bgpd/bgp_debug.c
@@ -209,7 +209,7 @@ static void bgp_debug_list_free(struct list *list)
listnode_delete(list, filter);
if (filter->p)
- prefix_free(filter->p);
+ prefix_free(&filter->p);
if (filter->host)
XFREE(MTYPE_BGP_DEBUG_STR, filter->host);
@@ -323,7 +323,7 @@ static int bgp_debug_list_remove_entry(struct list *list, const char *host,
} else if (p && filter->p->prefixlen == p->prefixlen
&& prefix_match(filter->p, p)) {
listnode_delete(list, filter);
- prefix_free(filter->p);
+ prefix_free(&filter->p);
XFREE(MTYPE_BGP_DEBUG_FILTER, filter);
return 1;
}
@@ -1412,7 +1412,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
ret = bgp_debug_parse_evpn_prefix(vty, argv, argc, &argv_p);
if (ret != CMD_SUCCESS) {
- prefix_free(argv_p);
+ prefix_free(&argv_p);
return ret;
}
@@ -1425,7 +1425,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
vty_out(vty,
"BGP updates debugging is already enabled for %s\n",
buf);
- prefix_free(argv_p);
+ prefix_free(&argv_p);
return CMD_SUCCESS;
}
@@ -1438,7 +1438,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
vty_out(vty, "BGP updates debugging is on for %s\n", buf);
}
- prefix_free(argv_p);
+ prefix_free(&argv_p);
return CMD_SUCCESS;
}
@@ -1477,7 +1477,7 @@ DEFPY (no_debug_bgp_update_prefix_afi_safi,
ret = bgp_debug_parse_evpn_prefix(vty, argv, argc, &argv_p);
if (ret != CMD_SUCCESS) {
- prefix_free(argv_p);
+ prefix_free(&argv_p);
return ret;
}
@@ -1505,7 +1505,7 @@ DEFPY (no_debug_bgp_update_prefix_afi_safi,
vty_out(vty, "BGP updates debugging was not enabled for %s\n",
buf);
- prefix_free(argv_p);
+ prefix_free(&argv_p);
return ret;
}
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 41e32b3112..c07fa2516e 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -10548,7 +10548,7 @@ static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp,
}
ret = bgp_show(vty, bgp, afi, safi, type, p, 0);
- prefix_free(p);
+ prefix_free(&p);
return ret;
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 06f6f933ac..7621d7ef0f 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -2586,7 +2586,7 @@ int peer_group_delete(struct peer_group *group)
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (ALL_LIST_ELEMENTS(group->listen_range[afi], node, nnode,
prefix)) {
- prefix_free(prefix);
+ prefix_free(&prefix);
}
list_delete(&group->listen_range[afi]);
}
diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c
index fe8e874440..660442b492 100644
--- a/bgpd/rfapi/rfapi_import.c
+++ b/bgpd/rfapi/rfapi_import.c
@@ -1512,7 +1512,7 @@ static int rfapiNhlAddNodeRoutes(
}
seen_nexthops =
- skiplist_new(0, vnc_prefix_cmp, (void (*)(void *))prefix_free);
+ skiplist_new(0, vnc_prefix_cmp, prefix_free_lists);
for (bpi = rn->info; bpi; bpi = bpi->next) {
@@ -4359,7 +4359,7 @@ rfapiImportTableRefAdd(struct bgp *bgp, struct ecommunity *rt_import_list,
it->rt_import_list = ecommunity_dup(rt_import_list);
it->rfg = rfg;
it->monitor_exterior_orphans =
- skiplist_new(0, NULL, (void (*)(void *))prefix_free);
+ skiplist_new(0, NULL, prefix_free_lists);
/*
* fill import route tables from RIBs
diff --git a/bgpd/rfapi/vnc_import_bgp.c b/bgpd/rfapi/vnc_import_bgp.c
index df06105535..6e8969ad18 100644
--- a/bgpd/rfapi/vnc_import_bgp.c
+++ b/bgpd/rfapi/vnc_import_bgp.c
@@ -1807,8 +1807,7 @@ static void vnc_import_bgp_exterior_add_route_it(
RFAPI_MONITOR_EXTERIOR(rn)->source =
skiplist_new(
0, NULL,
- (void (*)(void *))
- prefix_free);
+ prefix_free_lists);
agg_lock_node(rn); /* for skiplist */
}
agg_lock_node(rn); /* for skiplist entry */
@@ -2194,8 +2193,7 @@ void vnc_import_bgp_exterior_add_route_interior(
->source) {
RFAPI_MONITOR_EXTERIOR(rn_interior)
->source = skiplist_new(
- 0, NULL,
- (void (*)(void *))prefix_free);
+ 0, NULL, prefix_free_lists);
agg_lock_node(rn_interior);
}
skiplist_insert(
@@ -2337,8 +2335,7 @@ void vnc_import_bgp_exterior_add_route_interior(
if (!RFAPI_MONITOR_EXTERIOR(rn_interior)->source) {
RFAPI_MONITOR_EXTERIOR(rn_interior)->source =
skiplist_new(
- 0, NULL,
- (void (*)(void *))prefix_free);
+ 0, NULL, prefix_free_lists);
agg_lock_node(rn_interior); /* sl */
}
skiplist_insert(
@@ -2527,8 +2524,7 @@ void vnc_import_bgp_exterior_del_route_interior(
if (!RFAPI_MONITOR_EXTERIOR(par)->source) {
RFAPI_MONITOR_EXTERIOR(par)->source =
skiplist_new(
- 0, NULL,
- (void (*)(void *))prefix_free);
+ 0, NULL, prefix_free_lists);
agg_lock_node(par); /* sl */
}
skiplist_insert(RFAPI_MONITOR_EXTERIOR(par)->source,
diff --git a/eigrpd/eigrp_network.c b/eigrpd/eigrp_network.c
index 3e09ec41bb..324f309290 100644
--- a/eigrpd/eigrp_network.c
+++ b/eigrpd/eigrp_network.c
@@ -327,8 +327,7 @@ int eigrp_network_unset(struct eigrp *eigrp, struct prefix *p)
if (!IPV4_ADDR_SAME(&pref->u.prefix4, &p->u.prefix4))
return 0;
- prefix_ipv4_free(rn->info);
- rn->info = NULL;
+ prefix_ipv4_free((struct prefix_ipv4 **)&rn->info);
route_unlock_node(rn); /* initial reference */
/* Find interfaces that not configured already. */
diff --git a/eigrpd/eigrp_topology.c b/eigrpd/eigrp_topology.c
index 9cc612eaf1..56dbe3d85e 100644
--- a/eigrpd/eigrp_topology.c
+++ b/eigrpd/eigrp_topology.c
@@ -197,7 +197,7 @@ void eigrp_prefix_entry_delete(struct eigrp *eigrp, struct route_table *table,
list_delete(&pe->entries);
list_delete(&pe->rij);
eigrp_zebra_route_delete(eigrp, pe->destination);
- prefix_free(pe->destination);
+ prefix_free(&pe->destination);
rn->info = NULL;
route_unlock_node(rn); // Lookup above
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index 1d0e6549df..8343f7d85f 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -338,7 +338,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
if (ip) {
listnode_delete(circuit->ip_addrs, ip);
- prefix_ipv4_free(ip);
+ prefix_ipv4_free(&ip);
if (circuit->area)
lsp_regenerate_schedule(circuit->area,
circuit->is_type, 0);
@@ -358,7 +358,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
zlog_warn("End of addresses");
}
- prefix_ipv4_free(ipv4);
+ prefix_ipv4_free(&ipv4);
}
if (connected->address->family == AF_INET6) {
ipv6 = prefix_ipv6_new();
@@ -374,7 +374,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
}
if (ip6) {
listnode_delete(circuit->ipv6_link, ip6);
- prefix_ipv6_free(ip6);
+ prefix_ipv6_free(&ip6);
found = 1;
}
} else {
@@ -386,7 +386,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
}
if (ip6) {
listnode_delete(circuit->ipv6_non_link, ip6);
- prefix_ipv6_free(ip6);
+ prefix_ipv6_free(&ip6);
found = 1;
}
}
@@ -417,7 +417,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
lsp_regenerate_schedule(circuit->area, circuit->is_type,
0);
- prefix_ipv6_free(ipv6);
+ prefix_ipv6_free(&ipv6);
}
return;
}
diff --git a/lib/if.c b/lib/if.c
index 7c3606bbbf..a185d53ef7 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -869,10 +869,10 @@ struct nbr_connected *nbr_connected_new(void)
void connected_free(struct connected *connected)
{
if (connected->address)
- prefix_free(connected->address);
+ prefix_free(&connected->address);
if (connected->destination)
- prefix_free(connected->destination);
+ prefix_free(&connected->destination);
XFREE(MTYPE_CONNECTED_LABEL, connected->label);
@@ -883,7 +883,7 @@ void connected_free(struct connected *connected)
void nbr_connected_free(struct nbr_connected *connected)
{
if (connected->address)
- prefix_free(connected->address);
+ prefix_free(&connected->address);
XFREE(MTYPE_NBR_CONNECTED, connected);
}
diff --git a/lib/prefix.c b/lib/prefix.c
index 5071ca8201..e2bf3b949c 100644
--- a/lib/prefix.c
+++ b/lib/prefix.c
@@ -905,9 +905,9 @@ struct prefix_ipv4 *prefix_ipv4_new(void)
}
/* Free prefix_ipv4 structure. */
-void prefix_ipv4_free(struct prefix_ipv4 *p)
+void prefix_ipv4_free(struct prefix_ipv4 **p)
{
- prefix_free((struct prefix *)p);
+ prefix_free((struct prefix **)p);
}
/* If given string is valid return 1 else return 0 */
@@ -1077,9 +1077,9 @@ struct prefix_ipv6 *prefix_ipv6_new(void)
}
/* Free prefix for IPv6. */
-void prefix_ipv6_free(struct prefix_ipv6 *p)
+void prefix_ipv6_free(struct prefix_ipv6 **p)
{
- prefix_free((struct prefix *)p);
+ prefix_free((struct prefix **)p);
}
/* If given string is valid return 1 else return 0 */
@@ -1484,10 +1484,18 @@ struct prefix *prefix_new(void)
return p;
}
+void prefix_free_lists(void *arg)
+{
+ struct prefix *p = arg;
+
+ prefix_free(&p);
+}
+
/* Free prefix structure. */
-void prefix_free(struct prefix *p)
+void prefix_free(struct prefix **p)
{
- XFREE(MTYPE_PREFIX, p);
+ XFREE(MTYPE_PREFIX, *p);
+ *p = NULL;
}
/* Utility function to convert ipv4 prefixes to Classful prefixes */
diff --git a/lib/prefix.h b/lib/prefix.h
index 784927616a..7a93c766a3 100644
--- a/lib/prefix.h
+++ b/lib/prefix.h
@@ -396,7 +396,11 @@ extern unsigned int prefix6_bit(const struct in6_addr *prefix,
const uint16_t prefixlen);
extern struct prefix *prefix_new(void);
-extern void prefix_free(struct prefix *);
+extern void prefix_free(struct prefix **p);
+/*
+ * Function to handle prefix_free being used as a del function.
+ */
+extern void prefix_free_lists(void *arg);
extern const char *prefix_family_str(const struct prefix *);
extern int prefix_blen(const struct prefix *);
extern int str2prefix(const char *, struct prefix *);
@@ -435,7 +439,7 @@ extern void prefix2sockunion(const struct prefix *, union sockunion *);
extern int str2prefix_eth(const char *, struct prefix_eth *);
extern struct prefix_ipv4 *prefix_ipv4_new(void);
-extern void prefix_ipv4_free(struct prefix_ipv4 *);
+extern void prefix_ipv4_free(struct prefix_ipv4 **p);
extern int str2prefix_ipv4(const char *, struct prefix_ipv4 *);
extern void apply_mask_ipv4(struct prefix_ipv4 *);
@@ -460,7 +464,7 @@ extern in_addr_t ipv4_broadcast_addr(in_addr_t hostaddr, int masklen);
extern int netmask_str2prefix_str(const char *, const char *, char *);
extern struct prefix_ipv6 *prefix_ipv6_new(void);
-extern void prefix_ipv6_free(struct prefix_ipv6 *);
+extern void prefix_ipv6_free(struct prefix_ipv6 **p);
extern int str2prefix_ipv6(const char *, struct prefix_ipv6 *);
extern void apply_mask_ipv6(struct prefix_ipv6 *);
diff --git a/pbrd/pbr_vty.c b/pbrd/pbr_vty.c
index 069b3e6c9b..e0fd147b0e 100644
--- a/pbrd/pbr_vty.c
+++ b/pbrd/pbr_vty.c
@@ -133,10 +133,8 @@ DEFPY(pbr_map_match_src, pbr_map_match_src_cmd,
if (!pbrms->src)
pbrms->src = prefix_new();
prefix_copy(pbrms->src, prefix);
- } else {
- prefix_free(pbrms->src);
- pbrms->src = 0;
- }
+ } else
+ prefix_free(&pbrms->src);
pbr_map_check(pbrms);
@@ -162,10 +160,8 @@ DEFPY(pbr_map_match_dst, pbr_map_match_dst_cmd,
if (!pbrms->dst)
pbrms->dst = prefix_new();
prefix_copy(pbrms->dst, prefix);
- } else {
- prefix_free(pbrms->dst);
- pbrms->dst = NULL;
- }
+ } else
+ prefix_free(&pbrms->dst);
pbr_map_check(pbrms);
diff --git a/pimd/pim_neighbor.c b/pimd/pim_neighbor.c
index 722ecb2a72..3f2aaf2bbe 100644
--- a/pimd/pim_neighbor.c
+++ b/pimd/pim_neighbor.c
@@ -767,7 +767,7 @@ static void delete_from_neigh_addr(struct interface *ifp,
other_neigh_str, ifp->name);
listnode_delete(neigh->prefix_list, p);
- prefix_free(p);
+ prefix_free(&p);
}
}
diff --git a/pimd/pim_tlv.c b/pimd/pim_tlv.c
index d93a360448..4fe3237395 100644
--- a/pimd/pim_tlv.c
+++ b/pimd/pim_tlv.c
@@ -757,8 +757,7 @@ int pim_tlv_parse_addr_list(const char *ifname, struct in_addr src_addr,
*/
if (!*hello_option_addr_list) {
*hello_option_addr_list = list_new();
- (*hello_option_addr_list)->del =
- (void (*)(void *))prefix_free;
+ (*hello_option_addr_list)->del = prefix_free_lists;
}
/*
diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c
index 976f892efb..049cb4b4fa 100644
--- a/staticd/static_zebra.c
+++ b/staticd/static_zebra.c
@@ -260,7 +260,7 @@ static void static_nht_hash_free(void *data)
{
struct static_nht_data *nhtd = data;
- prefix_free(nhtd->nh);
+ prefix_free(&nhtd->nh);
XFREE(MTYPE_TMP, nhtd);
}