From: Reshma Pattan Date: Tue, 11 Sep 2018 14:20:35 +0000 (+0100) Subject: net/softnic: add table and port helper functions X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=51442e068453e91897b84cd6c04425119b8481f5;p=dpdk.git net/softnic: add table and port helper functions Added utility function to freeup the pipeline tables. Added utility functions to find the pipeline output port. Signed-off-by: Cristian Dumitrescu Signed-off-by: Reshma Pattan --- diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h index f40215dfe3..9c587bc7d9 100644 --- a/drivers/net/softnic/rte_eth_softnic_internals.h +++ b/drivers/net/softnic/rte_eth_softnic_internals.h @@ -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, diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c b/drivers/net/softnic/rte_eth_softnic_pipeline.c index db83dcced0..d1127a195a 100644 --- a/drivers/net/softnic/rte_eth_softnic_pipeline.c +++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c @@ -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; +}