summaryrefslogtreecommitdiffstats
path: root/hicn-light
diff options
context:
space:
mode:
authorEnrico Loparco (eloparco) <eloparco@cisco.com>2022-09-08 12:18:09 +0000
committerEnrico Loparco (eloparco) <eloparco@cisco.com>2022-09-12 13:23:29 +0000
commit6ee6b65ef03f8a479cccb2ae04e6b156f309f045 (patch)
treeea59d0e048c53c40490bc7290eda09ccad954423 /hicn-light
parentcb6f5724b85e51295498a39144ed4ccce114ad53 (diff)
feat(slab): add slab allocator to store hashtables' keys
Ref: HICN-777 Signed-off-by: Enrico Loparco (eloparco) <eloparco@cisco.com> Change-Id: Ibbd5c5e73cfd2f6adf757f7248dff8a933515d21
Diffstat (limited to 'hicn-light')
-rw-r--r--hicn-light/src/hicn/cli/hicns.c2
-rw-r--r--hicn-light/src/hicn/config/configuration.c23
-rw-r--r--hicn-light/src/hicn/core/connection_table.c38
-rw-r--r--hicn-light/src/hicn/core/connection_table.h3
-rw-r--r--hicn-light/src/hicn/core/forwarder.c11
-rw-r--r--hicn-light/src/hicn/core/listener_table.c38
-rw-r--r--hicn-light/src/hicn/core/listener_table.h3
-rw-r--r--hicn-light/src/hicn/core/packet_cache.c61
-rw-r--r--hicn-light/src/hicn/core/packet_cache.h14
-rw-r--r--hicn-light/src/hicn/test/test-configuration.cc1
-rw-r--r--hicn-light/src/hicn/test/test-connection_table.cc8
-rw-r--r--hicn-light/src/hicn/test/test-listener_table.cc8
-rw-r--r--hicn-light/src/hicn/test/test-packet_cache.cc33
13 files changed, 144 insertions, 99 deletions
diff --git a/hicn-light/src/hicn/cli/hicns.c b/hicn-light/src/hicn/cli/hicns.c
index fa668062d..c03fa8599 100644
--- a/hicn-light/src/hicn/cli/hicns.c
+++ b/hicn-light/src/hicn/cli/hicns.c
@@ -58,7 +58,7 @@ int shell(hc_sock_t *s) {
hc_command_t command = {0};
char *pos;
- if ((pos = strchr(line, '\n')) != NULL) {
+ if (line != NULL && (pos = strchr(line, '\n')) != NULL) {
*pos = '\0';
} else {
fprintf(stderr, "Error while reading command.\n");
diff --git a/hicn-light/src/hicn/config/configuration.c b/hicn-light/src/hicn/config/configuration.c
index f38c4f22f..b7e931e53 100644
--- a/hicn-light/src/hicn/config/configuration.c
+++ b/hicn-light/src/hicn/config/configuration.c
@@ -46,6 +46,8 @@
#include <hicn/utils/punting.h>
#include <hicn/util/log.h>
#include <hicn/face.h>
+#include <hicn/util/slab.h>
+#include <hicn/util/sstrncpy.h>
#include "configuration.h"
@@ -63,6 +65,10 @@
(msg)->header.seq_num = (seq_number); \
} while (0);
+typedef struct {
+ char prefix[MAXSZ_HICN_PREFIX];
+} prefix_key_t;
+
struct configuration_s {
const char *fn_config;
uint16_t port;
@@ -72,7 +78,10 @@ struct configuration_s {
const char *logfile;
int logfile_fd;
bool daemon;
+
kh_strategy_map_t *strategy_map;
+ slab_t *prefix_keys;
+
size_t n_suffixes_per_split;
int_manifest_split_strategy_t split_strategy;
};
@@ -95,6 +104,7 @@ configuration_t *configuration_create() {
#endif
configuration_set_loglevel(config, loglevel_from_str(DEFAULT_LOGLEVEL));
config->strategy_map = kh_init_strategy_map();
+ config->prefix_keys = slab_create(prefix_key_t, SLAB_INIT_SIZE);
config->n_suffixes_per_split = DEFAULT_N_SUFFIXES_PER_SPLIT;
config->split_strategy = DEFAULT_DISAGGREGATION_STRATEGY;
@@ -104,13 +114,8 @@ configuration_t *configuration_create() {
void configuration_free(configuration_t *config) {
assert(config);
- const char *k_prefix;
- unsigned _;
- (void)_;
-
- // Free the strategy hashmap
- kh_foreach(config->strategy_map, k_prefix, _, { free((char *)k_prefix); });
kh_destroy_strategy_map(config->strategy_map);
+ slab_free(config->prefix_keys);
free(config);
}
@@ -202,7 +207,11 @@ bool configuration_get_daemon(const configuration_t *config) {
void configuration_set_strategy(configuration_t *config, const char *prefix,
strategy_type_t strategy_type) {
int res;
- khiter_t k = kh_put_strategy_map(config->strategy_map, strdup(prefix), &res);
+ prefix_key_t *prefix_copy = slab_get(prefix_key_t, config->prefix_keys);
+ strcpy_s(prefix_copy->prefix, sizeof(prefix_key_t), prefix);
+
+ khiter_t k =
+ kh_put_strategy_map(config->strategy_map, prefix_copy->prefix, &res);
kh_value(config->strategy_map, k) = strategy_type;
}
diff --git a/hicn-light/src/hicn/core/connection_table.c b/hicn-light/src/hicn/core/connection_table.c
index 7bc0e2f4c..a6b114c01 100644
--- a/hicn-light/src/hicn/core/connection_table.c
+++ b/hicn-light/src/hicn/core/connection_table.c
@@ -19,6 +19,7 @@
*/
#include <hicn/util/log.h>
+#include <hicn/util/sstrncpy.h>
#include "connection.h"
#include "connection_table.h"
@@ -27,6 +28,10 @@
*/
#define DEFAULT_CONNECTION_TABLE_SIZE 64
+typedef struct {
+ char name[SYMBOLIC_NAME_LEN];
+} name_key_t;
+
connection_table_t *_connection_table_create(size_t init_size,
size_t max_size) {
if (init_size == 0) init_size = DEFAULT_CONNECTION_TABLE_SIZE;
@@ -38,7 +43,9 @@ connection_table_t *_connection_table_create(size_t init_size,
/* Initialize indices */
table->id_by_pair = kh_init_ct_pair();
+ table->pair_keys = slab_create(address_pair_t, SLAB_INIT_SIZE);
table->id_by_name = kh_init_ct_name();
+ table->name_keys = slab_create(name_key_t, SLAB_INIT_SIZE);
/*
* We start by allocating a reasonably-sized pool, as this will eventually
@@ -50,26 +57,20 @@ connection_table_t *_connection_table_create(size_t init_size,
}
void connection_table_free(connection_table_t *table) {
- const char *k_name;
- const address_pair_t *k_pair;
- unsigned v_conn_id;
+ unsigned conn_id;
+ kh_foreach_value(table->id_by_name, conn_id, {
+ connection_t *connection = connection_table_get_by_id(table, conn_id);
+ const char *name = connection_get_name(connection);
- connection_t *connection;
- const char *name;
- kh_foreach(table->id_by_name, k_name, v_conn_id, {
- connection = connection_table_get_by_id(table, v_conn_id);
- name = connection_get_name(connection);
INFO("Removing connection %s [%d]", name, connection->fd);
connection_finalize(connection);
});
- (void)v_conn_id;
- kh_foreach(table->id_by_name, k_name, v_conn_id, { free((char *)k_name); });
- kh_foreach(table->id_by_pair, k_pair, v_conn_id,
- { free((address_pair_t *)k_pair); });
-
kh_destroy_ct_pair(table->id_by_pair);
+ slab_free(table->pair_keys);
kh_destroy_ct_name(table->id_by_name);
+ slab_free(table->name_keys);
+
pool_free(table->connections);
free(table);
}
@@ -93,12 +94,15 @@ connection_t *connection_table_allocate(const connection_table_t *table,
int rc;
// Add in name hash table
- khiter_t k = kh_put_ct_name(table->id_by_name, strdup(name), &rc);
+ name_key_t *name_copy = slab_get(name_key_t, table->name_keys);
+ strcpy_s(name_copy->name, sizeof(name_key_t), name);
+
+ khiter_t k = kh_put_ct_name(table->id_by_name, name_copy->name, &rc);
assert(rc == KH_ADDED || rc == KH_RESET);
kh_value(table->id_by_name, k) = (unsigned int)id;
// Add in pair hash table
- address_pair_t *pair_copy = (address_pair_t *)malloc(sizeof(address_pair_t));
+ address_pair_t *pair_copy = slab_get(address_pair_t, table->pair_keys);
memcpy(pair_copy, pair, sizeof(address_pair_t));
k = kh_put_ct_pair(table->id_by_pair, pair_copy, &rc);
@@ -125,14 +129,14 @@ void connection_table_deallocate(const connection_table_t *table,
// Remove from name hash table
khiter_t k = kh_get_ct_name(table->id_by_name, name);
assert(k != kh_end(table->id_by_name));
- free((char *)kh_key(table->id_by_name, k));
kh_del_ct_name(table->id_by_name, k);
+ slab_put(table->name_keys, kh_key(table->id_by_name, k));
// Remove from pair hash table
k = kh_get_ct_pair(table->id_by_pair, pair);
assert(k != kh_end(table->id_by_pair));
- free((address_pair_t *)kh_key(table->id_by_pair, k));
kh_del_ct_pair(table->id_by_pair, k);
+ slab_put(table->pair_keys, kh_key(table->id_by_pair, k));
assert(kh_size(table->id_by_name) == kh_size(table->id_by_pair));
pool_put(table->connections, conn);
diff --git a/hicn-light/src/hicn/core/connection_table.h b/hicn-light/src/hicn/core/connection_table.h
index 566443d93..dcfb1e1dd 100644
--- a/hicn-light/src/hicn/core/connection_table.h
+++ b/hicn-light/src/hicn/core/connection_table.h
@@ -32,6 +32,7 @@
#include <hicn/util/khash.h>
#include <hicn/util/hash.h>
+#include <hicn/util/slab.h>
#include "address_pair.h"
#include "connection.h"
#include <hicn/util/pool.h>
@@ -48,7 +49,9 @@ typedef struct {
size_t max_size;
kh_ct_pair_t *id_by_pair;
+ slab_t *pair_keys;
kh_ct_name_t *id_by_name;
+ slab_t *name_keys;
connection_t *connections; // pool
} connection_table_t;
diff --git a/hicn-light/src/hicn/core/forwarder.c b/hicn-light/src/hicn/core/forwarder.c
index 72bb22118..d148f845d 100644
--- a/hicn-light/src/hicn/core/forwarder.c
+++ b/hicn-light/src/hicn/core/forwarder.c
@@ -805,7 +805,7 @@ int _forwarder_forward_aggregated_interest(
assert(msgbuf_id_is_valid(msgbuf_id) &&
msgbuf_get_type(msgbuf) == HICN_PACKET_TYPE_INTEREST);
- bool ret = -1;
+ int ret = -1;
fib_entry_t *fib_entry = fib_match_msgbuf(forwarder->fib, msgbuf);
if (!fib_entry) goto END;
@@ -843,9 +843,8 @@ int _forwarder_forward_aggregated_interest(
BITMAP_SIZE * sizeof(hicn_uword));
size_t suffix_index = 0; // Position of suffix in initial manifest
- interest_manifest_header_t *manifest;
+ interest_manifest_header_t *manifest = NULL;
size_t payload_size;
- int ret;
while (suffix_index < total_suffixes) {
// If more than one sub-manifest,
// clone original interest manifest and update suffix
@@ -869,9 +868,9 @@ int _forwarder_forward_aggregated_interest(
// Update manifest bitmap in current msgbuf
- ret =
+ int ret =
_forwarder_get_interest_manifest(msgbuf, &manifest, &payload_size);
- assert(ret == 0);
+ _ASSERT(ret == 0);
memcpy(manifest->request_bitmap, curr_bitmap,
BITMAP_SIZE * sizeof(hicn_uword));
WITH_TRACE({
@@ -1088,7 +1087,7 @@ static ssize_t forwarder_process_interest(forwarder_t *forwarder,
pkt_cache_save_suffixes_for_prefix(
forwarder->pkt_cache, hicn_name_get_prefix(msgbuf_get_name(msgbuf)));
- if (!int_manifest_header)
+ if (ret == -1)
return forwarder_process_single_interest(forwarder, msgbuf_pool, msgbuf,
msgbuf_id);
return forwarder_process_aggregated_interest(forwarder, int_manifest_header,
diff --git a/hicn-light/src/hicn/core/listener_table.c b/hicn-light/src/hicn/core/listener_table.c
index c130399a5..4a0f74a13 100644
--- a/hicn-light/src/hicn/core/listener_table.c
+++ b/hicn-light/src/hicn/core/listener_table.c
@@ -19,6 +19,7 @@
*/
#include <hicn/util/log.h>
+#include <hicn/util/sstrncpy.h>
#include "listener_table.h"
#include "listener.h"
@@ -27,6 +28,10 @@
*/
#define DEFAULT_LISTENER_TABLE_SIZE 64
+typedef struct {
+ char name[SYMBOLIC_NAME_LEN];
+} name_key_t;
+
listener_table_t *_listener_table_create(size_t init_size, size_t max_size) {
if (init_size == 0) init_size = DEFAULT_LISTENER_TABLE_SIZE;
@@ -37,7 +42,9 @@ listener_table_t *_listener_table_create(size_t init_size, size_t max_size) {
/* Initialize indices */
table->id_by_name = kh_init_lt_name();
+ table->name_keys = slab_create(name_key_t, SLAB_INIT_SIZE);
table->id_by_key = kh_init_lt_key();
+ table->listener_keys = slab_create(listener_key_t, SLAB_INIT_SIZE);
/*
* We start by allocating a reasonably-sized pool, as this will eventually
@@ -49,25 +56,19 @@ listener_table_t *_listener_table_create(size_t init_size, size_t max_size) {
}
void listener_table_free(listener_table_t *table) {
- const char *k_name;
- const listener_key_t *k_key;
- unsigned v;
-
- listener_t *listener;
- const char *name;
- kh_foreach(table->id_by_key, k_key, v, {
- listener = listener_table_get_by_id(table, v);
- name = listener_get_name(listener);
+ unsigned listener_id;
+ kh_foreach_value(table->id_by_key, listener_id, {
+ listener_t *listener = listener_table_get_by_id(table, listener_id);
+ const char *name = listener_get_name(listener);
INFO("Removing listener %s [%d]", name, listener->fd);
listener_finalize(listener);
});
- (void)v;
- kh_foreach(table->id_by_name, k_name, v, { free((char *)k_name); });
- kh_foreach(table->id_by_key, k_key, v, { free((listener_key_t *)k_key); });
-
kh_destroy_lt_name(table->id_by_name);
+ slab_free(table->name_keys);
kh_destroy_lt_key(table->id_by_key);
+ slab_free(table->listener_keys);
+
pool_free(table->listeners);
free(table);
}
@@ -83,12 +84,15 @@ listener_t *listener_table_allocate(const listener_table_t *table,
int rc;
// Add in name hash table
- khiter_t k = kh_put_lt_name(table->id_by_name, strdup(name), &rc);
+ name_key_t *name_copy = slab_get(name_key_t, table->name_keys);
+ strcpy_s(name_copy->name, sizeof(name_key_t), name);
+
+ khiter_t k = kh_put_lt_name(table->id_by_name, name_copy->name, &rc);
assert(rc == KH_ADDED || rc == KH_RESET);
kh_value(table->id_by_name, k) = (unsigned int)id;
// Add in key hash table
- listener_key_t *key_copy = (listener_key_t *)malloc(sizeof(listener_key_t));
+ listener_key_t *key_copy = slab_get(listener_key_t, table->listener_keys);
memcpy(key_copy, key, sizeof(listener_key_t));
k = kh_put_lt_key(table->id_by_key, key_copy, &rc);
@@ -107,14 +111,14 @@ void listener_table_deallocate(const listener_table_t *table,
// Remove from name hash table
khiter_t k = kh_get_lt_name(table->id_by_name, name);
assert(k != kh_end(table->id_by_name));
- free((char *)kh_key(table->id_by_name, k));
kh_del_lt_name(table->id_by_name, k);
+ slab_put(table->name_keys, kh_key(table->id_by_name, k));
// Remove from key hash table
k = kh_get_lt_key(table->id_by_key, key);
assert(k != kh_end(table->id_by_key));
- free((listener_key_t *)kh_key(table->id_by_key, k));
kh_del_lt_key(table->id_by_key, k);
+ slab_put(table->listener_keys, kh_key(table->id_by_key, k));
assert(kh_size(table->id_by_name) == kh_size(table->id_by_key));
pool_put(table->listeners, listener);
diff --git a/hicn-light/src/hicn/core/listener_table.h b/hicn-light/src/hicn/core/listener_table.h
index 27c5daa04..062d1748e 100644
--- a/hicn-light/src/hicn/core/listener_table.h
+++ b/hicn-light/src/hicn/core/listener_table.h
@@ -32,6 +32,7 @@
#include <hicn/util/khash.h>
#include <hicn/util/hash.h>
+#include <hicn/util/slab.h>
#include "address.h"
#include "listener.h"
#include <hicn/util/pool.h>
@@ -48,7 +49,9 @@ typedef struct {
size_t max_size;
kh_lt_key_t *id_by_key;
+ slab_t *listener_keys;
kh_lt_name_t *id_by_name;
+ slab_t *name_keys;
listener_t *listeners; // pool
} listener_table_t;
diff --git a/hicn-light/src/hicn/core/packet_cache.c b/hicn-light/src/hicn/core/packet_cache.c
index 9d0b041c3..7fa18b48f 100644
--- a/hicn-light/src/hicn/core/packet_cache.c
+++ b/hicn-light/src/hicn/core/packet_cache.c
@@ -84,13 +84,9 @@ const char *_pkt_cache_verdict_str[] = {
* Free the two level packet cache structure (helper)
*/
void _prefix_map_free(kh_pkt_cache_prefix_t *prefix_to_suffixes) {
- const hicn_name_prefix_t *key;
- kh_pkt_cache_suffix_t *value;
- kh_foreach(prefix_to_suffixes, key, value, {
- //(void)key;
- free((hicn_name_prefix_t *)key);
- kh_destroy_pkt_cache_suffix(value);
- });
+ kh_pkt_cache_suffix_t *suffix;
+ kh_foreach_value(prefix_to_suffixes, suffix,
+ { kh_destroy_pkt_cache_suffix(suffix); });
kh_destroy_pkt_cache_prefix(prefix_to_suffixes);
}
@@ -99,7 +95,7 @@ void _prefix_map_free(kh_pkt_cache_prefix_t *prefix_to_suffixes) {
*/
kh_pkt_cache_suffix_t *_get_suffixes(kh_pkt_cache_prefix_t *prefix_to_suffixes,
const hicn_name_prefix_t *prefix,
- bool create) {
+ bool create, slab_t *prefix_keys) {
khiter_t k = kh_get_pkt_cache_prefix(prefix_to_suffixes, prefix);
/* Return suffixes if found... */
@@ -114,8 +110,8 @@ kh_pkt_cache_suffix_t *_get_suffixes(kh_pkt_cache_prefix_t *prefix_to_suffixes,
*/
kh_pkt_cache_suffix_t *suffixes = kh_init_pkt_cache_suffix();
- hicn_name_prefix_t *prefix_copy = malloc(sizeof(hicn_name_prefix_t));
- *prefix_copy = *prefix;
+ hicn_name_prefix_t *prefix_copy = slab_get(hicn_name_prefix_t, prefix_keys);
+ memcpy(prefix_copy, prefix, sizeof(hicn_name_prefix_t));
int rc;
k = kh_put_pkt_cache_prefix(prefix_to_suffixes, prefix_copy, &rc);
@@ -129,8 +125,9 @@ kh_pkt_cache_suffix_t *_get_suffixes(kh_pkt_cache_prefix_t *prefix_to_suffixes,
*/
void _remove_suffix(kh_pkt_cache_prefix_t *prefixes,
const hicn_name_prefix_t *prefix,
- const hicn_name_suffix_t suffix) {
- kh_pkt_cache_suffix_t *suffixes = _get_suffixes(prefixes, prefix, false);
+ const hicn_name_suffix_t suffix, slab_t *prefix_keys) {
+ kh_pkt_cache_suffix_t *suffixes =
+ _get_suffixes(prefixes, prefix, false, prefix_keys);
assert(suffixes != NULL);
khiter_t k = kh_get_pkt_cache_suffix(suffixes, suffix);
@@ -159,8 +156,10 @@ void __add_suffix(kh_pkt_cache_suffix_t *suffixes, hicn_name_suffix_t suffix,
*/
void _add_suffix(kh_pkt_cache_prefix_t *prefixes,
const hicn_name_prefix_t *prefix,
- const hicn_name_suffix_t suffix, unsigned val) {
- kh_pkt_cache_suffix_t *suffixes = _get_suffixes(prefixes, prefix, true);
+ const hicn_name_suffix_t suffix, unsigned val,
+ slab_t *prefix_keys) {
+ kh_pkt_cache_suffix_t *suffixes =
+ _get_suffixes(prefixes, prefix, true, prefix_keys);
assert(suffixes != NULL);
__add_suffix(suffixes, suffix, val);
@@ -184,9 +183,10 @@ unsigned __get_suffix(kh_pkt_cache_suffix_t *suffixes,
unsigned _get_suffix(kh_pkt_cache_prefix_t *prefixes,
const hicn_name_prefix_t *prefix,
- hicn_name_suffix_t suffix) {
+ hicn_name_suffix_t suffix, slab_t *prefix_keys) {
/* create is false as this function is always called by lookup */
- kh_pkt_cache_suffix_t *suffixes = _get_suffixes(prefixes, prefix, false);
+ kh_pkt_cache_suffix_t *suffixes =
+ _get_suffixes(prefixes, prefix, false, prefix_keys);
if (!suffixes) {
return HICN_INVALID_SUFFIX;
}
@@ -197,11 +197,11 @@ unsigned _get_suffix(kh_pkt_cache_prefix_t *prefixes,
* Lookup in both the first and second levels of the packet cache (helper)
*/
unsigned _get_suffix_from_name(kh_pkt_cache_prefix_t *prefixes,
- const hicn_name_t *name) {
+ const hicn_name_t *name, slab_t *prefix_keys) {
const hicn_name_prefix_t *prefix = hicn_name_get_prefix(name);
const hicn_name_suffix_t suffix = hicn_name_get_suffix(name);
- return _get_suffix(prefixes, prefix, suffix);
+ return _get_suffix(prefixes, prefix, suffix, prefix_keys);
}
void pkt_cache_save_suffixes_for_prefix(pkt_cache_t *pkt_cache,
@@ -216,8 +216,9 @@ void pkt_cache_save_suffixes_for_prefix(pkt_cache_t *pkt_cache,
// Update cached prefix information
pkt_cache->cached_prefix = *prefix;
pkt_cache->cached_suffixes =
- _get_suffixes(pkt_cache->prefix_to_suffixes, prefix, true); // XXX
- //
+ _get_suffixes(pkt_cache->prefix_to_suffixes, prefix, true,
+ pkt_cache->prefix_keys); // XXX
+ //
}
void pkt_cache_reset_suffixes_for_prefix(pkt_cache_t *pkt_cache) {
@@ -237,6 +238,7 @@ pkt_cache_t *pkt_cache_create(size_t cs_size) {
if (!pkt_cache->cs) return NULL;
pkt_cache->prefix_to_suffixes = kh_init_pkt_cache_prefix();
+ pkt_cache->prefix_keys = slab_create(hicn_name_prefix_t, SLAB_INIT_SIZE);
pool_init(pkt_cache->entries, DEFAULT_PKT_CACHE_SIZE, 0);
pkt_cache->cached_prefix = HICN_NAME_PREFIX_EMPTY;
@@ -250,6 +252,7 @@ void pkt_cache_free(pkt_cache_t *pkt_cache) {
// Free prefix hash table and pool
_prefix_map_free(pkt_cache->prefix_to_suffixes);
+ slab_free(pkt_cache->prefix_keys);
pool_free(pkt_cache->entries);
// Free PIT and CS
@@ -261,8 +264,10 @@ void pkt_cache_free(pkt_cache_t *pkt_cache) {
kh_pkt_cache_suffix_t *pkt_cache_get_suffixes(const pkt_cache_t *pkt_cache,
const hicn_name_prefix_t *prefix,
- bool create) {
- return _get_suffixes(pkt_cache->prefix_to_suffixes, prefix, create);
+ bool create,
+ slab_t *prefix_keys) {
+ return _get_suffixes(pkt_cache->prefix_to_suffixes, prefix, create,
+ prefix_keys);
}
pkt_cache_entry_t *pkt_cache_allocate(pkt_cache_t *pkt_cache) {
@@ -286,7 +291,8 @@ void pkt_cache_add_to_index(const pkt_cache_t *pkt_cache,
(unsigned int)id);
} else {
_add_suffix(pkt_cache->prefix_to_suffixes, hicn_name_get_prefix(name),
- hicn_name_get_suffix(name), (unsigned int)id);
+ hicn_name_get_suffix(name), (unsigned int)id,
+ pkt_cache->prefix_keys);
}
}
@@ -296,7 +302,7 @@ void pkt_cache_add_to_index(const pkt_cache_t *pkt_cache,
void pkt_cache_remove_from_index(const pkt_cache_t *pkt_cache,
const hicn_name_t *name) {
_remove_suffix(pkt_cache->prefix_to_suffixes, hicn_name_get_prefix(name),
- hicn_name_get_suffix(name));
+ hicn_name_get_suffix(name), pkt_cache->prefix_keys);
// TODO
#if 0
@@ -321,7 +327,8 @@ pkt_cache_entry_t *pkt_cache_lookup(pkt_cache_t *pkt_cache,
index =
__get_suffix(pkt_cache->cached_suffixes, hicn_name_get_suffix(name));
} else {
- index = _get_suffix_from_name(pkt_cache->prefix_to_suffixes, name);
+ index = _get_suffix_from_name(pkt_cache->prefix_to_suffixes, name,
+ pkt_cache->prefix_keys);
}
if (index == HICN_INVALID_SUFFIX) {
@@ -364,7 +371,7 @@ void pkt_cache_cs_remove_entry(pkt_cache_t *pkt_cache, pkt_cache_entry_t *entry,
// XXX const hicn_name_t *name = msgbuf_get_name(msgbuf);
_remove_suffix(pkt_cache->prefix_to_suffixes,
hicn_name_get_prefix(&entry->name),
- hicn_name_get_suffix(&entry->name));
+ hicn_name_get_suffix(&entry->name), pkt_cache->prefix_keys);
// Do not update the LRU cache for evicted entries
if (!is_evicted) cs_vft[pkt_cache->cs->type]->remove_entry(pkt_cache, entry);
@@ -391,7 +398,7 @@ void pkt_cache_pit_remove_entry(pkt_cache_t *pkt_cache,
const hicn_name_t *name = &entry->name;
_remove_suffix(pkt_cache->prefix_to_suffixes, hicn_name_get_prefix(name),
- hicn_name_get_suffix(name));
+ hicn_name_get_suffix(name), pkt_cache->prefix_keys);
pool_put(pkt_cache->entries, entry);
diff --git a/hicn-light/src/hicn/core/packet_cache.h b/hicn-light/src/hicn/core/packet_cache.h
index dcbc20c7d..1abdc57c2 100644
--- a/hicn-light/src/hicn/core/packet_cache.h
+++ b/hicn-light/src/hicn/core/packet_cache.h
@@ -41,6 +41,7 @@
#define HICNLIGHT_PACKET_CACHE_H
#include <hicn/util/khash.h>
+#include <hicn/util/slab.h>
#include "content_store.h"
#include "pit.h"
#include "msgbuf_pool.h"
@@ -112,6 +113,7 @@ typedef struct {
cs_t *cs;
pkt_cache_entry_t *entries;
kh_pkt_cache_prefix_t *prefix_to_suffixes;
+ slab_t *prefix_keys;
// Cached prefix info to avoid double lookups,
// used for both single interest speculation and interest manifest
@@ -455,19 +457,19 @@ unsigned __get_suffix(kh_pkt_cache_suffix_t *suffixes,
hicn_name_suffix_t suffix);
unsigned _get_suffix(kh_pkt_cache_prefix_t *prefixes,
const hicn_name_prefix_t *prefix,
- hicn_name_suffix_t suffix);
+ hicn_name_suffix_t suffix, slab_t *prefix_keys);
void __add_suffix(kh_pkt_cache_suffix_t *suffixes, hicn_name_suffix_t suffix,
unsigned val);
void _add_suffix(kh_pkt_cache_prefix_t *prefixes,
- const hicn_name_prefix_t *prefix, hicn_name_suffix_t suffix,
- unsigned val);
+ const hicn_name_prefix_t *prefix,
+ const hicn_name_suffix_t suffix, unsigned val, slab_t *slab);
void _remove_suffix(kh_pkt_cache_prefix_t *prefixes,
- const hicn_name_prefix_t *prefix,
- hicn_name_suffix_t suffix);
+ const hicn_name_prefix_t *prefix, hicn_name_suffix_t suffix,
+ slab_t *slab);
void _prefix_map_free(kh_pkt_cache_prefix_t *prefix_to_suffixes);
kh_pkt_cache_suffix_t *_get_suffixes(kh_pkt_cache_prefix_t *prefix_to_suffixes,
const hicn_name_prefix_t *prefix,
- bool create);
+ bool create, slab_t *prefix_keys);
#endif
/************** Content Store *****************************/
diff --git a/hicn-light/src/hicn/test/test-configuration.cc b/hicn-light/src/hicn/test/test-configuration.cc
index b631bb20b..2d3b5329f 100644
--- a/hicn-light/src/hicn/test/test-configuration.cc
+++ b/hicn-light/src/hicn/test/test-configuration.cc
@@ -69,6 +69,7 @@ TEST_F(ConfigurationTest, SetLogParameters) {
EXPECT_EQ(log_file, LOG_FILE);
int write_fd = configuration_get_logfile_fd(config);
EXPECT_NE(write_fd, -1);
+ configuration_flush_log();
}
TEST_F(ConfigurationTest, SetStrategyParameter) {
diff --git a/hicn-light/src/hicn/test/test-connection_table.cc b/hicn-light/src/hicn/test/test-connection_table.cc
index 171921b53..6723d0ff1 100644
--- a/hicn-light/src/hicn/test/test-connection_table.cc
+++ b/hicn-light/src/hicn/test/test-connection_table.cc
@@ -28,14 +28,18 @@ extern "C" {
#define WITH_TESTS
#include <hicn/core/connection_table.h>
#include <hicn/util/log.h>
+#include <hicn/validation.h>
}
-#define CONNECTION_NAME "connection_name_test"
-#define CONNECTION_NAME_2 "connection_name_test_2"
+#define CONNECTION_NAME "conn_name"
+#define CONNECTION_NAME_2 "conn_name_2"
class ConnectionTableTest : public ::testing::Test {
protected:
ConnectionTableTest() {
+ assert(is_symbolic_name(CONNECTION_NAME, SYMBOLIC_NAME_LEN));
+ assert(is_symbolic_name(CONNECTION_NAME_2, SYMBOLIC_NAME_LEN));
+
log_conf.log_level = LOG_WARN;
conn_table_ = connection_table_create();
diff --git a/hicn-light/src/hicn/test/test-listener_table.cc b/hicn-light/src/hicn/test/test-listener_table.cc
index f4af02ee1..6bd2a6ab7 100644
--- a/hicn-light/src/hicn/test/test-listener_table.cc
+++ b/hicn-light/src/hicn/test/test-listener_table.cc
@@ -28,14 +28,18 @@ extern "C" {
#define WITH_TESTS
#include <hicn/core/listener_table.h>
#include <hicn/util/log.h>
+#include <hicn/validation.h>
}
-#define LISTENER_NAME "listener_name_test"
-#define LISTENER_NAME_2 "listener_name_test_2"
+#define LISTENER_NAME "listener_name"
+#define LISTENER_NAME_2 "listener_name_2"
class ListenerTableTest : public ::testing::Test {
protected:
ListenerTableTest() {
+ assert(is_symbolic_name(LISTENER_NAME, SYMBOLIC_NAME_LEN));
+ assert(is_symbolic_name(LISTENER_NAME_2, SYMBOLIC_NAME_LEN));
+
log_conf.log_level = LOG_INFO;
listener_table_ = listener_table_create();
diff --git a/hicn-light/src/hicn/test/test-packet_cache.cc b/hicn-light/src/hicn/test/test-packet_cache.cc
index 76fdb4516..37f4fe985 100644
--- a/hicn-light/src/hicn/test/test-packet_cache.cc
+++ b/hicn-light/src/hicn/test/test-packet_cache.cc
@@ -96,25 +96,26 @@ class PacketCacheTest : public ::testing::Test {
TEST_F(PacketCacheTest, LowLevelOperations) {
kh_pkt_cache_prefix_t *prefix_to_suffixes = kh_init_pkt_cache_prefix();
const hicn_name_prefix_t *prefix = hicn_name_get_prefix(&name);
- _add_suffix(prefix_to_suffixes, prefix, 1, 11);
- _add_suffix(prefix_to_suffixes, prefix, 2, 22);
+ _add_suffix(prefix_to_suffixes, prefix, 1, 11, pkt_cache->prefix_keys);
+ _add_suffix(prefix_to_suffixes, prefix, 2, 22, pkt_cache->prefix_keys);
- unsigned id = _get_suffix(prefix_to_suffixes, prefix, 1);
+ unsigned id =
+ _get_suffix(prefix_to_suffixes, prefix, 1, pkt_cache->prefix_keys);
EXPECT_EQ(id, 11UL);
- id = _get_suffix(prefix_to_suffixes, prefix, 2);
+ id = _get_suffix(prefix_to_suffixes, prefix, 2, pkt_cache->prefix_keys);
EXPECT_EQ(id, 22UL);
- id = _get_suffix(prefix_to_suffixes, prefix, 5);
+ id = _get_suffix(prefix_to_suffixes, prefix, 5, pkt_cache->prefix_keys);
EXPECT_EQ(id, HICN_INVALID_SUFFIX);
- _add_suffix(prefix_to_suffixes, prefix, 5, 55);
- id = _get_suffix(prefix_to_suffixes, prefix, 5);
+ _add_suffix(prefix_to_suffixes, prefix, 5, 55, pkt_cache->prefix_keys);
+ id = _get_suffix(prefix_to_suffixes, prefix, 5, pkt_cache->prefix_keys);
EXPECT_EQ(id, 55UL);
- _remove_suffix(prefix_to_suffixes, prefix, 2);
- _add_suffix(prefix_to_suffixes, prefix, 2, 222);
- id = _get_suffix(prefix_to_suffixes, prefix, 2);
+ _remove_suffix(prefix_to_suffixes, prefix, 2, pkt_cache->prefix_keys);
+ _add_suffix(prefix_to_suffixes, prefix, 2, 222, pkt_cache->prefix_keys);
+ id = _get_suffix(prefix_to_suffixes, prefix, 2, pkt_cache->prefix_keys);
EXPECT_EQ(id, 222UL);
_prefix_map_free(prefix_to_suffixes);
@@ -585,13 +586,15 @@ TEST_F(PacketCacheTest, PerformanceDoubleLookup) {
for (int seq = 0; seq < N_OPS; seq++) {
hicn_name_set_suffix(&tmp, seq);
_add_suffix(prefix_to_suffixes, hicn_name_get_prefix(&tmp),
- hicn_name_get_suffix(&tmp), hicn_name_get_suffix(&tmp));
+ hicn_name_get_suffix(&tmp), hicn_name_get_suffix(&tmp),
+ pkt_cache->prefix_keys);
}
// Read from hash table
for (int seq = 0; seq < N_OPS; seq++) {
hicn_name_set_suffix(&tmp, seq);
- _get_suffix(prefix_to_suffixes, hicn_name_get_prefix(&tmp), seq);
+ _get_suffix(prefix_to_suffixes, hicn_name_get_prefix(&tmp), seq,
+ pkt_cache->prefix_keys);
}
_prefix_map_free(prefix_to_suffixes);
@@ -605,7 +608,8 @@ TEST_F(PacketCacheTest, PerformanceCachedLookup) {
auto elapsed_time_single = get_execution_time([&]() {
kh_pkt_cache_prefix_t *prefix_to_suffixes = kh_init_pkt_cache_prefix();
kh_pkt_cache_suffix_t *suffixes =
- _get_suffixes(prefix_to_suffixes, hicn_name_get_prefix(&tmp), true);
+ _get_suffixes(prefix_to_suffixes, hicn_name_get_prefix(&tmp), true,
+ pkt_cache->prefix_keys);
// Add to hash table
for (int seq = 0; seq < N_OPS; seq++) {
@@ -638,7 +642,8 @@ TEST_F(PacketCacheTest, PerformanceCachedLookupRandom) {
auto elapsed_time_single_rand = get_execution_time([&]() {
kh_pkt_cache_prefix_t *prefix_to_suffixes = kh_init_pkt_cache_prefix();
kh_pkt_cache_suffix_t *suffixes =
- _get_suffixes(prefix_to_suffixes, hicn_name_get_prefix(&tmp), true);
+ _get_suffixes(prefix_to_suffixes, hicn_name_get_prefix(&tmp), true,
+ pkt_cache->prefix_keys);
// Add to hash table
for (int seq = 0; seq < N_OPS; seq++) {