summaryrefslogtreecommitdiffstats
path: root/VNFs/DPPD-PROX/handle_esp.c
diff options
context:
space:
mode:
Diffstat (limited to 'VNFs/DPPD-PROX/handle_esp.c')
-rw-r--r--VNFs/DPPD-PROX/handle_esp.c146
1 files changed, 72 insertions, 74 deletions
diff --git a/VNFs/DPPD-PROX/handle_esp.c b/VNFs/DPPD-PROX/handle_esp.c
index 447fcfa2..5ac52822 100644
--- a/VNFs/DPPD-PROX/handle_esp.c
+++ b/VNFs/DPPD-PROX/handle_esp.c
@@ -34,7 +34,6 @@
#include "defines.h"
#include <rte_ip.h>
#include <rte_cryptodev.h>
-#include <rte_cryptodev_pmd.h>
#include <rte_bus_vdev.h>
#include "prox_port_cfg.h"
#include "prox_compat.h"
@@ -163,27 +162,24 @@ static void init_task_esp_enc(struct task_base *tbase, struct task_args *targ)
char name[64];
sprintf(name, "core_%03u_crypto_pool", lcore_id);
task->crypto_op_pool = rte_crypto_op_pool_create(name, RTE_CRYPTO_OP_TYPE_SYMMETRIC,
- 8192, 128, MAXIMUM_IV_LENGTH, rte_socket_id());
+ targ->nb_mbuf, 128, MAXIMUM_IV_LENGTH, rte_socket_id());
PROX_PANIC(task->crypto_op_pool == NULL, "Can't create ENC CRYPTO_OP_POOL\n");
task->cdev_id = get_cdev_id();
struct rte_cryptodev_config cdev_conf;
cdev_conf.nb_queue_pairs = 2;
- //cdev_conf.socket_id = SOCKET_ID_ANY;
cdev_conf.socket_id = rte_socket_id();
rte_cryptodev_configure(task->cdev_id, &cdev_conf);
unsigned int session_size = rte_cryptodev_sym_get_private_session_size(task->cdev_id);
plog_info("rte_cryptodev_sym_get_private_session_size=%d\n", session_size);
sprintf(name, "core_%03u_session_pool", lcore_id);
- task->session_pool = rte_mempool_create(name,
+ task->session_pool = rte_cryptodev_sym_session_pool_create(name,
MAX_SESSIONS,
session_size,
POOL_CACHE_SIZE,
- 0, NULL, NULL, NULL,
- NULL, rte_socket_id(),
- 0);
+ 0, rte_socket_id());
PROX_PANIC(task->session_pool == NULL, "Failed rte_mempool_create\n");
task->qp_id=0;
@@ -227,18 +223,8 @@ static void init_task_esp_enc(struct task_base *tbase, struct task_args *targ)
auth_xform.auth.iv.offset = 0;
auth_xform.auth.iv.length = 0;
- task->sess = rte_cryptodev_sym_session_create(task->session_pool);
- PROX_PANIC(task->sess == NULL, "Failed to create ENC session\n");
-
- ret = rte_cryptodev_sym_session_init(task->cdev_id, task->sess, &cipher_xform, task->session_pool);
- PROX_PANIC(ret < 0, "Failed sym_session_init\n");
-
- //TODO: doublecheck task->ops_burst lifecycle!
- if (rte_crypto_op_bulk_alloc(task->crypto_op_pool,
- RTE_CRYPTO_OP_TYPE_SYMMETRIC,
- task->ops_burst, NUM_OPS) != NUM_OPS) {
- PROX_PANIC(1, "Failed to allocate ENC crypto operations\n");
- }
+ task->sess = rte_cryptodev_sym_session_create(task->cdev_id, &cipher_xform, task->session_pool);
+ PROX_PANIC(task->sess < 0, "Failed ENC sym_session_create\n");
task->local_ipv4 = rte_cpu_to_be_32(targ->local_ipv4);
task->remote_ipv4 = rte_cpu_to_be_32(targ->remote_ipv4);
@@ -264,7 +250,7 @@ static void init_task_esp_dec(struct task_base *tbase, struct task_args *targ)
char name[64];
sprintf(name, "core_%03u_crypto_pool", lcore_id);
task->crypto_op_pool = rte_crypto_op_pool_create(name, RTE_CRYPTO_OP_TYPE_SYMMETRIC,
- 8192, 128, MAXIMUM_IV_LENGTH, rte_socket_id());
+ targ->nb_mbuf, 128, MAXIMUM_IV_LENGTH, rte_socket_id());
PROX_PANIC(task->crypto_op_pool == NULL, "Can't create DEC CRYPTO_OP_POOL\n");
task->cdev_id = get_cdev_id();
@@ -277,13 +263,11 @@ static void init_task_esp_dec(struct task_base *tbase, struct task_args *targ)
unsigned int session_size = rte_cryptodev_sym_get_private_session_size(task->cdev_id);
plog_info("rte_cryptodev_sym_get_private_session_size=%d\n", session_size);
sprintf(name, "core_%03u_session_pool", lcore_id);
- task->session_pool = rte_mempool_create(name,
+ task->session_pool = rte_cryptodev_sym_session_pool_create(name,
MAX_SESSIONS,
session_size,
POOL_CACHE_SIZE,
- 0, NULL, NULL, NULL,
- NULL, rte_socket_id(),
- 0);
+ 0, rte_socket_id());
PROX_PANIC(task->session_pool == NULL, "Failed rte_mempool_create\n");
task->qp_id=0;
@@ -326,18 +310,8 @@ static void init_task_esp_dec(struct task_base *tbase, struct task_args *targ)
auth_xform.auth.iv.offset = 0;
auth_xform.auth.iv.length = 0;
- task->sess = rte_cryptodev_sym_session_create(task->session_pool);
- PROX_PANIC(task->sess == NULL, "Failed to create ENC session\n");
-
- ret = rte_cryptodev_sym_session_init(task->cdev_id, task->sess, &cipher_xform, task->session_pool);
- PROX_PANIC(ret < 0, "Failed sym_session_init\n");
-
- //TODO: doublecheck task->ops_burst lifecycle!
- if (rte_crypto_op_bulk_alloc(task->crypto_op_pool,
- RTE_CRYPTO_OP_TYPE_SYMMETRIC,
- task->ops_burst, NUM_OPS) != NUM_OPS) {
- PROX_PANIC(1, "Failed to allocate DEC crypto operations\n");
- }
+ task->sess = rte_cryptodev_sym_session_create(task->cdev_id, &cipher_xform, task->session_pool);
+ PROX_PANIC(task->sess < 0, "Failed DEC sym_session_create\n");
task->local_ipv4 = rte_cpu_to_be_32(targ->local_ipv4);
//memcpy(&task->src_mac, &prox_port_cfg[task->base.tx_params_hw.tx_port_queue->port].eth_addr, sizeof(prox_rte_ether_addr));
@@ -625,65 +599,89 @@ static int handle_esp_enc_bulk(struct task_base *tbase, struct rte_mbuf **mbufs,
{
struct task_esp_enc *task = (struct task_esp_enc *)tbase;
uint8_t out[MAX_PKT_BURST];
- uint16_t i = 0, nb_rx = 0, nb_enc=0, j = 0;
+ uint8_t result;
+ uint16_t i = 0, nb_rx = 0, nb_enc=0, j = 0, idx = 0;
+ struct rte_mbuf *new_mbufs[MAX_PKT_BURST];
+ if (rte_crypto_op_bulk_alloc(task->crypto_op_pool,
+ RTE_CRYPTO_OP_TYPE_SYMMETRIC,
+ task->ops_burst, n_pkts) != n_pkts) {
+ PROX_PANIC(1, "Failed to allocate ENC crypto operations\n");
+ }
for (uint16_t j = 0; j < n_pkts; ++j) {
- out[j] = handle_esp_ah_enc(task, mbufs[j], task->ops_burst[nb_enc]);
- if (out[j] != OUT_DISCARD)
+ result = handle_esp_ah_enc(task, mbufs[j], task->ops_burst[nb_enc]);
+ if (result != OUT_DISCARD) {
++nb_enc;
+ }
+ else {
+ new_mbufs[idx] = mbufs[j];
+ out[idx] = result;
+ idx++;
+ }
}
-
- if (rte_cryptodev_enqueue_burst(task->cdev_id, task->qp_id, task->ops_burst, nb_enc) != nb_enc) {
- plog_info("Error enc enqueue_burst\n");
- return -1;
+ if (nb_enc) {
+ if (rte_cryptodev_enqueue_burst(task->cdev_id, task->qp_id, task->ops_burst, nb_enc) != nb_enc) {
+ plog_info("Error enc enqueue_burst\n");
+ return -1;
+ }
}
- do {
- nb_rx = rte_cryptodev_dequeue_burst(task->cdev_id, task->qp_id, task->ops_burst+i, nb_enc-i);
- i += nb_rx;
- } while (i < nb_enc);
-
- return task->base.tx_pkt(&task->base, mbufs, n_pkts, out);
+ nb_rx = rte_cryptodev_dequeue_burst(task->cdev_id, task->qp_id, task->ops_burst, MAX_PKT_BURST - idx);
+ for (uint16_t j = 0; j < nb_rx; ++j) {
+ new_mbufs[idx] = task->ops_burst[j]->sym->m_src;
+ out[idx] = 0;
+ rte_crypto_op_free(task->ops_burst[j]);
+ idx++;
+ }
+ return task->base.tx_pkt(&task->base, new_mbufs, idx, out);
}
static int handle_esp_dec_bulk(struct task_base *tbase, struct rte_mbuf **mbufs, uint16_t n_pkts)
{
struct task_esp_dec *task = (struct task_esp_dec *)tbase;
uint8_t out[MAX_PKT_BURST];
- uint16_t j, nb_dec=0, nb_rx=0;
+ uint8_t result;
+ uint16_t i = 0, nb_rx = 0, nb_dec=0, j = 0, idx = 0;
+ struct rte_mbuf *new_mbufs[MAX_PKT_BURST];
+ if (rte_crypto_op_bulk_alloc(task->crypto_op_pool,
+ RTE_CRYPTO_OP_TYPE_SYMMETRIC,
+ task->ops_burst, n_pkts) != n_pkts) {
+ PROX_PANIC(1, "Failed to allocate DEC crypto operations\n");
+ }
for (j = 0; j < n_pkts; ++j) {
- out[j] = handle_esp_ah_dec(task, mbufs[j], task->ops_burst[nb_dec]);
- if (out[j] != OUT_DISCARD)
+ result = handle_esp_ah_dec(task, mbufs[j], task->ops_burst[nb_dec]);
+ if (result != OUT_DISCARD)
++nb_dec;
+ else {
+ new_mbufs[idx] = mbufs[j];
+ out[idx] = result;
+ idx++;
+ }
}
-
- if (rte_cryptodev_enqueue_burst(task->cdev_id, task->qp_id, task->ops_burst, nb_dec) != nb_dec) {
- plog_info("Error dec enqueue_burst\n");
- return -1;
+ if (nb_dec) {
+ if (rte_cryptodev_enqueue_burst(task->cdev_id, task->qp_id, task->ops_burst, nb_dec) != nb_dec) {
+ plog_info("Error dec enqueue_burst\n");
+ return -1;
+ }
}
- j=0;
- do {
- nb_rx = rte_cryptodev_dequeue_burst(task->cdev_id, task->qp_id,
- task->ops_burst+j, nb_dec-j);
- j += nb_rx;
- } while (j < nb_dec);
-
- for (j = 0; j < nb_dec; ++j) {
- if (task->ops_burst[j]->status != RTE_CRYPTO_OP_STATUS_SUCCESS){
- plog_info("err: task->ops_burst[%d].status=%d\n", j, task->ops_burst[j]->status);
- //!!!TODO!!! find mbuf and discard it!!!
- //for now just send it further
- //plogdx_info(mbufs[j], "RX: ");
- }
+ nb_rx = rte_cryptodev_dequeue_burst(task->cdev_id, task->qp_id,
+ task->ops_burst, MAX_PKT_BURST - idx);
+
+ for (j = 0; j < nb_rx; ++j) {
+ new_mbufs[idx] = task->ops_burst[j]->sym->m_src;
if (task->ops_burst[j]->status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
- struct rte_mbuf *mbuf = task->ops_burst[j]->sym->m_src;
- handle_esp_ah_dec_finish2(task, mbuf);//TODO set out[j] properly
+ out[idx] = handle_esp_ah_dec_finish2(task, new_mbufs[idx]);
}
+ else {
+ out[idx] = OUT_DISCARD;
+ }
+ rte_crypto_op_free(task->ops_burst[j]);
+ idx++;
}
- return task->base.tx_pkt(&task->base, mbufs, n_pkts, out);
+ return task->base.tx_pkt(&task->base, new_mbufs, idx, out);
}
struct task_init task_init_esp_enc = {
@@ -695,7 +693,7 @@ struct task_init task_init_esp_enc = {
};
struct task_init task_init_esp_dec = {
- .mode = ESP_ENC,
+ .mode = ESP_DEC,
.mode_str = "esp_dec",
.init = init_task_esp_dec,
.handle = handle_esp_dec_bulk,