The regular tables, selector tables and learner tables are all sharing
the table state array. The locations in this array were computed
incorrectly, leading to memory corruption issues.

Signed-off-by: Cristian Dumitrescu <cristian.dumitre...@intel.com>
Signed-off-by: Harshad Narayane <harshad.suresh.naray...@intel.com>
Signed-off-by: Kamalakannan R <kamalakanna...@intel.com>
Signed-off-by: Venkata Suresh Kumar P <venkata.suresh.kuma...@intel.com>

Fixes: 4f59d3726147 ("pipeline: support learner tables")
Cc: sta...@dpdk.org
---
 lib/pipeline/rte_swx_ctl.c      | 28 +++++++++++++++++-----------
 lib/pipeline/rte_swx_pipeline.c |  2 +-
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/lib/pipeline/rte_swx_ctl.c b/lib/pipeline/rte_swx_ctl.c
index 8e29d58cec..f52ccffd75 100644
--- a/lib/pipeline/rte_swx_ctl.c
+++ b/lib/pipeline/rte_swx_ctl.c
@@ -1021,15 +1021,16 @@ learner_action_data_size_get(struct 
rte_swx_ctl_pipeline *ctl, struct learner *l
 static void
 table_state_free(struct rte_swx_ctl_pipeline *ctl)
 {
-       uint32_t i;
+       uint32_t table_base_index, selector_base_index, learner_base_index, i;
 
        if (!ctl->ts_next)
                return;
 
        /* For each table, free its table state. */
+       table_base_index = 0;
        for (i = 0; i < ctl->info.n_tables; i++) {
                struct table *table = &ctl->tables[i];
-               struct rte_swx_table_state *ts = &ctl->ts_next[i];
+               struct rte_swx_table_state *ts = &ctl->ts_next[table_base_index 
+ i];
 
                /* Default action data. */
                free(ts->default_action_data);
@@ -1040,8 +1041,9 @@ table_state_free(struct rte_swx_ctl_pipeline *ctl)
        }
 
        /* For each selector table, free its table state. */
+       selector_base_index = ctl->info.n_tables;
        for (i = 0; i < ctl->info.n_selectors; i++) {
-               struct rte_swx_table_state *ts = &ctl->ts_next[i];
+               struct rte_swx_table_state *ts = 
&ctl->ts_next[selector_base_index + i];
 
                /* Table object. */
                if (ts->obj)
@@ -1049,8 +1051,9 @@ table_state_free(struct rte_swx_ctl_pipeline *ctl)
        }
 
        /* For each learner table, free its table state. */
+       learner_base_index = ctl->info.n_tables + ctl->info.n_selectors;
        for (i = 0; i < ctl->info.n_learners; i++) {
-               struct rte_swx_table_state *ts = &ctl->ts_next[i];
+               struct rte_swx_table_state *ts = 
&ctl->ts_next[learner_base_index + i];
 
                /* Default action data. */
                free(ts->default_action_data);
@@ -1063,10 +1066,10 @@ table_state_free(struct rte_swx_ctl_pipeline *ctl)
 static int
 table_state_create(struct rte_swx_ctl_pipeline *ctl)
 {
+       uint32_t table_base_index, selector_base_index, learner_base_index, i;
        int status = 0;
-       uint32_t i;
 
-       ctl->ts_next = calloc(ctl->info.n_tables + ctl->info.n_selectors,
+       ctl->ts_next = calloc(ctl->info.n_tables + ctl->info.n_selectors + 
ctl->info.n_learners,
                              sizeof(struct rte_swx_table_state));
        if (!ctl->ts_next) {
                status = -ENOMEM;
@@ -1074,10 +1077,11 @@ table_state_create(struct rte_swx_ctl_pipeline *ctl)
        }
 
        /* Tables. */
+       table_base_index = 0;
        for (i = 0; i < ctl->info.n_tables; i++) {
                struct table *table = &ctl->tables[i];
-               struct rte_swx_table_state *ts = &ctl->ts[i];
-               struct rte_swx_table_state *ts_next = &ctl->ts_next[i];
+               struct rte_swx_table_state *ts = &ctl->ts[table_base_index + i];
+               struct rte_swx_table_state *ts_next = 
&ctl->ts_next[table_base_index + i];
 
                /* Table object. */
                if (!table->is_stub && table->ops.add) {
@@ -1110,9 +1114,10 @@ table_state_create(struct rte_swx_ctl_pipeline *ctl)
        }
 
        /* Selector tables. */
+       selector_base_index = ctl->info.n_tables;
        for (i = 0; i < ctl->info.n_selectors; i++) {
                struct selector *s = &ctl->selectors[i];
-               struct rte_swx_table_state *ts_next = 
&ctl->ts_next[ctl->info.n_tables + i];
+               struct rte_swx_table_state *ts_next = 
&ctl->ts_next[selector_base_index + i];
 
                /* Table object. */
                ts_next->obj = rte_swx_table_selector_create(&s->params, NULL, 
ctl->numa_node);
@@ -1123,10 +1128,11 @@ table_state_create(struct rte_swx_ctl_pipeline *ctl)
        }
 
        /* Learner tables. */
+       learner_base_index = ctl->info.n_tables + ctl->info.n_selectors;
        for (i = 0; i < ctl->info.n_learners; i++) {
                struct learner *l = &ctl->learners[i];
-               struct rte_swx_table_state *ts = &ctl->ts[i];
-               struct rte_swx_table_state *ts_next = &ctl->ts_next[i];
+               struct rte_swx_table_state *ts = &ctl->ts[learner_base_index + 
i];
+               struct rte_swx_table_state *ts_next = 
&ctl->ts_next[learner_base_index + i];
 
                /* Table object: duplicate from the current table state. */
                ts_next->obj = ts->obj;
diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c
index eb54ccaeda..868010303c 100644
--- a/lib/pipeline/rte_swx_pipeline.c
+++ b/lib/pipeline/rte_swx_pipeline.c
@@ -8566,7 +8566,7 @@ table_state_build(struct rte_swx_pipeline *p)
        struct selector *s;
        struct learner *l;
 
-       p->table_state = calloc(p->n_tables + p->n_selectors,
+       p->table_state = calloc(p->n_tables + p->n_selectors + p->n_learners,
                                sizeof(struct rte_swx_table_state));
        CHECK(p->table_state, ENOMEM);
 
-- 
2.17.1

Reply via email to