move "node" functions internal to rbtree.c.
The public APIs are now:
rbtree_insert
rbtree_find
rbtree_delete
which fixes ~20 years of a bad API
* something has gone very badly wrong.
*/
if (request->in_request_tree) {
- ret = rbtree_delete_by_data(request_tree, request);
+ ret = rbtree_delete(request_tree, request);
RS_ASSERT(ret);
}
if (request->in_link_tree) {
- ret = rbtree_delete_by_data(link_tree, request);
+ ret = rbtree_delete(link_tree, request);
RS_ASSERT(ret);
}
{
/* look for a matching request and use it for decoding */
search.expect = packet;
- original = rbtree_find_data(request_tree, &search);
+ original = rbtree_find(request_tree, &search);
/*
* Verify this code is allowed
if (!fr_pair_list_empty(&search.link_vps)) {
rs_request_t *tuple;
- original = rbtree_find_data(link_tree, &search);
- tuple = rbtree_find_data(request_tree, &search);
+ original = rbtree_find(link_tree, &search);
+ tuple = rbtree_find(request_tree, &search);
/*
* If the packet we matched using attributes is not the same
* Detect duplicates using the normal 5-tuple of src/dst ips/ports id
*/
} else {
- original = rbtree_find_data(request_tree, &search);
+ original = rbtree_find(request_tree, &search);
if (original && (memcmp(original->expect->vector, packet->vector,
sizeof(original->expect->vector)) != 0)) {
/*
/* Request may need to be reinserted as the 5 tuple of the response may of changed */
if (rs_packet_cmp(original, &search) != 0) {
- rbtree_delete_by_data(request_tree, original);
+ rbtree_delete(request_tree, original);
}
/* replace expected packets and vps */
static int track_dedup_free(fr_io_track_t *track)
{
fr_assert(track->client->table != NULL);
- fr_assert(rbtree_find_data(track->client->table, track) != NULL);
+ fr_assert(rbtree_find(track->client->table, track) != NULL);
- if (!rbtree_delete_by_data(track->client->table, track)) {
+ if (!rbtree_delete(track->client->table, track)) {
fr_assert(0);
}
/*
* No existing duplicate. Return the new tracking entry.
*/
- old = rbtree_find_data(client->table, track);
+ old = rbtree_find(client->table, track);
if (!old) goto do_insert;
fr_assert(old->client == client);
} else {
fr_assert(client == old->client);
- if (!rbtree_delete_by_data(client->table, old)) {
+ if (!rbtree_delete(client->table, old)) {
fr_assert(0);
}
if (old->ev) (void) fr_event_timer_delete(&old->ev);
{
fr_network_socket_t *s;
- s = rbtree_find_data(nr->sockets, &(fr_network_socket_t){ .listen = li });
+ s = rbtree_find(nr->sockets, &(fr_network_socket_t){ .listen = li });
if (!s) return -1;
fr_network_socket_dead(nr, s);
(void) talloc_get_type_abort(nr, fr_network_t);
(void) talloc_get_type_abort_const(li, fr_listen_t);
- s = rbtree_find_data(nr->sockets, &(fr_network_socket_t){ .listen = li });
+ s = rbtree_find(nr->sockets, &(fr_network_socket_t){ .listen = li });
if (!s) return;
/*
fr_network_t *nr = s->nr;
fr_channel_data_t *cd;
- rbtree_delete_by_data(nr->sockets, s);
- rbtree_delete_by_data(nr->sockets_by_num, s);
+ rbtree_delete(nr->sockets, s);
+ rbtree_delete(nr->sockets_by_num, s);
fr_event_fd_delete(nr->el, s->listen->fd, s->filter);
fr_assert(data_size == sizeof(my_inject));
memcpy(&my_inject, data, data_size);
- s = rbtree_find_data(nr->sockets, &(fr_network_socket_t){ .listen = my_inject.listen });
+ s = rbtree_find(nr->sockets, &(fr_network_socket_t){ .listen = my_inject.listen });
if (!s) {
talloc_free(my_inject.packet); /* MUST be it's own TALLOC_CTX */
return;
* @todo - cache this somewhere so we don't need
* to do an rbtree lookup for every packet.
*/
- s = rbtree_find_data(nr->sockets, &(fr_network_socket_t){ .listen = li });
+ s = rbtree_find(nr->sockets, &(fr_network_socket_t){ .listen = li });
/*
* This shouldn't happen, but be safe...
fr_network_t const *nr = ctx;
fr_network_socket_t *s;
- s = rbtree_find_data(nr->sockets_by_num, &(fr_network_socket_t){ .number = info->box[0]->vb_uint32 });
+ s = rbtree_find(nr->sockets_by_num, &(fr_network_socket_t){ .number = info->box[0]->vb_uint32 });
if (!s) {
fprintf(fp_err, "No such socket number '%s'.\n", info->argv[0]);
return -1;
if (request->async->listen->track_duplicates) {
request_t *old;
- old = rbtree_find_data(worker->dedup, request);
+ old = rbtree_find(worker->dedup, request);
if (!old) {
/*
* Ignore duplicate packets where we've
* then, only some of the time.
*/
if (request->async->listen->track_duplicates) {
- (void) rbtree_delete_by_data(worker->dedup, request);
+ (void) rbtree_delete(worker->dedup, request);
}
/*
do { \
(_node)->is_active = false; \
(_node)->is_master = false; \
- rbtree_delete_by_data(cluster->used_nodes, _node); \
+ rbtree_delete(cluster->used_nodes, _node); \
fr_fifo_push(cluster->free_nodes, _node); \
} while (0)
memset(&tmpl_slot, 0, sizeof(tmpl_slot));
SET_ADDR(find.addr, map->element[2]);
- found = rbtree_find_data(cluster->used_nodes, &find);
+ found = rbtree_find(cluster->used_nodes, &find);
if (found) {
active[found->id] = true;
goto reuse_master_node;
*/
for (j = 3; (j < map->elements); j++) {
SET_ADDR(find.addr, map->element[j]);
- found = rbtree_find_data(cluster->used_nodes, &find);
+ found = rbtree_find(cluster->used_nodes, &find);
if (found) {
active[found->id] = true;
goto next;
if (cluster->node[i].is_active) {
/* Sanity check for duplicates that are active */
- found = rbtree_find_data(cluster->used_nodes, &cluster->node[i]);
+ found = rbtree_find(cluster->used_nodes, &cluster->node[i]);
fr_assert(found);
fr_assert(found->is_active);
fr_assert(found->id == i);
* If we have already have a pool for the
* host we were redirected to, use that.
*/
- found = rbtree_find_data(cluster->used_nodes, &find);
+ found = rbtree_find(cluster->used_nodes, &find);
if (found) {
/* We have the new pool, don't need to hold the lock */
pthread_mutex_unlock(&cluster->mutex);
find.addr.inet.dst_port = node_addr->inet.dst_port;
pthread_mutex_lock(&cluster->mutex);
- found = rbtree_find_data(cluster->used_nodes, &find);
+ found = rbtree_find(cluster->used_nodes, &find);
if (!found) {
fr_redis_cluster_node_t *spare;
char buffer[INET6_ADDRSTRLEN];
if (stat(filename, &my_file.buf) < 0) goto error;
- file = rbtree_find_data(tree, &my_file);
+ file = rbtree_find(tree, &my_file);
/*
* The file was previously read by including it
/*
* No ident2, use the ident1 tree.
*/
- if (IS_WILDCARD(ident2)) return rbtree_find_data(parent->ident1, find);
+ if (IS_WILDCARD(ident2)) return rbtree_find(parent->ident1, find);
/*
* Both ident1 and ident2 use the ident2 tree.
*/
- return rbtree_find_data(parent->ident2, find);
+ return rbtree_find(parent->ident2, find);
}
/** Return the next child that's of the specified type with the specified identifiers
fr_dlist_remove(&parent->children, found);
if (!fr_cond_assert(found == child)) return NULL;
- in_ident1 = (rbtree_find_data(parent->ident1, child) == child);
- if (in_ident1 && (!rbtree_delete_by_data(parent->ident1, child))) {
+ in_ident1 = (rbtree_find(parent->ident1, child) == child);
+ if (in_ident1 && (!rbtree_delete(parent->ident1, child))) {
fr_assert(0);
return NULL;
}
- in_ident2 = (rbtree_find_data(parent->ident2, child) == child);
- if (in_ident2 && (!rbtree_delete_by_data(parent->ident2, child))) {
+ in_ident2 = (rbtree_find(parent->ident2, child) == child);
+ if (in_ident2 && (!rbtree_delete(parent->ident2, child))) {
fr_assert(0);
return NULL;
}
while ((child = fr_dlist_next(&ci->children, child))) {
char const *in_ident1, *in_ident2;
- in_ident1 = rbtree_find_data(ci->ident1, child) == child? "in ident1 " : "";
- in_ident2 = rbtree_find_data(ci->ident2, child) == child? "in ident2 " : "";
+ in_ident1 = rbtree_find(ci->ident1, child) == child? "in ident1 " : "";
+ in_ident2 = rbtree_find(ci->ident2, child) == child? "in ident2 " : "";
switch (child->type) {
case CONF_ITEM_SECTION:
}
}
- old = rbtree_find_data(clients->tree[client->ipaddr.prefix], client);
+ old = rbtree_find(clients->tree[client->ipaddr.prefix], client);
#endif
if (old) {
/*
if (!clients->tree[client->ipaddr.prefix]) return;
- (void) rbtree_delete_by_data(clients->tree[client->ipaddr.prefix], client);
+ (void) rbtree_delete(clients->tree[client->ipaddr.prefix], client);
#endif
}
my_client.ipaddr = *ipaddr;
fr_ipaddr_mask(&my_client.ipaddr, i);
- client = rbtree_find_data(clients->tree[i], &my_client);
+ client = rbtree_find(clients->tree[i], &my_client);
if (client) {
return client;
}
if (dl_inst_cache.data == data) return dl_inst_cache.inst;
- return rbtree_find_data(dl_module_loader->inst_data_tree, &(dl_module_inst_t){ .data = UNCONST(void *, data) });
+ return rbtree_find(dl_module_loader->inst_data_tree, &(dl_module_inst_t){ .data = UNCONST(void *, data) });
}
/** Lookup instance name via instance data
}
if (dl_module->in_tree) {
- rbtree_delete_by_data(dl_module_loader->module_tree, dl_module);
+ rbtree_delete(dl_module_loader->module_tree, dl_module);
dl_module->in_tree = false;
}
/*
* If the module's already been loaded, increment the reference count.
*/
- dl_module = rbtree_find_data(dl_module_loader->module_tree,
+ dl_module = rbtree_find(dl_module_loader->module_tree,
&(dl_module_t){ .dl = &(dl_t){ .name = module_name }});
if (dl_module) {
talloc_free(module_name);
* Remove this instance from the tracking tree.
*/
fr_assert(dl_module_loader != NULL);
- rbtree_delete_by_data(dl_module_loader->inst_data_tree, dl_inst);
+ rbtree_delete(dl_module_loader->inst_data_tree, dl_inst);
/*
* Decrements the reference count. The module object
strlcpy(find.name, proc->name, sizeof(find.name));
find.length = strlen(find.name);
- found = rbtree_find_data(map_proc_root, &find);
+ found = rbtree_find(map_proc_root, &find);
if (!found) return 0;
- rbtree_delete_by_data(map_proc_root, found);
+ rbtree_delete(map_proc_root, found);
return 0;
}
strlcpy(find.name, name, sizeof(find.name));
find.length = strlen(find.name);
- return rbtree_find_data(map_proc_root, &find);
+ return rbtree_find(map_proc_root, &find);
}
/** Register a map processor
{
module_method_entry_t *found, find = { .id = id, .method = method };
- found = rbtree_find_data(set->tree, &find);
+ found = rbtree_find(set->tree, &find);
if (found) {
if (unlikely(found->method != method)) {
fr_strerror_printf("Conflict for method id %u (old %p vs new %p)",
{
module_method_entry_t *found;
- found = rbtree_find_data(set->tree, &(module_method_entry_t){ .id = id });
+ found = rbtree_find(set->tree, &(module_method_entry_t){ .id = id });
if (!found) return NULL;
return found->method;
inst_name = asked_name;
if (inst_name[0] == '-') inst_name++;
- inst = rbtree_find_data(module_instance_name_tree,
+ inst = rbtree_find(module_instance_name_tree,
&(module_instance_t){
.dl_inst = &(dl_module_inst_t){ .parent = parent ? parent->dl_inst : NULL },
.name = inst_name
{
module_instance_t *mi;
- mi = rbtree_find_data(module_instance_data_tree,
+ mi = rbtree_find(module_instance_data_tree,
&(module_instance_t){
.dl_inst = &(dl_module_inst_t){ .data = UNCONST(void *, data) },
});
{
DEBUG3("Freeing %s (%p)", mi->name, mi);
- if (mi->in_name_tree) if (!fr_cond_assert(rbtree_delete_by_data(module_instance_name_tree, mi))) return 1;
- if (mi->in_data_tree) if (!fr_cond_assert(rbtree_delete_by_data(module_instance_data_tree, mi))) return 1;
+ if (mi->in_name_tree) if (!fr_cond_assert(rbtree_delete(module_instance_name_tree, mi))) return 1;
+ if (mi->in_data_tree) if (!fr_cond_assert(rbtree_delete(module_instance_data_tree, mi))) return 1;
if (mi->mutex) {
/*
* FIXME
fr_dlist_remove(&state->to_expire, entry);
- rbtree_delete_by_data(state->tree, entry);
+ rbtree_delete(state->tree, entry);
DEBUG4("State ID %" PRIu64 " unlinked", entry->id);
}
*/
my_entry.state_comp.context_id ^= state->context_id;
- entry = rbtree_find_data(state->tree, &my_entry);
+ entry = rbtree_find(state->tree, &my_entry);
if (entry) (void) talloc_get_type_abort(entry, fr_state_entry_t);
pthread_mutex_lock(trigger_mutex);
- found = rbtree_find_data(trigger_last_fired_tree, &find);
+ found = rbtree_find(trigger_last_fired_tree, &find);
if (!found) {
MEM(found = talloc(NULL, trigger_last_fired_t));
found->ci = ci;
{
if (!listen_addr_root) return false;
- return rbtree_find_data(listen_addr_root, li);
+ return rbtree_find(listen_addr_root, li);
}
fr_virtual_namespace_t find = { .namespace = virtual_servers[i]->namespace };
fr_virtual_namespace_t *found;
- found = rbtree_find_data(vns_tree, &find);
+ found = rbtree_find(vns_tree, &find);
if (found) {
fr_assert(dict && (dict->dict == found->dict));
fr_assert(server_section_name_tree != NULL);
- old = rbtree_find_data(server_section_name_tree, entry);
+ old = rbtree_find(server_section_name_tree, entry);
if (old) return 0;
#ifndef NDEBUG
* define both "accounting on", and "accounting *".
*/
if (name2 != CF_IDENT_ANY) {
- entry = rbtree_find_data(server_section_name_tree,
+ entry = rbtree_find(server_section_name_tree,
&(virtual_server_compile_t) {
.name = name1,
.name2 = name2,
/*
* Then look up the wildcard, if we didn't find any matching name2.
*/
- entry = rbtree_find_data(server_section_name_tree,
+ entry = rbtree_find(server_section_name_tree,
&(virtual_server_compile_t) {
.name = name1,
.name2 = CF_IDENT_ANY,
} else {
tls_engine_t *found = NULL;
- found = rbtree_find_data(tls_engines, &(tls_engine_t){ .id = id, .instance = instance });
+ found = rbtree_find(tls_engines, &(tls_engine_t){ .id = id, .instance = instance });
if (found) {
fr_strerror_printf("engine %s%s%s%salready initialised", id,
instance ? " (" : "",
}
- found = rbtree_find_data(tls_engines, &(tls_engine_t){ .id = id, .instance = instance });
+ found = rbtree_find(tls_engines, &(tls_engine_t){ .id = id, .instance = instance });
if (!found) {
if (!auto_init) goto not_init;
goto do_init;
/*
* Mitigate against CrossTalk (CVE-2020-0543)
*/
- if (!tls_engines || !rbtree_find_data(tls_engines, &(tls_engine_t){ .id = "rdrand" })) {
+ if (!tls_engines || !rbtree_find(tls_engines, &(tls_engine_t){ .id = "rdrand" })) {
ENGINE *rand_engine;
ENGINE_register_all_RAND(); /* Give rand engines a chance to register */
if (!xlat_root) return NULL;
if (inlen < 0) {
- return rbtree_find_data(xlat_root, &(xlat_t){ .name = in });
+ return rbtree_find(xlat_root, &(xlat_t){ .name = in });
}
if ((size_t) inlen >= sizeof(buffer)) return NULL;
memcpy(buffer, in, inlen);
buffer[inlen] = '\0';
- return rbtree_find_data(xlat_root, &(xlat_t){ .name = buffer });
+ return rbtree_find(xlat_root, &(xlat_t){ .name = buffer });
}
{
if (!xlat_root) return 0;
- rbtree_delete_by_data(xlat_root, xlat);
+ rbtree_delete(xlat_root, xlat);
if (rbtree_num_elements(xlat_root) == 0) TALLOC_FREE(xlat_root);
return 0;
/*
* If it already exists, replace the instance.
*/
- c = rbtree_find_data(xlat_root, &(xlat_t){ .name = name });
+ c = rbtree_find(xlat_root, &(xlat_t){ .name = name });
if (c) {
if (c->internal) {
ERROR("%s: Cannot re-define internal expansion %s", __FUNCTION__, name);
/*
* If it already exists, replace the instance.
*/
- c = rbtree_find_data(xlat_root, &(xlat_t){ .name = name });
+ c = rbtree_find(xlat_root, &(xlat_t){ .name = name });
if (c) {
if (c->internal) {
ERROR("%s: Cannot re-define internal expansion %s", __FUNCTION__, name);
if (!name || !xlat_root) return;
- c = rbtree_find_data(xlat_root, &(xlat_t){ .name = name });
+ c = rbtree_find(xlat_root, &(xlat_t){ .name = name });
if (!c) return;
(void) talloc_get_type_abort(c, xlat_t);
* Remove permanent data from the instance tree.
*/
if (!inst->node->call.ephemeral) {
- rbtree_delete_by_data(xlat_inst_tree, inst);
+ rbtree_delete(xlat_inst_tree, inst);
if (rbtree_num_elements(xlat_inst_tree) == 0) TALLOC_FREE(xlat_inst_tree);
}
if (node->call.ephemeral) return node->call.thread_inst;
- found = rbtree_find_data(xlat_thread_inst_tree, &(xlat_thread_inst_t){ .node = node });
+ found = rbtree_find(xlat_thread_inst_tree, &(xlat_thread_inst_t){ .node = node });
fr_assert(found);
return found;
dl->handle = NULL;
- if (dl->in_tree) rbtree_delete_by_data(dl->loader->tree, dl);
+ if (dl->in_tree) rbtree_delete(dl->loader->tree, dl);
return 0;
}
* There's already something in the tree,
* just return that instead.
*/
- dl = rbtree_find_data(dl_loader->tree, &(dl_t){ .name = name });
+ dl = rbtree_find(dl_loader->tree, &(dl_t){ .name = name });
if (dl) {
talloc_increase_ref_count(dl);
return dl;
}
}
- rbtree_delete_by_data(el->fds, ef);
+ rbtree_delete(el->fds, ef);
ef->is_registered = false;
}
/*
* Ensure this exists
*/
- ef = rbtree_find_data(src->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
+ ef = rbtree_find(src->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
if (unlikely(!ef)) {
fr_strerror_printf("No events are registered for fd %i", fd);
return -1;
struct kevent evset[10];
int count = 0;
- ef = rbtree_find_data(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
+ ef = rbtree_find(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
if (unlikely(!ef)) {
fr_strerror_printf("No events are registered for fd %i", fd);
return -1;
}
if (!ef_out || !*ef_out) {
- ef = rbtree_find_data(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
+ ef = rbtree_find(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
} else {
ef = *ef_out;
fr_assert((fd < 0) || (ef->fd == fd));
{
fr_event_fd_t *ef;
- ef = rbtree_find_data(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
+ ef = rbtree_find(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
if (unlikely(!ef)) {
fr_strerror_printf("No events are registered for fd %i", fd);
return -1;
{
fr_event_fd_t *ef;
- ef = rbtree_find_data(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
+ ef = rbtree_find(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
if (unlikely(!ef)) {
fr_strerror_printf("No events are registered for fd %i", fd);
return -1;
{
fr_event_fd_t *ef;
- ef = rbtree_find_data(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
+ ef = rbtree_find(el->fds, &(fr_event_fd_t){ .fd = fd, .filter = filter });
if (unlikely(!ef)) {
fr_strerror_printf("No events are registered for fd %i", fd);
return -1;
fr_event_counter_t find = { .file = ev->file, .line = ev->line };
fr_event_counter_t *counter;
- counter = rbtree_find_data(locations[i], &find);
+ counter = rbtree_find(locations[i], &find);
if (!counter) {
counter = talloc(locations[i], fr_event_counter_t);
if (!counter) goto oom;
# define RBTREE_MAGIC (0x5ad09c42)
#endif
+static fr_rb_node_t *rbtree_insert_node(rbtree_t *tree, void *data) CC_HINT(nonnull);
+
static inline void rbtree_free_data(rbtree_t *tree, fr_rb_node_t *node)
{
if (!tree->free || unlikely(node->being_freed)) return;
/** Insert an element into the tree
*
*/
-fr_rb_node_t *rbtree_insert_node(rbtree_t *tree, void *data)
+static fr_rb_node_t *rbtree_insert_node(rbtree_t *tree, void *data)
{
fr_rb_node_t *current, *parent, *x;
}
}
-void rbtree_delete(rbtree_t *tree, fr_rb_node_t *z)
-{
- if (unlikely(tree->being_freed) || unlikely(z->being_freed)) return;
-
- rbtree_delete_internal(tree, z, false);
-}
-
-/** Delete a node from the tree, based on given data, which MUST have come from rbtree_find_data().
- *
- *
- */
-bool rbtree_delete_by_data(rbtree_t *tree, void const *data)
-{
- fr_rb_node_t *node;
-
- if (unlikely(tree->being_freed)) return false;
-
- node = rbtree_find(tree, data);
- if (!node) return false;
-
- rbtree_delete(tree, node);
-
- return true;
-}
-
/* Find user data, returning the node
*
*/
-fr_rb_node_t *rbtree_find(rbtree_t *tree, void const *data)
+static fr_rb_node_t *rbtree_find_node(rbtree_t *tree, void const *data)
{
fr_rb_node_t *current;
*
* @hidecallergraph
*/
-void *rbtree_find_data(rbtree_t *tree, void const *data)
+void *rbtree_find(rbtree_t *tree, void const *data)
{
fr_rb_node_t *x;
if (unlikely(tree->being_freed)) return NULL;
- x = rbtree_find(tree, data);
+ x = rbtree_find_node(tree, data);
if (!x) return NULL;
return x->data;
}
+/** Delete a node from the tree, based on given data
+ *
+ *
+ */
+bool rbtree_delete(rbtree_t *tree, void const *data)
+{
+ fr_rb_node_t *node;
+
+ if (unlikely(tree->being_freed)) return false;
+
+ node = rbtree_find_node(tree, data);
+ if (!node) return false;
+
+ if (unlikely(tree->being_freed) || unlikely(node->being_freed)) return true;
+
+ rbtree_delete_internal(tree, node, false);
+
+ return true;
+}
+
/** Return how many nodes there are in a tree
*
* @param[in] tree to return node count for.
bool rbtree_insert(rbtree_t *tree, void const *data) CC_HINT(nonnull);
-fr_rb_node_t *rbtree_insert_node(rbtree_t *tree, void *data) CC_HINT(nonnull);
-
-void rbtree_delete(rbtree_t *tree, fr_rb_node_t *z) CC_HINT(nonnull);
-
-bool rbtree_delete_by_data(rbtree_t *tree, void const *data) CC_HINT(nonnull);
-
-fr_rb_node_t *rbtree_find(rbtree_t *tree, void const *data) CC_HINT(nonnull);
+bool rbtree_delete(rbtree_t *tree, void const *data) CC_HINT(nonnull);
/** @hidecallergraph */
-void *rbtree_find_data(rbtree_t *tree, void const *data) CC_HINT(nonnull);
+void *rbtree_find(rbtree_t *tree, void const *data) CC_HINT(nonnull);
uint64_t rbtree_num_elements(rbtree_t *tree) CC_HINT(nonnull);
session->pthread_id = pthread_self();
} else {
if (!bfd_pthread_create(session)) {
- rbtree_delete_by_data(sock->session_tree, session);
+ rbtree_delete(sock->session_tree, session);
talloc_free(session);
return NULL;
}
fr_ipaddr_from_sockaddr(&my_session.socket.inet.dst_ipaddr,
&my_session.socket.inet.dst_port, &src, sizeof_src);
- session = rbtree_find_data(sock->session_tree, &my_session);
+ session = rbtree_find(sock->session_tree, &my_session);
if (!session) {
DEBUG("BFD unknown peer");
return 0;
my_session.socket.inet.dst_ipaddr = ipaddr;
my_session.socket.inet.dst_port = port;
- if (rbtree_find_data(sock->session_tree, &my_session) != NULL) {
+ if (rbtree_find(sock->session_tree, &my_session) != NULL) {
cf_log_err(ci, "Peers must have unique IP addresses");
return -1;
}
if (!sync || (sync->msgid != msgid)) {
find.msgid = msgid;
- sync = rbtree_find_data(tree, &find);
+ sync = rbtree_find(tree, &find);
if (!sync) {
WARN("Ignoring msgid %i, doesn't match any outstanding syncs",
find.msgid);
* Tell the remote server to stop sending results
*/
ldap_abandon_ext(sync->conn->handle, sync->msgid, NULL, NULL);
- rbtree_delete_by_data(tree, &find);
+ rbtree_delete(tree, &find);
return 0;
}
find.msgid = msgid;
- sync = rbtree_find_data(tree, &find);
+ sync = rbtree_find(tree, &find);
talloc_free(sync); /* Will inform the server */
}
find.msgid = msgid;
- sync = rbtree_find_data(tree, &find);
+ sync = rbtree_find(tree, &find);
return sync->config;
}
c = fr_heap_peek(driver->heap);
if (c && (c->expires < fr_time_to_unix_time(request->packet->timestamp))) {
fr_heap_extract(driver->heap, c);
- rbtree_delete_by_data(driver->cache, c);
+ rbtree_delete(driver->cache, c);
talloc_free(c);
}
/*
* Is there an entry for this key?
*/
- c = rbtree_find_data(driver->cache, &(rlm_cache_entry_t){ .key = key, .key_len = key_len });
+ c = rbtree_find(driver->cache, &(rlm_cache_entry_t){ .key = key, .key_len = key_len });
if (!c) {
*out = NULL;
return CACHE_MISS;
if (!request) return CACHE_ERROR;
- c = rbtree_find_data(driver->cache, &(rlm_cache_entry_t){ .key = key, .key_len = key_len });
+ c = rbtree_find(driver->cache, &(rlm_cache_entry_t){ .key = key, .key_len = key_len });
if (!c) return CACHE_MISS;
fr_heap_extract(driver->heap, c);
- rbtree_delete_by_data(driver->cache, c);
+ rbtree_delete(driver->cache, c);
talloc_free(c);
return CACHE_OK;
}
if (fr_heap_insert(driver->heap, UNCONST(rlm_cache_entry_t *, c)) < 0) {
- rbtree_delete_by_data(driver->cache, c);
+ rbtree_delete(driver->cache, c);
RERROR("Failed adding entry to expiry heap");
return CACHE_ERROR;
}
if (fr_heap_insert(driver->heap, c) < 0) {
- rbtree_delete_by_data(driver->cache, c); /* make sure we don't leak entries... */
+ rbtree_delete(driver->cache, c); /* make sure we don't leak entries... */
RERROR("Failed updating entry TTL. Entry was forcefully expired");
return CACHE_ERROR;
}
memcpy(&my_e.key, &key, sizeof(key)); /* const issues */
- return rbtree_find_data(inst->tree, &my_e);
+ return rbtree_find(inst->tree, &my_e);
}
static bool insert_entry(CONF_SECTION *conf, rlm_csv_t *inst, rlm_csv_entry_t *e, int lineno)
* for a matching list header already in the tree.
*/
search_list.name = entry->name;
- user_list = rbtree_find_data(tree, &search_list);
+ user_list = rbtree_find(tree, &search_list);
if (!user_list) {
user_list = talloc_zero(ctx, PAIR_LIST_LIST);
pairlist_list_init(user_list);
if (!tree) RETURN_MODULE_NOOP;
my_list.name = name;
- user_list = rbtree_find_data(tree, &my_list);
+ user_list = rbtree_find(tree, &my_list);
user_pl = (user_list) ? fr_dlist_head(&user_list->head) : NULL;
my_list.name = "DEFAULT";
- default_list = rbtree_find_data(tree, &my_list);
+ default_list = rbtree_find(tree, &my_list);
default_pl = (default_list) ? fr_dlist_head(&default_list->head) : NULL;
/*
MEM(vb = fr_value_box_alloc(ctx, FR_TYPE_BOOL, NULL, false));
vb->vb_bool = echo->replied;
- (void) rbtree_delete_by_data(thread->t->tree, echo);
+ (void) rbtree_delete(thread->t->tree, echo);
talloc_free(echo);
fr_dcursor_insert(out, vb);
RDEBUG2("Cancelling ICMP request for %pV (counter=%d)", echo->ip, echo->counter);
- (void) rbtree_delete_by_data(thread->t->tree, echo);
+ (void) rbtree_delete(thread->t->tree, echo);
talloc_free(echo);
}
if (unlang_xlat_event_timeout_add(request, _xlat_icmp_timeout, echo, fr_time() + inst->timeout) < 0) {
RPEDEBUG("Failed adding timeout");
- (void) rbtree_delete_by_data(thread->t->tree, echo);
+ (void) rbtree_delete(thread->t->tree, echo);
talloc_free(echo);
return XLAT_ACTION_FAIL;
}
rcode = sendto(thread->t->fd, &icmp, sizeof(icmp), 0, (struct sockaddr *) &dst, salen);
if (rcode < 0) {
REDEBUG("Failed sending ICMP request to %pV: %s", echo->ip, fr_syserror(errno));
- (void) rbtree_delete_by_data(thread->t->tree, echo);
+ (void) rbtree_delete(thread->t->tree, echo);
talloc_free(echo);
return XLAT_ACTION_FAIL;
}
if ((size_t) rcode < sizeof(icmp)) {
REDEBUG("Failed sending entire ICMP packet");
- (void) rbtree_delete_by_data(thread->t->tree, echo);
+ (void) rbtree_delete(thread->t->tree, echo);
talloc_free(echo);
return XLAT_ACTION_FAIL;
}
* Look up the packet by the fields which determine *our* ICMP packets.
*/
my_echo.counter = icmp->counter;
- echo = rbtree_find_data(t->tree, &my_echo);
+ echo = rbtree_find(t->tree, &my_echo);
if (!echo) {
DEBUG("Can't find packet counter=%d in tree", icmp->counter);
return;
}
- (void) rbtree_delete_by_data(t->tree, echo);
+ (void) rbtree_delete(t->tree, echo);
/*
* We have a reply!
* This entry MAY be in a subtree. If so, delete
* it.
*/
- if (tt->subtree[te->id]) (void) rbtree_delete_by_data(tt->subtree[te->id], te);
+ if (tt->subtree[te->id]) (void) rbtree_delete(tt->subtree[te->id], te);
goto done;
}
* Delete it from the tracking subtree.
*/
fr_assert(tt->subtree[te->id] != NULL);
- (void) rbtree_delete_by_data(tt->subtree[te->id], te);
+ (void) rbtree_delete(tt->subtree[te->id], te);
/*
* Try to free memory if the system gets idle. If the
/*
* The authentication vector may have changed.
*/
- if (tt->subtree[te->id]) (void) rbtree_delete_by_data(tt->subtree[te->id], te);
+ if (tt->subtree[te->id]) (void) rbtree_delete(tt->subtree[te->id], te);
memcpy(te->vector, vector, sizeof(te->vector));
*/
memcpy(&my_te.vector, vector, sizeof(my_te.vector));
- te = rbtree_find_data(tt->subtree[packet_id], &my_te);
+ te = rbtree_find(tt->subtree[packet_id], &my_te);
/*
* Not found, the packet MAY have been allocated in the
/************ private functions *************/
static SECURID_SESSION *securid_sessionlist_delete(rlm_securid_t *inst, SECURID_SESSION *session)
{
- fr_assert(rbtree_find_data(inst->session_tree, session) == session);
+ fr_assert(rbtree_find(inst->session_tree, session) == session);
/*
* Delete old session from the tree.
*/
- rbtree_delete_by_data(inst->session_tree, node);
+ rbtree_delete(inst->session_tree, node);
/*
* And unsplice it from the linked list.
*/
while((session = inst->session_head)) {
if ((timestamp - session->timestamp) > inst->timer_limit) {
- rbtree_delete_by_data(inst->session_tree, session);
+ rbtree_delete(inst->session_tree, session);
/*
* session == inst->session_head
/*
* Remove the outstanding transaction
*/
- if (!rbtree_delete_by_data(txn_tree, txn)) ERROR("Transaction removed before timeout");
+ if (!rbtree_delete(txn_tree, txn)) ERROR("Transaction removed before timeout");
txn->response.type = SIGTRAN_RESPONSE_FAIL;
/*
* Lookup the transaction in our tree of outstanding transactions
*/
- found = rbtree_find_data(txn_tree, &find);
+ found = rbtree_find(txn_tree, &find);
if (!found) {
/*
* Not an error, could be a retransmission
ERROR("No outstanding transaction with DTID %u Invoke ID %u", find.ctx.otid, find.ctx.invoke_id);
return 0;
}
- if (!rbtree_delete_by_data(txn_tree, found)) { /* Remove the outstanding transaction */
+ if (!rbtree_delete(txn_tree, found)) { /* Remove the outstanding transaction */
ERROR("Failed removing transaction");
fr_assert(0);
}
* Bootstrap with my statistics, where we don't need a
* lock.
*/
- stats = rbtree_find_data(*tree, mydata);
+ stats = rbtree_find(*tree, mydata);
if (!stats) {
memset(final_stats, 0, sizeof(uint64_t) * FR_RADIUS_CODE_MAX);
} else {
if (other == t) continue;
tree = (rbtree_t **) (((uint8_t *) other) + tree_offset);
- stats = rbtree_find_data(*tree, mydata);
+ stats = rbtree_find(*tree, mydata);
if (!stats) {
continue;
}
* Update source statistics
*/
mydata.ipaddr = request->packet->socket.inet.src_ipaddr;
- stats = rbtree_find_data(t->src, &mydata);
+ stats = rbtree_find(t->src, &mydata);
if (!stats) {
MEM(stats = talloc_zero(t, rlm_stats_data_t));
* Update destination statistics
*/
mydata.ipaddr = request->packet->socket.inet.dst_ipaddr;
- stats = rbtree_find_data(t->dst, &mydata);
+ stats = rbtree_find(t->dst, &mydata);
if (!stats) {
MEM(stats = talloc_zero(t, rlm_stats_data_t));
{
if (!pl || !request) return 0;
- return rbtree_find_data(pl->tree, request);
+ return rbtree_find(pl->tree, request);
}
my_request.id = reply->id;
request = &my_request;
- return rbtree_find_data(pl->tree, request);
+ return rbtree_find(pl->tree, request);
}
{
if (!pl || !request) return false;
- return rbtree_delete_by_data(pl->tree, request);
+ return rbtree_delete(pl->tree, request);
}
uint32_t fr_packet_list_num_elements(fr_packet_list_t *pl)
* For testing deletebydata instead
for (i = 0; i < n; i++) {
- if (filter_cb(&vals[i], &thresh) == 2) rbtree_delete_by_data(t, &vals[i]);
+ if (filter_cb(&vals[i], &thresh) == 2) rbtree_delete(t, &vals[i]);
}
*