From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, niklas.soderlund@corigine.com,
Chaoyong He <chaoyong.he@corigine.com>
Subject: [PATCH v5 06/25] net/nfp: support basic flow actions
Date: Thu, 20 Oct 2022 10:19:32 +0800 [thread overview]
Message-ID: <1666232391-29152-7-git-send-email-chaoyong.he@corigine.com> (raw)
In-Reply-To: <1666232391-29152-1-git-send-email-chaoyong.he@corigine.com>
Add the offload support of very basic actions: mark, rss,
count, drop and output.
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
---
doc/guides/nics/features/nfp.ini | 5 ++
doc/guides/rel_notes/release_22_11.rst | 2 +-
drivers/net/nfp/flower/nfp_flower_cmsg.h | 11 +++
drivers/net/nfp/nfp_flow.c | 112 +++++++++++++++++++++++++++++++
drivers/net/nfp/nfp_flow.h | 37 ++++++++++
5 files changed, 166 insertions(+), 1 deletion(-)
diff --git a/doc/guides/nics/features/nfp.ini b/doc/guides/nics/features/nfp.ini
index 4460cf0..f91da82 100644
--- a/doc/guides/nics/features/nfp.ini
+++ b/doc/guides/nics/features/nfp.ini
@@ -29,3 +29,8 @@ Usage doc = Y
[rte_flow items]
eth = Y
port_id = Y
+
+[rte_flow actions]
+count = Y
+drop = Y
+port_id = Y
diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst
index 6d421a2..471f300 100644
--- a/doc/guides/rel_notes/release_22_11.rst
+++ b/doc/guides/rel_notes/release_22_11.rst
@@ -163,7 +163,7 @@ New Features
* Added the control message interactive channels between PMD and firmware.
* Added the support of representor port.
- Add the support of rte_flow pattern items.
+ Add the support of rte_flow pattern items and actions.
* **Updated NXP dpaa2 driver.**
diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h
index 75a3b91..d776e37 100644
--- a/drivers/net/nfp/flower/nfp_flower_cmsg.h
+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h
@@ -253,6 +253,17 @@ struct nfp_flower_mac_mpls {
rte_be32_t mpls_lse;
};
+struct nfp_fl_act_head {
+ uint8_t jump_id;
+ uint8_t len_lw;
+};
+
+struct nfp_fl_act_output {
+ struct nfp_fl_act_head head;
+ rte_be16_t flags;
+ rte_be32_t port;
+};
+
int nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower);
int nfp_flower_cmsg_repr_reify(struct nfp_app_fw_flower *app_fw_flower,
struct nfp_flower_representor *repr);
diff --git a/drivers/net/nfp/nfp_flow.c b/drivers/net/nfp/nfp_flow.c
index 1af0acd..be522ad 100644
--- a/drivers/net/nfp/nfp_flow.c
+++ b/drivers/net/nfp/nfp_flow.c
@@ -546,6 +546,22 @@ struct nfp_mask_id_entry {
case RTE_FLOW_ACTION_TYPE_VOID:
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_VOID detected");
break;
+ case RTE_FLOW_ACTION_TYPE_MARK:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_MARK detected");
+ break;
+ case RTE_FLOW_ACTION_TYPE_DROP:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_DROP detected");
+ break;
+ case RTE_FLOW_ACTION_TYPE_COUNT:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_COUNT detected");
+ break;
+ case RTE_FLOW_ACTION_TYPE_RSS:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_RSS detected");
+ break;
+ case RTE_FLOW_ACTION_TYPE_PORT_ID:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_PORT_ID detected");
+ key_ls->act_size += sizeof(struct nfp_fl_act_output);
+ break;
default:
PMD_DRV_LOG(ERR, "Action type %d not supported.", action->type);
return -ENOTSUP;
@@ -773,6 +789,96 @@ struct nfp_mask_id_entry {
return 0;
}
+static int
+nfp_flow_action_output(char *act_data,
+ const struct rte_flow_action *action,
+ struct nfp_fl_rule_metadata *nfp_flow_meta)
+{
+ size_t act_size;
+ struct rte_eth_dev *ethdev;
+ struct nfp_fl_act_output *output;
+ struct nfp_flower_representor *representor;
+ const struct rte_flow_action_port_id *port_id;
+
+ port_id = action->conf;
+ if (port_id == NULL || port_id->id >= RTE_MAX_ETHPORTS)
+ return -ERANGE;
+
+ ethdev = &rte_eth_devices[port_id->id];
+ representor = (struct nfp_flower_representor *)ethdev->data->dev_private;
+ act_size = sizeof(struct nfp_fl_act_output);
+
+ output = (struct nfp_fl_act_output *)act_data;
+ output->head.jump_id = NFP_FL_ACTION_OPCODE_OUTPUT;
+ output->head.len_lw = act_size >> NFP_FL_LW_SIZ;
+ output->flags = rte_cpu_to_be_16(NFP_FL_OUT_FLAGS_LAST);
+ output->port = rte_cpu_to_be_32(representor->port_id);
+
+ nfp_flow_meta->shortcut = rte_cpu_to_be_32(representor->port_id);
+
+ return 0;
+}
+
+static int
+nfp_flow_compile_action(__rte_unused struct nfp_flower_representor *representor,
+ const struct rte_flow_action actions[],
+ struct rte_flow *nfp_flow)
+{
+ int ret = 0;
+ char *position;
+ char *action_data;
+ bool drop_flag = false;
+ uint32_t total_actions = 0;
+ const struct rte_flow_action *action;
+ struct nfp_fl_rule_metadata *nfp_flow_meta;
+
+ nfp_flow_meta = nfp_flow->payload.meta;
+ action_data = nfp_flow->payload.action_data;
+ position = action_data;
+
+ for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) {
+ switch (action->type) {
+ case RTE_FLOW_ACTION_TYPE_VOID:
+ break;
+ case RTE_FLOW_ACTION_TYPE_MARK:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_MARK");
+ break;
+ case RTE_FLOW_ACTION_TYPE_DROP:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_DROP");
+ drop_flag = true;
+ break;
+ case RTE_FLOW_ACTION_TYPE_COUNT:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_COUNT");
+ break;
+ case RTE_FLOW_ACTION_TYPE_RSS:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_RSS");
+ break;
+ case RTE_FLOW_ACTION_TYPE_PORT_ID:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_PORT_ID");
+ ret = nfp_flow_action_output(position, action, nfp_flow_meta);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "Failed when process"
+ " RTE_FLOW_ACTION_TYPE_PORT_ID");
+ return ret;
+ }
+
+ position += sizeof(struct nfp_fl_act_output);
+ break;
+ default:
+ PMD_DRV_LOG(ERR, "Unsupported action type: %d", action->type);
+ return -ENOTSUP;
+ }
+ total_actions++;
+ }
+
+ if (drop_flag)
+ nfp_flow_meta->shortcut = rte_cpu_to_be_32(NFP_FL_SC_ACT_DROP);
+ else if (total_actions > 1)
+ nfp_flow_meta->shortcut = rte_cpu_to_be_32(NFP_FL_SC_ACT_NULL);
+
+ return 0;
+}
+
static struct rte_flow *
nfp_flow_process(struct nfp_flower_representor *representor,
const struct rte_flow_item items[],
@@ -823,6 +929,12 @@ struct nfp_mask_id_entry {
goto free_flow;
}
+ ret = nfp_flow_compile_action(representor, actions, nfp_flow);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "nfp flow action process failed.");
+ goto free_flow;
+ }
+
nfp_flow_meta = nfp_flow->payload.meta;
mask_data = nfp_flow->payload.mask_data;
mask_len = key_layer.key_size;
diff --git a/drivers/net/nfp/nfp_flow.h b/drivers/net/nfp/nfp_flow.h
index 6fa1b3e..2ad6d0a 100644
--- a/drivers/net/nfp/nfp_flow.h
+++ b/drivers/net/nfp/nfp_flow.h
@@ -33,6 +33,43 @@
/* The firmware expects lengths in units of long words */
#define NFP_FL_LW_SIZ 2
+#define NFP_FL_SC_ACT_DROP 0x80000000
+#define NFP_FL_SC_ACT_USER 0x7D000000
+#define NFP_FL_SC_ACT_POPV 0x6A000000
+#define NFP_FL_SC_ACT_NULL 0x00000000
+
+/* Action opcodes */
+#define NFP_FL_ACTION_OPCODE_OUTPUT 0
+#define NFP_FL_ACTION_OPCODE_PUSH_VLAN 1
+#define NFP_FL_ACTION_OPCODE_POP_VLAN 2
+#define NFP_FL_ACTION_OPCODE_PUSH_MPLS 3
+#define NFP_FL_ACTION_OPCODE_POP_MPLS 4
+#define NFP_FL_ACTION_OPCODE_USERSPACE 5
+#define NFP_FL_ACTION_OPCODE_SET_TUNNEL 6
+#define NFP_FL_ACTION_OPCODE_SET_ETHERNET 7
+#define NFP_FL_ACTION_OPCODE_SET_MPLS 8
+#define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS 9
+#define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS 10
+#define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC 11
+#define NFP_FL_ACTION_OPCODE_SET_IPV6_DST 12
+#define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL 13
+#define NFP_FL_ACTION_OPCODE_SET_UDP 14
+#define NFP_FL_ACTION_OPCODE_SET_TCP 15
+#define NFP_FL_ACTION_OPCODE_PRE_LAG 16
+#define NFP_FL_ACTION_OPCODE_PRE_TUNNEL 17
+#define NFP_FL_ACTION_OPCODE_PRE_GS 18
+#define NFP_FL_ACTION_OPCODE_GS 19
+#define NFP_FL_ACTION_OPCODE_PUSH_NSH 20
+#define NFP_FL_ACTION_OPCODE_POP_NSH 21
+#define NFP_FL_ACTION_OPCODE_SET_QUEUE 22
+#define NFP_FL_ACTION_OPCODE_CONNTRACK 23
+#define NFP_FL_ACTION_OPCODE_METER 24
+#define NFP_FL_ACTION_OPCODE_CT_NAT_EXT 25
+#define NFP_FL_ACTION_OPCODE_PUSH_GENEVE 26
+#define NFP_FL_ACTION_OPCODE_NUM 32
+
+#define NFP_FL_OUT_FLAGS_LAST (1 << 15)
+
/* Tunnel ports */
#define NFP_FL_PORT_TYPE_TUN 0x50000000
--
1.8.3.1
next prev parent reply other threads:[~2022-10-20 2:21 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-18 11:26 [PATCH v4 00/25] add the basic rte_flow offload support of nfp PMD Chaoyong He
2022-10-18 11:26 ` [PATCH v4 01/25] net/nfp: fix the requirement of cpp bridge service Chaoyong He
2022-10-18 12:39 ` Ferruh Yigit
2022-10-18 11:26 ` [PATCH v4 02/25] net/nfp: add the structures and functions for flow offload Chaoyong He
2022-10-18 11:26 ` [PATCH v4 03/25] net/nfp: add the stats process logic in ctrl VNIC service Chaoyong He
2022-10-18 11:26 ` [PATCH v4 04/25] net/nfp: add the flow APIs of nfp PMD Chaoyong He
2022-10-18 11:26 ` [PATCH v4 05/25] net/nfp: support basic flow items Chaoyong He
2022-10-18 11:26 ` [PATCH v4 06/25] net/nfp: support basic flow actions Chaoyong He
2022-10-18 11:26 ` [PATCH v4 07/25] net/nfp: support VLAN flow item Chaoyong He
2022-10-18 11:26 ` [PATCH v4 08/25] net/nfp: support IPv4 " Chaoyong He
2022-10-18 11:26 ` [PATCH v4 09/25] net/nfp: support IPv6 " Chaoyong He
2022-10-18 11:26 ` [PATCH v4 10/25] net/nfp: support TCP " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 11/25] net/nfp: support UDP " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 12/25] net/nfp: support SCTP " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 13/25] net/nfp: support SRC MAC flow action Chaoyong He
2022-10-18 11:27 ` [PATCH v4 14/25] net/nfp: support DST " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 15/25] net/nfp: support pop VLAN " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 16/25] net/nfp: support push " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 17/25] net/nfp: support SRC IPv4 " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 18/25] net/nfp: support DST " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 19/25] net/nfp: support SRC IPv6 " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 20/25] net/nfp: support DST " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 21/25] net/nfp: support TP SRC " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 22/25] net/nfp: support TP DST " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 23/25] net/nfp: support TTL " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 24/25] net/nfp: support IPv4 DSCP " Chaoyong He
2022-10-18 11:27 ` [PATCH v4 25/25] net/nfp: support IPv6 " Chaoyong He
2022-10-18 12:27 ` [PATCH v4 00/25] add the basic rte_flow offload support of nfp PMD Ferruh Yigit
2022-10-20 2:19 ` [PATCH v5 " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 01/25] net/nfp: fix CPP bridge service requirement Chaoyong He
2022-10-20 2:19 ` [PATCH v5 02/25] net/nfp: add the structures and functions for flow offload Chaoyong He
2022-10-20 2:19 ` [PATCH v5 03/25] net/nfp: add the stats process logic in ctrl VNIC service Chaoyong He
2022-10-20 2:19 ` [PATCH v5 04/25] net/nfp: add the flow APIs of nfp PMD Chaoyong He
2022-10-20 11:09 ` Ferruh Yigit
2022-10-20 11:42 ` Chaoyong He
2022-10-20 2:19 ` [PATCH v5 05/25] net/nfp: support basic flow items Chaoyong He
2022-10-20 11:11 ` Ferruh Yigit
2022-10-20 11:43 ` Chaoyong He
2022-10-20 2:19 ` Chaoyong He [this message]
2022-10-20 11:12 ` [PATCH v5 06/25] net/nfp: support basic flow actions Ferruh Yigit
2022-10-20 11:41 ` Chaoyong He
2022-10-20 2:19 ` [PATCH v5 07/25] net/nfp: support VLAN flow item Chaoyong He
2022-10-20 2:19 ` [PATCH v5 08/25] net/nfp: support IPv4 " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 09/25] net/nfp: support IPv6 " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 10/25] net/nfp: support TCP " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 11/25] net/nfp: support UDP " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 12/25] net/nfp: support SCTP " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 13/25] net/nfp: support SRC MAC flow action Chaoyong He
2022-10-20 11:12 ` Ferruh Yigit
2022-10-20 11:48 ` Chaoyong He
2022-10-20 11:55 ` Ferruh Yigit
2022-10-20 2:19 ` [PATCH v5 14/25] net/nfp: support DST " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 15/25] net/nfp: support pop VLAN " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 16/25] net/nfp: support push " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 17/25] net/nfp: support SRC IPv4 " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 18/25] net/nfp: support DST " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 19/25] net/nfp: support SRC IPv6 " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 20/25] net/nfp: support DST " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 21/25] net/nfp: support TP SRC " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 22/25] net/nfp: support TP DST " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 23/25] net/nfp: support TTL " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 24/25] net/nfp: support IPv4 DSCP " Chaoyong He
2022-10-20 2:19 ` [PATCH v5 25/25] net/nfp: support IPv6 " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 00/27] add the basic rte_flow offload support of nfp PMD Chaoyong He
2022-10-21 8:01 ` [PATCH v6 01/27] net/nfp: fix CPP bridge service requirement Chaoyong He
2022-10-21 8:01 ` [PATCH v6 02/27] net/nfp: fix the promiscuous mode control functions Chaoyong He
2022-10-21 13:03 ` Ferruh Yigit
2022-10-22 6:49 ` Chaoyong He
2022-10-22 8:11 ` [PATCH v7] net/nfp: fix the promiscuous mode functions Chaoyong He
2022-10-24 12:31 ` Ferruh Yigit
2022-10-21 8:01 ` [PATCH v6 03/27] net/nfp: fix the service stuck the app end Chaoyong He
2022-10-21 8:01 ` [PATCH v6 04/27] net/nfp: add the structures and functions for flow offload Chaoyong He
2022-10-21 8:01 ` [PATCH v6 05/27] net/nfp: add the stats process logic in ctrl VNIC service Chaoyong He
2022-10-21 8:01 ` [PATCH v6 06/27] net/nfp: add the flow APIs of nfp PMD Chaoyong He
2022-10-21 8:01 ` [PATCH v6 07/27] net/nfp: support basic flow items Chaoyong He
2022-10-21 8:01 ` [PATCH v6 08/27] net/nfp: support basic flow actions Chaoyong He
2022-10-21 8:01 ` [PATCH v6 09/27] net/nfp: support VLAN flow item Chaoyong He
2022-10-21 8:01 ` [PATCH v6 10/27] net/nfp: support IPv4 " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 11/27] net/nfp: support IPv6 " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 12/27] net/nfp: support TCP " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 13/27] net/nfp: support UDP " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 14/27] net/nfp: support SCTP " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 15/27] net/nfp: support SRC MAC flow action Chaoyong He
2022-10-21 8:01 ` [PATCH v6 16/27] net/nfp: support DST " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 17/27] net/nfp: support pop VLAN " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 18/27] net/nfp: support push " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 19/27] net/nfp: support SRC IPv4 " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 20/27] net/nfp: support DST " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 21/27] net/nfp: support SRC IPv6 " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 22/27] net/nfp: support DST " Chaoyong He
2022-10-21 8:01 ` [PATCH v6 23/27] net/nfp: support TP SRC " Chaoyong He
2022-10-21 8:02 ` [PATCH v6 24/27] net/nfp: support TP DST " Chaoyong He
2022-10-21 8:02 ` [PATCH v6 25/27] net/nfp: support TTL " Chaoyong He
2022-10-21 8:02 ` [PATCH v6 26/27] net/nfp: support IPv4 DSCP " Chaoyong He
2022-10-21 8:02 ` [PATCH v6 27/27] net/nfp: support IPv6 " Chaoyong He
2022-10-21 13:04 ` [PATCH v6 00/27] add the basic rte_flow offload support of nfp PMD Ferruh Yigit
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=1666232391-29152-7-git-send-email-chaoyong.he@corigine.com \
--to=chaoyong.he@corigine.com \
--cc=dev@dpdk.org \
--cc=niklas.soderlund@corigine.com \
--cc=oss-drivers@corigine.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).