ethdev: add group jump action
Add jump action type which defines an action which allows a matched flow to be redirect to the specified group. This allows physical and logical flow table/group hierarchies to be defined through rte_flow. This breaks ABI compatibility for the following public functions (as it modifes the ordering of the rte_flow_action_type enumeration): - rte_flow_copy() - rte_flow_create() - rte_flow_query() - rte_flow_validate() Add support for specification of new JUMP action to testpmd's flow cli, and update the testpmd documentation to describe this new action. Signed-off-by: Declan Doherty <declan.doherty@intel.com>
This commit is contained in:
parent
3850cf0c8c
commit
2f82d143fb
@ -183,6 +183,8 @@ enum index {
|
||||
ACTION_END,
|
||||
ACTION_VOID,
|
||||
ACTION_PASSTHRU,
|
||||
ACTION_JUMP,
|
||||
ACTION_JUMP_GROUP,
|
||||
ACTION_MARK,
|
||||
ACTION_MARK_ID,
|
||||
ACTION_FLAG,
|
||||
@ -738,6 +740,7 @@ static const enum index next_action[] = {
|
||||
ACTION_END,
|
||||
ACTION_VOID,
|
||||
ACTION_PASSTHRU,
|
||||
ACTION_JUMP,
|
||||
ACTION_MARK,
|
||||
ACTION_FLAG,
|
||||
ACTION_QUEUE,
|
||||
@ -856,6 +859,12 @@ static const enum index action_of_push_mpls[] = {
|
||||
ZERO,
|
||||
};
|
||||
|
||||
static const enum index action_jump[] = {
|
||||
ACTION_JUMP_GROUP,
|
||||
ACTION_NEXT,
|
||||
ZERO,
|
||||
};
|
||||
|
||||
static int parse_init(struct context *, const struct token *,
|
||||
const char *, unsigned int,
|
||||
void *, unsigned int);
|
||||
@ -1931,6 +1940,20 @@ static const struct token token_list[] = {
|
||||
.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),
|
||||
.call = parse_vc,
|
||||
},
|
||||
[ACTION_JUMP] = {
|
||||
.name = "jump",
|
||||
.help = "redirect traffic to a given group",
|
||||
.priv = PRIV_ACTION(JUMP, sizeof(struct rte_flow_action_jump)),
|
||||
.next = NEXT(action_jump),
|
||||
.call = parse_vc,
|
||||
},
|
||||
[ACTION_JUMP_GROUP] = {
|
||||
.name = "group",
|
||||
.help = "group to redirect traffic to",
|
||||
.next = NEXT(action_jump, NEXT_ENTRY(UNSIGNED)),
|
||||
.args = ARGS(ARGS_ENTRY(struct rte_flow_action_jump, group)),
|
||||
.call = parse_vc_conf,
|
||||
},
|
||||
[ACTION_MARK] = {
|
||||
.name = "mark",
|
||||
.help = "attach 32 bit value to packets",
|
||||
|
@ -90,8 +90,12 @@ Thus predictable results for a given priority level can only be achieved
|
||||
with non-overlapping rules, using perfect matching on all protocol layers.
|
||||
|
||||
Flow rules can also be grouped, the flow rule priority is specific to the
|
||||
group they belong to. All flow rules in a given group are thus processed
|
||||
either before or after another group.
|
||||
group they belong to. All flow rules in a given group are thus processed within
|
||||
the context of that group. Groups are not linked by default, so the logical
|
||||
hierarchy of groups must be explicitly defined by flow rules themselves in each
|
||||
group using the JUMP action to define the next group to redirect too. Only flow
|
||||
rules defined in the default group 0 are guarantee to be matched against, this
|
||||
makes group 0 the origin of any group hierarchy defined by an application.
|
||||
|
||||
Support for multiple actions per rule may be implemented internally on top
|
||||
of non-default hardware priorities, as a result both features may not be
|
||||
@ -138,29 +142,34 @@ Attributes
|
||||
Attribute: Group
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
Flow rules can be grouped by assigning them a common group number. Lower
|
||||
values have higher priority. Group 0 has the highest priority.
|
||||
Flow rules can be grouped by assigning them a common group number. Groups
|
||||
allow a logical hierarchy of flow rule groups (tables) to be defined. These
|
||||
groups can be supported virtually in the PMD or in the physical device.
|
||||
Group 0 is the default group and this is the only group which flows are
|
||||
guarantee to matched against, all subsequent groups can only be reached by
|
||||
way of the JUMP action from a matched flow rule.
|
||||
|
||||
Although optional, applications are encouraged to group similar rules as
|
||||
much as possible to fully take advantage of hardware capabilities
|
||||
(e.g. optimized matching) and work around limitations (e.g. a single pattern
|
||||
type possibly allowed in a given group).
|
||||
type possibly allowed in a given group), while being aware that the groups
|
||||
hierarchies must be programmed explicitly.
|
||||
|
||||
Note that support for more than a single group is not guaranteed.
|
||||
|
||||
Attribute: Priority
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A priority level can be assigned to a flow rule. Like groups, lower values
|
||||
A priority level can be assigned to a flow rule, lower values
|
||||
denote higher priority, with 0 as the maximum.
|
||||
|
||||
A rule with priority 0 in group 8 is always matched after a rule with
|
||||
priority 8 in group 0.
|
||||
|
||||
Group and priority levels are arbitrary and up to the application, they do
|
||||
Priority levels are arbitrary and up to the application, they do
|
||||
not need to be contiguous nor start from 0, however the maximum number
|
||||
varies between devices and may be affected by existing flow rules.
|
||||
|
||||
A flow which matches multiple rules in the same group will always matched by
|
||||
the rule with the highest priority in that group.
|
||||
|
||||
If a packet is matched by several rules of a given group for a given
|
||||
priority level, the outcome is undefined. It can take any path, may be
|
||||
duplicated or even cause unrecoverable errors.
|
||||
@ -1372,6 +1381,38 @@ flow rules:
|
||||
| 2 | END |
|
||||
+-------+----------------------------+
|
||||
|
||||
Action: ``JUMP``
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
Redirects packets to a group on the current device.
|
||||
|
||||
In a hierarchy of groups, which can be used to represent physical or logical
|
||||
flow group/tables on the device, this action redirects the matched flow to
|
||||
the specified group on that device.
|
||||
|
||||
If a matched flow is redirected to a table which doesn't contain a matching
|
||||
rule for that flow then the behavior is undefined and the resulting behavior
|
||||
is up to the specific device. Best practice when using groups would be define
|
||||
a default flow rule for each group which a defines the default actions in that
|
||||
group so a consistent behavior is defined.
|
||||
|
||||
Defining an action for matched flow in a group to jump to a group which is
|
||||
higher in the group hierarchy may not be supported by physical devices,
|
||||
depending on how groups are mapped to the physical devices. In the
|
||||
definitions of jump actions, applications should be aware that it may be
|
||||
possible to define flow rules which trigger an undefined behavior causing
|
||||
flows to loop between groups.
|
||||
|
||||
.. _table_rte_flow_action_jump:
|
||||
|
||||
.. table:: JUMP
|
||||
|
||||
+-----------+------------------------------+
|
||||
| Field | Value |
|
||||
+===========+==============================+
|
||||
| ``group`` | Group to redirect packets to |
|
||||
+-----------+------------------------------+
|
||||
|
||||
Action: ``MARK``
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -3453,6 +3453,10 @@ This section lists supported actions and their attributes, if any.
|
||||
|
||||
- ``passthru``: let subsequent rule process matched packets.
|
||||
|
||||
- ``jump``: redirect traffic to group on device.
|
||||
|
||||
- ``group {unsigned}``: group to redirect to.
|
||||
|
||||
- ``mark``: attach 32 bit value to packets.
|
||||
|
||||
- ``id {unsigned}``: 32 bit value to return with packets.
|
||||
|
@ -35,18 +35,20 @@ extern "C" {
|
||||
/**
|
||||
* Flow rule attributes.
|
||||
*
|
||||
* Priorities are set on two levels: per group and per rule within groups.
|
||||
* Priorities are set on a per rule based within groups.
|
||||
*
|
||||
* Lower values denote higher priority, the highest priority for both levels
|
||||
* is 0, so that a rule with priority 0 in group 8 is always matched after a
|
||||
* rule with priority 8 in group 0.
|
||||
* Lower values denote higher priority, the highest priority for a flow rule
|
||||
* is 0, so that a flow that matches for than one rule, the rule with the
|
||||
* lowest priority value will always be matched.
|
||||
*
|
||||
* Although optional, applications are encouraged to group similar rules as
|
||||
* much as possible to fully take advantage of hardware capabilities
|
||||
* (e.g. optimized matching) and work around limitations (e.g. a single
|
||||
* pattern type possibly allowed in a given group).
|
||||
* pattern type possibly allowed in a given group). Applications should be
|
||||
* aware that groups are not linked by default, and that they must be
|
||||
* explicitly linked by the application using the JUMP action.
|
||||
*
|
||||
* Group and priority levels are arbitrary and up to the application, they
|
||||
* Priority levels are arbitrary and up to the application, they
|
||||
* do not need to be contiguous nor start from 0, however the maximum number
|
||||
* varies between devices and may be affected by existing flow rules.
|
||||
*
|
||||
@ -69,7 +71,7 @@ extern "C" {
|
||||
*/
|
||||
struct rte_flow_attr {
|
||||
uint32_t group; /**< Priority group. */
|
||||
uint32_t priority; /**< Priority level within group. */
|
||||
uint32_t priority; /**< Rule priority level within group. */
|
||||
uint32_t ingress:1; /**< Rule applies to ingress traffic. */
|
||||
uint32_t egress:1; /**< Rule applies to egress traffic. */
|
||||
/**
|
||||
@ -1236,6 +1238,15 @@ enum rte_flow_action_type {
|
||||
*/
|
||||
RTE_FLOW_ACTION_TYPE_PASSTHRU,
|
||||
|
||||
/**
|
||||
* RTE_FLOW_ACTION_TYPE_JUMP
|
||||
*
|
||||
* Redirects packets to a group on the current device.
|
||||
*
|
||||
* See struct rte_flow_action_jump.
|
||||
*/
|
||||
RTE_FLOW_ACTION_TYPE_JUMP,
|
||||
|
||||
/**
|
||||
* Attaches an integer value to packets and sets PKT_RX_FDIR and
|
||||
* PKT_RX_FDIR_ID mbuf flags.
|
||||
@ -1481,6 +1492,22 @@ struct rte_flow_action_mark {
|
||||
uint32_t id; /**< Integer value to return with packets. */
|
||||
};
|
||||
|
||||
/**
|
||||
* @warning
|
||||
* @b EXPERIMENTAL: this structure may change without prior notice
|
||||
*
|
||||
* RTE_FLOW_ACTION_TYPE_JUMP
|
||||
*
|
||||
* Redirects packets to a group on the current device.
|
||||
*
|
||||
* In a hierarchy of groups, which can be used to represent physical or logical
|
||||
* flow tables on the device, this action allows the action to be a redirect to
|
||||
* a group on that device.
|
||||
*/
|
||||
struct rte_flow_action_jump {
|
||||
uint32_t group;
|
||||
};
|
||||
|
||||
/**
|
||||
* RTE_FLOW_ACTION_TYPE_QUEUE
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user