diff options
author | Mauro Sardara <msardara@cisco.com> | 2022-07-08 16:10:13 +0000 |
---|---|---|
committer | Mauro Sardara <msardara@cisco.com> | 2022-08-10 11:57:10 +0200 |
commit | 8f0a8bf572b9b8123121338a31462440bad65857 (patch) | |
tree | ecac67f0ad005b2eb0a1bd25c8f242497ffddea1 /lib/includes | |
parent | 8d27045832427a0ea345f48bfb2c42f46a357af1 (diff) |
feat: add interest manifest serialization/deserialization
Also:
add helpers for interest manifest
Ref: HICN-738
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Change-Id: Ia531605148e00ccbe446da0f4f2d8caae2b098be
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Diffstat (limited to 'lib/includes')
-rw-r--r-- | lib/includes/hicn/common.h | 58 | ||||
-rw-r--r-- | lib/includes/hicn/interest_manifest.h | 91 | ||||
-rw-r--r-- | lib/includes/hicn/util/bitmap.h | 48 | ||||
-rw-r--r-- | lib/includes/hicn/util/types.h | 8 |
4 files changed, 160 insertions, 45 deletions
diff --git a/lib/includes/hicn/common.h b/lib/includes/hicn/common.h index a84124617..64aca8f1f 100644 --- a/lib/includes/hicn/common.h +++ b/lib/includes/hicn/common.h @@ -235,34 +235,54 @@ typedef struct } ip_version_t; #define HICN_IP_VERSION(packet) ((ip_version_t *) packet)->version -#ifndef ntohll -static inline uint64_t -ntohll (uint64_t input) -{ - uint64_t return_val = input; +/* + * Endianess utils + */ + #if (__BYTE_ORDER__) == (__ORDER_LITTLE_ENDIAN__) - uint8_t *tmp = (uint8_t *) &return_val; - - tmp[0] = (uint8_t) (input >> 56); - tmp[1] = (uint8_t) (input >> 48); - tmp[2] = (uint8_t) (input >> 40); - tmp[3] = (uint8_t) (input >> 32); - tmp[4] = (uint8_t) (input >> 24); - tmp[5] = (uint8_t) (input >> 16); - tmp[6] = (uint8_t) (input >> 8); - tmp[7] = (uint8_t) (input >> 0); +#define HICN_LITTLE_ENDIAN_ARCH +#else +#define HICN_BIG_ENDIAN_ARCH +#endif + +static inline u16 +hicn_conditional_swap_u16 (u16 value) +{ +#ifdef HICN_LITTLE_ENDIAN_ARCH + value = __builtin_bswap16 (value); #endif - return return_val; + return value; } -static inline uint64_t -htonll (uint64_t input) +static inline u32 +hicn_conditional_swap_u32 (u32 value) { - return (ntohll (input)); +#ifdef HICN_LITTLE_ENDIAN_ARCH + value = __builtin_bswap32 (value); +#endif + + return value; } + +static inline u64 +hicn_conditional_swap_u64 (u64 value) +{ +#ifdef HICN_LITTLE_ENDIAN_ARCH + value = __builtin_bswap64 (value); #endif + return value; +} + +#define hicn_net_to_host_16(x) hicn_conditional_swap_u16 ((u16) (x)) +#define hicn_net_to_host_32(x) hicn_conditional_swap_u32 ((u32) (x)) +#define hicn_net_to_host_64(x) hicn_conditional_swap_u64 ((u64) (x)) + +#define hicn_host_to_net_16(x) hicn_conditional_swap_u16 ((u16) (x)) +#define hicn_host_to_net_32(x) hicn_conditional_swap_u32 ((u32) (x)) +#define hicn_host_to_net_64(x) hicn_conditional_swap_u64 ((u64) (x)) + #define hicn_round_pow2(x, pow2) (((x) + (pow2) -1) & ~((pow2) -1)) #define _SIZEOF_ALIGNED(x, size) hicn_round_pow2 (sizeof (x), size) diff --git a/lib/includes/hicn/interest_manifest.h b/lib/includes/hicn/interest_manifest.h index 03f54d6d5..2b4cd57a2 100644 --- a/lib/includes/hicn/interest_manifest.h +++ b/lib/includes/hicn/interest_manifest.h @@ -21,6 +21,8 @@ #include <hicn/util/bitmap.h> #include <hicn/base.h> +#include <hicn/name.h> +#include <hicn/common.h> typedef enum { @@ -52,7 +54,56 @@ typedef struct } interest_manifest_header_t; static_assert (sizeof (interest_manifest_header_t) == 32 + 4 + 4, - "interest_manifest_header_t size must be 40 bytes"); + "interest_manifest_header_t size must be exactly 40 bytes"); + +#define _interest_manifest_serialize_deserialize(manifest, first, second, \ + size, serialize) \ + do \ + { \ + u32 n_suffixes = 0; \ + if (serialize) \ + n_suffixes = int_manifest_header->n_suffixes; \ + \ + int_manifest_header->n_suffixes = \ + hicn_##first##_to_##second##_32 (int_manifest_header->n_suffixes); \ + int_manifest_header->padding = \ + hicn_##first##_to_##second##_32 (int_manifest_header->padding); \ + \ + for (unsigned i = 0; i < BITMAP_SIZE; i++) \ + { \ + int_manifest_header->request_bitmap[i] = \ + hicn_##first##_to_##second##_##size ( \ + int_manifest_header->request_bitmap[i]); \ + } \ + \ + hicn_name_suffix_t *suffix = \ + (hicn_name_suffix_t *) (int_manifest_header + 1); \ + if (!serialize) \ + n_suffixes = int_manifest_header->n_suffixes; \ + for (unsigned i = 0; i < n_suffixes; i++) \ + { \ + *(suffix + i) = hicn_##first##_to_##second##_32 (*(suffix + i)); \ + } \ + } \ + while (0) + +#define _interest_manifest_serialize(manifest, size) \ + _interest_manifest_serialize_deserialize (manifest, host, net, size, 1) + +#define _interest_manifest_deserialize(manifest, size) \ + _interest_manifest_serialize_deserialize (manifest, net, host, size, 0) + +static inline void +interest_manifest_serialize (interest_manifest_header_t *int_manifest_header) +{ + _interest_manifest_serialize (int_manifest_header, hicn_uword_bits); +} + +static inline void +interest_manifest_deserialize (interest_manifest_header_t *int_manifest_header) +{ + _interest_manifest_deserialize (int_manifest_header, hicn_uword_bits); +} static inline bool interest_manifest_is_valid (interest_manifest_header_t *int_manifest_header, @@ -80,6 +131,33 @@ interest_manifest_is_valid (interest_manifest_header_t *int_manifest_header, return true; } +static inline void +interest_manifest_init (interest_manifest_header_t *int_manifest_header) +{ + int_manifest_header->n_suffixes = 0; + int_manifest_header->padding = 0; + memset (int_manifest_header->request_bitmap, 0, + sizeof (int_manifest_header->request_bitmap)); +} + +static inline void +interest_manifest_add_suffix (interest_manifest_header_t *int_manifest_header, + hicn_name_suffix_t suffix) +{ + hicn_name_suffix_t *start = (hicn_name_suffix_t *) (int_manifest_header + 1); + *(start + int_manifest_header->n_suffixes) = suffix; + hicn_uword *request_bitmap = int_manifest_header->request_bitmap; + bitmap_set_no_check (request_bitmap, int_manifest_header->n_suffixes); + int_manifest_header->n_suffixes++; +} + +static inline void +interest_manifest_del_suffix (interest_manifest_header_t *int_manifest_header, + hicn_uword pos) +{ + bitmap_unset_no_check (int_manifest_header->request_bitmap, pos); +} + static inline size_t interest_manifest_update_bitmap (const hicn_uword *initial_bitmap, hicn_uword *bitmap_to_update, size_t start, @@ -102,4 +180,15 @@ interest_manifest_update_bitmap (const hicn_uword *initial_bitmap, return i; } +#define _FIRST(h) (hicn_name_suffix_t *) (h + 1) + +#define interest_manifest_foreach_suffix(header, suffix) \ + for (suffix = _FIRST (header) + bitmap_first_set_no_check ( \ + header->request_bitmap, BITMAP_SIZE); \ + suffix - _FIRST (header) < header->n_suffixes; \ + suffix = _FIRST (header) + \ + bitmap_next_set_no_check (header->request_bitmap, \ + suffix - _FIRST (header) + 1, \ + BITMAP_SIZE)) + #endif /* HICNLIGHT_INTEREST_MANIFEST_H */ diff --git a/lib/includes/hicn/util/bitmap.h b/lib/includes/hicn/util/bitmap.h index 15d47ac61..68541bc28 100644 --- a/lib/includes/hicn/util/bitmap.h +++ b/lib/includes/hicn/util/bitmap.h @@ -127,40 +127,46 @@ _bitmap_get_no_check (const bitmap_t *bitmap, off_t i) #define bitmap_is_unset_no_check(bitmap, i) \ (_bitmap_get_no_check ((bitmap), (i)) == 0) +static inline int +_bitmap_set_no_check (bitmap_t *bitmap, off_t i) +{ + size_t offset = i / BITMAP_WIDTH (bitmap); + size_t pos = i % BITMAP_WIDTH (bitmap); + bitmap[offset] |= (bitmap_t) 1 << pos; + return 0; +} + +static inline int +_bitmap_set (bitmap_t **bitmap_ptr, off_t i) +{ + if (bitmap_ensure_pos (bitmap_ptr, i) < 0) + return -1; + + bitmap_t *bitmap = *bitmap_ptr; + return _bitmap_set_no_check (bitmap, i); +} + /* - * @brief Returns whether the i-th bit is unset (equal to 0) in a bitmap. + * @brief Set i-th bit to 1 in a bitmap. Reallocate the vector if the bit + * position is greater than the vector length. * * @param[in] bitmap The bitmap to access. * @param[in] i The bit position. * * @return bool */ -#define bitmap_set(bitmap, i) _bitmap_set ((bitmap_t **) &bitmap, i, 1) -#define bitmap_set_no_check(bitmap, i) \ - _bitmap_set ((bitmap_t **) &bitmap, i, 0) +#define bitmap_set(bitmap, i) _bitmap_set ((bitmap_t **) &bitmap, i) /* - * @brief Returns whether the i-th bit is unset (equal to 0) in a bitmap - * (helper). + * @brief Set i-th bit to 1 in a bitmap. Unsafe version, does not check + * boundaries. * * @param[in] bitmap The bitmap to access. * @param[in] i The bit position. * * @return bool */ -static inline int -_bitmap_set (bitmap_t **bitmap_ptr, off_t i, int check) -{ - if (check && bitmap_ensure_pos (bitmap_ptr, i) < 0) - return -1; - - bitmap_t *bitmap = *bitmap_ptr; - size_t offset = i / BITMAP_WIDTH (bitmap); - size_t pos = i % BITMAP_WIDTH (bitmap); - - bitmap[offset] |= (bitmap_t) 1 << pos; - return 0; -} +#define bitmap_set_no_check(bitmap, i) _bitmap_set_no_check (bitmap, i) #define bitmap_unset(bitmap, i) _bitmap_unset (bitmap, i, 1) #define bitmap_unset_no_check(bitmap, i) _bitmap_unset (bitmap, i, 0) @@ -306,11 +312,11 @@ bitmap_next_unset (const bitmap_t *bitmap, hicn_uword i) #define bitmap_first_set(bitmap) bitmap_next_set (bitmap, 0) #define bitmap_first_set_no_check(bitmap, size) \ - bitmap_next_set_no_checks (bitmap, 0, size) + bitmap_next_set_no_check (bitmap, 0, size) #define bitmap_first_unset(bitmap) bitmap_next_unset (bitmap, 0) #define bitmap_first_unset_no_check(bitmap, size) \ - bitmap_next_unset_no_checks (bitmap, 0, size) + bitmap_next_unset_no_check (bitmap, 0, size) static inline void bitmap_print (const bitmap_t *bitmap, size_t n_words) diff --git a/lib/includes/hicn/util/types.h b/lib/includes/hicn/util/types.h index c9cc878cf..a883b8220 100644 --- a/lib/includes/hicn/util/types.h +++ b/lib/includes/hicn/util/types.h @@ -44,21 +44,21 @@ typedef float f32; #error "Impossible to detect architecture" #endif -#define hicn_uword_bits (1 << hicn_log2_uword_bits) +#define _hicn_uword_bits (1 << hicn_log2_uword_bits) /* Word types. */ -#if hicn_uword_bits == 64 +#if _hicn_uword_bits == 64 /* 64 bit word machines. */ typedef u64 hicn_uword; +#define hicn_uword_bits 64 #else /* 32 bit word machines. */ typedef u32 hicn_uword; +#define hicn_uword_bits 32 #endif typedef hicn_uword hicn_ip_csum_t; -#define hicn_uword_bits (1 << hicn_log2_uword_bits) - /* Helper for avoiding warnings about type-punning */ #define UNION_CAST(x, destType) \ (((union { \ |