summaryrefslogtreecommitdiffstats
path: root/hicn-light/src
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src')
-rw-r--r--hicn-light/src/hicn/core/forwarder.c72
1 files changed, 36 insertions, 36 deletions
diff --git a/hicn-light/src/hicn/core/forwarder.c b/hicn-light/src/hicn/core/forwarder.c
index 14f1649fa..4fe1b6c63 100644
--- a/hicn-light/src/hicn/core/forwarder.c
+++ b/hicn-light/src/hicn/core/forwarder.c
@@ -776,10 +776,10 @@ static void _forwarder_update_interest_stats(forwarder_t *forwarder,
/**
* Return the interest manifest from the interest payload
*/
-static interest_manifest_header_t *_forwarder_get_interest_manifest(
- msgbuf_t *msgbuf) {
+static int _forwarder_get_interest_manifest(
+ msgbuf_t *msgbuf, interest_manifest_header_t **int_manifest_header,
+ size_t *payload_size) {
uint8_t *payload;
- size_t payload_size;
hicn_packet_buffer_t *pkbuf = msgbuf_get_pkbuf(msgbuf);
@@ -787,21 +787,14 @@ static interest_manifest_header_t *_forwarder_get_interest_manifest(
HICN_UNUSED(int rc) = hicn_packet_get_payload_type(pkbuf, &payload_type);
assert(rc == HICN_LIB_ERROR_NONE);
- if (payload_type != HPT_MANIFEST) return NULL;
+ if (payload_type != HPT_MANIFEST) return -1;
- rc = hicn_packet_get_payload(pkbuf, &payload, &payload_size, false);
+ rc = hicn_packet_get_payload(pkbuf, &payload, payload_size, false);
assert(rc == HICN_LIB_ERROR_NONE);
- interest_manifest_header_t *int_manifest_header =
- (interest_manifest_header_t *)payload;
-
- // Deserialize intrest mmanifest
- interest_manifest_deserialize(int_manifest_header);
+ *int_manifest_header = (interest_manifest_header_t *)payload;
- if (!interest_manifest_is_valid(int_manifest_header, payload_size))
- return NULL;
-
- return int_manifest_header;
+ return 0;
}
// Manifest is split using splitting strategy, then every
@@ -850,6 +843,9 @@ 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;
+ size_t payload_size;
+ int ret;
while (suffix_index < total_suffixes) {
// If more than one sub-manifest,
// clone original interest manifest and update suffix
@@ -872,9 +868,10 @@ int _forwarder_forward_aggregated_interest(
size_t first_suffix_index_in_next_submanifest = suffix_index;
// Update manifest bitmap in current msgbuf
- interest_manifest_header_t *manifest =
- _forwarder_get_interest_manifest(msgbuf);
- assert(manifest != NULL);
+
+ ret =
+ _forwarder_get_interest_manifest(msgbuf, &manifest, &payload_size);
+ assert(ret == 0);
memcpy(manifest->request_bitmap, curr_bitmap,
BITMAP_SIZE * sizeof(hicn_uword));
WITH_TRACE({
@@ -974,24 +971,25 @@ static ssize_t forwarder_process_aggregated_interest(
// `_forwarder_forward_aggregated_interest()`
pkt_cache_entry_t *entries[BITMAP_SIZE * WORD_WIDTH];
- int pos = 0; // Position of current suffix in manifest
int n_suffixes_to_fwd = 0;
- u32 *suffix = (u32 *)(int_manifest_header + 1);
- u32 seq = hicn_name_get_suffix(msgbuf_get_name(msgbuf));
hicn_name_t name_copy = HICN_NAME_EMPTY;
hicn_name_copy(&name_copy, msgbuf_get_name(msgbuf));
- // The fist loop iteration handles the suffix in the header,
- // the following ones handle the suffiexes in the manifest
- while (true) {
- if (!bitmap_is_set_no_check(int_manifest_header->request_bitmap, pos))
- goto NEXT_SUFFIX;
+ // Suffixes in interest manifest also contains suffix in main name. We can
+ // then just iterate the interest manifest and update the suffix in the name
+ // struct
+ hicn_name_suffix_t *suffix;
+ int pos;
+ interest_manifest_foreach_suffix(int_manifest_header, suffix, pos) {
+ // Update name
+ hicn_name_set_suffix(&name_copy, *suffix);
// Update packet cache
pkt_cache_on_interest(forwarder->pkt_cache, msgbuf_pool, msgbuf_id,
&verdict, &data_msgbuf_id, &entry, &name_copy,
forwarder->serve_from_cs);
+
entries[pos] = entry;
_forwarder_update_interest_stats(forwarder, verdict, msgbuf,
entry->has_expire_ts, entry->expire_ts);
@@ -1014,14 +1012,6 @@ static ssize_t forwarder_process_aggregated_interest(
n_suffixes_to_fwd++;
}
- NEXT_SUFFIX:
- if (pos++ >= int_manifest_header->n_suffixes) break;
-
- // Use next segment in manifest
- seq = *suffix;
- suffix++;
- hicn_name_set_suffix(&name_copy, seq);
-
WITH_DEBUG({
char buf[MAXSZ_HICN_PREFIX];
int rc =
@@ -1063,9 +1053,19 @@ static ssize_t forwarder_process_interest(forwarder_t *forwarder,
assert(msgbuf_get_type(msgbuf) == HICN_PACKET_TYPE_INTEREST);
u32 n_suffixes = 0;
- interest_manifest_header_t *int_manifest_header =
- _forwarder_get_interest_manifest(msgbuf);
- if (int_manifest_header) n_suffixes = int_manifest_header->n_suffixes;
+ interest_manifest_header_t *int_manifest_header;
+ size_t payload_size;
+ int ret = _forwarder_get_interest_manifest(msgbuf, &int_manifest_header,
+ &payload_size);
+ if (ret == 0) {
+ // Deserialize intrest manifest
+ interest_manifest_deserialize(int_manifest_header);
+
+ if (!interest_manifest_is_valid(int_manifest_header, payload_size))
+ return -1;
+
+ n_suffixes = int_manifest_header->n_suffixes;
+ }
// Update stats
forwarder->stats.countInterestsReceived++;