* ...
* }
* actions {
- * ACTION_NAME
+ * ACTION_NAME [ @tableonly | @defaultonly ]
* ...
* }
* default_action ACTION_NAME args none | ARGS_BYTE_ARRAY [ const ]
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);
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], "}")) {
}
/* 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)
}
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;
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;
* ...
* }
* actions {
- * ACTION_NAME args METADATA_FIELD_NAME
+ * ACTION_NAME [ @tableonly | @defaultonly]
* ...
* }
* default_action ACTION_NAME args none | ARGS_BYTE_ARRAY [ const ]
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;
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;
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], "}")) {
}
/* 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)
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;
}
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;
if (err_line)
*err_line = 0;
if (err_msg)
- *err_msg = "Null pipeline arument.";
+ *err_msg = "Null pipeline argument.";
status = -EINVAL;
goto error;
}