[23/33] net/bnxt: match rte flow actions with flow template actions
diff mbox series

Message ID 1584459511-5353-24-git-send-email-venkatkumar.duvvuru@broadcom.com
State Superseded, archived
Delegated to: Ajit Khaparde
Headers show
Series
  • add support for host based flow table management
Related show

Checks

Context Check Description
ci/Intel-compilation fail Compilation issues
ci/checkpatch success coding style OK

Commit Message

Venkat Duvvuru March 17, 2020, 3:38 p.m. UTC
From: Kishore Padmanabha <kishore.padmanabha@broadcom.com>

This patch does the following
1. Takes act_bitmap generated from the rte_flow_actions
2. Iterates through the static act_bitmap list
3. Returns success if a match is found, otherwise an error

Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Lance Richardson <lance.richardson@broadcom.com>
Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/tf_ulp/ulp_matcher.c         | 36 +++++++++++++++++++++++++++
 drivers/net/bnxt/tf_ulp/ulp_matcher.h         |  9 +++++++
 drivers/net/bnxt/tf_ulp/ulp_template_db.c     | 12 +++++++++
 drivers/net/bnxt/tf_ulp/ulp_template_db.h     |  2 ++
 drivers/net/bnxt/tf_ulp/ulp_template_struct.h | 10 ++++++++
 5 files changed, 69 insertions(+)

Patch
diff mbox series

diff --git a/drivers/net/bnxt/tf_ulp/ulp_matcher.c b/drivers/net/bnxt/tf_ulp/ulp_matcher.c
index f367e4c..040d08d 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_matcher.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_matcher.c
@@ -150,3 +150,39 @@  ulp_matcher_pattern_match(enum ulp_direction_type   dir,
 	*class_id = 0;
 	return BNXT_TF_RC_ERROR;
 }
+
+/*
+ * Function to handle the matching of RTE Flows and validating
+ * the action against the flow templates.
+ */
+int32_t
+ulp_matcher_action_match(enum ulp_direction_type		dir,
+			 struct ulp_rte_act_bitmap		*act_bitmap,
+			 uint32_t				*act_id)
+{
+	struct bnxt_ulp_action_match_info	*sel_act_match;
+	uint32_t				act_num, idx;
+
+	/* Select the ingress or egress template to match against */
+	if (dir == ULP_DIR_INGRESS) {
+		sel_act_match = ulp_ingress_act_match_list;
+		act_num = BNXT_ULP_INGRESS_ACT_MATCH_SZ;
+	} else {
+		sel_act_match = ulp_egress_act_match_list;
+		act_num = BNXT_ULP_EGRESS_ACT_MATCH_SZ;
+	}
+
+	/* Loop through the list of action templates to find the match */
+	for (idx = 0; idx < act_num; idx++, sel_act_match++) {
+		if (!ULP_BITSET_CMP(&sel_act_match->act_bitmap,
+				    act_bitmap)) {
+			*act_id = sel_act_match->act_tmpl_id;
+			BNXT_TF_DBG(DEBUG, "Found matching action template %u\n",
+				    *act_id);
+			return BNXT_TF_RC_SUCCESS;
+		}
+	}
+	BNXT_TF_DBG(DEBUG, "Did not find any matching action template\n");
+	*act_id = 0;
+	return BNXT_TF_RC_ERROR;
+}
diff --git a/drivers/net/bnxt/tf_ulp/ulp_matcher.h b/drivers/net/bnxt/tf_ulp/ulp_matcher.h
index 57a161d..c818bbe 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_matcher.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_matcher.h
@@ -23,4 +23,13 @@  ulp_matcher_pattern_match(enum ulp_direction_type	    dir,
 			  struct ulp_rte_act_bitmap	   *act_bitmap,
 			  uint32_t			   *class_id);
 
+/*
+ * Function to handle the matching of RTE Flows and validating
+ * the action against the flow templates.
+ */
+int32_t
+ulp_matcher_action_match(enum ulp_direction_type	dir,
+			 struct ulp_rte_act_bitmap	*act_bitmap,
+			 uint32_t			*act_id);
+
 #endif /* ULP_MATCHER_H_ */
diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_db.c b/drivers/net/bnxt/tf_ulp/ulp_template_db.c
index 68a2dc0..5981c74 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_template_db.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_template_db.c
@@ -1119,6 +1119,18 @@  struct bnxt_ulp_mapper_ident_info ulp_ident_list[] = {
 	}
 };
 
+struct bnxt_ulp_action_match_info ulp_ingress_act_match_list[] = {
+	{
+	.act_bitmap = { .bits =
+		BNXT_ULP_ACTION_BIT_MARK |
+		BNXT_ULP_ACTION_BIT_RSS },
+	.act_tmpl_id = 0
+	}
+};
+
+struct bnxt_ulp_action_match_info ulp_egress_act_match_list[] = {
+};
+
 struct bnxt_ulp_mapper_tbl_list_info ulp_act_tmpl_list[] = {
 	[((0 << BNXT_ULP_LOG2_MAX_NUM_DEV) | BNXT_ULP_DEVICE_ID_WH_PLUS)] = {
 	.device_name = BNXT_ULP_DEVICE_ID_WH_PLUS,
diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_db.h b/drivers/net/bnxt/tf_ulp/ulp_template_db.h
index 319500a..f4850bf 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_template_db.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_template_db.h
@@ -15,6 +15,8 @@ 
 #define BNXT_ULP_LOG2_MAX_NUM_DEV 2
 #define BNXT_ULP_INGRESS_HDR_MATCH_SZ 2
 #define BNXT_ULP_EGRESS_HDR_MATCH_SZ 1
+#define BNXT_ULP_INGRESS_ACT_MATCH_SZ 2
+#define BNXT_ULP_EGRESS_ACT_MATCH_SZ 1
 
 enum bnxt_ulp_action_bit {
 	BNXT_ULP_ACTION_BIT_MARK             = 0x0000000000000001,
diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h
index dd06fb1..0e811ec 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h
@@ -62,6 +62,16 @@  extern struct bnxt_ulp_header_match_info  ulp_egress_hdr_match_list[];
 /* Flow field match Information Structure Array defined in template source*/
 extern struct bnxt_ulp_matcher_field_info	ulp_field_match[];
 
+/* Flow Matcher Action structures */
+struct bnxt_ulp_action_match_info {
+	struct ulp_rte_act_bitmap		act_bitmap;
+	uint32_t				act_tmpl_id;
+};
+
+/* Flow Matcher templates Structure Array defined in template source */
+extern struct bnxt_ulp_action_match_info  ulp_ingress_act_match_list[];
+extern struct bnxt_ulp_action_match_info  ulp_egress_act_match_list[];
+
 /* Device specific parameters */
 struct bnxt_ulp_device_params {
 	uint8_t				description[16];