diff options
Diffstat (limited to 'hicn-plugin/src')
-rw-r--r-- | hicn-plugin/src/data_pcslookup_node.c | 52 | ||||
-rw-r--r-- | hicn-plugin/src/pcs.h | 28 |
2 files changed, 45 insertions, 35 deletions
diff --git a/hicn-plugin/src/data_pcslookup_node.c b/hicn-plugin/src/data_pcslookup_node.c index fdf855e57..1ae36202f 100644 --- a/hicn-plugin/src/data_pcslookup_node.c +++ b/hicn-plugin/src/data_pcslookup_node.c @@ -14,12 +14,12 @@ */ #include "data_pcslookup.h" +#include "infra.h" #include "mgmt.h" #include "parser.h" -#include "infra.h" +#include "state.h" #include "strategy.h" #include "strategy_dpo_manager.h" -#include "state.h" /* Stats string values */ static char *hicn_data_pcslookup_error_strings[] = { @@ -37,10 +37,9 @@ vlib_node_registration_t hicn_data_pcslookup_node; * hICN node for handling data. It performs a lookup in the PIT. */ static uword -hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, - vlib_frame_t * frame) +hicn_data_pcslookup_node_fn (vlib_main_t * vm, + vlib_node_runtime_t * node, vlib_frame_t * frame) { - u32 n_left_from, *from, *to_next; hicn_data_pcslookup_next_t next_index; hicn_data_pcslookup_runtime_t *rt; @@ -87,7 +86,8 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, { vlib_buffer_t *b1; b1 = vlib_get_buffer (vm, from[1]); - //Prefetch two cache lines-- 128 byte-- so that we load the hicn_buffer_t as well + // Prefetch two cache lines-- 128 byte-- so that we load the + // hicn_buffer_t as well CLIB_PREFETCH (b1, 2 * CLIB_CACHE_LINE_BYTES, STORE); CLIB_PREFETCH (b1->data, CLIB_CACHE_LINE_BYTES, LOAD); } @@ -99,10 +99,9 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, to_next += 1; n_left_to_next -= 1; - b0 = vlib_get_buffer (vm, bi0); hb0 = hicn_get_buffer (b0); - next0 = HICN_DATA_PCSLOOKUP_NEXT_ERROR_DROP; + next0 = HICN_DATA_PCSLOOKUP_NEXT_ERROR_DROP; /* Incr packet counter */ stats.pkts_processed += 1; @@ -111,26 +110,24 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, nameptr = (u8 *) (&name); if (PREDICT_TRUE (ret0 == HICN_ERROR_NONE && - hicn_hashtb_fullhash (nameptr, namelen, - &name_hash) == HICN_ERROR_NONE)) + hicn_hashtb_fullhash (nameptr, namelen, + &name_hash) == + HICN_ERROR_NONE)) { int res = hicn_hashtb_lookup_node (rt->pitcs->pcs_table, nameptr, namelen, name_hash, - !(hb0->flags & - HICN_BUFFER_FLAGS_FACE_IS_APP) - /* take lock */ , + 1 /*is_data. Do not take lock if hit CS */ , &node_id0, &dpo_ctx_id0, &vft_id0, - &is_cs0, - &hash_entry_id, &bucket_id, + &is_cs0, &hash_entry_id, &bucket_id, &bucket_is_overflown); stats.pkts_data_count += 1; #if HICN_FEATURE_CS - if ((res == HICN_ERROR_HASHTB_HASH_NOT_FOUND - || (res == HICN_ERROR_NONE && is_cs0)) - && ((hb0->flags & HICN_BUFFER_FLAGS_FACE_IS_APP))) + if ((res == HICN_ERROR_HASHTB_HASH_NOT_FOUND || + (res == HICN_ERROR_NONE && is_cs0)) && + ((hb0->flags & HICN_BUFFER_FLAGS_FACE_IS_APP))) { next0 = HICN_DATA_PCSLOOKUP_NEXT_STORE_DATA; } @@ -169,9 +166,8 @@ hicn_data_pcslookup_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, * Fix in case of a wrong speculation. Needed to * clone the data in the right frame */ - vlib_validate_buffer_enqueue_x1 (vm, node, next_index, - to_next, n_left_to_next, - bi0, next0); + vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, + n_left_to_next, bi0, next0); /* Maybe trace */ if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) && @@ -217,24 +213,22 @@ hicn_data_pcslookup_format_trace (u8 * s, va_list * args) return (s); } - /* * Node registration for the data forwarder node */ /* *INDENT-OFF* */ -VLIB_REGISTER_NODE (hicn_data_pcslookup_node) = +VLIB_REGISTER_NODE(hicn_data_pcslookup_node) = { .function = hicn_data_pcslookup_node_fn, .name = "hicn-data-pcslookup", - .vector_size = sizeof (u32), - .runtime_data_bytes = sizeof (hicn_data_pcslookup_runtime_t), + .vector_size = sizeof(u32), + .runtime_data_bytes = sizeof(hicn_data_pcslookup_runtime_t), .format_trace = hicn_data_pcslookup_format_trace, - .type = VLIB_NODE_TYPE_INTERNAL, - .n_errors = ARRAY_LEN (hicn_data_pcslookup_error_strings), + .type = VLIB_NODE_TYPE_INTERNAL, + .n_errors = ARRAY_LEN(hicn_data_pcslookup_error_strings), .error_strings = hicn_data_pcslookup_error_strings, .n_next_nodes = HICN_DATA_PCSLOOKUP_N_NEXT, - .next_nodes = - { + .next_nodes = { [HICN_DATA_PCSLOOKUP_NEXT_V4_LOOKUP] = "ip4-lookup", [HICN_DATA_PCSLOOKUP_NEXT_V6_LOOKUP] = "ip6-lookup", [HICN_DATA_PCSLOOKUP_NEXT_STORE_DATA] = "hicn-data-push", diff --git a/hicn-plugin/src/pcs.h b/hicn-plugin/src/pcs.h index c7e8a4b59..d9c48954e 100644 --- a/hicn-plugin/src/pcs.h +++ b/hicn-plugin/src/pcs.h @@ -499,8 +499,16 @@ hicn_pcs_cs_update (vlib_main_t * vm, hicn_pit_cs_t * pitcs, policy_vft->hicn_cs_delete_get (pitcs, policy_state, &node, &pcs_entry, &hash_entry); - hicn_pcs_cs_delete (vm, pitcs, &pcs_entry, &node, hash_entry, NULL, - NULL); + /* + * We don't have to decrease the lock (therefore we cannot + * use hicn_pcs_cs_delete function) + */ + policy_vft->hicn_cs_dequeue (pitcs, node, pcs_entry, policy_state); + + hicn_cs_delete_trimmed (pitcs, &pcs_entry, hash_entry, &node, vm); + + /* Update the global CS counter */ + pitcs->pcs_cs_count--; } } else @@ -541,14 +549,14 @@ hicn_pcs_cs_delete (vlib_main_t * vm, hicn_pit_cs_t * pitcs, } /* A data could have been inserted in the CS through a push. In this case locks == 0 */ - if (hash_entry->locks == 0 || hash_entry->locks == 1) + hash_entry->locks--; + if (hash_entry->locks == 0) { hicn_pcs_delete_internal (pitcs, pcs_entryp, hash_entry, nodep, vm, dpo_vft, hicn_dpo_id); } else { - hash_entry->locks--; hash_entry->he_flags |= HICN_HASH_ENTRY_FLAG_DELETED; } } @@ -603,8 +611,16 @@ hicn_pcs_cs_insert (vlib_main_t * vm, hicn_pit_cs_t * pitcs, policy_vft->hicn_cs_delete_get (pitcs, policy_state, &node, &pcs_entry, &hash_entry); - hicn_pcs_cs_delete (vm, pitcs, &pcs_entry, &node, hash_entry, NULL, - NULL); + /* + * We don't have to decrease the lock (therefore we cannot + * use hicn_pcs_cs_delete function) + */ + policy_vft->hicn_cs_dequeue (pitcs, node, pcs_entry, policy_state); + + hicn_cs_delete_trimmed (pitcs, &pcs_entry, hash_entry, &node, vm); + + /* Update the global CS counter */ + pitcs->pcs_cs_count--; } } return ret; |