Crypto completion event is now sole responsibility of the
implementation when API is operating asynchrnously.  Synchronous
mode can now return results directly without involving completion
event at all.

Signed-off-by: Robbie King <robk...@cisco.com>
---
 example/ipsec/odp_ipsec.c                          |  81 ++++++++++-------
 platform/linux-generic/include/api/odp_crypto.h    |  91 +++++++++----------
 .../linux-generic/include/odp_crypto_internal.h    |   6 +-
 platform/linux-generic/odp_crypto.c                |  95 +++++++++-----------
 test/validation/crypto/odp_crypto_test_async_inp.c | 100 +++++----------------
 test/validation/crypto/odp_crypto_test_sync_inp.c  |  13 ++-
 6 files changed, 164 insertions(+), 222 deletions(-)

diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index 7a0fbef..036f6b2 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -674,7 +674,8 @@ pkt_disposition_e do_route_fwd_db(odp_packet_t pkt, 
pkt_ctx_t *ctx)
 static
 pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
                                       pkt_ctx_t *ctx,
-                                      bool *skip)
+                                      bool *skip,
+                                      odp_crypto_op_result_t *result)
 {
        uint8_t *buf = odp_packet_data(pkt);
        odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
@@ -704,6 +705,7 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
 
        /* Initialize parameters block */
        memset(&params, 0, sizeof(params));
+       params.ctx = ctx;
        params.session = entry->state.session;
        params.pkt = pkt;
        params.out_pkt = entry->in_place ? pkt : ODP_PACKET_INVALID;
@@ -740,7 +742,7 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
        *skip = FALSE;
        if (odp_crypto_operation(&params,
                                 &posted,
-                                odp_packet_to_buffer(pkt))) {
+                                result)) {
                abort();
        }
        return (posted) ? PKT_POSTED : PKT_CONTINUE;
