X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fpipeline%2Frte_swx_pipeline.h;h=77141bd3415bfd39250dc6463e3c56d3441d51cc;hb=f3ca33bb20925cca90184bd3f05ebedc78a929b2;hp=cd395ac39dbbd7f9a0a1876eafa47e846f71e29e;hpb=cdaa937d3eaab0704ee991908497171417c7c09b;p=dpdk.git diff --git a/lib/pipeline/rte_swx_pipeline.h b/lib/pipeline/rte_swx_pipeline.h index cd395ac39d..77141bd341 100644 --- a/lib/pipeline/rte_swx_pipeline.h +++ b/lib/pipeline/rte_swx_pipeline.h @@ -298,6 +298,14 @@ struct rte_swx_field_params { * Similar to C language structs, they are a well defined sequence of fields, * with each field having a unique name and a constant size. * + * In order to use structs to express variable size packet headers such as IPv4 + * with options, it is allowed for the last field of the struct type to have a + * variable size between 0 and *n_bits* bits, with the actual size of this field + * determined at run-time for each packet. This struct feature is restricted to + * just a few selected instructions that deal with packet headers, so a typical + * struct generally has a constant size that is fully known when its struct type + * is registered. + * * @param[in] p * Pipeline handle. * @param[in] name @@ -306,6 +314,10 @@ struct rte_swx_field_params { * The sequence of struct fields. * @param[in] n_fields * The number of struct fields. + * @param[in] last_field_has_variable_size + * If non-zero (true), then the last field has a variable size between 0 and + * *n_bits* bits, with its actual size determined at run-time for each packet. + * If zero (false), then the last field has a constant size of *n_bits* bits. * @return * 0 on success or the following error codes otherwise: * -EINVAL: Invalid argument; @@ -317,7 +329,8 @@ int rte_swx_pipeline_struct_type_register(struct rte_swx_pipeline *p, const char *name, struct rte_swx_field_params *fields, - uint32_t n_fields); + uint32_t n_fields, + int last_field_has_variable_size); /** * Pipeline packet header register @@ -554,6 +567,20 @@ struct rte_swx_pipeline_table_params { /** The set of actions for the current table. */ const char **action_names; + /** Array of *n_actions* flags. For each action, the associated flag + * indicates whether the action can be assigned to regular table entries + * (when non-zero, i.e. true) or not (when zero, i.e. false). When set + * to NULL, it defaults to true for all actions. + */ + int *action_is_for_table_entries; + + /** Array of *n_actions* flags. For each action, the associated flag + * indicates whether the action can be assigned to the default table + * entry (when non-zero, i.e. true) or not (when zero, i.e. false). + * When set to NULL, it defaults to true for all actions. + */ + int *action_is_for_default_entry; + /** The number of actions for the current table. Must be at least one. */ uint32_t n_actions; @@ -620,7 +647,7 @@ struct rte_swx_pipeline_selector_params { const char *group_id_field_name; /** The set of fields used to select (through a hashing scheme) the - * member within the current group. Inputs into the seletion operation. + * member within the current group. Inputs into the selection operation. * Restriction: All the selector fields must be part of the same struct, * i.e. part of the same header or part of the meta-data structure. */ @@ -663,6 +690,87 @@ rte_swx_pipeline_selector_config(struct rte_swx_pipeline *p, const char *name, struct rte_swx_pipeline_selector_params *params); +/** Pipeline learner table parameters. */ +struct rte_swx_pipeline_learner_params { + /** The set of match fields for the current table. + * Restriction: All the match fields of the current table need to be + * part of the same struct, i.e. either all the match fields are part of + * the same header or all the match fields are part of the meta-data. + */ + const char **field_names; + + /** The number of match fields for the current table. Must be non-zero. + */ + uint32_t n_fields; + + /** The set of actions for the current table. */ + const char **action_names; + + /** Array of *n_actions* flags. For each action, the associated flag + * indicates whether the action can be assigned to regular table entries + * (when non-zero, i.e. true) or not (when zero, i.e. false). When set + * to NULL, it defaults to true for all actions. + */ + int *action_is_for_table_entries; + + /** Array of *n_actions* flags. For each action, the associated flag + * indicates whether the action can be assigned to the default table + * entry (when non-zero, i.e. true) or not (when zero, i.e. false). + * When set to NULL, it defaults to true for all actions. + */ + int *action_is_for_default_entry; + + /** The number of actions for the current table. Must be at least one. + */ + uint32_t n_actions; + + /** The default table action that gets executed on lookup miss. Must be + * one of the table actions included in the *action_names*. + */ + const char *default_action_name; + + /** Default action data. The size of this array is the action data size + * of the default action. Must be NULL if the default action data size + * is zero. + */ + uint8_t *default_action_data; + + /** If non-zero (true), then the default action of the current table + * cannot be changed. If zero (false), then the default action can be + * changed in the future with another action from the *action_names* + * list. + */ + int default_action_is_const; +}; + +/** + * Pipeline learner table configure + * + * @param[out] p + * Pipeline handle. + * @param[in] name + * Learner table name. + * @param[in] params + * Learner table parameters. + * @param[in] size + * The maximum number of table entries. Must be non-zero. + * @param[in] timeout + * Table entry timeout in seconds. Must be non-zero. + * @return + * 0 on success or the following error codes otherwise: + * -EINVAL: Invalid argument; + * -ENOMEM: Not enough space/cannot allocate memory; + * -EEXIST: Learner table with this name already exists; + * -ENODEV: Learner table creation error. + */ +__rte_experimental +int +rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p, + const char *name, + struct rte_swx_pipeline_learner_params *params, + uint32_t size, + uint32_t timeout); + /** * Pipeline register array configure *