From 15ad172a847fa667c57a4594ef4158405db9a984 Mon Sep 17 00:00:00 2001 From: Angelo Mantellini Date: Tue, 31 Mar 2020 17:50:43 +0200 Subject: [HICN-554] hicn-light refactoring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I36f2d393741d4502ce14d3791158e43e3e9cd4cf Signed-off-by: Jordan Augé --- hicn-light/src/hicn/core/listener_table.c | 107 ++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 hicn-light/src/hicn/core/listener_table.c (limited to 'hicn-light/src/hicn/core/listener_table.c') diff --git a/hicn-light/src/hicn/core/listener_table.c b/hicn-light/src/hicn/core/listener_table.c new file mode 100644 index 000000000..e3cbb310d --- /dev/null +++ b/hicn-light/src/hicn/core/listener_table.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2020 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * \file listener_table.c + * \brief Implementation of hICN listener table + */ + +#include +#include + +/* This is only used for first allocation, as the table is resizeable */ +#define DEFAULT_LISTENER_TABLE_SIZE 64 + +listener_table_t * +listener_table_create(size_t elt_size, size_t max_elts) +{ + listener_table_t * table = malloc(sizeof(listener_table_t)); + if (!table) + return NULL; + + table->id_by_name = kh_init_lt_name(); + table->id_by_key = kh_init_lt_key(); + pool_init(table->listeners, DEFAULT_LISTENER_TABLE_SIZE); + + return table; +} + +void +listener_table_free(listener_table_t * table) +{ + kh_destroy_lt_name(table->id_by_name); + kh_destroy_lt_key(table->id_by_key); + pool_free(table->listeners); + free(table); +} + +listener_t * +listener_table_get_by_address(listener_table_t * table, + face_type_t type, const address_t * address) +{ + listener_key_t key; + //XXX + memset(&key, 0, sizeof(listener_key_t)); + key = (listener_key_t) { + .type = type, + .address = *address, + }; + khiter_t k = kh_get_lt_key(table->id_by_key, &key); + if (k == kh_end(table->id_by_key)) + return NULL; + return listener_table_at(table, kh_val(table->id_by_key, k)); +} + +void +listener_table_remove_by_id(listener_table_t * table, off_t id) +{ + /* + * Get the listener address so as to be able to remove it from the + * hash table index + */ + listener_t * listener = listener_table_at(table, id); + const char * name = listener_get_name(listener); + listener_key_t * key = listener_get_key(listener); + khiter_t k; + k = kh_get_lt_name(table->id_by_name, name); + kh_del_lt_name(table->id_by_name, k); + k = kh_get_lt_key(table->id_by_key, key); + kh_del_lt_key(table->id_by_key, k); + + pool_put(table->listeners, listener); +} + +listener_t * +listener_table_get_by_name(listener_table_t * table, const char * name) +{ + khiter_t k = kh_get_lt_name(table->id_by_name, name); + if (k == kh_end(table->id_by_name)) + return NULL; + return listener_table_at(table, kh_val(table->id_by_name, k)); +} + +#if 0 +unsigned +listener_table_add(listener_table_t * table, listener_t * listener) +{ + // XXX missing hash and key storage + listener_t * lst; + pool_get(table->listeners, lst); + lst = listener; + unsigned listener_id = lst - table, + Listener_SetId(listener, listener_id); + return listener_id; +} +#endif -- cgit 1.2.3-korg