@@ -756,22 +758,20 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
  */
 static
 pkt_disposition_e do_ipsec_in_finish(odp_packet_t pkt,
-                                    pkt_ctx_t *ctx)
+                                    pkt_ctx_t *ctx,
+                                    odp_crypto_op_result_t *result)
 {
-       odp_buffer_t event;
-       odp_crypto_compl_status_t cipher_rc;
-       odp_crypto_compl_status_t auth_rc;
        odph_ipv4hdr_t *ip;
        int hdr_len = ctx->ipsec.hdr_len;
        int trl_len = 0;
 
        /* Check crypto result */
-       event = odp_packet_to_buffer(pkt);
-       odp_crypto_get_operation_compl_status(event, &auth_rc, &cipher_rc);
-       if (!is_crypto_compl_status_ok(&cipher_rc))
-               return PKT_DROP;
-       if (!is_crypto_compl_status_ok(&auth_rc))
-               return PKT_DROP;
+       if (!result->ok) {
+               if (!is_crypto_compl_status_ok(&result->cipher_status))
+                       return PKT_DROP;
+               if (!is_crypto_compl_status_ok(&result->auth_status))
+                       return PKT_DROP;
+       }
        ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
 
        /*
@@ -865,6 +865,7 @@ pkt_disposition_e do_ipsec_out_classify(odp_packet_t pkt,
        /* Initialize parameters block */
        memset(&params, 0, sizeof(params));
        params.session = entry->state.session;
+       params.ctx = ctx;
        params.pkt = pkt;
        params.out_pkt = entry->in_place ? pkt : ODP_PACKET_INVALID;
 
@@ -952,7 +953,8 @@ pkt_disposition_e do_ipsec_out_classify(odp_packet_t pkt,
  */
 static
 pkt_disposition_e do_ipsec_out_seq(odp_packet_t pkt,
-                                  pkt_ctx_t *ctx)
+                                  pkt_ctx_t *ctx,
+                                  odp_crypto_op_result_t *result)
 {
        uint8_t *buf = odp_packet_data(pkt);
        bool posted = 0;
@@ -974,7 +976,7 @@ pkt_disposition_e do_ipsec_out_seq(odp_packet_t pkt,
        /* Issue crypto request */
        if (odp_crypto_operation(&ctx->ipsec.params,
                                 &posted,
-                                odp_packet_to_buffer(pkt))) {
+                                result)) {
                abort();
        }
        return (posted) ? PKT_POSTED : PKT_CONTINUE;
@@ -990,20 +992,18 @@ pkt_disposition_e do_ipsec_out_seq(odp_packet_t pkt,
  */
 static
 pkt_disposition_e do_ipsec_out_finish(odp_packet_t pkt,
-                                     pkt_ctx_t *ctx)
+                                     pkt_ctx_t *ctx,
+                                     odp_crypto_op_result_t *result)
 {
-       odp_buffer_t event;
-       odp_crypto_compl_status_t cipher_rc;
-       odp_crypto_compl_status_t auth_rc;
        odph_ipv4hdr_t *ip;
 
        /* Check crypto result */
-       event = odp_packet_to_buffer(pkt);
-       odp_crypto_get_operation_compl_status(event, &auth_rc, &cipher_rc);
-       if (!is_crypto_compl_status_ok(&cipher_rc))
-               return PKT_DROP;
-       if (!is_crypto_compl_status_ok(&auth_rc))
-               return PKT_DROP;
+       if (!result->ok) {
+               if (!is_crypto_compl_status_ok(&result->cipher_status))
+                       return PKT_DROP;
+               if (!is_crypto_compl_status_ok(&result->auth_status))
+                       return PKT_DROP;
+       }
        ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
 
        /* Finalize the IPv4 header */
@@ -1051,17 +1051,27 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
                pkt_disposition_e rc;
                pkt_ctx_t   *ctx;
                odp_queue_t  dispatchq;
+               odp_crypto_op_result_t result;
 
                /* Use schedule to get buf from any input queue */
                buf = SCHEDULE(&dispatchq, ODP_SCHED_WAIT);
-               pkt = odp_packet_from_buffer(buf);
 
                /* Determine new work versus completion or sequence number */
-               if ((completionq != dispatchq) && (seqnumq != dispatchq)) {
+               if (seqnumq == dispatchq) {
+                       pkt = odp_packet_from_buffer(buf);
+                       ctx = get_pkt_ctx_from_pkt(pkt);
+               } else if (completionq == dispatchq) {
+                       odp_crypto_compl_event_t compl_event;
+
+                       compl_event = odp_crypto_compl_event_from_buffer(buf);
+                       odp_crypto_get_compl_event_result(compl_event, &result);
+                       odp_crypto_release_compl_event(compl_event);
+                       pkt = result.pkt;
+                       ctx = result.ctx;
+               } else {
+                       pkt = odp_packet_from_buffer(buf);
                        ctx = alloc_pkt_ctx(pkt);
                        ctx->state = PKT_STATE_INPUT_VERIFY;
-               } else {
-                       ctx = get_pkt_ctx_from_pkt(pkt);
                }
 
                /*
@@ -1088,7 +1098,10 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
 
                        case PKT_STATE_IPSEC_IN_CLASSIFY:
 
-                               rc = do_ipsec_in_classify(pkt, ctx, &skip);
+                               rc = do_ipsec_in_classify(pkt,
+                                                         ctx,
+                                                         &skip,
+                                                         &result);
                                ctx->state = (skip) ?
                                        PKT_STATE_ROUTE_LOOKUP :
                                        PKT_STATE_IPSEC_IN_FINISH;
@@ -1096,7 +1109,7 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
 
                        case PKT_STATE_IPSEC_IN_FINISH:
 
-                               rc = do_ipsec_in_finish(pkt, ctx);
+                               rc = do_ipsec_in_finish(pkt, ctx, &result);
                                ctx->state = PKT_STATE_ROUTE_LOOKUP;
                                break;
 
@@ -1108,7 +1121,9 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
 
                        case PKT_STATE_IPSEC_OUT_CLASSIFY:
 
-                               rc = do_ipsec_out_classify(pkt, ctx, &skip);
+                               rc = do_ipsec_out_classify(pkt,
+                                                          ctx,
+                                                          &skip);
                                if (odp_unlikely(skip)) {
                                        ctx->state = PKT_STATE_TRANSMIT;
                                } else {
@@ -1119,13 +1134,13 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
 
                        case PKT_STATE_IPSEC_OUT_SEQ:
 
-                               rc = do_ipsec_out_seq(pkt, ctx);
+                               rc = do_ipsec_out_seq(pkt, ctx, &result);
                                ctx->state = PKT_STATE_IPSEC_OUT_FINISH;
                                break;
 
                        case PKT_STATE_IPSEC_OUT_FINISH:
 
-                               rc = do_ipsec_out_finish(pkt, ctx);
+                               rc = do_ipsec_out_finish(pkt, ctx, &result);
                                ctx->state = PKT_STATE_TRANSMIT;
                                break;
 
diff --git a/platform/linux-generic/include/api/odp_crypto.h 
b/platform/linux-generic/include/api/odp_crypto.h
index 337e7cf..3815dee 100644
--- a/platform/linux-generic/include/api/odp_crypto.h
+++ b/platform/linux-generic/include/api/odp_crypto.h
@@ -141,6 +141,7 @@ typedef struct odp_crypto_session_params {
  */
 typedef struct odp_crypto_op_params {
        odp_crypto_session_t session;   /**< Session handle from creation */
+       void *ctx;                      /**< User context */
        odp_packet_t pkt;               /**< Input packet buffer */
        odp_packet_t out_pkt;           /**< Output packet buffer */
        uint8_t *override_iv_ptr;       /**< Override session IV pointer */
@@ -210,6 +211,21 @@ typedef struct odp_crypto_compl_status {
        enum crypto_hw_err  hw_err;   /**< Hardware specific return code */
 } odp_crypto_compl_status_t;
 
+/**
+ * Cryto API completion event
+ */
+typedef odp_buffer_t odp_crypto_compl_event_t;
+
+/**
+ * Crypto API operation result
+ */
+typedef struct odp_crypto_op_result {
+       odp_bool_t  ok;                  /**< Request completed successfully */
+       void *ctx;                       /**< User context from request */
+       odp_packet_t pkt;                /**< Output packet */
+       odp_crypto_compl_status_t cipher_status; /**< Cipher status */
+       odp_crypto_compl_status_t auth_status;   /**< Authentication status */
+} odp_crypto_op_result_t;
 
 /**
  * Crypto session creation (synchronous)
@@ -225,76 +241,53 @@ odp_crypto_session_create(odp_crypto_session_params_t 
*params,
                          odp_crypto_session_t *session,
                          enum odp_crypto_ses_create_err *status);
 
+/**
+ * Release crypto completion event
+ *
+ * @param completion_event  Completion event we are done accessing
+ */
+void
+odp_crypto_release_compl_event(odp_crypto_compl_event_t completion_event);
+
+/**
+ * Convert buffer to completion event
+ *
+ * @param buffer       Generic ODP buffer
+ *
+ * @return Completion event
+ */
+odp_crypto_compl_event_t
+odp_crypto_compl_event_from_buffer(odp_buffer_t buffer);
 
 /**
  * Crypto per packet operation
  *
  * Performs the cryptographic operations specified during session creation
  * on the packet.  If the operation is performed synchronously, "posted"
- * will return FALSE and the result of the operation is immediately available
- * in the completion event.  If "posted" returns TRUE the result will be
- * delivered via the completion queue specified when the session was created.
- *
- * @todo Resolve if completion_event is necessary, can/should the output
- *       packet buffer always be used instead.
+ * will return FALSE and the result of the operation is immediately available.
+ * If "posted" returns TRUE the result will be delivered via the completion
+ * queue specified when the session was created.
  *
  * @param params            Operation parameters
  * @param posted            Pointer to return posted, TRUE for async operation
- * @param completion_event  Event by which the operation results are delivered.
+ * @param result            Results of operation (when posted returns FALSE)
  *
  * @return 0 if successful else -1
  */
 int
 odp_crypto_operation(odp_crypto_op_params_t *params,
                     bool *posted,
-                    odp_buffer_t completion_event);
+                    odp_crypto_op_result_t *result);
 
 /**
- * Crypto per packet operation set user context in completion event
+ * Crypto per packet operation query result from completion event
  *
  * @param completion_event  Event containing operation results
- * @param ctx               User data
+ * @param result            Pointer to result structure
  */
 void
-odp_crypto_set_operation_compl_ctx(odp_buffer_t completion_event,
-                                  void *ctx);
-
-/**
- * Crypto per packet operation completion status
- *
- * Accessor function for obtaining operation status from the completion event.
- *
- * @param completion_event  Event containing operation results
- * @param auth              Pointer to store authentication results
- * @param cipher            Pointer to store cipher results
- */
-void
-odp_crypto_get_operation_compl_status(odp_buffer_t completion_event,
-                                     odp_crypto_compl_status_t *auth,
-                                     odp_crypto_compl_status_t *cipher);
-
-/**
- * Crypto per packet operation query completed operation packet
- *
- * Accessor function for obtaining current packet buffer, can be
- * different from input packet buffer on some systems
- *
- * @param completion_event  Event containing operation results
- *
- * @return Packet structure where data now resides
- */
-odp_packet_t
-odp_crypto_get_operation_compl_packet(odp_buffer_t completion_event);
-
-/**
- * Crypto per packet operation query user context in completion event
- *
- * @param completion_event  Event containing operation results
- *
- * @return User data
- */
-void *
-odp_crypto_get_operation_compl_ctx(odp_buffer_t completion_event);
+odp_crypto_get_compl_event_result(odp_crypto_compl_event_t completion_event,
+                                 odp_crypto_op_result_t *result);
 
 /**
  * Generate random byte string
diff --git a/platform/linux-generic/include/odp_crypto_internal.h 
b/platform/linux-generic/include/odp_crypto_internal.h
index 2e5a71c..237b1e8 100644
--- a/platform/linux-generic/include/odp_crypto_internal.h
+++ b/platform/linux-generic/include/odp_crypto_internal.h
@@ -59,7 +59,6 @@ struct odp_crypto_generic_session {
                } data;
                crypto_func_t func;
        } auth;
-
 };
 
 /**
@@ -67,10 +66,7 @@ struct odp_crypto_generic_session {
  */
 typedef struct odp_crypto_generic_op_result {
        uint32_t magic;
-       odp_crypto_compl_status_t cipher;
-       odp_crypto_compl_status_t auth;
-       void *op_context;
-       odp_packet_t out_pkt;
+       odp_crypto_op_result_t result;
 } odp_crypto_generic_op_result_t;
 
 /**
diff --git a/platform/linux-generic/odp_crypto.c 
b/platform/linux-generic/odp_crypto.c
index 2f95cbe..f18fa3c 100644
--- a/platform/linux-generic/odp_crypto.c
+++ b/platform/linux-generic/odp_crypto.c
@@ -340,18 +340,16 @@ odp_crypto_session_create(odp_crypto_session_params_t 
*params,
        return 0;
 }
 
-
 int
 odp_crypto_operation(odp_crypto_op_params_t *params,
                     bool *posted,
-                    odp_buffer_t completion_event)
+                    odp_crypto_op_result_t *result)
 {
        enum crypto_alg_err rc_cipher = ODP_CRYPTO_ALG_ERR_NONE;
        enum crypto_alg_err rc_auth = ODP_CRYPTO_ALG_ERR_NONE;
        odp_crypto_generic_session_t *session;
-       odp_crypto_generic_op_result_t *result;
+       odp_crypto_op_result_t local_result;
 
-       *posted = 0;
        session = (odp_crypto_generic_session_t *)(intptr_t)params->session;
 
        /* Resolve output buffer */
@@ -364,9 +362,6 @@ odp_crypto_operation(odp_crypto_op_params_t *params,
                        ODP_ABORT();
                _odp_packet_copy_to_packet(params->pkt, 0, params->out_pkt, 0,
                                           odp_packet_len(params->pkt));
-               if (completion_event == odp_packet_to_buffer(params->pkt))
-                       completion_event =
-                               odp_packet_to_buffer(params->out_pkt);
                odp_packet_free(params->pkt);
                params->pkt = ODP_PACKET_INVALID;
        }
@@ -380,19 +375,39 @@ odp_crypto_operation(odp_crypto_op_params_t *params,
                rc_cipher = session->cipher.func(params, session);
        }
 
-       /* Build Result (no HW so no errors) */
-       result = get_op_result_from_buffer(completion_event);
-       result->magic = OP_RESULT_MAGIC;
-       result->cipher.alg_err = rc_cipher;
-       result->cipher.hw_err = ODP_CRYPTO_HW_ERR_NONE;
-       result->auth.alg_err = rc_auth;
-       result->auth.hw_err = ODP_CRYPTO_HW_ERR_NONE;
-       result->out_pkt = params->out_pkt;
+       /* Fill in result */
+       local_result.ctx = params->ctx;
+       local_result.pkt = params->out_pkt;
+       local_result.cipher_status.alg_err = rc_cipher;
+       local_result.cipher_status.hw_err = ODP_CRYPTO_HW_ERR_NONE;
+       local_result.auth_status.alg_err = rc_auth;
+       local_result.auth_status.hw_err = ODP_CRYPTO_HW_ERR_NONE;
+       local_result.ok =
+               (rc_cipher == ODP_CRYPTO_ALG_ERR_NONE) &&
+               (rc_auth == ODP_CRYPTO_ALG_ERR_NONE);
 
        /* If specified during creation post event to completion queue */
        if (ODP_QUEUE_INVALID != session->compl_queue) {
+               odp_crypto_compl_event_t completion_event;
+               odp_crypto_generic_op_result_t *op_result;
+
+               /* Linux generic will always use packet for completion event */
+               completion_event = odp_packet_to_buffer(params->out_pkt);
+
+               /* Asynchronous, build result (no HW so no errors) and send it*/
+               op_result = get_op_result_from_buffer(completion_event);
+               op_result->magic = OP_RESULT_MAGIC;
+               op_result->result = local_result;
                odp_queue_enq(session->compl_queue, completion_event);
+
+               /* Indicate to caller operation was async */
                *posted = 1;
+       } else {
+               /* Synchronous, simply return results */
+               *result = local_result;
+
+               /* Indicate to caller operation was sync */
+               *posted = 0;
        }
        return 0;
 }
@@ -431,55 +446,27 @@ odp_hw_random_get(uint8_t *buf, size_t *len, bool 
use_entropy ODP_UNUSED)
 }
 
 void
-odp_crypto_get_operation_compl_status(odp_buffer_t completion_event,
-                                     odp_crypto_compl_status_t *auth,
-                                     odp_crypto_compl_status_t *cipher)
+odp_crypto_get_compl_event_result(odp_crypto_compl_event_t completion_event,
+                                 odp_crypto_op_result_t *result)
 {
-       odp_crypto_generic_op_result_t *result;
+       odp_crypto_generic_op_result_t *op_result;
 
-       result = get_op_result_from_buffer(completion_event);
+       op_result = get_op_result_from_buffer(completion_event);
 
-       if (OP_RESULT_MAGIC != result->magic)
+       if (OP_RESULT_MAGIC != op_result->magic)
                ODP_ABORT();
 
-       memcpy(auth, &result->auth, sizeof(*auth));
-       memcpy(cipher, &result->cipher, sizeof(*cipher));
-}
-
-
-void
-odp_crypto_set_operation_compl_ctx(odp_buffer_t completion_event,
-                                  void *ctx)
-{
-       odp_crypto_generic_op_result_t *result;
-
-       result = get_op_result_from_buffer(completion_event);
-       /*
-        * Completion event magic can't be checked here, because it is filled
-        * later in odp_crypto_operation() function.
-        */
-
-       result->op_context = ctx;
+       memcpy(result, &op_result->result, sizeof(*result));
 }
 
 void
-*odp_crypto_get_operation_compl_ctx(odp_buffer_t completion_event)
+odp_crypto_release_compl_event(odp_crypto_compl_event_t compl_event ODP_UNUSED)
 {
-       odp_crypto_generic_op_result_t *result;
-
-       result = get_op_result_from_buffer(completion_event);
-       ODP_ASSERT(OP_RESULT_MAGIC == result->magic, "Bad completion magic");
-
-       return result->op_context;
+       /* We use the packet as the completion event so nothing to do here */
 }
 
-odp_packet_t
-odp_crypto_get_operation_compl_packet(odp_buffer_t completion_event)
+odp_crypto_compl_event_t
+odp_crypto_compl_event_from_buffer(odp_buffer_t buffer)
 {
-       odp_crypto_generic_op_result_t *result;
-
-       result = get_op_result_from_buffer(completion_event);
-       ODP_ASSERT(OP_RESULT_MAGIC == result->magic, "Bad completion magic");
-
-       return result->out_pkt;
+       return (odp_crypto_compl_event_t)buffer;
 }
diff --git a/test/validation/crypto/odp_crypto_test_async_inp.c 
b/test/validation/crypto/odp_crypto_test_async_inp.c
index 96d4c3f..588592c 100644
--- a/test/validation/crypto/odp_crypto_test_async_inp.c
+++ b/test/validation/crypto/odp_crypto_test_async_inp.c
@@ -25,7 +25,6 @@ static void alg_test(enum odp_crypto_op op,
                     odp_crypto_key_t cipher_key,
                     enum odp_auth_alg auth_alg,
                     odp_crypto_key_t auth_key,
-                    odp_buffer_t compl_new,
                     uint8_t *input_vec,
                     unsigned int input_vec_len,
                     uint8_t *output_vec,
@@ -35,7 +34,8 @@ static void alg_test(enum odp_crypto_op op,
        int rc;
        enum odp_crypto_ses_create_err status;
        bool posted;
-       odp_buffer_t compl_event;
+       odp_buffer_t compl_buff;
+       odp_crypto_op_result_t result;
 
        odp_queue_t compl_queue = odp_queue_lookup("crypto-out");
        CU_ASSERT(compl_queue != ODP_QUEUE_INVALID);
@@ -75,6 +75,7 @@ static void alg_test(enum odp_crypto_op op,
        op_params.session = session;
        op_params.pkt = pkt;
        op_params.out_pkt = pkt;
+       op_params.ctx = (void *)0xdeadbeef;
        if (cipher_alg != ODP_CIPHER_ALG_NULL &&
            auth_alg == ODP_AUTH_ALG_NULL) {
                op_params.cipher_range.offset = data_off;
@@ -90,42 +91,30 @@ static void alg_test(enum odp_crypto_op op,
                CU_FAIL("%s : not implemented for combined alg mode\n");
        }
 
-       if (compl_new == ODP_BUFFER_INVALID) {
-               odp_crypto_set_operation_compl_ctx(buf, (void *)0xdeadbeef);
-               rc = odp_crypto_operation(&op_params, &posted, buf);
-       } else {
-               odp_crypto_set_operation_compl_ctx(compl_new,
-                                                  (void *)0xdeadbeef);
-               rc = odp_crypto_operation(&op_params, &posted, compl_new);
-       }
+       rc = odp_crypto_operation(&op_params, &posted, NULL);
        CU_ASSERT(posted);
 
        /* Poll completion queue for results */
+       odp_crypto_compl_event_t compl_event;
        do {
-               compl_event = odp_queue_deq(compl_queue);
-       } while (compl_event == ODP_BUFFER_INVALID);
-
-       if (compl_new == ODP_BUFFER_INVALID)
-               CU_ASSERT(compl_event == buf)
-       else
-               CU_ASSERT(compl_event == compl_new)
-
-       struct odp_crypto_compl_status auth_status, cipher_status;
-       odp_crypto_get_operation_compl_status(compl_event,
-                                             &auth_status, &cipher_status);
-       CU_ASSERT(auth_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
-       CU_ASSERT(auth_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
-       CU_ASSERT(cipher_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
-       CU_ASSERT(cipher_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
-
-       odp_packet_t out_pkt;
-       out_pkt = odp_crypto_get_operation_compl_packet(compl_event);
-       CU_ASSERT(out_pkt == pkt);
+               compl_buff = odp_queue_deq(compl_queue);
+       } while (compl_buff == ODP_BUFFER_INVALID);
+
+       compl_event = odp_crypto_compl_event_from_buffer(compl_buff);
+       odp_crypto_get_compl_event_result(compl_event, &result);
+       odp_crypto_release_compl_event(compl_event);
+
+       CU_ASSERT(result.ok);
+       CU_ASSERT(result.auth_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
+       CU_ASSERT(result.auth_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
+       CU_ASSERT(result.cipher_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
+       CU_ASSERT(result.cipher_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
+
+       CU_ASSERT(result.pkt == pkt);
 
        CU_ASSERT(!memcmp(data_addr, output_vec, output_vec_len));
 
-       void *ctx = odp_crypto_get_operation_compl_ctx(compl_event);
-       CU_ASSERT(ctx == (void *)0xdeadbeef);
+       CU_ASSERT(result.ctx == (void *)0xdeadbeef);
 
        odp_buffer_free(buf);
 }
@@ -157,7 +146,6 @@ static void enc_alg_3des_cbc(void)
                         cipher_key,
                         ODP_AUTH_ALG_NULL,
                         auth_key,
-                        ODP_BUFFER_INVALID,
                         tdes_cbc_reference_plaintext[i],
                         tdes_cbc_reference_length[i],
                         tdes_cbc_reference_ciphertext[i],
@@ -189,7 +177,6 @@ static void enc_alg_3des_cbc_ovr_iv(void)
                         cipher_key,
                         ODP_AUTH_ALG_NULL,
                         auth_key,
-                        ODP_BUFFER_INVALID,
                         tdes_cbc_reference_plaintext[i],
                         tdes_cbc_reference_length[i],
                         tdes_cbc_reference_ciphertext[i],
@@ -226,7 +213,6 @@ static void dec_alg_3des_cbc(void)
                         cipher_key,
                         ODP_AUTH_ALG_NULL,
                         auth_key,
-                        ODP_BUFFER_INVALID,
                         tdes_cbc_reference_ciphertext[i],
                         tdes_cbc_reference_length[i],
                         tdes_cbc_reference_plaintext[i],
@@ -260,7 +246,6 @@ static void dec_alg_3des_cbc_ovr_iv(void)
                         cipher_key,
                         ODP_AUTH_ALG_NULL,
                         auth_key,
-                        ODP_BUFFER_INVALID,
                         tdes_cbc_reference_ciphertext[i],
                         tdes_cbc_reference_length[i],
                         tdes_cbc_reference_plaintext[i],
@@ -298,7 +283,6 @@ static void alg_hmac_md5(void)
                         cipher_key,
                         ODP_AUTH_ALG_MD5_96,
                         auth_key,
-                        ODP_BUFFER_INVALID,
                         hmac_md5_reference_plaintext[i],
                         hmac_md5_reference_length[i],
                         hmac_md5_reference_digest[i],
@@ -306,55 +290,11 @@ static void alg_hmac_md5(void)
        }
 }
 
-/* This test verifies the correctness of encode (plaintext -> ciphertext)
- * operation for 3DES_CBC algorithm. IV for the operation is the session IV.
- * Uses a separate buffer for completion event
- * */
-#define ASYNC_INP_ENC_ALG_3DES_CBC_COMPL_NEW   "ENC_ALG_3DES_CBC_COMPL_NEW"
-static void enc_alg_3des_cbc_compl_new(void)
-{
-       odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
-                        auth_key   = { .data = NULL, .length = 0 };
-       odp_crypto_iv_t iv;
-       unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
-                                    sizeof(tdes_cbc_reference_length[0]));
-
-       odp_buffer_pool_t pool = odp_buffer_pool_lookup("compl_pool");
-       CU_ASSERT(pool != ODP_BUFFER_POOL_INVALID);
-
-       unsigned int i;
-       odp_buffer_t compl_new;
-       for (i = 0; i < test_vec_num; i++) {
-               compl_new = odp_buffer_alloc(pool);
-               CU_ASSERT(compl_new != ODP_BUFFER_INVALID);
-
-               cipher_key.data = tdes_cbc_reference_key[i];
-               cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
-               iv.data = tdes_cbc_reference_iv[i];
-               iv.length = sizeof(tdes_cbc_reference_iv[i]);
-
-               alg_test(ODP_CRYPTO_OP_ENCODE,
-                        ODP_CIPHER_ALG_3DES_CBC,
-                        iv,
-                        NULL,
-                        cipher_key,
-                        ODP_AUTH_ALG_NULL,
-                        auth_key,
-                        compl_new,
-                        tdes_cbc_reference_plaintext[i],
-                        tdes_cbc_reference_length[i],
-                        tdes_cbc_reference_ciphertext[i],
-                        tdes_cbc_reference_length[i]);
-               odp_buffer_free(compl_new);
-       }
-}
-
 CU_TestInfo test_array_async[] = {
        {ASYNC_INP_ENC_ALG_3DES_CBC, enc_alg_3des_cbc },
        {ASYNC_INP_DEC_ALG_3DES_CBC, dec_alg_3des_cbc },
        {ASYNC_INP_ENC_ALG_3DES_CBC_OVR_IV, enc_alg_3des_cbc_ovr_iv },
        {ASYNC_INP_DEC_ALG_3DES_CBC_OVR_IV, dec_alg_3des_cbc_ovr_iv },
        {ASYNC_INP_ALG_HMAC_MD5, alg_hmac_md5 },
-       {ASYNC_INP_ENC_ALG_3DES_CBC_COMPL_NEW, enc_alg_3des_cbc_compl_new },
        CU_TEST_INFO_NULL,
 };
diff --git a/test/validation/crypto/odp_crypto_test_sync_inp.c 
b/test/validation/crypto/odp_crypto_test_sync_inp.c
index f37ad54..0215b6f 100644
--- a/test/validation/crypto/odp_crypto_test_sync_inp.c
+++ b/test/validation/crypto/odp_crypto_test_sync_inp.c
@@ -24,6 +24,7 @@ static void alg_test(enum odp_crypto_op op,
        int rc;
        enum odp_crypto_ses_create_err status;
        bool posted;
+       odp_crypto_op_result_t result;
 
        odp_queue_t compl_queue = odp_queue_lookup("crypto-out");
        CU_ASSERT(compl_queue != ODP_QUEUE_INVALID);
@@ -64,6 +65,7 @@ static void alg_test(enum odp_crypto_op op,
        op_params.session = session;
        op_params.pkt = pkt;
        op_params.out_pkt = pkt;
+       op_params.ctx = (void *)0xdeadbeef;
        if (cipher_alg != ODP_CIPHER_ALG_NULL &&
            auth_alg == ODP_AUTH_ALG_NULL) {
                op_params.cipher_range.offset = data_off;
@@ -80,13 +82,22 @@ static void alg_test(enum odp_crypto_op op,
        }
 
        /* TEST : odp_crypto_operation */
-       rc = odp_crypto_operation(&op_params, &posted, buf);
+       rc = odp_crypto_operation(&op_params, &posted, &result);
        CU_ASSERT(!rc);
        /* indication that the operation completed */
        CU_ASSERT(!posted);
 
+       /* TEST: results were ok */
+       CU_ASSERT(result.ok);
+       CU_ASSERT(result.auth_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
+       CU_ASSERT(result.auth_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
+       CU_ASSERT(result.cipher_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
+       CU_ASSERT(result.cipher_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
+
        /* TEST : operation output was correct */
        CU_ASSERT(!memcmp(data_addr, output_vec, output_vec_len));
+
+       CU_ASSERT(result.ctx == (void *)0xdeadbeef);
 }
 
 #define SYNC_INP_ENC_ALG_3DES_CBC      "ENC_ALG_3DES_CBC"
-- 
1.9.1


_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to