From: Stephen Hemminger <stephen@networkplumber.org>
To: Anatoly Burakov <anatoly.burakov@intel.com>
Cc: dev@dpdk.org
Subject: Re: [RFC PATCH v1 00/21] Building a better rte_flow parser
Date: Sun, 12 Apr 2026 09:42:21 -0700 [thread overview]
Message-ID: <20260412094221.4defa766@phoenix.local> (raw)
In-Reply-To: <cover.1773681363.git.anatoly.burakov@intel.com>
On Mon, 16 Mar 2026 17:27:28 +0000
Anatoly Burakov <anatoly.burakov@intel.com> wrote:
> Most rte_flow parsers in DPDK suffer from huge implementation complexity because
> even though 99% of what people use rte_flow parsers for is parsing protocol
> graphs, no parser is written explicitly as a graph. This patchset attempts to
> suggest a viable model to build rte_flow parsers as graphs, by offering a
> lightweight header only library to build rte_flow parsering graphs without too
> much boilerplate and complexity.
>
> Most of the patchset is about Intel drivers, but they are meant as
> reimplementations as well as examples for the rest of the community to assess
> how to build parsers using this new infrastructure. I expect the first two
> patches will be of most interest to non-Intel reviewers, as they deal with
> building two reusable parser architecture pieces.
>
> The first piece is a new flow graph helper in ethdev. Its purpose is
> deliberately narrow: it targets the protocol-graph part of rte_flow pattern
> parsing, where drivers walk packet headers and validate legal item sequences and
> parameters. That does not cover all possible rte_flow features, especially more
> exotic flow items, but it does cover a large and widely shared part of what
> existing drivers need to do. Or, to put it in other words, the only flow items
> this infrastructure *doesn't* cover is things that do not lend themselves well
> to be parsed as a graph of protocol headers (e.g. conntrack items). Everything
> else should be covered or cover-able.
>
> The second piece is a reusable flow engine framework for Intel Ethernet drivers.
> This is kept Intel-local for now because I do not feel it is generic enough to
> be presented as an ethdev-wide engine model. Even so, the intent is to establish
> a cleaner parser architecture with a defined interaction model, explicit memory
> ownership rules, and engine definitions that do not block secondary-process-safe
> usage. It is my hope that we could also promote something like this into ethdev
> proper and remove the necessity for drivers to build so much boilerplate around
> rte_flow parsing (and more often than not doing it in a way that is more complex
> than it needs to be).
>
> Most of the rest of the series is parser reimplementation, but that is mainly
> the vehicle for demonstrating and validating those two pieces. ixgbe and i40e
> are wired into the new common parsing path, and their existing parsers are
> migrated incrementally to the graph-based model. Besides reducing ad hoc parser
> code, this also makes validation more explicit and more consistent with the
> actual install path. In a few places that means invalid inputs that were
> previously ignored, deferred, or interpreted loosely are now rejected earlier
> and more strictly, without any increase in code complexity (in fact, with marked
> *decrease* of it!).
>
> Series depends on previously submitted patchsets:
>
> - IAVF global buffer fix [1]
> - Common attr parsing stuff [2]
>
> [1] https://patches.dpdk.org/project/dpdk/list/?series=37585&state=*
> [2] https://patches.dpdk.org/project/dpdk/list/?series=37663&state=*
>
> Anatoly Burakov (21):
> ethdev: add flow graph API
> net/intel/common: add flow engines infrastructure
> net/intel/common: add utility functions
> net/ixgbe: add support for common flow parsing
> net/ixgbe: reimplement ethertype parser
> net/ixgbe: reimplement syn parser
> net/ixgbe: reimplement L2 tunnel parser
> net/ixgbe: reimplement ntuple parser
> net/ixgbe: reimplement security parser
> net/ixgbe: reimplement FDIR parser
> net/ixgbe: reimplement hash parser
> net/i40e: add support for common flow parsing
> net/i40e: reimplement ethertype parser
> net/i40e: reimplement FDIR parser
> net/i40e: reimplement tunnel QinQ parser
> net/i40e: reimplement VXLAN parser
> net/i40e: reimplement NVGRE parser
> net/i40e: reimplement MPLS parser
> net/i40e: reimplement gtp parser
> net/i40e: reimplement L4 cloud parser
> net/i40e: reimplement hash parser
>
> drivers/net/intel/common/flow_engine.h | 1003 ++++
> drivers/net/intel/common/flow_util.h | 165 +
> drivers/net/intel/i40e/i40e_ethdev.c | 56 +-
> drivers/net/intel/i40e/i40e_ethdev.h | 49 +-
> drivers/net/intel/i40e/i40e_fdir.c | 47 -
> drivers/net/intel/i40e/i40e_flow.c | 4092 +----------------
> drivers/net/intel/i40e/i40e_flow.h | 44 +
> drivers/net/intel/i40e/i40e_flow_ethertype.c | 258 ++
> drivers/net/intel/i40e/i40e_flow_fdir.c | 1806 ++++++++
> drivers/net/intel/i40e/i40e_flow_hash.c | 1289 ++++++
> drivers/net/intel/i40e/i40e_flow_tunnel.c | 1510 ++++++
> drivers/net/intel/i40e/i40e_hash.c | 980 +---
> drivers/net/intel/i40e/i40e_hash.h | 8 +-
> drivers/net/intel/i40e/meson.build | 4 +
> drivers/net/intel/ixgbe/ixgbe_ethdev.c | 40 +-
> drivers/net/intel/ixgbe/ixgbe_ethdev.h | 13 +-
> drivers/net/intel/ixgbe/ixgbe_fdir.c | 13 +-
> drivers/net/intel/ixgbe/ixgbe_flow.c | 3130 +------------
> drivers/net/intel/ixgbe/ixgbe_flow.h | 38 +
> .../net/intel/ixgbe/ixgbe_flow_ethertype.c | 240 +
> drivers/net/intel/ixgbe/ixgbe_flow_fdir.c | 1510 ++++++
> drivers/net/intel/ixgbe/ixgbe_flow_hash.c | 182 +
> drivers/net/intel/ixgbe/ixgbe_flow_l2tun.c | 228 +
> drivers/net/intel/ixgbe/ixgbe_flow_ntuple.c | 483 ++
> drivers/net/intel/ixgbe/ixgbe_flow_security.c | 297 ++
> drivers/net/intel/ixgbe/ixgbe_flow_syn.c | 280 ++
> drivers/net/intel/ixgbe/meson.build | 7 +
> lib/ethdev/meson.build | 1 +
> lib/ethdev/rte_flow_graph.h | 414 ++
> 29 files changed, 9867 insertions(+), 8320 deletions(-)
> create mode 100644 drivers/net/intel/common/flow_engine.h
> create mode 100644 drivers/net/intel/common/flow_util.h
> create mode 100644 drivers/net/intel/i40e/i40e_flow.h
> create mode 100644 drivers/net/intel/i40e/i40e_flow_ethertype.c
> create mode 100644 drivers/net/intel/i40e/i40e_flow_fdir.c
> create mode 100644 drivers/net/intel/i40e/i40e_flow_hash.c
> create mode 100644 drivers/net/intel/i40e/i40e_flow_tunnel.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow.h
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_ethertype.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_fdir.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_hash.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_l2tun.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_ntuple.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_security.c
> create mode 100644 drivers/net/intel/ixgbe/ixgbe_flow_syn.c
> create mode 100644 lib/ethdev/rte_flow_graph.h
>
Good to see common code, but this patchset is complex.
AI review found a couple issues that need addressing.
=== Review: [PATCH v3 00/29] Intel PMD common flow handling ===
Review of series from Anatoly Burakov <anatoly.burakov@intel.com>
This series refactors flow attribute and action validation across Intel
PMDs (ixgbe, i40e, iavf, ice) into common code in flow_check.h, while
also converting ixgbe flow-related functions from rte_eth_dev to
ixgbe_adapter parameters for multiprocess safety.
Patches 1/29, 2/29, 3/29, 6/29, 7/29, 8/29, 9/29, 10/29, 11/29,
13/29, 14/29, 15/29, 16/29, 17/29, 18/29, 19/29, 20/29, 21/29,
22/29, 23/29, 24/29, 25/29, 26/29, 27/29, 28/29, 29/29: no issues.
----------------------------------------------------------------------
Patch 4/29: net/ixgbe: use adapter in flow-related calls
----------------------------------------------------------------------
Error: In ixgbe_clear_all_l2_tn_filter(), the macro is called with
the wrong argument:
struct ixgbe_adapter *adapter = IXGBE_DEV_PRIVATE_TO_ADAPTER(dev);
This casts the rte_eth_dev pointer directly to ixgbe_adapter, which
is a type confusion. Every other call site in this patch passes
dev->data->dev_private. Should be:
struct ixgbe_adapter *adapter = IXGBE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
----------------------------------------------------------------------
Patch 5/29: net/intel/common: add common flow action parsing
----------------------------------------------------------------------
Error: In __flow_action_check_rss(), the queue/queue_num consistency
check has inverted logic:
if ((q_num == 0) == (rss->queue == NULL)) {
return rte_flow_error_set(error, ...);
}
This errors when q_num and queue are both absent or both present (the
valid cases), and accepts when they are mismatched (the invalid cases).
When q_num > 0 and queue == NULL passes this check, the subsequent
contiguity loop dereferences rss->queue, which is a NULL pointer
dereference.
The key_len/key check immediately below correctly uses != for the same
pattern. Fix:
if ((q_num == 0) != (rss->queue == NULL)) {
Warning: ci_flow_check_actions() returns -EINVAL at the end when
parsed_actions->count is zero (all VOID actions), but does not call
rte_flow_error_set(). Every other error path in that function sets
the flow error. Callers may report a confusing empty error to the
application.
----------------------------------------------------------------------
Patch 12/29: net/ixgbe: use common checks in FDIR filters
----------------------------------------------------------------------
Warning: ixgbe_fdir_actions_check() rejects DROP+MARK via the check:
if (drop_action != NULL && action != NULL) {
return rte_flow_error_set(..., "Conflicting actions");
}
The old ixgbe_parse_fdir_act_attr() allowed DROP+MARK (set fdirflags
and soft_id together). The new parse functions still contain code to
handle DROP+MARK (setting rule->soft_id from aux_action), but it is
now dead code because the check function rejects the combination
before parsing.
If DROP+MARK was intentionally disallowed, the dead aux_action
handling should be removed from ixgbe_parse_fdir_filter_normal() and
ixgbe_parse_fdir_filter_tunnel(). If it should still be allowed, the
check needs to permit a MARK alongside DROP.
Also, this block in ixgbe_fdir_actions_check() is dead code:
if (drop_action == NULL && action != NULL &&
action->type == RTE_FLOW_ACTION_TYPE_DROP) {
drop_action = action;
}
DROP is in fwd_actions[], so a DROP as the second action is already
rejected by the preceding "must not be a forwarding action" check.
prev parent reply other threads:[~2026-04-12 16:42 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-16 17:27 [RFC PATCH v1 00/21] Building a better rte_flow parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 01/21] ethdev: add flow graph API Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 02/21] net/intel/common: add flow engines infrastructure Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 03/21] net/intel/common: add utility functions Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 04/21] net/ixgbe: add support for common flow parsing Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 05/21] net/ixgbe: reimplement ethertype parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 06/21] net/ixgbe: reimplement syn parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 07/21] net/ixgbe: reimplement L2 tunnel parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 08/21] net/ixgbe: reimplement ntuple parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 09/21] net/ixgbe: reimplement security parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 10/21] net/ixgbe: reimplement FDIR parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 11/21] net/ixgbe: reimplement hash parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 12/21] net/i40e: add support for common flow parsing Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 13/21] net/i40e: reimplement ethertype parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 14/21] net/i40e: reimplement FDIR parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 15/21] net/i40e: reimplement tunnel QinQ parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 16/21] net/i40e: reimplement VXLAN parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 17/21] net/i40e: reimplement NVGRE parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 18/21] net/i40e: reimplement MPLS parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 19/21] net/i40e: reimplement gtp parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 20/21] net/i40e: reimplement L4 cloud parser Anatoly Burakov
2026-03-16 17:27 ` [RFC PATCH v1 21/21] net/i40e: reimplement hash parser Anatoly Burakov
2026-03-17 0:42 ` [RFC PATCH v1 00/21] Building a better rte_flow parser Stephen Hemminger
2026-04-12 16:42 ` Stephen Hemminger [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260412094221.4defa766@phoenix.local \
--to=stephen@networkplumber.org \
--cc=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.