From c7f942175b8c25c77ddc21561b52e3e6b5620b80 Mon Sep 17 00:00:00 2001 From: Alberto Compagno Date: Sat, 19 Jan 2019 17:28:57 +0100 Subject: Improved performance on data-fwd node: - Removed full pit entry initialization in favor of a lighter initialization on few fields - Squeezed pit entry size in order to store only the number of incomplete faces (as set in HICN_PARAM_PIT_ENTRY_PHOPS_MAX). The bitmap size is now determined by HICN_PARAM_FACES_MAX and optimized to do a fast lookup Replaced the field is_appface with the field flags in the hicn_buffer_t: - is_appface is now a flag with value 0x01 (HICN_BUFFER_FLAGS_FACE_IS_APP) - Added flag HICN_BUFFER_FLAGS_PKT_LESS_TWO_CL (0x02) to handle the copy of pkt with length < than 2*CACHE_LINES (in this case cloning is prevented by the cloning function in vpp). Such flag is initialized by the incoming face of the pkt. Change-Id: Ia956fd5719a28ee29f7fa2fd23d283964743efd8 Signed-off-by: Alberto Compagno --- hicn-plugin/src/data_fwd.h | 5 ---- hicn-plugin/src/data_fwd_node.c | 36 ++++++++++++++++++------ hicn-plugin/src/data_pcslookup_node.c | 6 ++-- hicn-plugin/src/face_db.h | 11 +++----- hicn-plugin/src/faces/face.h | 23 ++++++++++++++++ hicn-plugin/src/faces/ip/dpo_ip.c | 13 ++++----- hicn-plugin/src/faces/ip/dpo_ip.h | 44 ++++++++++++++++++++---------- hicn-plugin/src/faces/ip/face_ip_node.c | 6 ++-- hicn-plugin/src/faces/ip/iface_ip_node.c | 8 +++--- hicn-plugin/src/faces/udp/dpo_udp.c | 8 +++--- hicn-plugin/src/faces/udp/dpo_udp.h | 30 ++++++++++---------- hicn-plugin/src/faces/udp/face_udp_node.c | 6 ++-- hicn-plugin/src/faces/udp/iface_udp_node.c | 6 ++-- hicn-plugin/src/hashtb.c | 8 ++++++ hicn-plugin/src/hashtb.h | 16 ++++------- hicn-plugin/src/hicn.h | 9 ++++-- hicn-plugin/src/interest_hitcs_node.c | 38 ++++++++++++-------------- hicn-plugin/src/params.h | 12 ++++++-- hicn-plugin/src/pcs.h | 6 ++-- hicn-plugin/src/strategies/strategy_mw.c | 1 + hicn-plugin/src/strategy.c | 11 +++++--- hicn-plugin/src/strategy.h | 1 + 22 files changed, 188 insertions(+), 116 deletions(-) (limited to 'hicn-plugin') diff --git a/hicn-plugin/src/data_fwd.h b/hicn-plugin/src/data_fwd.h index 7390382ef..df74e9150 100755 --- a/hicn-plugin/src/data_fwd.h +++ b/hicn-plugin/src/data_fwd.h @@ -79,13 +79,10 @@ vlib_buffer_clone_256_2 (vlib_main_t * vm, u32 src_buffer, u32 * buffers, { vlib_buffer_t *d; d = vlib_buffer_copy (vm, s); - clib_memcpy (d->opaque2, s->opaque2, sizeof (s->opaque2)); if (d == 0) return i; buffers[i] = vlib_get_buffer_index (vm, d); } - s->current_data += head_end_offset; - s->current_length -= head_end_offset; return n_buffers; } n_buffers = vlib_buffer_alloc_from_free_list (vm, buffers, n_buffers, @@ -145,8 +142,6 @@ always_inline u16 vlib_buffer_clone2 (vlib_main_t * vm, u32 src_buffer, u32 * buffers, u16 n_buffers, u16 head_end_offset) { - ASSERT (head_end_offset >= VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); - vlib_buffer_t *s = vlib_get_buffer (vm, src_buffer); /* diff --git a/hicn-plugin/src/data_fwd_node.c b/hicn-plugin/src/data_fwd_node.c index 088683fe0..1d37fdbcc 100755 --- a/hicn-plugin/src/data_fwd_node.c +++ b/hicn-plugin/src/data_fwd_node.c @@ -112,10 +112,6 @@ hicn_data_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, b1 = vlib_get_buffer (vm, from[1]); CLIB_PREFETCH (b1, 2 * CLIB_CACHE_LINE_BYTES, STORE); CLIB_PREFETCH (b1->data, CLIB_CACHE_LINE_BYTES, STORE); - - /* HICN PREFETCH */ - hicn_buffer_t *hicnb1 = hicn_get_buffer (b1); - hicn_prefetch_pcs_entry (hicnb1, pitcs); } /* Dequeue a packet buffer */ /* @@ -288,6 +284,8 @@ hicn_satisfy_faces (vlib_main_t * vm, u32 bi0, u32 n_left_from = 0; u32 next0 = HICN_DATA_FWD_NEXT_ERROR_DROP, next1 = HICN_DATA_FWD_NEXT_ERROR_DROP; + u16 buffer_advance = isv6 ? sizeof (ip6_header_t) + sizeof (tcp_header_t) : + sizeof (ip4_header_t) + sizeof (tcp_header_t); /* * We have a hard limit on the number of vlib_buffer that we can @@ -304,11 +302,32 @@ hicn_satisfy_faces (vlib_main_t * vm, u32 bi0, /* Clone bi0 */ vlib_buffer_t *b0 = vlib_get_buffer (vm, bi0); - /* Add one reference to maintain the buffer in the CS */ - b0->n_add_refs++; + hicn_buffer_t *hicnb = hicn_get_buffer (b0); + /* + * Mark the buffer as smaller than TWO_CL. It will be stored as is in the CS, without excluding + * the hicn_header. Cloning is not possible, it will be copied. + */ + if (b0->current_length <= buffer_advance + CLIB_CACHE_LINE_BYTES * 2) + { + /* In this case the packet is copied. We don't need to add a reference as no buffer are + * chained to it. + */ + hicnb->flags |= HICN_BUFFER_FLAGS_PKT_LESS_TWO_CL; + } + else + { + /* Add one reference to maintain the buffer in the CS. + * b0->n_add_refs == 0 has two meaning: it has 1 buffer or no buffer chained to it. + * vlib_buffer_clone2 add a number of reference equalt to pitp->u.pit.faces.n_faces - 1 + * as vlib_buffer_clone does. So after all the packet are forwarded the buffer stored in + * the CS will have n_add_refs == 0; + */ + b0->n_add_refs++; + } + found = n_left_from = vlib_buffer_clone2 (vm, bi0, clones, pitp->u.pit.faces.n_faces, - VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); + buffer_advance); ASSERT (n_left_from == pitp->u.pit.faces.n_faces); @@ -474,7 +493,8 @@ clone_data_to_cs (vlib_main_t * vm, hicn_pit_cs_t * pitcs, */ hicn_buffer_t *hicnb0 = hicn_get_buffer (b0); hicn_pit_to_cs (vm, pitcs, pitp, hash_entry, nodep, dpo_vft, hicn_dpo_id, - &hicnb->face_dpo_id, hicnb0->is_appface); + &hicnb->face_dpo_id, + hicnb0->flags & HICN_BUFFER_FLAGS_FACE_IS_APP); pitp->shared.create_time = tnow; diff --git a/hicn-plugin/src/data_pcslookup_node.c b/hicn-plugin/src/data_pcslookup_node.c index 222545106..231d8557e 100755 --- a/hicn-plugin/src/data_pcslookup_node.c +++ b/hicn-plugin/src/data_pcslookup_node.c @@ -127,7 +127,9 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, int res = hicn_hashtb_lookup_node (rt->pitcs->pcs_table, nameptr, namelen, name_hash, - !(hb0->is_appface) /* take lock */ , + !(hb0->flags & + HICN_BUFFER_FLAGS_FACE_IS_APP) + /* take lock */ , &node_id0, &dpo_ctx_id0, &vft_id0, &is_cs0, &hash_entry_id, &bucket_id, @@ -137,7 +139,7 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, if ((res == HICN_ERROR_HASHTB_HASH_NOT_FOUND || (res == HICN_ERROR_NONE && is_cs0)) - && (hb0->is_appface)) + && (hb0->flags & HICN_BUFFER_FLAGS_FACE_IS_APP)) { next0 = HICN_DATA_PCSLOOKUP_NEXT_STORE_DATA; } diff --git a/hicn-plugin/src/face_db.h b/hicn-plugin/src/face_db.h index 7b8a08879..5c95be334 100755 --- a/hicn-plugin/src/face_db.h +++ b/hicn-plugin/src/face_db.h @@ -30,14 +30,11 @@ /* 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_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) -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 */ @@ -46,7 +43,7 @@ typedef struct __attribute__ ((packed)) hicn_face_bucket_s CLIB_CACHE_LINE_ALIGN_MARK (cache_line1); /* Used to check if interests are retransmission */ - u8 bitmap[HICN_PIT_N_HOP_BITMAP_SIZE]; + u8 bitmap[HICN_PIT_BITMAP_SIZE_BYTE]; } hicn_face_bucket_t; @@ -138,7 +135,7 @@ 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); + clib_memset_u8 (&(faces_bkt->bitmap), 0, HICN_PIT_BITMAP_SIZE_BYTE); face_db->n_faces = 0; pool_put_index (hicn_face_bucket_pool, face_db->next_bucket); } diff --git a/hicn-plugin/src/faces/face.h b/hicn-plugin/src/faces/face.h index 2774d9a2e..b24fe8648 100755 --- a/hicn-plugin/src/faces/face.h +++ b/hicn-plugin/src/faces/face.h @@ -21,6 +21,8 @@ #include #include +#include "../hicn.h" + typedef u8 hicn_face_flags_t; typedef index_t hicn_face_id_t; typedef dpo_type_t hicn_face_type_t; @@ -101,6 +103,27 @@ extern hicn_face_t *hicn_dpoi_face_pool; #define HICN_FACE_NULL (hicn_face_id_t) ~0 +#define HICN_FACE_FLAGS_APPFACE_PROD_BIT 2 +#define HICN_FACE_FLAGS_APPFACE_CONS_BIT 3 + +STATIC_ASSERT ((1 << HICN_FACE_FLAGS_APPFACE_PROD_BIT) == + HICN_FACE_FLAGS_APPFACE_PROD, + "HICN_FACE_FLAGS_APPFACE_PROD_BIT and HICN_FACE_FLAGS_APPFACE_PROD must correspond"); + +STATIC_ASSERT ((1 << HICN_FACE_FLAGS_APPFACE_CONS_BIT) == + HICN_FACE_FLAGS_APPFACE_CONS, + "HICN_FACE_FLAGS_APPFACE_CONS_BIT and HICN_FACE_FLAGS_APPFACE_CONS must correspond"); + +STATIC_ASSERT ((HICN_FACE_FLAGS_APPFACE_PROD >> + HICN_FACE_FLAGS_APPFACE_PROD_BIT) == + HICN_BUFFER_FLAGS_FACE_IS_APP, + "hicn buffer app flag does not correspond to HICN_FACE_FLAGS_APPFACE_PROD"); + +STATIC_ASSERT ((HICN_FACE_FLAGS_APPFACE_CONS >> + HICN_FACE_FLAGS_APPFACE_CONS_BIT) == + HICN_BUFFER_FLAGS_FACE_IS_APP, + "hicn buffer app flag does not correspond to HICN_FACE_FLAGS_APPFACE_PROD"); + /** * @brief Definition of the virtual functin table for an hICN FACE DPO. * diff --git a/hicn-plugin/src/faces/ip/dpo_ip.c b/hicn-plugin/src/faces/ip/dpo_ip.c index 1b2dbcff9..de71f1b01 100755 --- a/hicn-plugin/src/faces/ip/dpo_ip.c +++ b/hicn-plugin/src/faces/ip/dpo_ip.c @@ -78,7 +78,7 @@ hicn_dpo_ip4_create (dpo_id_t * dpo, /* If local matches the dpoi is a face */ hicn_face_t *face = hicn_face_ip4_get (local_addr, sw_if, &hicn_face_ip_local_hashtb); - u8 is_appface; + u8 hicnb_flags; if (face != NULL) return HICN_ERROR_FACE_ALREADY_CREATED; @@ -87,7 +87,7 @@ hicn_dpo_ip4_create (dpo_id_t * dpo, if (face == NULL) { - hicn_dpo_ip4_add_and_lock_from_remote (dpo, &is_appface, local_addr, + hicn_dpo_ip4_add_and_lock_from_remote (dpo, &hicnb_flags, local_addr, remote_addr, sw_if, node_index); *face_id = (hicn_face_id_t) dpo->dpoi_index; face = hicn_dpoi_get_from_idx (*face_id); @@ -127,7 +127,7 @@ hicn_dpo_ip6_create (dpo_id_t * dpo, hicn_face_t *face = hicn_face_ip6_get (local_addr, sw_if, &hicn_face_ip_local_hashtb); - u8 is_appface; + u8 hicnb_flags; if (face != NULL) return HICN_ERROR_FACE_ALREADY_CREATED; @@ -137,7 +137,7 @@ hicn_dpo_ip6_create (dpo_id_t * dpo, /* If remote matches the dpoi is a iface */ if (face == NULL) { - hicn_dpo_ip6_add_and_lock_from_remote (dpo, &is_appface, local_addr, + hicn_dpo_ip6_add_and_lock_from_remote (dpo, &hicnb_flags, local_addr, remote_addr, sw_if, node_index); *face_id = (hicn_face_id_t) dpo->dpoi_index; face = hicn_dpoi_get_from_idx (*face_id); @@ -172,9 +172,8 @@ hicn_dpo_ip_create_from_face (hicn_face_t * face, dpo_id_t * dpo, hicn_face_id_t face_dpoi_id = hicn_dpoi_get_index (face); hicn_face_ip_t *ip_face = (hicn_face_ip_t *) face->data; dpo_set (dpo, face->shared.face_type, - ip46_address_is_ip4 (&ip_face-> - local_addr) ? DPO_PROTO_IP4 : DPO_PROTO_IP6, - face_dpoi_id); + ip46_address_is_ip4 (&ip_face->local_addr) ? DPO_PROTO_IP4 : + DPO_PROTO_IP6, face_dpoi_id); dpo->dpoi_next_node = dpoi_next_node; } diff --git a/hicn-plugin/src/faces/ip/dpo_ip.h b/hicn-plugin/src/faces/ip/dpo_ip.h index 675443277..426d5a146 100755 --- a/hicn-plugin/src/faces/ip/dpo_ip.h +++ b/hicn-plugin/src/faces/ip/dpo_ip.h @@ -33,7 +33,7 @@ void hicn_dpo_ip_module_init (void); * method adds a lock on the face state. * * @param dpo: Result of the lookup. If the face doesn't exist dpo = NULL - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not * @param local_addr: Ip v4 local address of the face * @param sw_if: software interface id of the face @@ -42,7 +42,7 @@ void hicn_dpo_ip_module_init (void); */ always_inline int hicn_dpo_ip4_lock_from_local (dpo_id_t * dpo, - u8 * is_appface, + u8 * hicnb_flags, const ip4_address_t * local_addr, u32 sw_if) { hicn_face_t *face = @@ -51,7 +51,10 @@ hicn_dpo_ip4_lock_from_local (dpo_id_t * dpo, if (PREDICT_FALSE (face == NULL)) return HICN_ERROR_FACE_NOT_FOUND; - *is_appface = face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; + *hicnb_flags |= + (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >> + HICN_FACE_FLAGS_APPFACE_PROD_BIT; hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face); dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index); @@ -66,7 +69,7 @@ hicn_dpo_ip4_lock_from_local (dpo_id_t * dpo, * method adds a lock on the face state. * * @param dpo: Result of the lookup. If the face doesn't exist dpo = NULL - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not * @param local_addr: Ip v6 local address of the face * @param sw_if: software interface id of the face @@ -75,7 +78,7 @@ hicn_dpo_ip4_lock_from_local (dpo_id_t * dpo, */ always_inline int hicn_dpo_ip6_lock_from_local (dpo_id_t * dpo, - u8 * is_appface, + u8 * hicnb_flags, const ip6_address_t * local_addr, u32 sw_if) { hicn_face_t *face = @@ -84,7 +87,10 @@ hicn_dpo_ip6_lock_from_local (dpo_id_t * dpo, if (PREDICT_FALSE (face == NULL)) return HICN_ERROR_FACE_NOT_FOUND; - *is_appface = face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; + *hicnb_flags |= + (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >> + HICN_FACE_FLAGS_APPFACE_PROD_BIT; hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face); dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP6, dpoi_index); @@ -100,7 +106,7 @@ hicn_dpo_ip6_lock_from_local (dpo_id_t * dpo, * address and returns its dpo. This method adds a lock on the face state. * * @param dpo: Result of the lookup - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not * @param local_addr: Ip v4 local address of the face * @param remote_addr: Ip v4 remote address of the face @@ -109,7 +115,7 @@ hicn_dpo_ip6_lock_from_local (dpo_id_t * dpo, */ always_inline void hicn_dpo_ip4_add_and_lock_from_remote (dpo_id_t * dpo, - u8 * is_appface, + u8 * hicnb_flags, const ip4_address_t * local_addr, const ip4_address_t * remote_addr, u32 sw_if, u32 node_index) @@ -125,7 +131,7 @@ hicn_dpo_ip4_add_and_lock_from_remote (dpo_id_t * dpo, ip46_address_t remote_addr46 = to_ip46 (0, (u8 *) remote_addr); hicn_iface_ip_add (&local_addr46, &remote_addr46, sw_if, &dpoi_index); - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index); dpo->dpoi_next_node = node_index; @@ -135,7 +141,10 @@ hicn_dpo_ip4_add_and_lock_from_remote (dpo_id_t * dpo, } /* Code replicated on purpose */ - *is_appface = face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; + *hicnb_flags |= + (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >> + HICN_FACE_FLAGS_APPFACE_PROD_BIT; hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face); dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index); @@ -148,7 +157,7 @@ hicn_dpo_ip4_add_and_lock_from_remote (dpo_id_t * dpo, * address and returns its dpo. This method adds a lock on the face state. * * @param dpo: Result of the lookup - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not * @param local_addr: Ip v6 local address of the face * @param remote_addr: Ip v6 remote address of the face @@ -157,11 +166,15 @@ hicn_dpo_ip4_add_and_lock_from_remote (dpo_id_t * dpo, */ always_inline void hicn_dpo_ip6_add_and_lock_from_remote (dpo_id_t * dpo, - u8 * is_appface, + u8 * hicnb_flags, const ip6_address_t * local_addr, const ip6_address_t * remote_addr, u32 sw_if, u32 node_index) { + dpo->dpoi_type = DPO_FIRST; + dpo->dpoi_proto = DPO_PROTO_NONE; + dpo->dpoi_index = INDEX_INVALID; + dpo->dpoi_next_node = 0; /*All (complete) faces are indexed by remote addess as well */ hicn_face_t *face = hicn_face_ip6_get (remote_addr, sw_if, &hicn_face_ip_remote_hashtb); @@ -172,7 +185,7 @@ hicn_dpo_ip6_add_and_lock_from_remote (dpo_id_t * dpo, hicn_iface_ip_add ((ip46_address_t *) local_addr, (ip46_address_t *) remote_addr, sw_if, &dpoi_index); - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index); dpo->dpoi_next_node = node_index; @@ -181,7 +194,10 @@ hicn_dpo_ip6_add_and_lock_from_remote (dpo_id_t * dpo, return; } /* Code replicated on purpose */ - *is_appface = face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; + *hicnb_flags |= + (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >> + HICN_FACE_FLAGS_APPFACE_PROD_BIT; index_t dpoi_index = hicn_dpoi_get_index (face); dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP6, dpoi_index); diff --git a/hicn-plugin/src/faces/ip/face_ip_node.c b/hicn-plugin/src/faces/ip/face_ip_node.c index 6081e4737..b3577f65f 100755 --- a/hicn-plugin/src/faces/ip/face_ip_node.c +++ b/hicn-plugin/src/faces/ip/face_ip_node.c @@ -140,7 +140,7 @@ typedef enum \ ret = LOCK_FROM_LOCAL_IP##ipv \ (&(hicnb0->face_dpo_id), \ - &hicnb0->is_appface, \ + &hicnb0->flags, \ &(ip_hdr->dst_address), \ vnet_buffer (b0)->sw_if_index[VLIB_RX]); \ \ @@ -217,13 +217,13 @@ typedef enum \ ret0 = LOCK_FROM_LOCAL_IP##ipv \ (&(hicnb0->face_dpo_id), \ - &hicnb0->is_appface, \ + &hicnb0->flags, \ &(ip_hdr0->dst_address), \ vnet_buffer (b0)->sw_if_index[VLIB_RX]); \ \ ret1 = LOCK_FROM_LOCAL_IP##ipv \ (&(hicnb1->face_dpo_id), \ - &hicnb1->is_appface, \ + &hicnb1->flags, \ &(ip_hdr1->dst_address), \ vnet_buffer (b1)->sw_if_index[VLIB_RX]); \ \ diff --git a/hicn-plugin/src/faces/ip/iface_ip_node.c b/hicn-plugin/src/faces/ip/iface_ip_node.c index 8df0467f0..9ca00d7bf 100755 --- a/hicn-plugin/src/faces/ip/iface_ip_node.c +++ b/hicn-plugin/src/faces/ip/iface_ip_node.c @@ -143,7 +143,7 @@ typedef enum { \ vlib_buffer_t *b1; \ b1 = vlib_get_buffer (vm, from[1]); \ - CLIB_PREFETCH (b1, 2*CLIB_CACHE_LINE_BYTES, STORE); \ + CLIB_PREFETCH (b1, 2*CLIB_CACHE_LINE_BYTES, STORE); \ CLIB_PREFETCH (b1->data, CLIB_CACHE_LINE_BYTES , LOAD); \ } \ /* Dequeue a packet buffer */ \ @@ -171,7 +171,7 @@ typedef enum \ DPO_ADD_LOCK_IP##ipv \ (&(hicnb0->face_dpo_id), \ - &hicnb0->is_appface, \ + &hicnb0->flags, \ local_address, \ &(ip_hdr->src_address), \ vnet_buffer(b0)->sw_if_index[VLIB_RX], \ @@ -248,7 +248,7 @@ typedef enum \ DPO_ADD_LOCK_IP##ipv \ (&(hicnb0->face_dpo_id), \ - &hicnb0->is_appface, \ + &hicnb0->flags, \ local_address0, \ &(ip_hdr0->src_address), \ vnet_buffer(b0)->sw_if_index[VLIB_RX], \ @@ -256,7 +256,7 @@ typedef enum \ DPO_ADD_LOCK_IP##ipv \ (&(hicnb1->face_dpo_id), \ - &hicnb1->is_appface, \ + &hicnb1->flags, \ local_address1, \ &(ip_hdr1->src_address), \ vnet_buffer(b1)->sw_if_index[VLIB_RX], \ diff --git a/hicn-plugin/src/faces/udp/dpo_udp.c b/hicn-plugin/src/faces/udp/dpo_udp.c index e58fc9788..eadcb6abd 100755 --- a/hicn-plugin/src/faces/udp/dpo_udp.c +++ b/hicn-plugin/src/faces/udp/dpo_udp.c @@ -79,14 +79,14 @@ hicn_dpo_udp4_create (dpo_id_t * dpo, u16 net_dst_port = clib_host_to_net_u16 (dst_port); hicn_face_t *face = hicn_face_udp4_get (src_ip, dst_ip, src_port, dst_port); - u8 is_appface; + u8 hicnb_flags; /* ip_csum_t sum0; */ if (face != NULL) return HICN_ERROR_FACE_ALREADY_CREATED; hicn_dpo_udp4_add_and_lock (dpo, src_ip, dst_ip, net_src_port, net_dst_port, - node_index, &is_appface); + node_index, &hicnb_flags); face = hicn_dpoi_get_from_idx (dpo->dpoi_index); @@ -118,13 +118,13 @@ hicn_dpo_udp6_create (dpo_id_t * dpo, u16 net_dst_port = clib_host_to_net_u16 (dst_port); hicn_face_t *face = hicn_face_udp6_get (src_ip, dst_ip, net_src_port, net_dst_port); - u8 is_appface; + u8 hicnb_flags; if (face != NULL) return HICN_ERROR_FACE_ALREADY_CREATED; hicn_dpo_udp6_add_and_lock (dpo, src_ip, dst_ip, net_src_port, net_dst_port, - node_index, &is_appface); + node_index, &hicnb_flags); face = hicn_dpoi_get_from_idx (dpo->dpoi_index); diff --git a/hicn-plugin/src/faces/udp/dpo_udp.h b/hicn-plugin/src/faces/udp/dpo_udp.h index fdde4192b..33e4b5d46 100755 --- a/hicn-plugin/src/faces/udp/dpo_udp.h +++ b/hicn-plugin/src/faces/udp/dpo_udp.h @@ -64,8 +64,8 @@ hicn_dpo_udp4_create (dpo_id_t * dpo, * @param remote_addr: Remote address of the UDP tunnel * @param local_port: Local port of the UDP tunnel * @param remote_port: Remote port of the UDP tunnel - * @param is_appface: Boolean that indicates whether the face is an application - * face or not. (Currently only IP faces can be appface) + * @param hicnb_flags: Flags that indicate whether the face is an application + * face or not in the hicn_buffer. (Currently only IP faces can be appface) * * @result HICN_ERROR_FACE_NOT_FOUND if the face does not exist, otherwise HICN_ERROR_NONE. */ @@ -73,7 +73,7 @@ always_inline int hicn_dpo_udp4_lock (dpo_id_t * dpo, const ip4_address_t * local_addr, const ip4_address_t * remote_addr, - u16 local_port, u16 remote_port, u8 * is_appface) + u16 local_port, u16 remote_port, u8 * hicnb_flags) { hicn_face_t *face = hicn_face_udp4_get (local_addr, remote_addr, local_port, remote_port); @@ -86,7 +86,7 @@ hicn_dpo_udp4_lock (dpo_id_t * dpo, dpo->dpoi_next_node = ~0; dpo_lock (dpo); - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; return HICN_ERROR_NONE; } @@ -101,7 +101,7 @@ hicn_dpo_udp4_lock (dpo_id_t * dpo, * @param remote_addr: Remote address of the UDP tunnel * @param local_port: Local port of the UDP tunnel * @param remote_port: Remote port of the UDP tunnel - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not. (Currently only IP faces can be appface) * @param node_index: vlib edge index to use in the packet processing */ @@ -110,7 +110,7 @@ hicn_dpo_udp4_add_and_lock (dpo_id_t * dpo, const ip4_address_t * local_addr, const ip4_address_t * remote_addr, u16 local_port, u16 remote_port, - u32 node_index, u8 * is_appface) + u32 node_index, u8 * hicnb_flags) { hicn_face_t *face = hicn_face_udp4_get (local_addr, remote_addr, local_port, remote_port); @@ -145,7 +145,7 @@ hicn_dpo_udp4_add_and_lock (dpo_id_t * dpo, mhash_set_mem (&hicn_face_udp_hashtb, &key, (uword *) & dpoi_index, 0); face = face; - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; dpo_set (dpo, hicn_face_udp_type, DPO_PROTO_IP4, dpoi_index); dpo->dpoi_next_node = node_index; dpo_lock (dpo); @@ -153,7 +153,7 @@ hicn_dpo_udp4_add_and_lock (dpo_id_t * dpo, return; } - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face); dpo_set (dpo, hicn_face_udp_type, DPO_PROTO_IP4, dpoi_index); @@ -196,7 +196,7 @@ hicn_dpo_udp6_create (dpo_id_t * dpo, * @param remote_addr: Remote address of the UDP tunnel * @param local_port: Local port of the UDP tunnel * @param remote_port: Remote port of the UDP tunnel - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not. (Currently only IP faces can be appface) * * @result HICN_ERROR_FACE_NOT_FOUND if the face does not exist, otherwise HICN_ERROR_NONE. @@ -205,7 +205,7 @@ always_inline int hicn_dpo_udp6_lock (dpo_id_t * dpo, const ip6_address_t * local_addr, const ip6_address_t * remote_addr, - u16 local_port, u16 remote_port, u8 * is_appface) + u16 local_port, u16 remote_port, u8 * hicnb_flags) { hicn_face_t *face = hicn_face_udp6_get (local_addr, remote_addr, local_port, remote_port); @@ -218,7 +218,7 @@ hicn_dpo_udp6_lock (dpo_id_t * dpo, dpo_set (dpo, hicn_face_udp_type, DPO_PROTO_IP4, dpoi_index); dpo->dpoi_next_node = ~0; dpo_lock (dpo); - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; return HICN_ERROR_NONE; } @@ -233,7 +233,7 @@ hicn_dpo_udp6_lock (dpo_id_t * dpo, * @param remote_addr: Remote address of the UDP tunnel * @param local_port: Local port of the UDP tunnel * @param remote_port: Remote port of the UDP tunnel - * @param is_appface: Boolean that indicates whether the face is an application + * @param hicnb_flags: Flags that indicate whether the face is an application * face or not. (Currently only IP faces can be appface) * @param node_index: vlib edge index to use in the packet processing */ @@ -242,7 +242,7 @@ hicn_dpo_udp6_add_and_lock (dpo_id_t * dpo, const ip6_address_t * local_addr, const ip6_address_t * remote_addr, u16 local_port, u16 remote_port, - u32 node_index, u8 * is_appface) + u32 node_index, u8 * hicnb_flags) { hicn_face_t *face = hicn_face_udp6_get (local_addr, remote_addr, local_port, remote_port); @@ -276,7 +276,7 @@ hicn_dpo_udp6_add_and_lock (dpo_id_t * dpo, mhash_set_mem (&hicn_face_udp_hashtb, &key, (uword *) & dpoi_index, 0); - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; dpo_set (dpo, hicn_face_udp_type, DPO_PROTO_IP6, dpoi_index); dpo->dpoi_next_node = node_index; dpo_lock (dpo); @@ -284,7 +284,7 @@ hicn_dpo_udp6_add_and_lock (dpo_id_t * dpo, return; } - *is_appface = 0; + *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT; hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face); dpo_set (dpo, hicn_face_udp_type, DPO_PROTO_IP6, dpoi_index); diff --git a/hicn-plugin/src/faces/udp/face_udp_node.c b/hicn-plugin/src/faces/udp/face_udp_node.c index 74d0b1864..ac7a63731 100755 --- a/hicn-plugin/src/faces/udp/face_udp_node.c +++ b/hicn-plugin/src/faces/udp/face_udp_node.c @@ -139,7 +139,7 @@ typedef enum &(ip_hdr->src_address), \ (udp_hdr->dst_port), \ (udp_hdr->src_port), \ - &hicnb0->is_appface); \ + &hicnb0->flags); \ \ if ( PREDICT_FALSE(ret != HICN_ERROR_NONE) ) \ { \ @@ -233,7 +233,7 @@ typedef enum &(ip_hdr0->src_address), \ (udp_hdr0->dst_port), \ (udp_hdr0->src_port), \ - &hicnb0->is_appface); \ + &hicnb0->flags); \ \ ret1 = HICN_DPO_UDP_LOCK_IP##ipv \ (&(hicnb1->face_dpo_id), \ @@ -241,7 +241,7 @@ typedef enum &(ip_hdr1->src_address), \ (udp_hdr1->dst_port), \ (udp_hdr1->src_port), \ - &hicnb1->is_appface); \ + &hicnb1->flags); \ \ if ( PREDICT_FALSE(ret0 != HICN_ERROR_NONE) ) \ { \ diff --git a/hicn-plugin/src/faces/udp/iface_udp_node.c b/hicn-plugin/src/faces/udp/iface_udp_node.c index ddea31b4c..1f6dbd4ab 100755 --- a/hicn-plugin/src/faces/udp/iface_udp_node.c +++ b/hicn-plugin/src/faces/udp/iface_udp_node.c @@ -183,7 +183,7 @@ typedef enum udp_hdr->src_port, \ GET_FACE_UDP##ipv \ (), \ - &hicnb0->is_appface); \ + &hicnb0->flags); \ \ vlib_buffer_advance(b0, sizeof(IP_HEADER_##ipv) + \ sizeof(udp_header_t)); \ @@ -270,7 +270,7 @@ typedef enum udp_hdr0->src_port, \ GET_FACE_UDP##ipv \ (), \ - &hicnb0->is_appface); \ + &hicnb0->flags); \ \ \ HICN_IFACE_UDP_ADD_LOCK_IP##ipv \ @@ -281,7 +281,7 @@ typedef enum udp_hdr1->src_port, \ GET_FACE_UDP##ipv \ (), \ - &hicnb1->is_appface); \ + &hicnb1->flags); \ \ vlib_buffer_advance(b0, sizeof(IP_HEADER_##ipv) + \ sizeof(udp_header_t)); \ diff --git a/hicn-plugin/src/hashtb.c b/hicn-plugin/src/hashtb.c index 332da350d..0bdb91c0d 100755 --- a/hicn-plugin/src/hashtb.c +++ b/hicn-plugin/src/hashtb.c @@ -409,6 +409,8 @@ hicn_hashtb_init_entry (hicn_hash_entry_t * entry, u32 nodeidx, /* Clear out some other fields in the entry */ entry->he_flags = 0; entry->locks = locks; + entry->vft_id = 0; + entry->dpo_ctx_id = 0; } /* @@ -506,6 +508,8 @@ loop_buckets: node->bucket_id = current_bucket_id; node->entry_idx = i; + (*hash_entry)->vft_id = *vft_id; + (*hash_entry)->dpo_ctx_id = *dpo_ctx_id; if (is_overflow) node->hn_flags |= HICN_HASH_NODE_OVERFLOW_BUCKET; @@ -590,6 +594,8 @@ loop_buckets: node->bucket_id = (newbkt - h->ht_overflow_buckets); node->entry_idx = 1; node->hn_flags |= HICN_HASH_NODE_OVERFLOW_BUCKET; + (*hash_entry)->vft_id = *vft_id; + (*hash_entry)->dpo_ctx_id = *dpo_ctx_id; } else { @@ -600,6 +606,8 @@ loop_buckets: node->bucket_id = (newbkt - h->ht_overflow_buckets); node->entry_idx = 0; node->hn_flags |= HICN_HASH_NODE_OVERFLOW_BUCKET; + (*hash_entry)->vft_id = *vft_id; + (*hash_entry)->dpo_ctx_id = *dpo_ctx_id; } } diff --git a/hicn-plugin/src/hashtb.h b/hicn-plugin/src/hashtb.h index 1690419a1..b74e972b2 100755 --- a/hicn-plugin/src/hashtb.h +++ b/hicn-plugin/src/hashtb.h @@ -125,19 +125,15 @@ typedef struct * bucket. the node contains an embedded key; long keys are stored as chains * of keys. * - * The memory block for a node includes space for client data, additional memory - * located off the end of the htnode data structure. Size of client-supplied - * data is fixed, so we can use vpp pools. The PIT and FIB need to ensure - * that they fit within the available data area, or change the size to - * accomodate their needs. + * The memory block for a node includes space for storing outgoing faces for + * interests, additional memory located off the end of the htnode data structure. * - * NOTE: app_data_size currently applies to all apps, i.e. bigger FIB nodes - * means (leads to, requires) bigger PCS nodes */ -/* Size this so that we can offer 64B aligned on 64-bits to the applications */ -/* New PIT entry syze 62B */ -#define HICN_HASH_NODE_APP_DATA_SIZE 4184 //to support 512 entry //96 //190 to support 50 faces +/* Size this so that we can offer 64B aligned on 64-bits for storing outgoing + * faces information + */ +#define HICN_HASH_NODE_APP_DATA_SIZE 64 /* How to align in the right way */ typedef struct __attribute__ ((packed)) hicn_hash_node_s diff --git a/hicn-plugin/src/hicn.h b/hicn-plugin/src/hicn.h index 02a3dfa52..c0de65de4 100755 --- a/hicn-plugin/src/hicn.h +++ b/hicn-plugin/src/hicn.h @@ -42,6 +42,12 @@ typedef u8 weight_t; #define VLIB_BUFFER_MIN_CHAIN_SEG_SIZE (128) #endif +#define HICN_BUFFER_FLAGS_DEFAULT 0x00 +#define HICN_BUFFER_FLAGS_FACE_IS_APP 0x01 +/* vlib_buffer cloning utilities impose that current_lentgh is more that 2*CLIB_CACHE_LINE_BYTES. */ +/* This flag is used to mark packets whose lenght is less that 2*CLIB_CACHE_LINE_BYTES. */ +#define HICN_BUFFER_FLAGS_PKT_LESS_TWO_CL 0x02 + /* The following is stored in the opaque2 field in the vlib_buffer_t */ typedef struct { @@ -54,8 +60,7 @@ typedef struct u8 hash_entry_id; u8 hash_bucket_flags; - u8 is_appface; /* 1 the incoming face is an - * application face, 0 otherwise */ + u8 flags; u8 dpo_ctx_id; /* used for data path */ u8 vft_id; /* " */ diff --git a/hicn-plugin/src/interest_hitcs_node.c b/hicn-plugin/src/interest_hitcs_node.c index f9c8c4898..1d2255fcd 100755 --- a/hicn-plugin/src/interest_hitcs_node.c +++ b/hicn-plugin/src/interest_hitcs_node.c @@ -40,43 +40,41 @@ vlib_node_registration_t hicn_interest_hitcs_node; always_inline void drop_packet (u32 * next0); always_inline void -clone_from_cs (vlib_main_t * vm, u32 * bi0_cs, vlib_buffer_t * dest) +clone_from_cs (vlib_main_t * vm, u32 * bi0_cs, vlib_buffer_t * dest, u8 isv6) { /* Retrieve the buffer to clone */ vlib_buffer_t *cs_buf = vlib_get_buffer (vm, *bi0_cs); + hicn_buffer_t *hicnb = hicn_get_buffer (cs_buf); + u16 buffer_advance = isv6 ? sizeof (ip6_header_t) + sizeof (tcp_header_t) : + sizeof (ip4_header_t) + sizeof (tcp_header_t); - if (cs_buf->current_data >= VLIB_BUFFER_MIN_CHAIN_SEG_SIZE - && ((i16) cs_buf->current_length) < (i16) 0) + if (hicnb->flags & HICN_BUFFER_FLAGS_PKT_LESS_TWO_CL) { - vlib_buffer_advance (cs_buf, - -(((i16) cs_buf->current_length) + - VLIB_BUFFER_MIN_CHAIN_SEG_SIZE)); - - clib_memcpy (vlib_buffer_get_current (dest), - vlib_buffer_get_current (cs_buf), cs_buf->current_length); - clib_memcpy (dest->opaque2, cs_buf->opaque2, sizeof (cs_buf->opaque2)); + clib_memcpy_fast (vlib_buffer_get_current (dest), + vlib_buffer_get_current (cs_buf), + cs_buf->current_length); + clib_memcpy_fast (dest->opaque2, cs_buf->opaque2, + sizeof (cs_buf->opaque2)); dest->current_data = cs_buf->current_data; dest->current_length = cs_buf->current_length; dest->total_length_not_including_first_buffer = 0; - cs_buf->current_data += VLIB_BUFFER_MIN_CHAIN_SEG_SIZE; - cs_buf->current_length -= VLIB_BUFFER_MIN_CHAIN_SEG_SIZE; } else { - vlib_buffer_advance (cs_buf, -VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); - + vlib_buffer_advance (cs_buf, -buffer_advance); if (PREDICT_FALSE (cs_buf->n_add_refs == 255)) { vlib_buffer_t *cs_buf2 = vlib_buffer_copy (vm, cs_buf); - vlib_buffer_advance (cs_buf, VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); + vlib_buffer_advance (cs_buf, buffer_advance); + *bi0_cs = vlib_get_buffer_index (vm, cs_buf2); + cs_buf->n_add_refs--; cs_buf = cs_buf2; } clib_memcpy (vlib_buffer_get_current (dest), - vlib_buffer_get_current (cs_buf), - VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); - dest->current_length = VLIB_BUFFER_MIN_CHAIN_SEG_SIZE; - vlib_buffer_advance (cs_buf, VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); + vlib_buffer_get_current (cs_buf), buffer_advance); + dest->current_length = buffer_advance; + vlib_buffer_advance (cs_buf, buffer_advance); vlib_buffer_attach_clone (vm, dest, cs_buf); } } @@ -198,7 +196,7 @@ hicn_interest_hitcs_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vnet_buffer (b0)->ip.adj_index[VLIB_TX] = hicnb0->face_dpo_id.dpoi_index; - clone_from_cs (vm, &pitp->u.cs.cs_pkt_buf, b0); + clone_from_cs (vm, &pitp->u.cs.cs_pkt_buf, b0, isv6); stats.pkts_from_cache_count++; stats.pkts_data_count++; diff --git a/hicn-plugin/src/params.h b/hicn-plugin/src/params.h index fc890f602..9e6ef5dbd 100755 --- a/hicn-plugin/src/params.h +++ b/hicn-plugin/src/params.h @@ -24,7 +24,10 @@ /* * Face compile-time parameters */ -#define HICN_PARAM_FACES_MAX 64 +#define HICN_PARAM_FACES_MAX 512 + +STATIC_ASSERT ((HICN_PARAM_FACES_MAX & (HICN_PARAM_FACES_MAX - 1)) == 0, + "HICN_PARAM_FACES_MAX must be a power of 2"); /* * Max length for hICN names @@ -46,7 +49,12 @@ #define HICN_PARAM_PIT_ENTRIES_MAX 2 * 1024 * 1024 // aggregation limit(interest previous hops) -#define HICN_PARAM_PIT_ENTRY_PHOPS_MAX 516 +// Supported up to 516. For more than 4 faces this param must +// satisfy the equation (HICN_PARAM_PIT_ENTRY_PHOPS_MAX - 4) % 2 = 0 +#define HICN_PARAM_PIT_ENTRY_PHOPS_MAX 20 + +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"); // PIT lifetime limits on API override this(in seconds, long -float type) #define HICN_PARAM_PIT_LIFETIME_BOUND_MIN_SEC 0.100L diff --git a/hicn-plugin/src/pcs.h b/hicn-plugin/src/pcs.h index 375a7d537..3ce40c9a3 100755 --- a/hicn-plugin/src/pcs.h +++ b/hicn-plugin/src/pcs.h @@ -247,7 +247,9 @@ hicn_pit_get_data (hicn_hash_node_t * node) static inline void hicn_pit_init_data (hicn_pcs_entry_t * p) { - memset (p, 0, sizeof (hicn_pcs_entry_t)); + p->shared.entry_flags = 0; + p->u.pit.faces.n_faces = 0; + p->u.pit.faces.is_overflow = 0; hicn_face_bucket_t *face_bkt; pool_get (hicn_face_bucket_pool, face_bkt); @@ -363,7 +365,6 @@ hicn_pcs_delete_internal (hicn_pit_cs_t * pitcs, } hicn_hashtb_delete (pitcs->pcs_table, node, hash_entry->he_msb64); - memset (*pcs_entryp, 0, sizeof (hicn_pcs_entry_t)); *pcs_entryp = NULL; } @@ -386,7 +387,6 @@ hicn_pit_to_cs (vlib_main_t * vm, hicn_pit_cs_t * pitcs, dpo_vft->hicn_dpo_unlock_dpo_ctx (hicn_dpo_id); /* Flush faces */ hicn_faces_flush (&(pcs_entry->u.pit.faces)); - memset (&(pcs_entry->u.cs), ~0, sizeof (hicn_cs_entry_t)); hash_entry->he_flags |= HICN_HASH_ENTRY_FLAG_CS_ENTRY; node->hn_flags |= HICN_HASH_NODE_CS_FLAGS; diff --git a/hicn-plugin/src/strategies/strategy_mw.c b/hicn-plugin/src/strategies/strategy_mw.c index 144dd145e..fc7ef47fc 100755 --- a/hicn-plugin/src/strategies/strategy_mw.c +++ b/hicn-plugin/src/strategies/strategy_mw.c @@ -102,6 +102,7 @@ hicn_mw_strategy_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { return hicn_forward_interest_fn (vm, node, frame, &hicn_strategy_mw_vft, + hicn_dpo_strategy_mw_get_type (), &hicn_mw_strategy_node); } diff --git a/hicn-plugin/src/strategy.c b/hicn-plugin/src/strategy.c index 56de34e6b..247de9d07 100755 --- a/hicn-plugin/src/strategy.c +++ b/hicn-plugin/src/strategy.c @@ -41,7 +41,8 @@ hicn_new_interest (hicn_strategy_runtime_t * rt, vlib_buffer_t * b0, u32 * next, f64 tnow, u8 * nameptr, u16 namelen, dpo_id_t * outface, int nh_idx, index_t hicn_dpo_idx, hicn_strategy_vft_t * strategy, - u8 isv6, vl_api_hicn_api_node_stats_get_reply_t * stats) + dpo_type_t dpo_type, u8 isv6, + vl_api_hicn_api_node_stats_get_reply_t * stats) { int ret; hicn_hash_node_t *nodep; @@ -50,8 +51,8 @@ hicn_new_interest (hicn_strategy_runtime_t * rt, vlib_buffer_t * b0, hicn_main_t *sm = &hicn_main; hicn_buffer_t *hicnb0 = hicn_get_buffer (b0); u32 node_id0 = 0; - u8 dpo_ctx_id0 = 0; - u8 vft_id0 = 0; + u8 dpo_ctx_id0 = vnet_buffer (b0)->ip.adj_index[VLIB_TX]; + u8 vft_id0 = dpo_type; u8 is_cs0 = 0; u8 hash_entry_id = 0; u8 bucket_is_overflow = 0; @@ -92,6 +93,7 @@ hicn_new_interest (hicn_strategy_runtime_t * rt, vlib_buffer_t * b0, hicnb0->name_hash, &node_id0, &dpo_ctx_id0, &vft_id0, &is_cs0, &hash_entry_id, &bucket_id, &bucket_is_overflow); + if (ret == HICN_ERROR_NONE) { strategy->hicn_add_interest (vnet_buffer (b0)->ip.adj_index[VLIB_TX], @@ -140,6 +142,7 @@ hicn_forward_interest_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame, hicn_strategy_vft_t * strategy, + dpo_type_t dpo_type, vlib_node_registration_t * hicn_strategy_node) { @@ -221,7 +224,7 @@ hicn_forward_interest_fn (vlib_main_t * vm, hicn_new_interest (rt, b0, &next0, tnow, nameptr, namelen, outface, nh_idx, vnet_buffer (b0)->ip.adj_index[VLIB_TX], - strategy, isv6, &stats); + strategy, dpo_type, isv6, &stats); } /* Maybe trace */ if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) && diff --git a/hicn-plugin/src/strategy.h b/hicn-plugin/src/strategy.h index 6b06a6ce9..a0100a4da 100755 --- a/hicn-plugin/src/strategy.h +++ b/hicn-plugin/src/strategy.h @@ -56,6 +56,7 @@ hicn_forward_interest_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame, hicn_strategy_vft_t * strategy, + dpo_type_t dpo_type, vlib_node_registration_t * hicn_strategy_node); /* Trace context struct */ -- cgit 1.2.3-korg