Signed-off-by: Robbie King <[email protected]>
---
example/ipsec/odp_ipsec.c | 68 +++++++++++++++++++++++++++--------------------
1 file changed, 39 insertions(+), 29 deletions(-)
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index 538f8dc..b6f4bc5 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_op_result_t *result)
{
uint8_t *buf = odp_packet_addr(pkt);
odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3(pkt);
@@ -709,6 +710,7 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
/* Initialize parameters block */
memset(¶ms, 0, sizeof(params));
+ params.ctx = ctx;
params.session = entry->state.session;
params.pkt = pkt;
params.out_pkt = entry->in_place ? pkt : ODP_PACKET_INVALID;
@@ -745,7 +747,7 @@ pkt_disposition_e do_ipsec_in_classify(odp_packet_t pkt,
*skip = FALSE;
if (odp_crypto_operation(¶ms,
&posted,
- odp_packet_to_buffer(pkt))) {
+ result)) {
abort();
}
return (posted) ? PKT_POSTED : PKT_CONTINUE;
@@ -761,21 +763,17 @@ 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))
+ if (!is_crypto_compl_status_ok(&result->cipher))
return PKT_DROP;
- if (!is_crypto_compl_status_ok(&auth_rc))
+ if (!is_crypto_compl_status_ok(&result->auth))
return PKT_DROP;
ip = (odph_ipv4hdr_t *)odp_packet_l3(pkt);
@@ -870,6 +868,7 @@ pkt_disposition_e do_ipsec_out_classify(odp_packet_t pkt,
/* Initialize parameters block */
memset(¶ms, 0, sizeof(params));
params.session = entry->state.session;
+ params.ctx = ctx;
params.pkt = pkt;
params.out_pkt = entry->in_place ? pkt : ODP_PACKET_INVALID;
@@ -957,7 +956,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_addr(pkt);
bool posted = 0;
@@ -979,7 +979,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;
@@ -995,19 +995,15 @@ 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))
+ if (!is_crypto_compl_status_ok(&result->cipher))
return PKT_DROP;
- if (!is_crypto_compl_status_ok(&auth_rc))
+ if (!is_crypto_compl_status_ok(&result->auth))
return PKT_DROP;
ip = (odph_ipv4hdr_t *)odp_packet_l3(pkt);
@@ -1056,17 +1052,26 @@ 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);
+ 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);
}
/*
@@ -1093,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;
@@ -1101,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;
@@ -1113,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 {
@@ -1124,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;
--
1.9.1
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp