diff options
Diffstat (limited to 'src/plugins/odp/ipsec/crypto_input.c')
-rw-r--r-- | src/plugins/odp/ipsec/crypto_input.c | 90 |
1 files changed, 83 insertions, 7 deletions
diff --git a/src/plugins/odp/ipsec/crypto_input.c b/src/plugins/odp/ipsec/crypto_input.c index 0b0fba37..4e91822c 100644 --- a/src/plugins/odp/ipsec/crypto_input.c +++ b/src/plugins/odp/ipsec/crypto_input.c @@ -12,12 +12,20 @@ _(ENCRYPT_POST, "odp-crypto-esp-encrypt-post") \ _(DECRYPT_POST, "odp-crypto-esp-decrypt-post") + +#define foreach_odp_ipsec_input_next \ + _(ENCRYPT_POST, "odp-ipsec-esp-encrypt-post") \ + _(DECRYPT_POST, "odp-ipsec-esp-decrypt-post") + typedef enum { #define _(f, s) ODP_CRYPTO_INPUT_NEXT_##f, foreach_odp_crypto_input_next #undef _ - ODP_CRYPTO_INPUT_N_NEXT, +#define _(f, s) ODP_IPSEC_INPUT_NEXT_##f, + foreach_odp_ipsec_input_next +#undef _ +ODP_CRYPTO_INPUT_N_NEXT, } odp_crypto_input_next_t; #define foreach_crypto_input_error \ @@ -125,6 +133,70 @@ odp_dequeue_cops (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_put_next_frame (vm, node, next_index, n_left_to_next); } vlib_node_increment_counter (vm, odp_crypto_input_node.index, + CRYPTO_INPUT_ERROR_DEQUE_COP, + n_deq); + + return n_deq; +} + +static uword +odp_dequeue_ipsec_ops (vlib_main_t * vm, vlib_node_runtime_t * node, + vlib_frame_t * frame, odp_queue_t queue, u32 next_node_index) +{ + u32 next_index = next_node_index, n_deq, n_cops, *to_next = 0; + const int MAX_EVENTS = (1<<8); + odp_event_t events[MAX_EVENTS]; + + n_deq = odp_queue_deq_multi(queue, events, MAX_EVENTS); + + n_cops = n_deq; + + int index = 0; + while(n_cops > 0) { + u32 n_left_to_next; + + vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); + + while(n_cops > 0 && n_left_to_next > 0) { + odp_event_t event = events[index++]; + + odp_packet_t pkt; + vlib_buffer_t *b0; + u32 bi0; + + pkt = odp_packet_from_event(event); + + b0 = vlib_buffer_from_odp_packet(pkt); + bi0 = vlib_get_buffer_index (vm, b0); + + b0->current_data = + (i16) ((intptr_t) odp_packet_data (pkt) - + (intptr_t) b0->data + + (intptr_t) odp_packet_l3_offset (pkt)); + if (next_index == ODP_IPSEC_INPUT_NEXT_DECRYPT_POST) + b0->current_length = odp_packet_len (pkt) - sizeof (ethernet_header_t); + else + b0->current_length = odp_packet_len (pkt); + + to_next[0] = bi0; + to_next += 1; + + n_cops -= 1; + n_left_to_next -= 1; + + if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED)) + { + odp_packet_crypto_trace_t *tr; + tr = vlib_add_trace (vm, node, b0, sizeof (*tr)); + tr->next_index = next_index; + } + + vlib_validate_buffer_enqueue_x1 (vm, node, next_index, + to_next, n_left_to_next, bi0, next_node_index); + } + vlib_put_next_frame (vm, node, next_index, n_left_to_next); + } + vlib_node_increment_counter (vm, odp_crypto_input_node.index, CRYPTO_INPUT_ERROR_DEQUE_COP, n_deq); return n_deq; @@ -139,12 +211,13 @@ odp_crypto_input_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, odp_crypto_worker_main_t *cwm = vec_elt_at_index (ocm->workers, thread_index); u32 n_cops_dequeued = 0; - n_cops_dequeued += - odp_dequeue_cops (vm, node, frame, cwm->post_encrypt, - ODP_CRYPTO_INPUT_NEXT_ENCRYPT_POST); - n_cops_dequeued += - odp_dequeue_cops (vm, node, frame, cwm->post_decrypt, - ODP_CRYPTO_INPUT_NEXT_DECRYPT_POST); + if (!ipsec_api) { + n_cops_dequeued += odp_dequeue_cops(vm, node, frame, cwm->post_encrypt, ODP_CRYPTO_INPUT_NEXT_ENCRYPT_POST); + n_cops_dequeued += odp_dequeue_cops(vm, node, frame, cwm->post_decrypt, ODP_CRYPTO_INPUT_NEXT_DECRYPT_POST); + } else { + n_cops_dequeued += odp_dequeue_ipsec_ops(vm, node, frame, cwm->post_encrypt, ODP_IPSEC_INPUT_NEXT_ENCRYPT_POST); + n_cops_dequeued += odp_dequeue_ipsec_ops(vm, node, frame, cwm->post_decrypt, ODP_IPSEC_INPUT_NEXT_DECRYPT_POST); + } return n_cops_dequeued; } @@ -167,6 +240,9 @@ VLIB_REGISTER_NODE (odp_crypto_input_node) = #define _(s, n) [ODP_CRYPTO_INPUT_NEXT_##s] = n, foreach_odp_crypto_input_next #undef _ +#define _(s, n) [ODP_IPSEC_INPUT_NEXT_##s] = n, + foreach_odp_ipsec_input_next +#undef _ }, }; /* *INDENT-ON* */ |