Scheduled for 0.10.0 to be applied after Events

On 20 January 2015 at 12:22, Maxim Uvarov <maxim.uva...@linaro.org> wrote:

> Need review-by to include it.
>
> Maxim.
>
>
> On 01/15/2015 06:55 PM, Robbie King wrote:
>
>> 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"
>>
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
>



-- 
*Mike Holmes*
Linaro  Sr Technical Manager
LNG - ODP
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to