X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fpipeline%2Frte_swx_pipeline_spec.c;h=07a7580ac8398aae74dcebb5d61ecbc01415122a;hb=f3ca33bb20925cca90184bd3f05ebedc78a929b2;hp=d9cd1d05956ed2b123b956f28714fde3083e2d5a;hpb=4f59d3726147e7cf0ff98931b2512687727838ad;p=dpdk.git diff --git a/lib/pipeline/rte_swx_pipeline_spec.c b/lib/pipeline/rte_swx_pipeline_spec.c index d9cd1d0595..07a7580ac8 100644 --- a/lib/pipeline/rte_swx_pipeline_spec.c +++ b/lib/pipeline/rte_swx_pipeline_spec.c @@ -539,7 +539,7 @@ action_block_parse(struct action_spec *s, * ... * } * actions { - * ACTION_NAME + * ACTION_NAME [ @tableonly | @defaultonly ] * ... * } * default_action ACTION_NAME args none | ARGS_BYTE_ARRAY [ const ] @@ -597,6 +597,12 @@ table_spec_free(struct table_spec *s) free(s->params.default_action_data); s->params.default_action_data = NULL; + free(s->params.action_is_for_table_entries); + s->params.action_is_for_table_entries = NULL; + + free(s->params.action_is_for_default_entry); + s->params.action_is_for_default_entry = NULL; + s->params.default_action_is_const = 0; free(s->recommended_table_type_name); @@ -730,8 +736,10 @@ table_actions_block_parse(struct table_spec *s, uint32_t *err_line, const char **err_msg) { - const char **new_action_names; - char *name; + const char **new_action_names = NULL; + int *new_action_is_for_table_entries = NULL, *new_action_is_for_default_entry = NULL; + char *name = NULL; + int action_is_for_table_entries = 1, action_is_for_default_entry = 1; /* Handle end of block. */ if ((n_tokens == 1) && !strcmp(tokens[0], "}")) { @@ -740,7 +748,9 @@ table_actions_block_parse(struct table_spec *s, } /* Check input arguments. */ - if (n_tokens != 1) { + if ((n_tokens > 2) || + ((n_tokens == 2) && strcmp(tokens[1], "@tableonly") && + strcmp(tokens[1], "@defaultonly"))) { if (err_line) *err_line = n_lines; if (err_msg) @@ -749,18 +759,30 @@ table_actions_block_parse(struct table_spec *s, } name = strdup(tokens[0]); - if (!name) { - if (err_line) - *err_line = n_lines; - if (err_msg) - *err_msg = "Memory allocation failed."; - return -ENOMEM; + + if (n_tokens == 2) { + if (!strcmp(tokens[1], "@tableonly")) + action_is_for_default_entry = 0; + + if (!strcmp(tokens[1], "@defaultonly")) + action_is_for_table_entries = 0; } new_action_names = realloc(s->params.action_names, (s->params.n_actions + 1) * sizeof(char *)); - if (!new_action_names) { + new_action_is_for_table_entries = realloc(s->params.action_is_for_table_entries, + (s->params.n_actions + 1) * sizeof(int)); + new_action_is_for_default_entry = realloc(s->params.action_is_for_default_entry, + (s->params.n_actions + 1) * sizeof(int)); + + if (!name || + !new_action_names || + !new_action_is_for_table_entries || + !new_action_is_for_default_entry) { free(name); + free(new_action_names); + free(new_action_is_for_table_entries); + free(new_action_is_for_default_entry); if (err_line) *err_line = n_lines; @@ -771,6 +793,13 @@ table_actions_block_parse(struct table_spec *s, s->params.action_names = new_action_names; s->params.action_names[s->params.n_actions] = name; + + s->params.action_is_for_table_entries = new_action_is_for_table_entries; + s->params.action_is_for_table_entries[s->params.n_actions] = action_is_for_table_entries; + + s->params.action_is_for_default_entry = new_action_is_for_default_entry; + s->params.action_is_for_default_entry[s->params.n_actions] = action_is_for_default_entry; + s->params.n_actions++; return 0; @@ -1293,7 +1322,7 @@ selector_block_parse(struct selector_spec *s, * ... * } * actions { - * ACTION_NAME args METADATA_FIELD_NAME + * ACTION_NAME [ @tableonly | @defaultonly] * ... * } * default_action ACTION_NAME args none | ARGS_BYTE_ARRAY [ const ] @@ -1340,15 +1369,6 @@ learner_spec_free(struct learner_spec *s) free(s->params.action_names); s->params.action_names = NULL; - for (i = 0; i < s->params.n_actions; i++) { - uintptr_t name = (uintptr_t)s->params.action_field_names[i]; - - free((void *)name); - } - - free(s->params.action_field_names); - s->params.action_field_names = NULL; - s->params.n_actions = 0; default_action_name = (uintptr_t)s->params.default_action_name; @@ -1358,6 +1378,12 @@ learner_spec_free(struct learner_spec *s) free(s->params.default_action_data); s->params.default_action_data = NULL; + free(s->params.action_is_for_table_entries); + s->params.action_is_for_table_entries = NULL; + + free(s->params.action_is_for_default_entry); + s->params.action_is_for_default_entry = NULL; + s->params.default_action_is_const = 0; s->size = 0; @@ -1468,9 +1494,9 @@ learner_actions_block_parse(struct learner_spec *s, const char **err_msg) { const char **new_action_names = NULL; - const char **new_action_field_names = NULL; - char *action_name = NULL, *action_field_name = NULL; - int has_args = 1; + int *new_action_is_for_table_entries = NULL, *new_action_is_for_default_entry = NULL; + char *name = NULL; + int action_is_for_table_entries = 1, action_is_for_default_entry = 1; /* Handle end of block. */ if ((n_tokens == 1) && !strcmp(tokens[0], "}")) { @@ -1479,7 +1505,9 @@ learner_actions_block_parse(struct learner_spec *s, } /* Check input arguments. */ - if ((n_tokens != 3) || strcmp(tokens[1], "args")) { + if ((n_tokens > 2) || + ((n_tokens == 2) && strcmp(tokens[1], "@tableonly") && + strcmp(tokens[1], "@defaultonly"))) { if (err_line) *err_line = n_lines; if (err_msg) @@ -1487,28 +1515,31 @@ learner_actions_block_parse(struct learner_spec *s, return -EINVAL; } - if (!strcmp(tokens[2], "none")) - has_args = 0; + name = strdup(tokens[0]); - action_name = strdup(tokens[0]); + if (n_tokens == 2) { + if (!strcmp(tokens[1], "@tableonly")) + action_is_for_default_entry = 0; - if (has_args) - action_field_name = strdup(tokens[2]); + if (!strcmp(tokens[1], "@defaultonly")) + action_is_for_table_entries = 0; + } new_action_names = realloc(s->params.action_names, (s->params.n_actions + 1) * sizeof(char *)); + new_action_is_for_table_entries = realloc(s->params.action_is_for_table_entries, + (s->params.n_actions + 1) * sizeof(int)); + new_action_is_for_default_entry = realloc(s->params.action_is_for_default_entry, + (s->params.n_actions + 1) * sizeof(int)); - new_action_field_names = realloc(s->params.action_field_names, - (s->params.n_actions + 1) * sizeof(char *)); - - if (!action_name || - (has_args && !action_field_name) || + if (!name || !new_action_names || - !new_action_field_names) { - free(action_name); - free(action_field_name); + !new_action_is_for_table_entries || + !new_action_is_for_default_entry) { + free(name); free(new_action_names); - free(new_action_field_names); + free(new_action_is_for_table_entries); + free(new_action_is_for_default_entry); if (err_line) *err_line = n_lines; @@ -1518,9 +1549,14 @@ learner_actions_block_parse(struct learner_spec *s, } s->params.action_names = new_action_names; - s->params.action_names[s->params.n_actions] = action_name; - s->params.action_field_names = new_action_field_names; - s->params.action_field_names[s->params.n_actions] = action_field_name; + s->params.action_names[s->params.n_actions] = name; + + s->params.action_is_for_table_entries = new_action_is_for_table_entries; + s->params.action_is_for_table_entries[s->params.n_actions] = action_is_for_table_entries; + + s->params.action_is_for_default_entry = new_action_is_for_default_entry; + s->params.action_is_for_default_entry[s->params.n_actions] = action_is_for_default_entry; + s->params.n_actions++; return 0; @@ -1975,7 +2011,7 @@ rte_swx_pipeline_build_from_spec(struct rte_swx_pipeline *p, if (err_line) *err_line = 0; if (err_msg) - *err_msg = "Null pipeline arument."; + *err_msg = "Null pipeline argument."; status = -EINVAL; goto error; }