On Wednesday 10 December 2014 08:42 PM, Robbie King wrote:
Signed-off-by: Robbie King <robk...@cisco.com>
---
  example/ipsec/odp_ipsec.c | 68 ++++++++++++++++++++++++++++++++---------------
  1 file changed, 46 insertions(+), 22 deletions(-)

diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index 76d27c5..819d590 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -679,7 +679,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_compl_event_t *event)
  {
        uint8_t *buf = odp_packet_addr(pkt);
        odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3(pkt);
@@ -688,6 +689,7 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
        odph_esphdr_t *esp = NULL;
        ipsec_cache_entry_t *entry;
        odp_crypto_op_params_t params;
+       odp_crypto_compl_event_t compl_event;
        bool posted = 0;
/* Default to skip IPsec */
@@ -743,11 +745,14 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
/* Issue crypto request */
        *skip = FALSE;
+       compl_event = odp_crypto_get_compl_event(&params);
+       odp_crypto_set_operation_compl_ctx(compl_event, ctx);
        if (odp_crypto_operation(&params,
                                 &posted,
-                                odp_packet_to_buffer(pkt))) {
+                                compl_event)) {
                abort();
        }
+       *event = compl_event;
        return (posted) ? PKT_POSTED : PKT_CONTINUE;
  }
@@ -761,9 +766,9 @@ 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_compl_event_t event)
  {
-       odp_buffer_t event;
        odp_crypto_compl_status_t cipher_rc;
        odp_crypto_compl_status_t auth_rc;
        odph_ipv4hdr_t *ip;
@@ -771,8 +776,8 @@ pkt_disposition_e do_ipsec_in_finish(odp_packet_t pkt,
        int trl_len = 0;
/* Check crypto result */
-       event = odp_packet_to_buffer(pkt);
        odp_crypto_get_operation_compl_status(event, &cipher_rc, &auth_rc);
+       odp_crypto_release_compl_event(event);
        if (!is_crypto_compl_status_ok(&cipher_rc))
                return PKT_DROP;
        if (!is_crypto_compl_status_ok(&auth_rc))
@@ -957,10 +962,12 @@ 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_compl_event_t *event)
  {
        uint8_t *buf = odp_packet_addr(pkt);
        bool posted = 0;
+       odp_crypto_compl_event_t compl_event;
/* We were dispatched from atomic queue, assign sequence numbers */
        if (ctx->ipsec.ah_offset) {
@@ -977,11 +984,14 @@ pkt_disposition_e do_ipsec_out_seq(odp_packet_t pkt,
        }
/* Issue crypto request */
+       compl_event = odp_crypto_get_compl_event(&ctx->ipsec.params);
+       odp_crypto_set_operation_compl_ctx(compl_event, ctx);
        if (odp_crypto_operation(&ctx->ipsec.params,
                                 &posted,
-                                odp_packet_to_buffer(pkt))) {
+                                compl_event)) {
                abort();
        }
+       *event = compl_event;
        return (posted) ? PKT_POSTED : PKT_CONTINUE;
  }
@@ -995,16 +1005,16 @@ 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_compl_event_t event)
  {
-       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, &cipher_rc, &auth_rc);
+       odp_crypto_release_compl_event(event);
        if (!is_crypto_compl_status_ok(&cipher_rc))
                return PKT_DROP;
        if (!is_crypto_compl_status_ok(&auth_rc))
@@ -1056,17 +1066,26 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
                pkt_disposition_e rc;
                pkt_ctx_t   *ctx;
                odp_queue_t  dispatchq;
+               odp_crypto_compl_event_t compl_event;
+
+               /* Reset completion event */
+               odp_crypto_reset_compl_event(&compl_event);
/* 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) {
+                       compl_event = odp_crypto_compl_event_from_buffer(buf);
+                       pkt = 
odp_crypto_get_operation_compl_packet(compl_event);
+                       ctx = odp_crypto_get_operation_compl_ctx(compl_event);
Compl_event holds both output pkt and ctx can't this be optimized from the implementation?
+               } 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);
                }
/*
@@ -1093,15 +1112,18 @@ 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,
+                                                         &compl_event);
                                ctx->state = (skip) ?
                                        PKT_STATE_ROUTE_LOOKUP :
                                        PKT_STATE_IPSEC_IN_FINISH;
                                break;
case PKT_STATE_IPSEC_IN_FINISH:
-
-                               rc = do_ipsec_in_finish(pkt, ctx);
+                               
+                               rc = do_ipsec_in_finish(pkt, ctx, compl_event);
                                ctx->state = PKT_STATE_ROUTE_LOOKUP;
                                break;
@@ -1113,7 +1135,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 {
@@ -1123,14 +1147,14 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
                                break;
case PKT_STATE_IPSEC_OUT_SEQ:
-
-                               rc = do_ipsec_out_seq(pkt, ctx);
+                               
+                               rc = do_ipsec_out_seq(pkt, ctx, &compl_event);
                                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, compl_event);
                                ctx->state = PKT_STATE_TRANSMIT;
                                break;


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

Reply via email to