pipeline: remove unreachable branch
[dpdk.git] / lib / pipeline / rte_swx_pipeline.c
index 1cd09a4..2145ca0 100644 (file)
@@ -4539,8 +4539,6 @@ instr_meter_translate(struct rte_swx_pipeline *p,
                instr->meter.color_out.struct_id = (uint8_t)color_out_struct_id;
                instr->meter.color_out.n_bits = fcout->n_bits;
                instr->meter.color_out.offset = fcout->offset / 8;
-
-               return 0;
        }
 
        /* index = HMEFT, length = HMEFT, color_in = I, color_out = MEF. */
@@ -4575,8 +4573,6 @@ instr_meter_translate(struct rte_swx_pipeline *p,
                instr->meter.color_out.struct_id = (uint8_t)color_out_struct_id;
                instr->meter.color_out.n_bits = fcout->n_bits;
                instr->meter.color_out.offset = fcout->offset / 8;
-
-               return 0;
        }
 
        /* index = I, length = HMEFT, color_in = MEFT, color_out = MEF. */
@@ -4607,8 +4603,6 @@ instr_meter_translate(struct rte_swx_pipeline *p,
                instr->meter.color_out.struct_id = (uint8_t)color_out_struct_id;
                instr->meter.color_out.n_bits = fcout->n_bits;
                instr->meter.color_out.offset = fcout->offset / 8;
-
-               return 0;
        }
 
        /* index = I, length = HMEFT, color_in = I, color_out = MEF. */
@@ -4638,11 +4632,9 @@ instr_meter_translate(struct rte_swx_pipeline *p,
                instr->meter.color_out.struct_id = (uint8_t)color_out_struct_id;
                instr->meter.color_out.n_bits = fcout->n_bits;
                instr->meter.color_out.offset = fcout->offset / 8;
-
-               return 0;
        }
 
-       CHECK(0, EINVAL);
+       return 0;
 }
 
 static inline void
@@ -5937,7 +5929,7 @@ instr_translate(struct rte_swx_pipeline *p,
                                              instr,
                                              data);
 
-       CHECK(0, EINVAL);
+       return -EINVAL;
 }
 
 static struct instruction_data *
@@ -5983,7 +5975,7 @@ instr_label_check(struct instruction_data *instruction_data,
                        continue;
 
                for (j = i + 1; j < n_instructions; j++)
-                       CHECK(strcmp(label, data[j].label), EINVAL);
+                       CHECK(strcmp(label, instruction_data[j].label), EINVAL);
        }
 
        /* Get users for each instruction label. */
@@ -7309,7 +7301,7 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
                              uint32_t size)
 {
        struct table_type *type;
-       struct table *t;
+       struct table *t = NULL;
        struct action *default_action;
        struct header *header = NULL;
        uint32_t action_data_size_max = 0, i;
@@ -7336,6 +7328,7 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
                const char *action_name = params->action_names[i];
                struct action *a;
                uint32_t action_data_size;
+               int action_is_for_table_entries = 1, action_is_for_default_entry = 1;
 
                CHECK_NAME(action_name, EINVAL);
 
@@ -7346,6 +7339,12 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
                action_data_size = a->st ? a->st->n_bits / 8 : 0;
                if (action_data_size > action_data_size_max)
                        action_data_size_max = action_data_size;
+
+               if (params->action_is_for_table_entries)
+                       action_is_for_table_entries = params->action_is_for_table_entries[i];
+               if (params->action_is_for_default_entry)
+                       action_is_for_default_entry = params->action_is_for_default_entry[i];
+               CHECK(action_is_for_table_entries || action_is_for_default_entry, EINVAL);
        }
 
        CHECK_NAME(params->default_action_name, EINVAL);
@@ -7354,6 +7353,9 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
                            params->default_action_name))
                        break;
        CHECK(i < params->n_actions, EINVAL);
+       CHECK(!params->action_is_for_default_entry || params->action_is_for_default_entry[i],
+             EINVAL);
+
        default_action = action_find(p, params->default_action_name);
        CHECK((default_action->st && params->default_action_data) ||
              !params->default_action_data, EINVAL);
@@ -7377,31 +7379,31 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
 
        /* Memory allocation. */
        t = calloc(1, sizeof(struct table));
-       CHECK(t, ENOMEM);
+       if (!t)
+               goto nomem;
 
        t->fields = calloc(params->n_fields, sizeof(struct match_field));
-       if (!t->fields) {
-               free(t);
-               CHECK(0, ENOMEM);
-       }
+       if (!t->fields)
+               goto nomem;
 
        t->actions = calloc(params->n_actions, sizeof(struct action *));
-       if (!t->actions) {
-               free(t->fields);
-               free(t);
-               CHECK(0, ENOMEM);
-       }
+       if (!t->actions)
+               goto nomem;
 
        if (action_data_size_max) {
                t->default_action_data = calloc(1, action_data_size_max);
-               if (!t->default_action_data) {
-                       free(t->actions);
-                       free(t->fields);
-                       free(t);
-                       CHECK(0, ENOMEM);
-               }
+               if (!t->default_action_data)
+                       goto nomem;
        }
 
+       t->action_is_for_table_entries = calloc(params->n_actions, sizeof(int));
+       if (!t->action_is_for_table_entries)
+               goto nomem;
+
+       t->action_is_for_default_entry = calloc(params->n_actions, sizeof(int));
+       if (!t->action_is_for_default_entry)
+               goto nomem;
+
        /* Node initialization. */
        strcpy(t->name, name);
        if (args && args[0])
