From 0ddff0682a040b6e4e87902598e3ff6b5db64cde Mon Sep 17 00:00:00 2001 From: Alexander Kozyrev Date: Mon, 9 Oct 2023 19:24:44 +0300 Subject: [PATCH] ethdev: add packet type matching item Add RTE_FLOW_ITEM_TYPE_PTYPE to allow matching on L2/L3/L4 and tunnel information as defined in mbuf. To match on RTE_PTYPE_L4_TCP and RTE_PTYPE_INNER_L4_UDP: flow pattern_template 0 create pattern_template_id 1 ingress template ptype packet_type mask 0x0f000f00 / end flow queue 0 create 0 template_table 1 pattern_template 0 actions_template 0 pattern ptype packet_type is 0x02000100 / end actions queue index 1 / end Signed-off-by: Alexander Kozyrev Acked-by: Ori Kam --- app/test-pmd/cmdline_flow.c | 28 +++++++++++++++++++++ doc/guides/nics/features/default.ini | 1 + doc/guides/prog_guide/rte_flow.rst | 7 ++++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 4 +++ lib/ethdev/rte_flow.c | 1 + lib/ethdev/rte_flow.h | 25 ++++++++++++++++++ 6 files changed, 66 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 21828c144c7..70eef3e34d0 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -533,6 +533,8 @@ enum index { ITEM_IB_BTH_PSN, ITEM_IPV6_PUSH_REMOVE_EXT, ITEM_IPV6_PUSH_REMOVE_EXT_TYPE, + ITEM_PTYPE, + ITEM_PTYPE_VALUE, /* Validate/create actions. */ ACTIONS, @@ -1578,6 +1580,7 @@ static const enum index next_item[] = { ITEM_AGGR_AFFINITY, ITEM_TX_QUEUE, ITEM_IB_BTH, + ITEM_PTYPE, END_SET, ZERO, }; @@ -2097,6 +2100,12 @@ static const enum index item_ib_bth[] = { ZERO, }; +static const enum index item_ptype[] = { + ITEM_PTYPE_VALUE, + ITEM_NEXT, + ZERO, +}; + static const enum index next_action[] = { ACTION_END, ACTION_VOID, @@ -5896,6 +5905,22 @@ static const struct token token_list[] = { .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ib_bth, hdr.psn)), }, + [ITEM_PTYPE] = { + .name = "ptype", + .help = "match L2/L3/L4 and tunnel information", + .priv = PRIV_ITEM(PTYPE, + sizeof(struct rte_flow_item_ptype)), + .next = NEXT(item_ptype), + .call = parse_vc, + }, + [ITEM_PTYPE_VALUE] = { + .name = "packet_type", + .help = "packet type as defined in rte_mbuf_ptype", + .next = NEXT(item_ptype, NEXT_ENTRY(COMMON_UNSIGNED), + item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_ptype, packet_type)), + }, + /* Validate/create actions. */ [ACTIONS] = { .name = "actions", @@ -12810,6 +12835,9 @@ flow_item_default_mask(const struct rte_flow_item *item) case RTE_FLOW_ITEM_TYPE_IB_BTH: mask = &rte_flow_item_ib_bth_mask; break; + case RTE_FLOW_ITEM_TYPE_PTYPE: + mask = &rte_flow_item_ptype_mask; + break; default: break; } diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini index 2011e97127e..e41a97b3bb0 100644 --- a/doc/guides/nics/features/default.ini +++ b/doc/guides/nics/features/default.ini @@ -137,6 +137,7 @@ ppp = pppoed = pppoes = pppoe_proto_id = +ptype = quota = raw = represented_port = diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 590d2a770e2..68f8914516d 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1566,6 +1566,13 @@ Matches an InfiniBand base transport header in RoCE packet. - ``hdr``: InfiniBand base transport header definition (``rte_ib.h``). +Item: ``PTYPE`` +^^^^^^^^^^^^^^^ + +Matches the packet type as defined in rte_mbuf_ptype. + +- ``packet_type``: L2/L3/L4 and tunnel information. + Actions ~~~~~~~ diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index 7a40980d6c9..67968ecb7f4 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -3815,6 +3815,10 @@ This section lists supported pattern items and their attributes, if any. - ``send_to_kernel``: send packets to kernel. +- ``ptype``: match the packet type (L2/L3/L4 and tunnel information). + + - ``packet_type {unsigned}``: packet type. + Actions list ^^^^^^^^^^^^ diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index c9d23da7024..ba8bf27090f 100644 --- a/lib/ethdev/rte_flow.c +++ b/lib/ethdev/rte_flow.c @@ -167,6 +167,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = { MK_FLOW_ITEM(AGGR_AFFINITY, sizeof(struct rte_flow_item_aggr_affinity)), MK_FLOW_ITEM(TX_QUEUE, sizeof(struct rte_flow_item_tx_queue)), MK_FLOW_ITEM(IB_BTH, sizeof(struct rte_flow_item_ib_bth)), + MK_FLOW_ITEM(PTYPE, sizeof(struct rte_flow_item_ptype)), }; /** Generate flow_action[] entry. */ diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index 2c291b541a3..b385741fba6 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -694,6 +694,14 @@ enum rte_flow_item_type { * @see struct rte_flow_item_ib_bth. */ RTE_FLOW_ITEM_TYPE_IB_BTH, + + /** + * Matches the packet type as defined in rte_mbuf_ptype. + * + * See struct rte_flow_item_ptype. + * + */ + RTE_FLOW_ITEM_TYPE_PTYPE, }; /** @@ -2309,6 +2317,23 @@ static const struct rte_flow_item_tx_queue rte_flow_item_tx_queue_mask = { }; #endif +/** + * + * RTE_FLOW_ITEM_TYPE_PTYPE + * + * Matches the packet type as defined in rte_mbuf_ptype. + */ +struct rte_flow_item_ptype { + uint32_t packet_type; /**< L2/L3/L4 and tunnel information. */ +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_PTYPE. */ +#ifndef __cplusplus +static const struct rte_flow_item_ptype rte_flow_item_ptype_mask = { + .packet_type = 0xffffffff, +}; +#endif + /** * Action types. *