New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / softnic / rte_eth_softnic_pipeline.c
index 45136a4..5e180f8 100644 (file)
 #include <rte_port_source_sink.h>
 #include <rte_port_fd.h>
 #include <rte_port_sched.h>
+#include <rte_port_sym_crypto.h>
 
 #include <rte_table_acl.h>
 #include <rte_table_array.h>
 #include <rte_table_hash.h>
+#include <rte_table_hash_func.h>
 #include <rte_table_lpm.h>
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
 
 #include "rte_eth_softnic_internals.h"
 
-#include "hash_func.h"
-
 #ifndef PIPELINE_MSGQ_SIZE
 #define PIPELINE_MSGQ_SIZE                                 64
 #endif
@@ -43,17 +43,52 @@ softnic_pipeline_init(struct pmd_internals *p)
        return 0;
 }
 
+static void
+softnic_pipeline_table_free(struct softnic_table *table)
+{
+       for ( ; ; ) {
+               struct rte_flow *flow;
+
+               flow = TAILQ_FIRST(&table->flows);
+               if (flow == NULL)
+                       break;
+
+               TAILQ_REMOVE(&table->flows, flow, node);
+               free(flow);
+       }
+
+       for ( ; ; ) {
+               struct softnic_table_meter_profile *mp;
+
+               mp = TAILQ_FIRST(&table->meter_profiles);
+               if (mp == NULL)
+                       break;
+
+               TAILQ_REMOVE(&table->meter_profiles, mp, node);
+               free(mp);
+       }
+}
+
 void
 softnic_pipeline_free(struct pmd_internals *p)
 {
        for ( ; ; ) {
                struct pipeline *pipeline;
+               uint32_t table_id;
 
                pipeline = TAILQ_FIRST(&p->pipeline_list);
                if (pipeline == NULL)
                        break;
 
                TAILQ_REMOVE(&p->pipeline_list, pipeline, node);
+
+               for (table_id = 0; table_id < pipeline->n_tables; table_id++) {
+                       struct softnic_table *table =
+                               &pipeline->table[table_id];
+
+                       softnic_pipeline_table_free(table);
+               }
+
                rte_ring_free(pipeline->msgq_req);
                rte_ring_free(pipeline->msgq_rsp);
                rte_pipeline_free(pipeline->p);
@@ -160,6 +195,7 @@ softnic_pipeline_create(struct pmd_internals *softnic,
        /* Node fill in */
        strlcpy(pipeline->name, name, sizeof(pipeline->name));
        pipeline->p = p;
+       memcpy(&pipeline->params, params, sizeof(*params));
        pipeline->n_ports_in = 0;
        pipeline->n_ports_out = 0;
        pipeline->n_tables = 0;
@@ -189,6 +225,7 @@ softnic_pipeline_port_in_create(struct pmd_internals *softnic,
                struct rte_port_sched_reader_params sched;
                struct rte_port_fd_reader_params fd;
                struct rte_port_source_params source;
+               struct rte_port_sym_crypto_reader_params cryptodev;
        } pp;
 
        struct pipeline *pipeline;
@@ -213,7 +250,7 @@ softnic_pipeline_port_in_create(struct pmd_internals *softnic,
                return -1;
 
        ap = NULL;
-       if (params->action_profile_name) {
+       if (strlen(params->action_profile_name)) {
                ap = softnic_port_in_action_profile_find(softnic,
                        params->action_profile_name);
                if (ap == NULL)
@@ -306,6 +343,23 @@ softnic_pipeline_port_in_create(struct pmd_internals *softnic,
                break;
        }
 
+       case PORT_IN_CRYPTODEV:
+       {
+               struct softnic_cryptodev *cryptodev;
+
+               cryptodev = softnic_cryptodev_find(softnic, params->dev_name);
+               if (cryptodev == NULL)
+                       return -1;
+
+               pp.cryptodev.cryptodev_id = cryptodev->dev_id;
+               pp.cryptodev.queue_id = params->cryptodev.queue_id;
+               pp.cryptodev.f_callback = params->cryptodev.f_callback;
+               pp.cryptodev.arg_callback = params->cryptodev.arg_callback;
+               p.ops = &rte_port_sym_crypto_reader_ops;
+               p.arg_create = &pp.cryptodev;
+               break;
+       }
+
        default:
                return -1;
        }
@@ -392,15 +446,18 @@ softnic_pipeline_port_out_create(struct pmd_internals *softnic,
                struct rte_port_sched_writer_params sched;
                struct rte_port_fd_writer_params fd;
                struct rte_port_sink_params sink;
+               struct rte_port_sym_crypto_writer_params cryptodev;
        } pp;
 
        union {
                struct rte_port_ethdev_writer_nodrop_params ethdev;
                struct rte_port_ring_writer_nodrop_params ring;
                struct rte_port_fd_writer_nodrop_params fd;
+               struct rte_port_sym_crypto_writer_nodrop_params cryptodev;
        } pp_nodrop;
 
        struct pipeline *pipeline;
+       struct softnic_port_out *port_out;
        uint32_t port_id;
        int status;
 
@@ -526,6 +583,40 @@ softnic_pipeline_port_out_create(struct pmd_internals *softnic,
                break;
        }
 
+       case PORT_OUT_CRYPTODEV:
+       {
+               struct softnic_cryptodev *cryptodev;
+
+               cryptodev = softnic_cryptodev_find(softnic, params->dev_name);
+               if (cryptodev == NULL)
+                       return -1;
+
+               if (params->cryptodev.queue_id >= cryptodev->n_queues)
+                       return -1;
+
+               pp.cryptodev.cryptodev_id = cryptodev->dev_id;
+               pp.cryptodev.queue_id = params->cryptodev.queue_id;
+               pp.cryptodev.tx_burst_sz = params->burst_size;
+               pp.cryptodev.crypto_op_offset = params->cryptodev.op_offset;
+
+               pp_nodrop.cryptodev.cryptodev_id = cryptodev->dev_id;
+               pp_nodrop.cryptodev.queue_id = params->cryptodev.queue_id;
+               pp_nodrop.cryptodev.tx_burst_sz = params->burst_size;
+               pp_nodrop.cryptodev.n_retries = params->retry;
+               pp_nodrop.cryptodev.crypto_op_offset =
+                               params->cryptodev.op_offset;
+
+               if (params->retry == 0) {
+                       p.ops = &rte_port_sym_crypto_writer_ops;
+                       p.arg_create = &pp.cryptodev;
+               } else {
+                       p.ops = &rte_port_sym_crypto_writer_nodrop_ops;
+                       p.arg_create = &pp_nodrop.cryptodev;
+               }
+
+               break;
+       }
+
        default:
                return -1;
        }
@@ -542,6 +633,8 @@ softnic_pipeline_port_out_create(struct pmd_internals *softnic,
                return -1;
 
        /* Pipeline */
+       port_out = &pipeline->port_out[pipeline->n_ports_out];
+       memcpy(&port_out->params, params, sizeof(*params));
        pipeline->n_ports_out++;
 
        return 0;
@@ -730,7 +823,7 @@ softnic_pipeline_table_create(struct pmd_internals *softnic,
                return -1;
 
        ap = NULL;
-       if (params->action_profile_name) {
+       if (strlen(params->action_profile_name)) {
                ap = softnic_table_action_profile_find(softnic,
                        params->action_profile_name);
                if (ap == NULL)
@@ -797,28 +890,28 @@ softnic_pipeline_table_create(struct pmd_internals *softnic,
 
                switch (params->match.hash.key_size) {
                case  8:
-                       f_hash = hash_default_key8;
+                       f_hash = rte_table_hash_crc_key8;
                        break;
                case 16:
-                       f_hash = hash_default_key16;
+                       f_hash = rte_table_hash_crc_key16;
                        break;
                case 24:
-                       f_hash = hash_default_key24;
+                       f_hash = rte_table_hash_crc_key24;
                        break;
                case 32:
-                       f_hash = hash_default_key32;
+                       f_hash = rte_table_hash_crc_key32;
                        break;
                case 40:
-                       f_hash = hash_default_key40;
+                       f_hash = rte_table_hash_crc_key40;
                        break;
                case 48:
-                       f_hash = hash_default_key48;
+                       f_hash = rte_table_hash_crc_key48;
                        break;
                case 56:
-                       f_hash = hash_default_key56;
+                       f_hash = rte_table_hash_crc_key56;
                        break;
                case 64:
-                       f_hash = hash_default_key64;
+                       f_hash = rte_table_hash_crc_key64;
                        break;
                default:
                        return -1;
@@ -960,7 +1053,51 @@ softnic_pipeline_table_create(struct pmd_internals *softnic,
        memcpy(&table->params, params, sizeof(*params));
        table->ap = ap;
        table->a = action;
+       TAILQ_INIT(&table->flows);
+       TAILQ_INIT(&table->meter_profiles);
+       memset(&table->dscp_table, 0, sizeof(table->dscp_table));
        pipeline->n_tables++;
 
        return 0;
 }
+
+int
+softnic_pipeline_port_out_find(struct pmd_internals *softnic,
+               const char *pipeline_name,
+               const char *name,
+               uint32_t *port_id)
+{
+       struct pipeline *pipeline;
+       uint32_t i;
+
+       if (softnic == NULL ||
+                       pipeline_name == NULL ||
+                       name == NULL ||
+                       port_id == NULL)
+               return -1;
+
+       pipeline = softnic_pipeline_find(softnic, pipeline_name);
+       if (pipeline == NULL)
+               return -1;
+
+       for (i = 0; i < pipeline->n_ports_out; i++)
+               if (strcmp(pipeline->port_out[i].params.dev_name, name) == 0) {
+                       *port_id = i;
+                       return 0;
+               }
+
+       return -1;
+}
+
+struct softnic_table_meter_profile *
+softnic_pipeline_table_meter_profile_find(struct softnic_table *table,
+       uint32_t meter_profile_id)
+{
+       struct softnic_table_meter_profile *mp;
+
+       TAILQ_FOREACH(mp, &table->meter_profiles, node)
+               if (mp->meter_profile_id == meter_profile_id)
+                       return mp;
+
+       return NULL;
+}