@@ -7420,8 +7422,18 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
        t->n_fields = params->n_fields;
        t->header = header;
 
-       for (i = 0; i < params->n_actions; i++)
+       for (i = 0; i < params->n_actions; i++) {
+               int action_is_for_table_entries = 1, action_is_for_default_entry = 1;
+
+               if (params->action_is_for_table_entries)
+                       action_is_for_table_entries = params->action_is_for_table_entries[i];
+               if (params->action_is_for_default_entry)
+                       action_is_for_default_entry = params->action_is_for_default_entry[i];
+
                t->actions[i] = action_find(p, params->action_names[i]);
+               t->action_is_for_table_entries[i] = action_is_for_table_entries;
+               t->action_is_for_default_entry[i] = action_is_for_default_entry;
+       }
        t->default_action = default_action;
        if (default_action->st)
                memcpy(t->default_action_data,
@@ -7439,6 +7451,19 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
        p->n_tables++;
 
        return 0;
+
+nomem:
+       if (!t)
+               return -ENOMEM;
+
+       free(t->action_is_for_default_entry);
+       free(t->action_is_for_table_entries);
+       free(t->default_action_data);
+       free(t->actions);
+       free(t->fields);
+       free(t);
+
+       return -ENOMEM;
 }
 
 static struct rte_swx_table_params *
@@ -8179,12 +8204,12 @@ rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
 
        /* Action checks. */
        CHECK(params->n_actions, EINVAL);
-
        CHECK(params->action_names, EINVAL);
        for (i = 0; i < params->n_actions; i++) {
                const char *action_name = params->action_names[i];
                struct action *a;
                uint32_t action_data_size;
+               int action_is_for_table_entries = 1, action_is_for_default_entry = 1;
 
                CHECK_NAME(action_name, EINVAL);
 
@@ -8201,6 +8226,12 @@ rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
                action_data_size = a->st ? a->st->n_bits / 8 : 0;
                if (action_data_size > action_data_size_max)
                        action_data_size_max = action_data_size;
+
+               if (params->action_is_for_table_entries)
+                       action_is_for_table_entries = params->action_is_for_table_entries[i];
+               if (params->action_is_for_default_entry)
+                       action_is_for_default_entry = params->action_is_for_default_entry[i];
+               CHECK(action_is_for_table_entries || action_is_for_default_entry, EINVAL);
        }
 
        CHECK_NAME(params->default_action_name, EINVAL);
@@ -8209,6 +8240,8 @@ rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
                            params->default_action_name))
                        break;
        CHECK(i < params->n_actions, EINVAL);
+       CHECK(!params->action_is_for_default_entry || params->action_is_for_default_entry[i],
+             EINVAL);
 
        default_action = action_find(p, params->default_action_name);
        CHECK((default_action->st && params->default_action_data) ||
@@ -8237,6 +8270,14 @@ rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
                        goto nomem;
        }
 
+       l->action_is_for_table_entries = calloc(params->n_actions, sizeof(int));
+       if (!l->action_is_for_table_entries)
+               goto nomem;
+
+       l->action_is_for_default_entry = calloc(params->n_actions, sizeof(int));
+       if (!l->action_is_for_default_entry)
+               goto nomem;
+
        /* Node initialization. */
        strcpy(l->name, name);
 
@@ -8252,8 +8293,18 @@ rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
 
        l->header = header;
 
-       for (i = 0; i < params->n_actions; i++)
+       for (i = 0; i < params->n_actions; i++) {
+               int action_is_for_table_entries = 1, action_is_for_default_entry = 1;
+
+               if (params->action_is_for_table_entries)
+                       action_is_for_table_entries = params->action_is_for_table_entries[i];
+               if (params->action_is_for_default_entry)
+                       action_is_for_default_entry = params->action_is_for_default_entry[i];
+
                l->actions[i] = action_find(p, params->action_names[i]);
+               l->action_is_for_table_entries[i] = action_is_for_table_entries;
+               l->action_is_for_default_entry[i] = action_is_for_default_entry;
+       }
 
        l->default_action = default_action;
 
@@ -8284,6 +8335,9 @@ nomem:
        if (!l)
                return -ENOMEM;
 
+       free(l->action_is_for_default_entry);
+       free(l->action_is_for_table_entries);
+       free(l->default_action_data);
        free(l->actions);
        free(l->fields);
        free(l);
@@ -9277,6 +9331,9 @@ rte_swx_ctl_table_action_info_get(struct rte_swx_pipeline *p,
 
        table_action->action_id = t->actions[table_action_id]->id;
 
+       table_action->action_is_for_table_entries = t->action_is_for_table_entries[table_action_id];
+       table_action->action_is_for_default_entry = t->action_is_for_default_entry[table_action_id];
+
        return 0;
 }
 
@@ -9464,6 +9521,12 @@ rte_swx_ctl_learner_action_info_get(struct rte_swx_pipeline *p,
 
        learner_action->action_id = l->actions[learner_action_id]->id;
 
+       learner_action->action_is_for_table_entries =
+               l->action_is_for_table_entries[learner_action_id];
+
+       learner_action->action_is_for_default_entry =
+               l->action_is_for_default_entry[learner_action_id];
+
        return 0;
 }