From 6838dd4bf9763a0649e7de34b6605746b9fc8ed6 Mon Sep 17 00:00:00 2001 From: Michael Savisko Date: Mon, 3 Oct 2022 19:34:49 +0300 Subject: [PATCH] ethdev: add send to kernel action In some cases application may receive a packet that should have been received by the kernel. In this case application uses KNI or other means to transfer the packet to the kernel. With bifurcated driver we can have a rule to route packets matching a pattern (example: IPv4 packets) to the DPDK application and the rest of the traffic will be received by the kernel. But if we want to receive most of the traffic in DPDK except specific pattern (example: ICMP packets) that should be processed by the kernel, then it's easier to re-route these packets with a single rule. This commit introduces new rte_flow action which allows application to re-route packets directly to the kernel without software involvement. Add new testpmd rte_flow action 'send_to_kernel'. The application may use this action to route the packet to the kernel while still in the HW. Example with testpmd command: flow create 0 ingress priority 0 group 1 pattern eth type spec 0x0800 type mask 0xffff / end actions send_to_kernel / end Signed-off-by: Michael Savisko Acked-by: Ori Kam Acked-by: Andrew Rybchenko --- app/test-pmd/cmdline_flow.c | 9 +++++++++ doc/guides/rel_notes/release_22_11.rst | 5 +++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 3 +++ lib/ethdev/rte_flow.c | 1 + lib/ethdev/rte_flow.h | 11 +++++++++++ 5 files changed, 29 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index eb7b4853a5..64297992d2 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -615,6 +615,7 @@ enum index { ACTION_PORT_REPRESENTOR_PORT_ID, ACTION_REPRESENTED_PORT, ACTION_REPRESENTED_PORT_ETHDEV_PORT_ID, + ACTION_SEND_TO_KERNEL, }; /** Maximum size for pattern in struct rte_flow_item_raw. */ @@ -1876,6 +1877,7 @@ static const enum index next_action[] = { ACTION_CONNTRACK_UPDATE, ACTION_PORT_REPRESENTOR, ACTION_REPRESENTED_PORT, + ACTION_SEND_TO_KERNEL, ZERO, }; @@ -6018,6 +6020,13 @@ static const struct token token_list[] = { width)), .call = parse_vc_conf, }, + [ACTION_SEND_TO_KERNEL] = { + .name = "send_to_kernel", + .help = "send packets to kernel", + .priv = PRIV_ACTION(SEND_TO_KERNEL, 0), + .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), + .call = parse_vc, + }, /* Top level command. */ [SET] = { .name = "set", diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst index c0a278fca9..c4ec809060 100644 --- a/doc/guides/rel_notes/release_22_11.rst +++ b/doc/guides/rel_notes/release_22_11.rst @@ -81,6 +81,11 @@ New Features * Added meter API to get a pointer to profile/policy by their ID. * Added METER_MARK action for metering with lockless profile/policy access. +* **Added flow offload action to route packets to kernel.** + + Added new flow action which allows application to re-route packets + directly to the kernel without software involvement. + * **Updated Intel iavf driver.** * Added flow subscription support. diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index 52b4f83b48..9bec13b1c4 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -3691,6 +3691,9 @@ This section lists supported pattern items and their attributes, if any. - ``color {value}``: meter color value (green/yellow/red). +- ``send_to_kernel``: send packets to kernel. + + Actions list ^^^^^^^^^^^^ diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index 17d4a230dc..d11ba270db 100644 --- a/lib/ethdev/rte_flow.c +++ b/lib/ethdev/rte_flow.c @@ -250,6 +250,7 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = { MK_FLOW_ACTION(PORT_REPRESENTOR, sizeof(struct rte_flow_action_ethdev)), MK_FLOW_ACTION(REPRESENTED_PORT, sizeof(struct rte_flow_action_ethdev)), MK_FLOW_ACTION(METER_MARK, sizeof(struct rte_flow_action_meter_mark)), + MK_FLOW_ACTION(SEND_TO_KERNEL, 0), }; int diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index 355d602e5f..7e5b1442d3 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -2722,6 +2722,17 @@ enum rte_flow_action_type { * See file rte_mtr.h for MTR profile object configuration. */ RTE_FLOW_ACTION_TYPE_METER_MARK, + + /** + * Send packets to the kernel, without going to userspace at all. + * The packets will be received by the kernel driver sharing + * the same device as the DPDK port on which this action is configured. + * This action mostly suits bifurcated driver model. + * This is an ingress non-transfer action only. + * + * No associated configuration structure. + */ + RTE_FLOW_ACTION_TYPE_SEND_TO_KERNEL, }; /**