From d75c88d2c066e7886cf0bc4ebeceee073588b750 Mon Sep 17 00:00:00 2001 From: Alberto Compagno Date: Thu, 11 Apr 2019 18:54:52 +0200 Subject: [HICN-176] Fixed bitmap size in pit entry and added static assert to avoid misconfiguration of parameters in param.h Change-Id: Ia64eaebe267f87bd5f93abf3e5a9e80bab735765 Signed-off-by: Alberto Compagno --- hicn-plugin/src/data_fwd_node.c | 4 +- hicn-plugin/src/data_pcslookup_node.c | 2 +- hicn-plugin/src/data_push_node.c | 13 ++- hicn-plugin/src/face_db.h | 16 ++-- hicn-plugin/src/faces/face.c | 2 +- hicn-plugin/src/params.h | 8 +- hicn-plugin/src/vface_db.h | 155 ---------------------------------- 7 files changed, 34 insertions(+), 166 deletions(-) delete mode 100644 hicn-plugin/src/vface_db.h diff --git a/hicn-plugin/src/data_fwd_node.c b/hicn-plugin/src/data_fwd_node.c index f7c8ae70b..efb98164d 100644 --- a/hicn-plugin/src/data_fwd_node.c +++ b/hicn-plugin/src/data_fwd_node.c @@ -168,7 +168,8 @@ hicn_data_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, * not changed from the lookup. */ - if (tnow > pitp->shared.expire_time) + if (tnow > pitp->shared.expire_time + || (hash_entry0->he_flags & HICN_HASH_ENTRY_FLAG_DELETED)) { dpo_id_t hicn_dpo_id0 = { dpo_vft0->hicn_dpo_get_type (), 0, 0, dpo_ctx_id0 }; @@ -503,6 +504,7 @@ hicn_satisfy_faces (vlib_main_t * vm, u32 bi0, *n_left_to_next -= 1; n_left_from -= 1; clones += 1; + next0 = face0->dpoi_next_node; vnet_buffer (h0)->ip.adj_index[VLIB_TX] = face0->dpoi_index; diff --git a/hicn-plugin/src/data_pcslookup_node.c b/hicn-plugin/src/data_pcslookup_node.c index 0a5793056..aeb8c2276 100644 --- a/hicn-plugin/src/data_pcslookup_node.c +++ b/hicn-plugin/src/data_pcslookup_node.c @@ -72,7 +72,7 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, u32 next0 = HICN_DATA_PCSLOOKUP_NEXT_ERROR_DROP; u64 name_hash = 0; hicn_name_t name; - hicn_header_t *hicn0; + hicn_header_t *hicn0 = NULL; u32 node_id0 = 0; u8 dpo_ctx_id0 = 0; int ret0; diff --git a/hicn-plugin/src/data_push_node.c b/hicn-plugin/src/data_push_node.c index b955a765d..8f9e137f7 100644 --- a/hicn-plugin/src/data_push_node.c +++ b/hicn-plugin/src/data_push_node.c @@ -54,7 +54,6 @@ typedef struct u32 next_index; u32 sw_if_index; u8 pkt_type; - u8 packet_data[40]; } hicn_data_push_trace_t; vlib_node_registration_t hicn_data_push_node; @@ -250,6 +249,17 @@ hicn_data_push_fn (vlib_main_t * vm, nameptr, namelen, isv6); stats.pkts_data_count++; } + + /* Maybe trace */ + if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) && + (b0->flags & VLIB_BUFFER_IS_TRACED))) + { + hicn_data_push_trace_t *t = + vlib_add_trace (vm, node, b0, sizeof (*t)); + t->pkt_type = HICN_PKT_TYPE_CONTENT; + t->sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_RX]; + t->next_index = HICN_DATA_PUSH_NEXT_ERROR_DROP; + } } to_forward -= n_to_forward; @@ -266,6 +276,7 @@ hicn_data_push_fn (vlib_main_t * vm, to_next++; n_left_to_next--; } + vlib_put_next_frame (vm, node, next_index, n_left_to_next); } diff --git a/hicn-plugin/src/face_db.h b/hicn-plugin/src/face_db.h index 5c95be334..c3308050a 100644 --- a/hicn-plugin/src/face_db.h +++ b/hicn-plugin/src/face_db.h @@ -30,18 +30,16 @@ /* Must be power of two */ #define HICN_FACE_DB_INLINE_FACES 4 -#define HICN_PIT_BITMAP_SIZE_BYTE (HICN_PARAM_FACES_MAX / 8) +#define HICN_PIT_BITMAP_SIZE_BYTE HICN_PARAM_FACES_MAX/8 #define HICN_PIT_N_HOP_BITMAP_SIZE HICN_PARAM_FACES_MAX #define HICN_PIT_N_HOP_BUCKET (HICN_PARAM_PIT_ENTRY_PHOPS_MAX - HICN_FACE_DB_INLINE_FACES) -typedef struct __attribute__ ((packed)) hicn_face_bucket_s +typedef struct hicn_face_bucket_s { /* Array of indexes of virtual faces */ dpo_id_t faces[HICN_PIT_N_HOP_BUCKET]; - CLIB_CACHE_LINE_ALIGN_MARK (cache_line1); - /* Used to check if interests are retransmission */ u8 bitmap[HICN_PIT_BITMAP_SIZE_BYTE]; @@ -116,7 +114,10 @@ hicn_face_db_add_face_dpo (dpo_id_t * dpo, hicn_face_db_t * face_db) dpo_lock (dpo); u32 bitmap_index = dpo->dpoi_index % HICN_PIT_N_HOP_BITMAP_SIZE; - faces_bkt->bitmap[bitmap_index] |= 0x01; + u32 position_array = bitmap_index / 8; + u8 bit_index = (u8) (bitmap_index - position_array * 8); + + faces_bkt->bitmap[position_array] |= (0x01 << bit_index); face_db->n_faces++; } @@ -127,7 +128,10 @@ hicn_face_search (dpo_id_t * dpo, hicn_face_db_t * face_db) pool_elt_at_index (hicn_face_bucket_pool, face_db->next_bucket); u32 bitmap_index = dpo->dpoi_index % HICN_PIT_N_HOP_BITMAP_SIZE; - return faces_bkt->bitmap[bitmap_index] & 0x01; + u32 position_array = bitmap_index / 8; + u8 bit_index = bitmap_index - position_array * 8; + + return (faces_bkt->bitmap[position_array] >> bit_index) & 0x01; } always_inline void diff --git a/hicn-plugin/src/faces/face.c b/hicn-plugin/src/faces/face.c index 3be42a77f..68d2ba01c 100644 --- a/hicn-plugin/src/faces/face.c +++ b/hicn-plugin/src/faces/face.c @@ -85,7 +85,7 @@ hicn_face_module_init (vlib_main_t * vm) hicn_iface_ip_init (vm); hicn_face_udp_init (vm); hicn_iface_udp_init (vm); - vec_alloc (counters, 40); + counters = vec_new (vlib_combined_counter_main_t, HICN_PARAM_FACES_MAX); } u8 * diff --git a/hicn-plugin/src/params.h b/hicn-plugin/src/params.h index f3af714ec..1ca9ba08b 100644 --- a/hicn-plugin/src/params.h +++ b/hicn-plugin/src/params.h @@ -16,6 +16,8 @@ #ifndef __HICN_PARAM_H__ #define __HICN_PARAM_H__ +#include + /* * Features */ @@ -50,9 +52,13 @@ STATIC_ASSERT ((HICN_PARAM_FACES_MAX & (HICN_PARAM_FACES_MAX - 1)) == 0, // aggregation limit(interest previous hops) // Supported up to 516. For more than 4 faces this param must -// satisfy the equation (HICN_PARAM_PIT_ENTRY_PHOPS_MAX - 4) % 2 = 0 +// HICN_PARAM_PIT_ENTRY_PHOPS_MAX - 4 must be a power of two #define HICN_PARAM_PIT_ENTRY_PHOPS_MAX 20 +STATIC_ASSERT ((ceil (log2 ((HICN_PARAM_PIT_ENTRY_PHOPS_MAX - 4)))) == + (floor (log2 ((HICN_PARAM_PIT_ENTRY_PHOPS_MAX - 4)))), + "HICN_PARAM_PIT_ENTRY_PHOPS_MAX - 4 must be a power of two"); + STATIC_ASSERT ((HICN_PARAM_PIT_ENTRY_PHOPS_MAX <= HICN_PARAM_FACES_MAX), "HICN_PARAM_PIT_ENTRY_PHOP_MAX must be <= than HICN_PARAM_FACES_MAX"); diff --git a/hicn-plugin/src/vface_db.h b/hicn-plugin/src/vface_db.h deleted file mode 100644 index b98a2f46d..000000000 --- a/hicn-plugin/src/vface_db.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2017-2019 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. - */ - -#ifndef __HICN_FACE_DB_H__ -#define __HICN_FACE_DB_H__ - -#include -#include "faces/face.h" - -/* Must be power of two*/ -#define HICN_FACE_DB_INLINE_FACES 4 - -#define HICN_PIT_N_HOP_BITMAP_SIZE HICN_PARAM_PIT_ENTRY_PHOPS_MAX - -#define HICN_PIT_N_HOP_BUCKET (HICN_PARAM_PIT_ENTRY_PHOPS_MAX - HICN_FACE_DB_INLINE_FACES) - -STATIC_ASSERT ((HICN_PIT_N_HOP_BUCKET & (HICN_PIT_N_HOP_BUCKET - 1)) == 0, - "HICN_PARAM_PIT_ENTRY_PHOP_MAX must be a power of 2 + 4"); - -/* Takes 2 cache lines */ -typedef struct __attribute__ ((packed)) hicn_face_bucket_s -{ - /* Array of indexes of virtual faces */ - dpo_id_t faces[HICN_PIT_N_HOP_BUCKET]; - - CLIB_CACHE_LINE_ALIGN_MARK (cache_line1); - - /* Used to check if interests are retransmission */ - /* How much are we gaining (performance)/wasting (memory) wrt the linear */ - /* search on the array of faces? */ - u8 bitmap[HICN_PIT_N_HOP_BITMAP_SIZE]; - -} hicn_face_bucket_t; - -extern hicn_face_bucket_t *hicn_face_bucket_pool; - -/* - * Virtual faces will be stored in a pool and when a virtual face is created and - * its index will be saved in the pit entry. In case of interest aggregation we - * have to look on all the virtual faces to understand if there is a duplicated - * interest - */ -typedef struct __attribute__ ((packed)) hicn_face_db_s -{ - /* 19B + 1B = 20B */ - /* Equal to one or zero */ - u8 is_overflow; - - /* Number of faces in the last bucket */ - /* Or next availabe entry for storing a dpo_id_t */ - /* 20B + 4B = 24B */ - u32 n_faces; - - /* 24B + 32B (8*4) = 56B */ - /* Array of indexes of virtual faces */ - dpo_id_t inline_faces[HICN_FACE_DB_INLINE_FACES]; - - /* 56B + 4B = 60B */ - u32 next_bucket; - - /* 60B + 4B = 64B */ - u32 align; //align back to 64 - -} hicn_face_db_t; - -//STATIC_ASSERT(HICN_PIT_N_HOP_BITMAP_SIZE <= (HICN_PARAM_PIT_ENTRY_PHOPS_MAX/8)); - -always_inline dpo_id_t * -hicn_face_db_get_dpo_face (u32 index, hicn_face_db_t * face_db) -{ - ASSERT (index < face_db->n_faces); - - return index < HICN_FACE_DB_INLINE_FACES ? &(face_db->inline_faces[index]) : - &(pool_elt_at_index (hicn_face_bucket_pool, face_db->next_bucket)->faces - [(index - HICN_FACE_DB_INLINE_FACES) & (HICN_PIT_N_HOP_BUCKET - 1)]); -} - -always_inline void -hicn_face_db_init (int max_element) -{ - pool_init_fixed (hicn_face_bucket_pool, max_element); -} - -always_inline hicn_face_bucket_t * -hicn_face_db_get_bucket (u32 bucket_index) -{ - return pool_elt_at_index (hicn_face_bucket_pool, bucket_index); -} - -always_inline void -hicn_face_db_add_face_dpo (dpo_id_t * dpo, hicn_face_db_t * face_db) -{ - ASSERT (dpo->dpoi_index != ~0); - - hicn_face_bucket_t *faces_bkt = - pool_elt_at_index (hicn_face_bucket_pool, face_db->next_bucket); - dpo_id_t *face = - face_db->n_faces < - HICN_FACE_DB_INLINE_FACES ? &(face_db->inline_faces[face_db->n_faces]) : - &(faces_bkt->faces - [(face_db->n_faces - - HICN_FACE_DB_INLINE_FACES) & (HICN_PIT_N_HOP_BUCKET - 1)]); - - clib_memcpy (face, dpo, sizeof (dpo_id_t)); - - /* This access the dpoi to increase the lock */ - dpo_lock (dpo); - - u32 bitmap_index = dpo->dpoi_index % HICN_PIT_N_HOP_BITMAP_SIZE; - faces_bkt->bitmap[bitmap_index] |= 0x01; - face_db->n_faces++; -} - -always_inline u8 -hicn_face_search (dpo_id_t * dpo, hicn_face_db_t * face_db) -{ - hicn_face_bucket_t *faces_bkt = - pool_elt_at_index (hicn_face_bucket_pool, face_db->next_bucket); - u32 bitmap_index = dpo->dpoi_index % HICN_PIT_N_HOP_BITMAP_SIZE; - - return faces_bkt->bitmap[bitmap_index] & 0x01; -} - -always_inline void -hicn_faces_flush (hicn_face_db_t * face_db) -{ - hicn_face_bucket_t *faces_bkt = - pool_elt_at_index (hicn_face_bucket_pool, face_db->next_bucket); - clib_memset_u64 (&(faces_bkt->bitmap), 0, HICN_PIT_N_HOP_BITMAP_SIZE / 8); - face_db->n_faces = 0; - pool_put_index (hicn_face_bucket_pool, face_db->next_bucket); -} - - -#endif // __HICN_FACE_DB_H__ - -/* - * fd.io coding-style-patch-verification: ON - * - * Local Variables: - * eval: (c-set-style "gnu") - * End: - */ -- cgit 1.2.3-korg