diff options
Diffstat (limited to 'src/plugins/odp/ipsec/esp_decrypt_ipsec_api.c')
-rw-r--r-- | src/plugins/odp/ipsec/esp_decrypt_ipsec_api.c | 136 |
1 files changed, 113 insertions, 23 deletions
diff --git a/src/plugins/odp/ipsec/esp_decrypt_ipsec_api.c b/src/plugins/odp/ipsec/esp_decrypt_ipsec_api.c index aa9eeec9..87427ea4 100644 --- a/src/plugins/odp/ipsec/esp_decrypt_ipsec_api.c +++ b/src/plugins/odp/ipsec/esp_decrypt_ipsec_api.c @@ -85,6 +85,17 @@ format_esp_decrypt_trace (u8 * s, va_list * args) return s; } +/* packet trace format function */ +static u8 * +format_esp_decrypt_post_trace (u8 * s, va_list * args) +{ + CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); + CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); + + s = format (s, "POST DECRYPT CRYPTO (ODP)"); + return s; +} + static uword esp_decrypt_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * from_frame) @@ -115,7 +126,6 @@ esp_decrypt_node_fn (vlib_main_t * vm, while (n_left_from > 0) { u32 n_left_to_next; - u32 buffers_passed = 0; vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); @@ -180,11 +190,16 @@ esp_decrypt_node_fn (vlib_main_t * vm, to_next[0] = bi0; to_next += 1; + vnet_buffer (i_b0)->post_crypto.next_index = (u8) next0; + int processed = 1; - int ret = odp_ipsec_in (&pkt, 1, &out_pkt, &processed, &oiopt); + int ret; - o_b0 = vlib_buffer_from_odp_packet (out_pkt); + if (!is_async) + ret = odp_ipsec_in (&pkt, 1, &out_pkt, &processed, &oiopt); + else + ret = odp_ipsec_in_enq(&pkt, 1, &oiopt); if (ret < 1) { @@ -192,36 +207,40 @@ esp_decrypt_node_fn (vlib_main_t * vm, goto trace; } - /* add the change of the ODP data offset - and the offset to IP within the packet data */ - o_b0->current_data = - (i16) ((intptr_t) odp_packet_data (out_pkt) - - (intptr_t) o_b0->data + - (intptr_t) odp_packet_l3_offset (out_pkt)); - o_b0->current_length = - odp_packet_len (out_pkt) - sizeof (ethernet_header_t); + if (!is_async) + { + o_b0 = vlib_buffer_from_odp_packet (out_pkt); + + /* add the change of the ODP data offset + and the offset to IP within the packet data */ + o_b0->current_data = + (i16) ((intptr_t) odp_packet_data (out_pkt) - + (intptr_t) o_b0->data + + (intptr_t) odp_packet_l3_offset (out_pkt)); + o_b0->current_length = + odp_packet_len (out_pkt) - sizeof (ethernet_header_t); - vnet_buffer (o_b0)->sw_if_index[VLIB_TX] = (u32) ~ 0; + vnet_buffer (o_b0)->sw_if_index[VLIB_TX] = (u32) ~ 0; - vnet_buffer (o_b0)->unused[0] = next0; + vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, + n_left_to_next, bi0, next0); + } + else + { + to_next -= 1; + n_left_to_next += 1; + } trace: - if (PREDICT_FALSE (o_b0->flags & VLIB_BUFFER_IS_TRACED)) + if (PREDICT_FALSE (i_b0->flags & VLIB_BUFFER_IS_TRACED)) { - o_b0->flags |= VLIB_BUFFER_IS_TRACED; - o_b0->trace_index = o_b0->trace_index; esp_decrypt_trace_t *tr = - vlib_add_trace (vm, node, o_b0, sizeof (*tr)); + vlib_add_trace (vm, node, i_b0, sizeof (*tr)); tr->crypto_alg = sa0->crypto_alg; tr->integ_alg = sa0->integ_alg; } - - vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, - n_left_to_next, bi0, next0); - buffers_passed += 1; } - if (buffers_passed > 0) - vlib_put_next_frame (vm, node, next_index, n_left_to_next); + vlib_put_next_frame (vm, node, next_index, n_left_to_next); } vlib_node_increment_counter (vm, odp_ipsec_esp_decrypt_node.index, ESP_DECRYPT_ERROR_RX_PKTS, @@ -251,6 +270,77 @@ VLIB_REGISTER_NODE (odp_ipsec_esp_decrypt_node) = { }, }; +VLIB_NODE_FUNCTION_MULTIARCH (odp_ipsec_esp_decrypt_node, esp_decrypt_node_fn) + + static uword + esp_decrypt_post_node_fn (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * from_frame) +{ + u32 n_left_from, *from, *to_next = 0, next_index; + from = vlib_frame_vector_args (from_frame); + n_left_from = from_frame->n_vectors; + + next_index = node->cached_next_index; + + while (n_left_from > 0) + { + u32 n_left_to_next; + + vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); + + while (n_left_from > 0 && n_left_to_next > 0) + { + u32 bi0, next0; + vlib_buffer_t *b0 = 0; + + bi0 = from[0]; + from += 1; + n_left_from -= 1; + n_left_to_next -= 1; + + b0 = vlib_get_buffer (vm, bi0); + + to_next[0] = bi0; + to_next += 1; + + next0 = vnet_buffer (b0)->post_crypto.next_index; + + vlib_validate_buffer_enqueue_x1 (vm, node, next_index, + to_next, n_left_to_next, bi0, + next0); + if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED)) + vlib_add_trace (vm, node, b0, 0); + } + vlib_put_next_frame (vm, node, next_index, n_left_to_next); + + } + vlib_node_increment_counter (vm, odp_ipsec_esp_decrypt_post_node.index, + ESP_DECRYPT_ERROR_RX_PKTS, + from_frame->n_vectors); + + return from_frame->n_vectors; +} + +/* *INDENT-OFF* */ +VLIB_REGISTER_NODE (odp_ipsec_esp_decrypt_post_node) = { + .function = esp_decrypt_post_node_fn, + .name = "odp-ipsec-esp-decrypt-post", + .vector_size = sizeof (u32), + .format_trace = format_esp_decrypt_post_trace, + .type = VLIB_NODE_TYPE_INTERNAL, + + .n_errors = ARRAY_LEN(esp_decrypt_error_strings), + .error_strings = esp_decrypt_error_strings, + + .n_next_nodes = ESP_DECRYPT_N_NEXT, + .next_nodes = { +#define _(s,n) [ESP_DECRYPT_NEXT_##s] = n, + foreach_esp_decrypt_next +#undef _ + }, +}; + /* *INDENT-ON* */ /* |