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(¶ms); + odp_crypto_set_operation_compl_ctx(compl_event, ctx); if (odp_crypto_operation(¶ms, &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); + } 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; -- 1.9.1 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org http://lists.linaro.org/mailman/listinfo/lng-odp