Hi Bernard,
<snip>
> --- a/lib/librte_table/rte_table_acl.c
> +++ b/lib/librte_table/rte_table_acl.c
> @@ -316,8 +316,7 @@ struct rte_table_acl {
> if (status == 0) {
> *key_found = 1;
> *entry_ptr = &acl->memory[i * acl->entry_size];
> - memcpy(*entry_ptr, entry, acl->entry_size);
> -
> + memcpy(entry, *entry_ptr, acl->entry_size);
> return 0;
> }
> }
In this case, table entry which is being added already presents in the table.
So, first the pointer to that entry from the memory[] that stores the pipeline
table data(struct rte_pipeline_table_entry) associated with key is retrieved
and the changes (action and metadara) are stored in the internal table pointed
by action_table. So, above fix doesn't seem correct.
> @@ -353,8 +352,8 @@ struct rte_table_acl {
> rte_acl_free(acl->ctx);
> acl->ctx = ctx;
> *key_found = 0;
> - *entry_ptr = &acl->memory[free_pos * acl->entry_size];
> - memcpy(*entry_ptr, entry, acl->entry_size);
> + *entry_ptr = &acl->acl_rule_memory[free_pos * acl->entry_size];
> + memcpy(entry, *entry_ptr, acl->entry_size);
>
> return 0;
> }
> @@ -435,7 +434,7 @@ struct rte_table_acl {
> acl->ctx = ctx;
> *key_found = 1;
> if (entry != NULL)
> - memcpy(entry, &acl->memory[pos * acl->entry_size],
> + memcpy(entry, &acl->acl_rule_memory[pos * acl-
> >entry_size],
> acl->entry_size);
Above fixes also seems not correct. As per documentation, *entry_ptr is
intended to store the handle to the pipeline table entry containing the data
associated with the current key instead of pointing to memory used to store the
acl rules, etc. Please refer rte_table_acl_create() where memory is initialized
and organized to stores different types of internal tables (pointed by
action_table, acl_rule_list and acl_rule_memory).