aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin
diff options
context:
space:
mode:
authorMauro Sardara <msardara@cisco.com>2023-01-20 20:19:01 +0000
committerMauro Sardara <msardara@cisco.com>2023-01-23 16:56:15 +0000
commitc33cdb0fe6a1b97e16e9a3a92d9b084115e1b278 (patch)
tree068c6ba4baee93e8dbf9827f37333d00a1adbc08 /hicn-plugin
parent5a86b5436c369547360ec8206d1f07261b9562f3 (diff)
feat(hicn-plugin): reuse strategy node to forward interests
Before the interest forwarding was duplicated in 2 different nodes, the strategy_node and the interest_hitpit_node. Reuse the strategy node so that the nexthop selection via the strategy is done only in one place - teh strategy node. Change-Id: I2c72ec35b1df4e6ed8ce0877e9f3e6f5c1ae68f8 Signed-off-by: Mauro Sardara <msardara@cisco.com> (cherry picked from commit 4ec2784197db60e4f287a88b7944ecb1067bfc08)
Diffstat (limited to 'hicn-plugin')
-rw-r--r--hicn-plugin/src/interest_hitpit_node.c182
-rw-r--r--hicn-plugin/src/interest_pcslookup_node.c82
-rw-r--r--hicn-plugin/src/strategy_node.c2
3 files changed, 91 insertions, 175 deletions
diff --git a/hicn-plugin/src/interest_hitpit_node.c b/hicn-plugin/src/interest_hitpit_node.c
index 0b09711f7..fb2393f54 100644
--- a/hicn-plugin/src/interest_hitpit_node.c
+++ b/hicn-plugin/src/interest_hitpit_node.c
@@ -38,8 +38,6 @@ static char *hicn_interest_hitpit_error_strings[] = {
vlib_node_registration_t hicn_interest_hitpit_node;
-always_inline void drop_packet (u32 *next0);
-
/*
* hICN forwarder node for interests hitting the PIT
*/
@@ -47,7 +45,6 @@ static uword
hicn_interest_hitpit_node_fn (vlib_main_t *vm, vlib_node_runtime_t *node,
vlib_frame_t *frame)
{
- int ret;
u32 n_left_from, *from, *to_next;
hicn_interest_hitpit_next_t next_index;
hicn_interest_hitpit_runtime_t *rt;
@@ -62,9 +59,6 @@ hicn_interest_hitpit_node_fn (vlib_main_t *vm, vlib_node_runtime_t *node,
const hicn_dpo_vft_t *dpo_vft0;
u8 dpo_ctx_id0;
u8 forward = 0;
- hicn_face_id_t outfaces[MAX_OUT_FACES];
- u32 clones[MAX_OUT_FACES];
- u16 outfaces_len;
u32 pit_entry_index;
hicn_pcs_entry_t *pcs_entry = NULL;
hicn_buffer_t *hicnb0;
@@ -119,152 +113,56 @@ hicn_interest_hitpit_node_fn (vlib_main_t *vm, vlib_node_runtime_t *node,
// Increment packet counter
stats.pkts_processed += 1;
- // If the entry is expired, remove it no matter of the possible
- // cases.
- if (tnow > hicn_pcs_entry_get_expire_time (pcs_entry))
+ // A data packet may have arrived in the time between the pcs
+ // lookup and now. Check again to make sure the entry is CS or
+ // PIT
+ if (hicn_pcs_entry_is_cs (pcs_entry))
{
- // Notify strategy
- strategy_vft0->hicn_on_interest_timeout (dpo_ctx_id0);
-
- // Release lock on entry - this MUST delete the entry
- hicn_pcs_entry_remove_lock (rt->pitcs, pcs_entry);
-
- stats.pit_expired_count++;
-
- // Forward to strategy node
- // TODO this can be simplified by checking directly in the
- // pcslookup node!
- next0 = HICN_INTEREST_HITPIT_NEXT_STRATEGY;
+ next0 = HICN_INTEREST_HITPIT_NEXT_INTEREST_HITCS;
}
else
{
- // A data packet may have arrived in the time between the pcs
- // lookup and now. Check again to make sure the entry is CS or
- // PIT
- if (hicn_pcs_entry_is_cs (pcs_entry))
+ // Distinguish between aggregation, retransmission and
+ // additionally check if the strategy mandates to always send
+ // the interest
+
+ // Retransmission
+ forward = hicn_pcs_entry_pit_search (pcs_entry, hicnb0->face_id);
+
+ // Strategy mandates to force send after aggregation
+ if (!forward && strategy_vft0->hicn_send_after_aggregation (
+ dpo_ctx_id0, hicnb0->face_id))
+ {
+ forward = true;
+ hicn_pcs_entry_pit_add_face (pcs_entry, hicnb0->face_id);
+ }
+
+ if (forward && hicnb0->payload_type != HPT_MANIFEST)
{
- next0 = HICN_INTEREST_HITPIT_NEXT_INTEREST_HITCS;
+ next0 = HICN_INTEREST_HITPIT_NEXT_STRATEGY;
}
else
{
- // Distinguish between aggregation, retransmission and
- // additionally check if the strategy mandates to always send
- // the interest
-
- // Retransmission
- forward =
- hicn_pcs_entry_pit_search (pcs_entry, hicnb0->face_id);
-
- // Strategy mandates to force send after aggregation
- if (!forward && strategy_vft0->hicn_send_after_aggregation (
- dpo_ctx_id0, hicnb0->face_id))
- {
- forward = true;
- hicn_pcs_entry_pit_add_face (pcs_entry, hicnb0->face_id);
- }
-
- if (forward && hicnb0->payload_type != HPT_MANIFEST)
- {
- // Send interest
- strategy_vft0->hicn_select_next_hop (
- dpo_ctx_id0, hicnb0->face_id, outfaces, &outfaces_len);
-
- // If no next hops, drop the packet
- if (outfaces_len == 0)
- {
- drop_packet (&next0);
- vlib_validate_buffer_enqueue_x1 (
- vm, node, next_index, to_next, n_left_to_next, bi0,
- next0);
- continue;
- }
-
- // Prepare the packet for the forwarding
- next0 = isv6 ? HICN_INTEREST_HITPIT_NEXT_FACE6_OUTPUT :
- HICN_INTEREST_HITPIT_NEXT_FACE4_OUTPUT;
+ // Aggregation
+ hicn_pcs_entry_pit_add_face (pcs_entry, hicnb0->face_id);
- // Update stats
- stats.interests_retx += outfaces_len;
+ next0 = HICN_INTEREST_HITPIT_NEXT_ERROR_DROP;
- // Clone interest if needed
- if (outfaces_len > 1)
- {
- ret = vlib_buffer_clone (vm, bi0, clones,
- (u16) outfaces_len,
- CLIB_CACHE_LINE_BYTES * 2);
- ASSERT (ret == outfaces_len);
- }
- else
- {
- clones[0] = bi0;
- }
-
- // We need to clone the packet over multiple output
- // faces
-
- // Restore pointers
- to_next -= 1;
- n_left_to_next += 1;
-
- for (u32 nh = 0; nh < outfaces_len; nh++)
- {
- vlib_buffer_t *local_b0 =
- vlib_get_buffer (vm, clones[nh]);
- to_next[0] = clones[nh];
- to_next += 1;
- n_left_to_next -= 1;
-
- vnet_buffer (local_b0)->ip.adj_index[VLIB_TX] =
- outfaces[nh];
-
- /* Maybe trace */
- if (PREDICT_FALSE (
- (node->flags & VLIB_NODE_FLAG_TRACE) &&
- (local_b0->flags & VLIB_BUFFER_IS_TRACED)))
- {
- hicn_interest_hitpit_trace_t *t =
- vlib_add_trace (vm, node, local_b0,
- sizeof (*t));
- t->pkt_type = HICN_PACKET_TYPE_INTEREST;
- t->sw_if_index =
- vnet_buffer (local_b0)->sw_if_index[VLIB_RX];
- t->next_index = next0;
- }
-
- /*
- * Verify speculative enqueue, maybe switch
- * current next frame
- */
- vlib_validate_buffer_enqueue_x1 (
- vm, node, next_index, to_next, n_left_to_next,
- clones[nh], next0);
- }
- continue;
- }
- else
- {
- // Aggregation
- hicn_pcs_entry_pit_add_face (pcs_entry, hicnb0->face_id);
-
- drop_packet (&next0);
- stats.interests_aggregated++;
-
- /* Maybe trace */
- if (PREDICT_FALSE (
- (node->flags & VLIB_NODE_FLAG_TRACE) &&
- (b0->flags & VLIB_BUFFER_IS_TRACED)))
- {
- hicn_interest_hitpit_trace_t *t =
- vlib_add_trace (vm, node, b0, sizeof (*t));
- t->pkt_type = HICN_PACKET_TYPE_INTEREST;
- t->sw_if_index =
- vnet_buffer (b0)->sw_if_index[VLIB_RX];
- t->next_index = next0;
- }
- }
+ stats.interests_aggregated++;
}
}
+ /* Maybe trace */
+ if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) &&
+ (b0->flags & VLIB_BUFFER_IS_TRACED)))
+ {
+ hicn_interest_hitpit_trace_t *t =
+ vlib_add_trace (vm, node, b0, sizeof (*t));
+ t->pkt_type = HICN_PACKET_TYPE_INTEREST;
+ t->sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];
+ t->next_index = next0;
+ }
+
/*
* Verify speculative enqueue, maybe switch current
* next frame
@@ -311,12 +209,6 @@ hicn_interest_hitpit_format_trace (u8 *s, va_list *args)
return (s);
}
-void
-drop_packet (u32 *next0)
-{
- *next0 = HICN_INTEREST_HITPIT_NEXT_ERROR_DROP;
-}
-
/*
* Node registration for the interest forwarder node
*/
diff --git a/hicn-plugin/src/interest_pcslookup_node.c b/hicn-plugin/src/interest_pcslookup_node.c
index a0b2ee3f0..e8aad4a83 100644
--- a/hicn-plugin/src/interest_pcslookup_node.c
+++ b/hicn-plugin/src/interest_pcslookup_node.c
@@ -80,6 +80,7 @@ hicn_interest_pcslookup_node_inline (vlib_main_t *vm,
hicn_pcs_entry_t *pcs_entry = NULL;
f64 tnow;
hicn_buffer_t *hicnb0;
+ const hicn_strategy_vft_t *strategy;
rt = vlib_node_get_runtime_data (vm, hicn_interest_pcslookup_node.index);
@@ -132,49 +133,72 @@ hicn_interest_pcslookup_node_inline (vlib_main_t *vm,
if (ret == HICN_ERROR_NONE)
{
- // We found an entry in the PCS. Next stage for this packet is
- // one of hitpit/cs nodes
- next0 = HICN_INTEREST_PCSLOOKUP_NEXT_INTEREST_HITPIT +
- hicn_pcs_entry_is_cs (pcs_entry);
-
+ // We found an entry in the PCS.
ret = hicn_store_internal_state (
b0, hicn_pcs_entry_get_index (rt->pitcs, pcs_entry),
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
- if (PREDICT_FALSE (ret != HICN_ERROR_NONE))
- next0 = HICN_INTEREST_PCSLOOKUP_NEXT_ERROR_DROP;
- }
- else
- {
- // No entry in PCS. Let's create one now
- pcs_entry = hicn_pcs_entry_pit_get (
- rt->pitcs, tnow, hicn_buffer_get_lifetime (b0));
+ // Make sure the entry is not expired first
+ if (tnow > hicn_pcs_entry_get_expire_time (pcs_entry))
+ {
+ // Notify strategy
+ strategy = hicn_dpo_get_strategy_vft (hicnb0->vft_id);
+ strategy->hicn_on_interest_timeout (
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
- ret = hicn_pcs_pit_insert (rt->pitcs, pcs_entry, &name);
+ // Release lock on entry - this MUST delete the entry
+ hicn_pcs_entry_remove_lock (rt->pitcs, pcs_entry);
- if (PREDICT_FALSE (ret != HICN_ERROR_NONE))
+ stats.pit_expired_count++;
+
+ // Forward to strategy node
+ // TODO this can be simplified by checking directly in the
+ // pcslookup node!
+ next0 = HICN_INTEREST_PCSLOOKUP_NEXT_STRATEGY;
+
+ goto newentry;
+ }
+ else
{
- next0 = HICN_INTEREST_PCSLOOKUP_NEXT_ERROR_DROP;
+ // Next stage for this packet is one of hitpit/cs nodes
+ next0 = HICN_INTEREST_PCSLOOKUP_NEXT_INTEREST_HITPIT +
+ hicn_pcs_entry_is_cs (pcs_entry);
+
+ if (PREDICT_FALSE (ret != HICN_ERROR_NONE))
+ next0 = HICN_INTEREST_PCSLOOKUP_NEXT_ERROR_DROP;
+
goto end;
}
+ }
+ newentry:
+ // No entry in PCS. Let's create one now
+ pcs_entry = hicn_pcs_entry_pit_get (rt->pitcs, tnow,
+ hicn_buffer_get_lifetime (b0));
- // Store internal state
- ret = hicn_store_internal_state (
- b0, hicn_pcs_entry_get_index (rt->pitcs, pcs_entry),
- vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
+ ret = hicn_pcs_pit_insert (rt->pitcs, pcs_entry, &name);
- if (PREDICT_FALSE (ret != HICN_ERROR_NONE))
- {
- hicn_pcs_entry_remove_lock (rt->pitcs, pcs_entry);
- drop_packet (vm, bi0, &n_left_from, &next0, &to_next,
- &next_index, node);
- continue;
- }
+ if (PREDICT_FALSE (ret != HICN_ERROR_NONE))
+ {
+ next0 = HICN_INTEREST_PCSLOOKUP_NEXT_ERROR_DROP;
+ goto end;
+ }
- // Add face
- hicn_pcs_entry_pit_add_face (pcs_entry, hicnb0->face_id);
+ // Store internal state
+ ret = hicn_store_internal_state (
+ b0, hicn_pcs_entry_get_index (rt->pitcs, pcs_entry),
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
+
+ if (PREDICT_FALSE (ret != HICN_ERROR_NONE))
+ {
+ hicn_pcs_entry_remove_lock (rt->pitcs, pcs_entry);
+ drop_packet (vm, bi0, &n_left_from, &next0, &to_next,
+ &next_index, node);
+ continue;
}
+ // Add face
+ hicn_pcs_entry_pit_add_face (pcs_entry, hicnb0->face_id);
+
end:
stats.pkts_interest_count++;
diff --git a/hicn-plugin/src/strategy_node.c b/hicn-plugin/src/strategy_node.c
index 9c1a484d6..add5772a4 100644
--- a/hicn-plugin/src/strategy_node.c
+++ b/hicn-plugin/src/strategy_node.c
@@ -155,7 +155,7 @@ hicn_strategy_fn (vlib_main_t *vm, vlib_node_runtime_t *node,
if (PREDICT_FALSE (ret != HICN_ERROR_NONE || outfaces_len == 0))
{
- drop_packet (vm, bi0, &n_left_from, &next0, &to_next,
+ drop_packet (vm, bi0, &n_left_to_next, &next0, &to_next,
&next_index, node);
continue;
}