net/softnic: add table and port helper functions
authorReshma Pattan <reshma.pattan@intel.com>
Tue, 11 Sep 2018 14:20:35 +0000 (15:20 +0100)
committerCristian Dumitrescu <cristian.dumitrescu@intel.com>
Fri, 12 Oct 2018 15:59:01 +0000 (17:59 +0200)
Added utility function to freeup the
pipeline tables.

Added utility functions to find the pipeline
output port.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
drivers/net/softnic/rte_eth_softnic_internals.h
drivers/net/softnic/rte_eth_softnic_pipeline.c

index f40215d..9c587bc 100644 (file)
@@ -415,10 +415,15 @@ struct softnic_port_in {
        struct rte_port_in_action *a;
 };
 
+struct softnic_port_out {
+       struct softnic_port_out_params params;
+};
+
 struct softnic_table {
        struct softnic_table_params params;
        struct softnic_table_action_profile *ap;
        struct rte_table_action *a;
+       struct flow_list flows;
 };
 
 struct pipeline {
@@ -426,7 +431,9 @@ struct pipeline {
        char name[NAME_SIZE];
 
        struct rte_pipeline *p;
+       struct pipeline_params params;
        struct softnic_port_in port_in[RTE_PIPELINE_PORT_IN_MAX];
+       struct softnic_port_out port_out[RTE_PIPELINE_PORT_OUT_MAX];
        struct softnic_table table[RTE_PIPELINE_TABLE_MAX];
        uint32_t n_ports_in;
        uint32_t n_ports_out;
@@ -725,6 +732,12 @@ softnic_pipeline_port_out_create(struct pmd_internals *p,
        const char *pipeline_name,
        struct softnic_port_out_params *params);
 
+int
+softnic_pipeline_port_out_find(struct pmd_internals *softnic,
+               const char *pipeline_name,
+               const char *name,
+               uint32_t *port_id);
+
 int
 softnic_pipeline_table_create(struct pmd_internals *p,
        const char *pipeline_name,
index db83dcc..d1127a1 100644 (file)
@@ -42,17 +42,41 @@ 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);
+       }
+}
+
 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);
@@ -159,6 +183,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;
@@ -400,6 +425,7 @@ softnic_pipeline_port_out_create(struct pmd_internals *softnic,
        } pp_nodrop;
 
        struct pipeline *pipeline;
+       struct softnic_port_out *port_out;
        uint32_t port_id;
        int status;
 
@@ -541,6 +567,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;
@@ -959,7 +987,36 @@ softnic_pipeline_table_create(struct pmd_internals *softnic,
        memcpy(&table->params, params, sizeof(*params));
        table->ap = ap;
        table->a = action;
+       TAILQ_INIT(&table->flows);
        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;
+}