[dpdk-dev] [PATCH v4 05/16] ethdev: alter behavior of flow API actions
Andrew Rybchenko
arybchenko at solarflare.com
Wed Apr 18 14:26:00 CEST 2018
On 04/16/2018 07:22 PM, Adrien Mazarguil wrote:
> This patch makes the following changes to flow rule actions:
>
> - List order now matters, they are redefined as performed first to last
> instead of "all simultaneously".
>
> - Repeated actions are now supported (e.g. specifying QUEUE multiple times
> now duplicates traffic among them). Previously only the last action of
> any given kind was taken into account.
>
> - No more distinction between terminating/non-terminating/meta actions.
> Flow rules themselves are now defined as always terminating unless a
> PASSTHRU action is specified.
>
> These changes alter the behavior of flow rules in corner cases in order to
> prepare the flow API for actions that modify traffic contents or properties
> (e.g. encapsulation, compression) and for which order matter when combined.
>
> Previously one would have to do so through multiple flow rules by combining
> PASSTRHU with priority levels, however this proved overly complex to
> implement at the PMD level, hence this simpler approach.
>
> This breaks ABI compatibility for the following public functions:
>
> - rte_flow_create()
> - rte_flow_validate()
>
> PMDs with rte_flow support are modified accordingly:
>
> - bnxt: no change, implementation already forbids multiple actions and does
> not support PASSTHRU.
>
> - e1000: no change, same as bnxt.
>
> - enic: modified to forbid redundant actions, no support for default drop.
>
> - failsafe: no change needed.
>
> - i40e: no change, implementation already forbids multiple actions.
>
> - ixgbe: same as i40e.
>
> - mlx4: modified to forbid multiple fate-deciding actions and drop when
> unspecified.
>
> - mlx5: same as mlx4, with other redundant actions also forbidden.
>
> - sfc: same as mlx4.
>
> - tap: implementation already complies with the new behavior except for
> the default pass-through modified as a default drop.
>
> Signed-off-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com>
> Reviewed-by: Andrew Rybchenko <arybchenko at oktetlabs.ru>
> Cc: Ajit Khaparde <ajit.khaparde at broadcom.com>
> Cc: Wenzhuo Lu <wenzhuo.lu at intel.com>
> Cc: John Daley <johndale at cisco.com>
> Cc: Gaetan Rivet <gaetan.rivet at 6wind.com>
> Cc: Beilei Xing <beilei.xing at intel.com>
> Cc: Konstantin Ananyev <konstantin.ananyev at intel.com>
> Cc: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>
> Cc: Andrew Rybchenko <arybchenko at solarflare.com>
> Cc: Pascal Mazon <pascal.mazon at 6wind.com>
> ---
> doc/guides/prog_guide/rte_flow.rst | 67 +++++++++++++-------------------
> drivers/net/enic/enic_flow.c | 25 ++++++++++++
> drivers/net/mlx4/mlx4_flow.c | 21 +++++++---
> drivers/net/mlx5/mlx5_flow.c | 69 ++++++++++++++-------------------
> drivers/net/sfc/sfc_flow.c | 22 +++++++----
> drivers/net/tap/tap_flow.c | 11 ++++++
> lib/librte_ether/rte_flow.h | 54 +++++++-------------------
> 7 files changed, 138 insertions(+), 131 deletions(-)
[...]
> diff --git a/drivers/net/enic/enic_flow.c b/drivers/net/enic/enic_flow.c
> index b9f36587c..a5c6a1670 100644
> --- a/drivers/net/enic/enic_flow.c
> +++ b/drivers/net/enic/enic_flow.c
> @@ -975,6 +979,10 @@ enic_copy_action_v1(const struct rte_flow_action actions[],
> const struct rte_flow_action_queue *queue =
> (const struct rte_flow_action_queue *)
> actions->conf;
> +
> + if (overlap & FATE)
> + return ENOTSUP;
> + overlap |= FATE;
> enic_action->rq_idx =
> enic_rte_rq_idx_to_sop_idx(queue->index);
> break;
> @@ -984,6 +992,8 @@ enic_copy_action_v1(const struct rte_flow_action actions[],
> break;
> }
> }
> + if (!overlap & FATE)
Build using clang on Ubuntu 17.10 fails:
/var/tmp/dpdk-next-net/drivers/net/enic/enic_flow.c:1000:6: fatal error:
logical not is only applied to
the left hand side of this bitwise operator
[-Wlogical-not-parentheses]
if (!overlap & FATE)
^ ~
/var/tmp/dpdk-next-net/drivers/net/enic/enic_flow.c:1000:6: note: add
parentheses after the '!' to
evaluate the bitwise operator first
if (!overlap & FATE)
^
( )
/var/tmp/dpdk-next-net/drivers/net/enic/enic_flow.c:1000:6: note: add
parentheses around left hand side
expression to silence this warning
if (!overlap & FATE)
^
( )
1 error generated.
/var/tmp/dpdk-next-net/mk/internal/rte.compile-pre.mk:114: recipe for
target 'enic_flow.o' failed
make[4]: *** [enic_flow.o] Error 1
/var/tmp/dpdk-next-net/mk/rte.subdir.mk:35: recipe for target 'enic' failed
make[3]: *** [enic] Error 2
CC nfp_cpp_pcie_ops.o
make[3]: *** Waiting for unfinished jobs....
$ clang --version
clang version 4.0.1-6 (tags/RELEASE_401/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
> + return ENOTSUP;
> enic_action->type = FILTER_ACTION_RQ_STEERING;
> return 0;
> }
> @@ -1001,6 +1011,9 @@ static int
> enic_copy_action_v2(const struct rte_flow_action actions[],
> struct filter_action_v2 *enic_action)
> {
> + enum { FATE = 1, MARK = 2, };
> + uint32_t overlap = 0;
> +
> FLOW_TRACE();
>
> for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> @@ -1009,6 +1022,10 @@ enic_copy_action_v2(const struct rte_flow_action actions[],
> const struct rte_flow_action_queue *queue =
> (const struct rte_flow_action_queue *)
> actions->conf;
> +
> + if (overlap & FATE)
> + return ENOTSUP;
> + overlap |= FATE;
> enic_action->rq_idx =
> enic_rte_rq_idx_to_sop_idx(queue->index);
> enic_action->flags |= FILTER_ACTION_RQ_STEERING_FLAG;
> @@ -1019,6 +1036,9 @@ enic_copy_action_v2(const struct rte_flow_action actions[],
> (const struct rte_flow_action_mark *)
> actions->conf;
>
> + if (overlap & MARK)
Same
> + return ENOTSUP;
> + overlap |= MARK;
> /* ENIC_MAGIC_FILTER_ID is reserved and is the highest
> * in the range of allows mark ids.
> */
> @@ -1029,6 +1049,9 @@ enic_copy_action_v2(const struct rte_flow_action actions[],
> break;
> }
> case RTE_FLOW_ACTION_TYPE_FLAG: {
> + if (overlap & MARK)
> + return ENOTSUP;
> + overlap |= MARK;
> enic_action->filter_id = ENIC_MAGIC_FILTER_ID;
> enic_action->flags |= FILTER_ACTION_FILTER_ID_FLAG;
> break;
> @@ -1044,6 +1067,8 @@ enic_copy_action_v2(const struct rte_flow_action actions[],
> break;
> }
> }
> + if (!overlap & FATE)
Same
> + return ENOTSUP;
> enic_action->type = FILTER_ACTION_V2;
> return 0;
> }
[...]
More information about the dev
mailing list