diff options
-rw-r--r-- | platform/linux-dpdk/odp_crypto.c | 98 |
1 files changed, 56 insertions, 42 deletions
diff --git a/platform/linux-dpdk/odp_crypto.c b/platform/linux-dpdk/odp_crypto.c index 026132579..7de208f0d 100644 --- a/platform/linux-dpdk/odp_crypto.c +++ b/platform/linux-dpdk/odp_crypto.c @@ -1803,6 +1803,58 @@ static int linearize_pkt(const crypto_session_entry_t *session, odp_packet_t pkt return odp_packet_num_segs(pkt) != 1; } +static int copy_data_and_metadata(odp_packet_t dst, odp_packet_t src) +{ + int md_copy; + int rc; + + md_copy = _odp_packet_copy_md_possible(odp_packet_pool(dst), + odp_packet_pool(src)); + if (odp_unlikely(md_copy < 0)) { + ODP_ERR("Unable to copy packet metadata\n"); + return -1; + } + + rc = odp_packet_copy_from_pkt(dst, 0, src, 0, odp_packet_len(src)); + if (odp_unlikely(rc < 0)) { + ODP_ERR("Unable to copy packet data\n"); + return -1; + } + + _odp_packet_copy_md(packet_hdr(dst), packet_hdr(src), md_copy); + return 0; +} + +static odp_packet_t get_output_packet(const crypto_session_entry_t *session, + odp_packet_t pkt_in, + odp_packet_t pkt_out) +{ + int rc; + + if (odp_likely(pkt_in == pkt_out)) + return pkt_out; + + if (pkt_out == ODP_PACKET_INVALID) { + odp_pool_t pool = session->p.output_pool; + + ODP_ASSERT(pool != ODP_POOL_INVALID); + if (pool == odp_packet_pool(pkt_in)) { + pkt_out = pkt_in; + } else { + pkt_out = odp_packet_copy(pkt_in, pool); + if (odp_likely(pkt_out != ODP_PACKET_INVALID)) + odp_packet_free(pkt_in); + } + return pkt_out; + } + rc = copy_data_and_metadata(pkt_out, pkt_in); + if (odp_unlikely(rc < 0)) + return ODP_PACKET_INVALID; + + odp_packet_free(pkt_in); + return pkt_out; +} + static int odp_crypto_int(odp_packet_t pkt_in, odp_packet_t *pkt_out, @@ -1813,8 +1865,7 @@ int odp_crypto_int(odp_packet_t pkt_in, odp_crypto_alg_err_t rc_auth = ODP_CRYPTO_ALG_ERR_NONE; struct rte_cryptodev_sym_session *rte_session = NULL; struct rte_crypto_op *op = NULL; - odp_bool_t allocated = false; - odp_packet_t out_pkt = *pkt_out; + odp_packet_t out_pkt; odp_crypto_packet_result_t *op_result; odp_bool_t result_ok = true; @@ -1822,19 +1873,6 @@ int odp_crypto_int(odp_packet_t pkt_in, if (odp_unlikely(session == NULL)) return -1; - /* Resolve output buffer */ - if (ODP_PACKET_INVALID == out_pkt && - ODP_POOL_INVALID != session->p.output_pool) { - out_pkt = odp_packet_alloc(session->p.output_pool, - odp_packet_len(pkt_in)); - allocated = true; - } - - if (odp_unlikely(ODP_PACKET_INVALID == out_pkt)) { - ODP_DBG("Alloc failed.\n"); - return -1; - } - op = rte_crypto_op_alloc(global->crypto_op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC); if (odp_unlikely(op == NULL)) { @@ -1842,29 +1880,9 @@ int odp_crypto_int(odp_packet_t pkt_in, goto err; } - if (pkt_in != out_pkt) { - int ret; - int md_copy; - - md_copy = _odp_packet_copy_md_possible(odp_packet_pool(out_pkt), - odp_packet_pool(pkt_in)); - if (odp_unlikely(md_copy < 0)) { - ODP_ERR("Unable to copy packet metadata\n"); - goto err; - } - - ret = odp_packet_copy_from_pkt(out_pkt, - 0, - pkt_in, - 0, - odp_packet_len(pkt_in)); - if (odp_unlikely(ret < 0)) - goto err; - - _odp_packet_copy_md(packet_hdr(out_pkt), packet_hdr(pkt_in), md_copy); - odp_packet_free(pkt_in); - pkt_in = ODP_PACKET_INVALID; - } + out_pkt = get_output_packet(session, pkt_in, *pkt_out); + if (odp_unlikely(out_pkt == ODP_PACKET_INVALID)) + goto err; if (odp_unlikely(linearize_pkt(session, out_pkt))) { result_ok = false; @@ -1995,10 +2013,6 @@ out: err: if (op) rte_crypto_op_free(op); - if (allocated) { - odp_packet_free(out_pkt); - out_pkt = ODP_PACKET_INVALID; - } return -1; } |