diff options
author | Alberto Compagno <acompagn+fdio@cisco.com> | 2019-01-19 17:28:57 +0100 |
---|---|---|
committer | Alberto Compagno <acompagn+fdio@cisco.com> | 2019-01-19 17:35:54 +0100 |
commit | c7f942175b8c25c77ddc21561b52e3e6b5620b80 (patch) | |
tree | d9cecc4574ae9ed2f4a9e041010c8794e6001363 /hicn-plugin/src/faces/ip/dpo_ip.h | |
parent | d13d37534d9449dd54277af664310d5f957dc44a (diff) |
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 <acompagn+fdio@cisco.com>
Diffstat (limited to 'hicn-plugin/src/faces/ip/dpo_ip.h')
-rwxr-xr-x | hicn-plugin/src/faces/ip/dpo_ip.h | 44 |
1 files changed, 30 insertions, 14 deletions
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); |