From: Jasvinder Singh Date: Wed, 26 Sep 2018 13:08:51 +0000 (+0100) Subject: net/softnic: update DSCP table X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=8602bcae02026efb2c98a8b9b88ecf03527cb791;p=dpdk.git net/softnic: update DSCP table Implement meter object dscp table update. Signed-off-by: Jasvinder Singh --- diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h index 4b0f54c847..78864e7aae 100644 --- a/drivers/net/softnic/rte_eth_softnic_internals.h +++ b/drivers/net/softnic/rte_eth_softnic_internals.h @@ -464,6 +464,7 @@ struct softnic_table { struct softnic_table_action_profile *ap; struct rte_table_action *a; struct flow_list flows; + struct rte_table_action_dscp_table dscp_table; struct softnic_table_meter_profile_list meter_profiles; }; diff --git a/drivers/net/softnic/rte_eth_softnic_meter.c b/drivers/net/softnic/rte_eth_softnic_meter.c index 68daf8af68..ed44767fe5 100644 --- a/drivers/net/softnic/rte_eth_softnic_meter.c +++ b/drivers/net/softnic/rte_eth_softnic_meter.c @@ -433,6 +433,58 @@ pmd_mtr_meter_profile_update(struct rte_eth_dev *dev, return 0; } +/* MTR object meter DSCP table update */ +static int +pmd_mtr_meter_dscp_table_update(struct rte_eth_dev *dev, + uint32_t mtr_id, + enum rte_mtr_color *dscp_table, + struct rte_mtr_error *error) +{ + struct pmd_internals *p = dev->data->dev_private; + struct rte_table_action_dscp_table dt; + struct pipeline *pipeline; + struct softnic_table *table; + struct softnic_mtr *m; + uint32_t table_id, i; + int status; + + /* MTR object id must be valid */ + m = softnic_mtr_find(p, mtr_id); + if (m == NULL) + return -rte_mtr_error_set(error, + EEXIST, + RTE_MTR_ERROR_TYPE_MTR_ID, + NULL, + "MTR object id not valid"); + + /* MTR object owner valid? */ + if (m->flow == NULL) + return 0; + + pipeline = m->flow->pipeline; + table_id = m->flow->table_id; + table = &pipeline->table[table_id]; + + memcpy(&dt, &table->dscp_table, sizeof(dt)); + for (i = 0; i < RTE_DIM(dt.entry); i++) + dt.entry[i].color = (enum rte_meter_color)dscp_table[i]; + + /* Update table */ + status = softnic_pipeline_table_dscp_table_update(p, + pipeline->name, + table_id, + UINT64_MAX, + &dt); + if (status) + return -rte_mtr_error_set(error, + EINVAL, + RTE_MTR_ERROR_TYPE_UNSPECIFIED, + NULL, + "Table action dscp table update failed"); + + return 0; +} + const struct rte_mtr_ops pmd_mtr_ops = { .capabilities_get = NULL, @@ -445,7 +497,7 @@ const struct rte_mtr_ops pmd_mtr_ops = { .meter_disable = NULL, .meter_profile_update = pmd_mtr_meter_profile_update, - .meter_dscp_table_update = NULL, + .meter_dscp_table_update = pmd_mtr_meter_dscp_table_update, .policer_actions_update = NULL, .stats_update = NULL, diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c b/drivers/net/softnic/rte_eth_softnic_pipeline.c index 17830d319c..3d37ba3fee 100644 --- a/drivers/net/softnic/rte_eth_softnic_pipeline.c +++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c @@ -1000,6 +1000,7 @@ softnic_pipeline_table_create(struct pmd_internals *softnic, 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; diff --git a/drivers/net/softnic/rte_eth_softnic_thread.c b/drivers/net/softnic/rte_eth_softnic_thread.c index 11d08d4167..76217fcde5 100644 --- a/drivers/net/softnic/rte_eth_softnic_thread.c +++ b/drivers/net/softnic/rte_eth_softnic_thread.c @@ -1902,6 +1902,11 @@ softnic_pipeline_table_dscp_table_update(struct pmd_internals *softnic, dscp_mask, dscp_table); + /* Update table dscp table */ + if (!status) + memcpy(&p->table[table_id].dscp_table, dscp_table, + sizeof(p->table[table_id].dscp_table)); + return status; } @@ -1925,6 +1930,11 @@ softnic_pipeline_table_dscp_table_update(struct pmd_internals *softnic, /* Read response */ status = rsp->status; + /* Update table dscp table */ + if (!status) + memcpy(&p->table[table_id].dscp_table, dscp_table, + sizeof(p->table[table_id].dscp_table)); + /* Free response */ pipeline_msg_free(rsp);