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(¶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);
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