xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c (revision d4b36fc5f0dc59b256441c82e5a9395054026496)
153a0d4f7SKishore Padmanabha /* SPDX-License-Identifier: BSD-3-Clause
2d9e70b1dSRandy Schacher  * Copyright(c) 2014-2023 Broadcom
353a0d4f7SKishore Padmanabha  * All rights reserved.
453a0d4f7SKishore Padmanabha  */
553a0d4f7SKishore Padmanabha 
653a0d4f7SKishore Padmanabha #include "bnxt.h"
78ce17d56SKishore Padmanabha #include "ulp_template_db_enum.h"
853a0d4f7SKishore Padmanabha #include "ulp_template_struct.h"
9675e31d8SVenkat Duvvuru #include "bnxt_ulp.h"
100c036a14SPeter Spreadborough #include "bnxt_ulp_utils.h"
1153a0d4f7SKishore Padmanabha #include "bnxt_tf_common.h"
12ad9eed02SKishore Padmanabha #include "bnxt_tf_pmd_shim.h"
1353a0d4f7SKishore Padmanabha #include "ulp_rte_parser.h"
14675e31d8SVenkat Duvvuru #include "ulp_matcher.h"
1553a0d4f7SKishore Padmanabha #include "ulp_utils.h"
1653a0d4f7SKishore Padmanabha #include "tfp.h"
17dc8ee812SKishore Padmanabha #include "ulp_port_db.h"
18675e31d8SVenkat Duvvuru #include "ulp_flow_db.h"
19675e31d8SVenkat Duvvuru #include "ulp_mapper.h"
20675e31d8SVenkat Duvvuru #include "ulp_tun.h"
21ddaf0afaSKishore Padmanabha #include "ulp_template_db_tbl.h"
2253a0d4f7SKishore Padmanabha 
23d21325eaSKishore Padmanabha /* Local defines for the parsing functions */
24d21325eaSKishore Padmanabha #define ULP_VLAN_PRIORITY_SHIFT		13 /* First 3 bits */
25d21325eaSKishore Padmanabha #define ULP_VLAN_PRIORITY_MASK		0x700
26d21325eaSKishore Padmanabha #define ULP_VLAN_TAG_MASK		0xFFF /* Last 12 bits*/
270c0f5a98SKishore Padmanabha #define ULP_UDP_PORT_VXLAN		4789
2874cab005SRandy Schacher #define ULP_UDP_PORT_VXLAN_MASK		0xFFFF
2974cab005SRandy Schacher #define ULP_UDP_PORT_VXLAN_GPE		4790
3074cab005SRandy Schacher #define ULP_UDP_PORT_VXLAN_GPE_MASK	0xFFFF
31dd0191d5SShuanglin Wang #define ULP_UDP_PORT_GENEVE		6081
32dd0191d5SShuanglin Wang #define ULP_UDP_PORT_GENEVE_MASK	0xFFFF
33dd0191d5SShuanglin Wang 
34dd0191d5SShuanglin Wang /**
35dd0191d5SShuanglin Wang  * Geneve header first 16Bit
36dd0191d5SShuanglin Wang  * Version (2b), length of the options fields (6b), OAM packet (1b),
37dd0191d5SShuanglin Wang  * critical options present (1b), reserved 0 (6b).
38dd0191d5SShuanglin Wang  */
39dd0191d5SShuanglin Wang #define ULP_GENEVE_OPT_MAX_SIZE 6 /* HW only supports 6 words */
40dd0191d5SShuanglin Wang #define ULP_GENEVE_OPTLEN_MASK 0x3F
41dd0191d5SShuanglin Wang #define ULP_GENEVE_OPTLEN_SHIFT 8
42dd0191d5SShuanglin Wang #define ULP_GENEVE_OPTLEN_VAL(a) \
43dd0191d5SShuanglin Wang 	    (((a) >> (ULP_GENEVE_OPTLEN_SHIFT)) & (ULP_GENEVE_OPTLEN_MASK))
44d21325eaSKishore Padmanabha 
4511c854e2SKishore Padmanabha /* Utility function to skip the void items. */
4611c854e2SKishore Padmanabha static inline int32_t
4711c854e2SKishore Padmanabha ulp_rte_item_skip_void(const struct rte_flow_item **item, uint32_t increment)
4811c854e2SKishore Padmanabha {
4911c854e2SKishore Padmanabha 	if (!*item)
5011c854e2SKishore Padmanabha 		return 0;
5111c854e2SKishore Padmanabha 	if (increment)
5211c854e2SKishore Padmanabha 		(*item)++;
5311c854e2SKishore Padmanabha 	while ((*item) && (*item)->type == RTE_FLOW_ITEM_TYPE_VOID)
5411c854e2SKishore Padmanabha 		(*item)++;
5511c854e2SKishore Padmanabha 	if (*item)
5611c854e2SKishore Padmanabha 		return 1;
5711c854e2SKishore Padmanabha 	return 0;
5811c854e2SKishore Padmanabha }
5911c854e2SKishore Padmanabha 
60f63aa27dSKishore Padmanabha /* Utility function to copy field spec items */
610c036a14SPeter Spreadborough static inline struct ulp_rte_hdr_field *
62f63aa27dSKishore Padmanabha ulp_rte_parser_fld_copy(struct ulp_rte_hdr_field *field,
63f63aa27dSKishore Padmanabha 			const void *buffer,
64f63aa27dSKishore Padmanabha 			uint32_t size)
65f63aa27dSKishore Padmanabha {
66f63aa27dSKishore Padmanabha 	field->size = size;
67f63aa27dSKishore Padmanabha 	memcpy(field->spec, buffer, field->size);
68f63aa27dSKishore Padmanabha 	field++;
69f63aa27dSKishore Padmanabha 	return field;
70f63aa27dSKishore Padmanabha }
71f63aa27dSKishore Padmanabha 
722bbcdee8SKishore Padmanabha /* Utility function to update the field_bitmap */
732bbcdee8SKishore Padmanabha static void
742bbcdee8SKishore Padmanabha ulp_rte_parser_field_bitmap_update(struct ulp_rte_parser_params *params,
75741172beSKishore Padmanabha 				   uint32_t idx,
76741172beSKishore Padmanabha 				   enum bnxt_ulp_prsr_action prsr_act)
772bbcdee8SKishore Padmanabha {
782bbcdee8SKishore Padmanabha 	struct ulp_rte_hdr_field *field;
792bbcdee8SKishore Padmanabha 
802bbcdee8SKishore Padmanabha 	field = &params->hdr_field[idx];
812bbcdee8SKishore Padmanabha 	if (ulp_bitmap_notzero(field->mask, field->size)) {
822bbcdee8SKishore Padmanabha 		ULP_INDEX_BITMAP_SET(params->fld_bitmap.bits, idx);
83741172beSKishore Padmanabha 		if (!(prsr_act & ULP_PRSR_ACT_MATCH_IGNORE))
84741172beSKishore Padmanabha 			ULP_INDEX_BITMAP_SET(params->fld_s_bitmap.bits, idx);
852bbcdee8SKishore Padmanabha 		/* Not exact match */
862bbcdee8SKishore Padmanabha 		if (!ulp_bitmap_is_ones(field->mask, field->size))
87397922ffSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
88397922ffSKishore Padmanabha 					    BNXT_ULP_CF_IDX_WC_MATCH, 1);
892bbcdee8SKishore Padmanabha 	} else {
902bbcdee8SKishore Padmanabha 		ULP_INDEX_BITMAP_RESET(params->fld_bitmap.bits, idx);
912bbcdee8SKishore Padmanabha 	}
922bbcdee8SKishore Padmanabha }
932bbcdee8SKishore Padmanabha 
94741172beSKishore Padmanabha #define ulp_deference_struct(x, y) ((x) ? &((x)->y) : NULL)
95741172beSKishore Padmanabha /* Utility function to copy field spec and masks items */
960c036a14SPeter Spreadborough static inline void
97741172beSKishore Padmanabha ulp_rte_prsr_fld_mask(struct ulp_rte_parser_params *params,
983d6ba7cbSKishore Padmanabha 		      uint32_t *idx,
99741172beSKishore Padmanabha 		      uint32_t size,
100741172beSKishore Padmanabha 		      const void *spec_buff,
101741172beSKishore Padmanabha 		      const void *mask_buff,
102741172beSKishore Padmanabha 		      enum bnxt_ulp_prsr_action prsr_act)
1033d6ba7cbSKishore Padmanabha {
1043d6ba7cbSKishore Padmanabha 	struct ulp_rte_hdr_field *field = &params->hdr_field[*idx];
1053d6ba7cbSKishore Padmanabha 
106741172beSKishore Padmanabha 	/* update the field size */
107741172beSKishore Padmanabha 	field->size = size;
108741172beSKishore Padmanabha 
109741172beSKishore Padmanabha 	/* copy the mask specifications only if mask is not null */
110f6e12015SKishore Padmanabha 	if (!(prsr_act & ULP_PRSR_ACT_MASK_IGNORE) && mask_buff &&
111f6e12015SKishore Padmanabha 	    spec_buff && ulp_bitmap_notzero(spec_buff, size)) {
112741172beSKishore Padmanabha 		memcpy(field->mask, mask_buff, size);
113741172beSKishore Padmanabha 		ulp_rte_parser_field_bitmap_update(params, *idx, prsr_act);
114741172beSKishore Padmanabha 	}
115741172beSKishore Padmanabha 
116741172beSKishore Padmanabha 	/* copy the protocol specifications only if mask is not null*/
117741172beSKishore Padmanabha 	if (spec_buff && mask_buff && ulp_bitmap_notzero(mask_buff, size))
118741172beSKishore Padmanabha 		memcpy(field->spec, spec_buff, size);
119741172beSKishore Padmanabha 
120741172beSKishore Padmanabha 	/* Increment the index */
1213d6ba7cbSKishore Padmanabha 	*idx = *idx + 1;
1223d6ba7cbSKishore Padmanabha }
1233d6ba7cbSKishore Padmanabha 
124741172beSKishore Padmanabha /* Utility function to copy field spec and masks items */
1250c036a14SPeter Spreadborough static inline int32_t
126741172beSKishore Padmanabha ulp_rte_prsr_fld_size_validate(struct ulp_rte_parser_params *params,
1279238ac2aSKishore Padmanabha 			       uint32_t *idx,
128741172beSKishore Padmanabha 			       uint32_t size)
1299238ac2aSKishore Padmanabha {
1300c036a14SPeter Spreadborough 	if (unlikely(params->field_idx + size >= BNXT_ULP_PROTO_HDR_MAX)) {
131dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "OOB for field processing %u\n", *idx);
132741172beSKishore Padmanabha 		return -EINVAL;
133741172beSKishore Padmanabha 	}
134741172beSKishore Padmanabha 	*idx = params->field_idx;
135741172beSKishore Padmanabha 	params->field_idx += size;
136741172beSKishore Padmanabha 	return 0;
1379238ac2aSKishore Padmanabha }
1389238ac2aSKishore Padmanabha 
13953a0d4f7SKishore Padmanabha /*
14053a0d4f7SKishore Padmanabha  * Function to handle the parsing of RTE Flows and placing
14153a0d4f7SKishore Padmanabha  * the RTE flow items into the ulp structures.
14253a0d4f7SKishore Padmanabha  */
14353a0d4f7SKishore Padmanabha int32_t
14453a0d4f7SKishore Padmanabha bnxt_ulp_rte_parser_hdr_parse(const struct rte_flow_item pattern[],
1453d6ba7cbSKishore Padmanabha 			      struct ulp_rte_parser_params *params)
14653a0d4f7SKishore Padmanabha {
14753a0d4f7SKishore Padmanabha 	const struct rte_flow_item *item = pattern;
14853a0d4f7SKishore Padmanabha 	struct bnxt_ulp_rte_hdr_info *hdr_info;
14953a0d4f7SKishore Padmanabha 
1502bbcdee8SKishore Padmanabha 	params->field_idx = BNXT_ULP_PROTO_HDR_SVIF_NUM;
1512bbcdee8SKishore Padmanabha 
15253a0d4f7SKishore Padmanabha 	/* Parse all the items in the pattern */
15353a0d4f7SKishore Padmanabha 	while (item && item->type != RTE_FLOW_ITEM_TYPE_END) {
1544d2c4291SShahaji Bhosle 		if (item->type >= (typeof(item->type))
155bdf4a3c6SKishore Padmanabha 		    BNXT_RTE_FLOW_ITEM_TYPE_END) {
156bdf4a3c6SKishore Padmanabha 			if (item->type >=
1574d2c4291SShahaji Bhosle 			    (typeof(item->type))BNXT_RTE_FLOW_ITEM_TYPE_LAST)
158bdf4a3c6SKishore Padmanabha 				goto hdr_parser_error;
159bdf4a3c6SKishore Padmanabha 			/* get the header information */
160bdf4a3c6SKishore Padmanabha 			hdr_info = &ulp_vendor_hdr_info[item->type -
161bdf4a3c6SKishore Padmanabha 				BNXT_RTE_FLOW_ITEM_TYPE_END];
162bdf4a3c6SKishore Padmanabha 		} else {
1632d344c36SRandy Schacher 			if (item->type > RTE_FLOW_ITEM_TYPE_ECPRI)
164bdf4a3c6SKishore Padmanabha 				goto hdr_parser_error;
16553a0d4f7SKishore Padmanabha 			hdr_info = &ulp_hdr_info[item->type];
166bdf4a3c6SKishore Padmanabha 		}
1673d6ba7cbSKishore Padmanabha 		if (hdr_info->hdr_type == BNXT_ULP_HDR_TYPE_NOT_SUPPORTED) {
168bdf4a3c6SKishore Padmanabha 			goto hdr_parser_error;
1693d6ba7cbSKishore Padmanabha 		} else if (hdr_info->hdr_type == BNXT_ULP_HDR_TYPE_SUPPORTED) {
17053a0d4f7SKishore Padmanabha 			/* call the registered callback handler */
17153a0d4f7SKishore Padmanabha 			if (hdr_info->proto_hdr_func) {
1723d6ba7cbSKishore Padmanabha 				if (hdr_info->proto_hdr_func(item, params) !=
17353a0d4f7SKishore Padmanabha 				    BNXT_TF_RC_SUCCESS) {
17453a0d4f7SKishore Padmanabha 					return BNXT_TF_RC_ERROR;
17553a0d4f7SKishore Padmanabha 				}
17653a0d4f7SKishore Padmanabha 			}
17753a0d4f7SKishore Padmanabha 		}
17853a0d4f7SKishore Padmanabha 		item++;
17953a0d4f7SKishore Padmanabha 	}
180a7420bd9SMike Baucom 	/* update the implied SVIF */
18177b359eeSKishore Padmanabha 	return ulp_rte_parser_implicit_match_port_process(params);
182bdf4a3c6SKishore Padmanabha 
183bdf4a3c6SKishore Padmanabha hdr_parser_error:
184dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Truflow parser does not support type %d\n",
185bdf4a3c6SKishore Padmanabha 		    item->type);
186bdf4a3c6SKishore Padmanabha 	return BNXT_TF_RC_PARSE_ERR;
18753a0d4f7SKishore Padmanabha }
18853a0d4f7SKishore Padmanabha 
18911c854e2SKishore Padmanabha /*
19011c854e2SKishore Padmanabha  * Function to handle the parsing of RTE Flows and placing
19111c854e2SKishore Padmanabha  * the RTE flow actions into the ulp structures.
19211c854e2SKishore Padmanabha  */
19311c854e2SKishore Padmanabha int32_t
19411c854e2SKishore Padmanabha bnxt_ulp_rte_parser_act_parse(const struct rte_flow_action actions[],
1953d6ba7cbSKishore Padmanabha 			      struct ulp_rte_parser_params *params)
19611c854e2SKishore Padmanabha {
19711c854e2SKishore Padmanabha 	const struct rte_flow_action *action_item = actions;
19811c854e2SKishore Padmanabha 	struct bnxt_ulp_rte_act_info *hdr_info;
19911c854e2SKishore Padmanabha 
20011c854e2SKishore Padmanabha 	/* Parse all the items in the pattern */
20111c854e2SKishore Padmanabha 	while (action_item && action_item->type != RTE_FLOW_ACTION_TYPE_END) {
202bdf4a3c6SKishore Padmanabha 		if (action_item->type >=
2034d2c4291SShahaji Bhosle 		    (typeof(action_item->type))BNXT_RTE_FLOW_ACTION_TYPE_END) {
204bdf4a3c6SKishore Padmanabha 			if (action_item->type >=
2054d2c4291SShahaji Bhosle 			    (typeof(action_item->type))BNXT_RTE_FLOW_ACTION_TYPE_LAST)
206bdf4a3c6SKishore Padmanabha 				goto act_parser_error;
207bdf4a3c6SKishore Padmanabha 			/* get the header information from bnxt actinfo table */
208bdf4a3c6SKishore Padmanabha 			hdr_info = &ulp_vendor_act_info[action_item->type -
209bdf4a3c6SKishore Padmanabha 				BNXT_RTE_FLOW_ACTION_TYPE_END];
210bdf4a3c6SKishore Padmanabha 		} else {
2116d160d77SRandy Schacher 			if (action_item->type > RTE_FLOW_ACTION_TYPE_INDIRECT)
212bdf4a3c6SKishore Padmanabha 				goto act_parser_error;
213bdf4a3c6SKishore Padmanabha 			/* get the header information from the act info table */
21411c854e2SKishore Padmanabha 			hdr_info = &ulp_act_info[action_item->type];
215bdf4a3c6SKishore Padmanabha 		}
216bdf4a3c6SKishore Padmanabha 		if (hdr_info->act_type == BNXT_ULP_ACT_TYPE_NOT_SUPPORTED) {
217bdf4a3c6SKishore Padmanabha 			goto act_parser_error;
218bdf4a3c6SKishore Padmanabha 		} else if (hdr_info->act_type == BNXT_ULP_ACT_TYPE_SUPPORTED) {
21911c854e2SKishore Padmanabha 			/* call the registered callback handler */
22011c854e2SKishore Padmanabha 			if (hdr_info->proto_act_func) {
22111c854e2SKishore Padmanabha 				if (hdr_info->proto_act_func(action_item,
2223d6ba7cbSKishore Padmanabha 							     params) !=
22311c854e2SKishore Padmanabha 				    BNXT_TF_RC_SUCCESS) {
22411c854e2SKishore Padmanabha 					return BNXT_TF_RC_ERROR;
22511c854e2SKishore Padmanabha 				}
22611c854e2SKishore Padmanabha 			}
22711c854e2SKishore Padmanabha 		}
22811c854e2SKishore Padmanabha 		action_item++;
22911c854e2SKishore Padmanabha 	}
23014f260c0SKishore Padmanabha 	/* update the implied port details */
23177b359eeSKishore Padmanabha 	ulp_rte_parser_implicit_act_port_process(params);
23211c854e2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
233bdf4a3c6SKishore Padmanabha 
234bdf4a3c6SKishore Padmanabha act_parser_error:
235dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Truflow parser does not support act %u\n",
236bdf4a3c6SKishore Padmanabha 		    action_item->type);
237bdf4a3c6SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
23811c854e2SKishore Padmanabha }
23911c854e2SKishore Padmanabha 
24077b359eeSKishore Padmanabha /*
2414182be0dSKishore Padmanabha  * Function to handle the post processing of the computed
2424182be0dSKishore Padmanabha  * fields for the interface.
2434182be0dSKishore Padmanabha  */
2444182be0dSKishore Padmanabha static void
2454182be0dSKishore Padmanabha bnxt_ulp_comp_fld_intf_update(struct ulp_rte_parser_params *params)
2464182be0dSKishore Padmanabha {
2474182be0dSKishore Padmanabha 	uint32_t ifindex;
2486d160d77SRandy Schacher 	uint16_t port_id, parif, svif;
249f7df1c75SKishore Padmanabha 	uint32_t mtype;
2504182be0dSKishore Padmanabha 	enum bnxt_ulp_direction_type dir;
2514182be0dSKishore Padmanabha 
2524182be0dSKishore Padmanabha 	/* get the direction details */
2534182be0dSKishore Padmanabha 	dir = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
2544182be0dSKishore Padmanabha 
2554182be0dSKishore Padmanabha 	/* read the port id details */
2561993b267SShahaji Bhosle 	port_id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF);
2574182be0dSKishore Padmanabha 	if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx,
2584182be0dSKishore Padmanabha 					      port_id,
2594182be0dSKishore Padmanabha 					      &ifindex)) {
260dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:Portid is not valid\n");
2614182be0dSKishore Padmanabha 		return;
2624182be0dSKishore Padmanabha 	}
263f7df1c75SKishore Padmanabha 
264f7df1c75SKishore Padmanabha 	if (dir == BNXT_ULP_DIR_INGRESS) {
2654182be0dSKishore Padmanabha 		/* Set port PARIF */
2664182be0dSKishore Padmanabha 		if (ulp_port_db_parif_get(params->ulp_ctx, ifindex,
2672921498cSMike Baucom 					  BNXT_ULP_DRV_FUNC_PARIF, &parif)) {
268dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR, "ParseErr:ifindex is not valid\n");
2694182be0dSKishore Padmanabha 			return;
2704182be0dSKishore Padmanabha 		}
2712921498cSMike Baucom 		/* Note:
2722921498cSMike Baucom 		 * We save the drv_func_parif into CF_IDX of phy_port_parif,
2732921498cSMike Baucom 		 * since that index is currently referenced by ingress templates
2742921498cSMike Baucom 		 * for datapath flows. If in the future we change the parser to
2752921498cSMike Baucom 		 * save it in the CF_IDX of drv_func_parif we also need to update
2762921498cSMike Baucom 		 * the template.
2772921498cSMike Baucom 		 * WARNING: Two VFs on same parent PF will not work, as the parif is
2782921498cSMike Baucom 		 * based on fw fid of the parent PF.
2792921498cSMike Baucom 		 */
2804182be0dSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_PHY_PORT_PARIF,
2814182be0dSKishore Padmanabha 				    parif);
2826d160d77SRandy Schacher 		/* Set port SVIF */
2836d160d77SRandy Schacher 		if (ulp_port_db_svif_get(params->ulp_ctx, ifindex,
2846d160d77SRandy Schacher 					  BNXT_ULP_PHY_PORT_SVIF, &svif)) {
285dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR, "ParseErr:ifindex is not valid\n");
2866d160d77SRandy Schacher 			return;
2876d160d77SRandy Schacher 		}
2886d160d77SRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_PHY_PORT_SVIF,
2896d160d77SRandy Schacher 				    svif);
290f7df1c75SKishore Padmanabha 	} else {
291f7df1c75SKishore Padmanabha 		/* Get the match port type */
292f7df1c75SKishore Padmanabha 		mtype = ULP_COMP_FLD_IDX_RD(params,
293f7df1c75SKishore Padmanabha 					    BNXT_ULP_CF_IDX_MATCH_PORT_TYPE);
294f7df1c75SKishore Padmanabha 		if (mtype == BNXT_ULP_INTF_TYPE_VF_REP) {
295f7df1c75SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
296f7df1c75SKishore Padmanabha 					    BNXT_ULP_CF_IDX_MATCH_PORT_IS_VFREP,
297f7df1c75SKishore Padmanabha 					    1);
298f7df1c75SKishore Padmanabha 			/* Set VF func PARIF */
299f7df1c75SKishore Padmanabha 			if (ulp_port_db_parif_get(params->ulp_ctx, ifindex,
300f7df1c75SKishore Padmanabha 						  BNXT_ULP_VF_FUNC_PARIF,
301f7df1c75SKishore Padmanabha 						  &parif)) {
302dd0191d5SShuanglin Wang 				BNXT_DRV_DBG(ERR,
303f7df1c75SKishore Padmanabha 					    "ParseErr:ifindex is not valid\n");
304f7df1c75SKishore Padmanabha 				return;
305f7df1c75SKishore Padmanabha 			}
306f7df1c75SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
307f7df1c75SKishore Padmanabha 					    BNXT_ULP_CF_IDX_VF_FUNC_PARIF,
308f7df1c75SKishore Padmanabha 					    parif);
309f6194540SKishore Padmanabha 
310*d4b36fc5SKishore Padmanabha 			/* Set VF func SVIF */
311*d4b36fc5SKishore Padmanabha 			if (ulp_port_db_svif_get(params->ulp_ctx, ifindex,
312*d4b36fc5SKishore Padmanabha 						 BNXT_ULP_CF_IDX_VF_FUNC_SVIF, &svif)) {
313*d4b36fc5SKishore Padmanabha 				BNXT_DRV_DBG(ERR, "ParseErr:ifindex is not valid\n");
314*d4b36fc5SKishore Padmanabha 				return;
315*d4b36fc5SKishore Padmanabha 			}
316*d4b36fc5SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_VF_FUNC_SVIF,
317*d4b36fc5SKishore Padmanabha 					    svif);
318f7df1c75SKishore Padmanabha 		} else {
319f7df1c75SKishore Padmanabha 			/* Set DRV func PARIF */
320f7df1c75SKishore Padmanabha 			if (ulp_port_db_parif_get(params->ulp_ctx, ifindex,
321f7df1c75SKishore Padmanabha 						  BNXT_ULP_DRV_FUNC_PARIF,
322f7df1c75SKishore Padmanabha 						  &parif)) {
323dd0191d5SShuanglin Wang 				BNXT_DRV_DBG(ERR,
324f7df1c75SKishore Padmanabha 					    "ParseErr:ifindex is not valid\n");
325f7df1c75SKishore Padmanabha 				return;
326f7df1c75SKishore Padmanabha 			}
327f7df1c75SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
328f7df1c75SKishore Padmanabha 					    BNXT_ULP_CF_IDX_DRV_FUNC_PARIF,
329f7df1c75SKishore Padmanabha 					    parif);
330*d4b36fc5SKishore Padmanabha 
331*d4b36fc5SKishore Padmanabha 			/* Set DRV SVIF */
332*d4b36fc5SKishore Padmanabha 			if (ulp_port_db_svif_get(params->ulp_ctx, ifindex,
333*d4b36fc5SKishore Padmanabha 						 BNXT_ULP_DRV_FUNC_SVIF, &svif)) {
334*d4b36fc5SKishore Padmanabha 				BNXT_DRV_DBG(ERR, "ParseErr:ifindex is not valid\n");
335*d4b36fc5SKishore Padmanabha 				return;
336*d4b36fc5SKishore Padmanabha 			}
337*d4b36fc5SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_DRV_FUNC_SVIF,
338*d4b36fc5SKishore Padmanabha 					    svif);
339f7df1c75SKishore Padmanabha 		}
340ddaf0afaSKishore Padmanabha 		if (mtype == BNXT_ULP_INTF_TYPE_PF) {
341ddaf0afaSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
342ddaf0afaSKishore Padmanabha 					    BNXT_ULP_CF_IDX_MATCH_PORT_IS_PF,
343ddaf0afaSKishore Padmanabha 					    1);
344ddaf0afaSKishore Padmanabha 		}
3454182be0dSKishore Padmanabha 	}
3464182be0dSKishore Padmanabha }
3474182be0dSKishore Padmanabha 
348675e31d8SVenkat Duvvuru static int32_t
349675e31d8SVenkat Duvvuru ulp_post_process_normal_flow(struct ulp_rte_parser_params *params)
35077b359eeSKishore Padmanabha {
35177b359eeSKishore Padmanabha 	enum bnxt_ulp_intf_type match_port_type, act_port_type;
352675e31d8SVenkat Duvvuru 	enum bnxt_ulp_direction_type dir;
35377b359eeSKishore Padmanabha 	uint32_t act_port_set;
35477b359eeSKishore Padmanabha 
35577b359eeSKishore Padmanabha 	/* Get the computed details */
35677b359eeSKishore Padmanabha 	dir = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
35777b359eeSKishore Padmanabha 	match_port_type = ULP_COMP_FLD_IDX_RD(params,
35877b359eeSKishore Padmanabha 					      BNXT_ULP_CF_IDX_MATCH_PORT_TYPE);
35977b359eeSKishore Padmanabha 	act_port_type = ULP_COMP_FLD_IDX_RD(params,
36077b359eeSKishore Padmanabha 					    BNXT_ULP_CF_IDX_ACT_PORT_TYPE);
36177b359eeSKishore Padmanabha 	act_port_set = ULP_COMP_FLD_IDX_RD(params,
36277b359eeSKishore Padmanabha 					   BNXT_ULP_CF_IDX_ACT_PORT_IS_SET);
36377b359eeSKishore Padmanabha 
36477b359eeSKishore Padmanabha 	/* set the flow direction in the proto and action header */
36577b359eeSKishore Padmanabha 	if (dir == BNXT_ULP_DIR_EGRESS) {
36677b359eeSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits,
36777b359eeSKishore Padmanabha 			       BNXT_ULP_FLOW_DIR_BITMASK_EGR);
36877b359eeSKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
36977b359eeSKishore Padmanabha 			       BNXT_ULP_FLOW_DIR_BITMASK_EGR);
3702aa70990SKishore Padmanabha 	} else {
3712aa70990SKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits,
3722aa70990SKishore Padmanabha 			       BNXT_ULP_FLOW_DIR_BITMASK_ING);
3732aa70990SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
3742aa70990SKishore Padmanabha 			       BNXT_ULP_FLOW_DIR_BITMASK_ING);
37577b359eeSKishore Padmanabha 	}
37677b359eeSKishore Padmanabha 
3776d160d77SRandy Schacher 	/* Evaluate the VF to VF flag */
37877b359eeSKishore Padmanabha 	if (act_port_set && act_port_type == BNXT_ULP_INTF_TYPE_VF_REP &&
379987f2ec9SManish Kurup 	     match_port_type == BNXT_ULP_INTF_TYPE_VF_REP) {
380987f2ec9SManish Kurup 		if (!ULP_BITMAP_ISSET(params->act_bitmap.bits,
381987f2ec9SManish Kurup 				      BNXT_ULP_ACT_BIT_MULTIPLE_PORT)) {
3826d160d77SRandy Schacher 			ULP_BITMAP_SET(params->act_bitmap.bits,
3836d160d77SRandy Schacher 				       BNXT_ULP_ACT_BIT_VF_TO_VF);
384987f2ec9SManish Kurup 		} else {
385987f2ec9SManish Kurup 			if (ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_MP_A_IS_VFREP) &&
386987f2ec9SManish Kurup 			    ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_MP_B_IS_VFREP))
387987f2ec9SManish Kurup 				ULP_BITMAP_SET(params->act_bitmap.bits,
388987f2ec9SManish Kurup 					       BNXT_ULP_ACT_BIT_VF_TO_VF);
389987f2ec9SManish Kurup 			else
390987f2ec9SManish Kurup 				ULP_BITMAP_RESET(params->act_bitmap.bits,
391987f2ec9SManish Kurup 						 BNXT_ULP_ACT_BIT_VF_TO_VF);
392987f2ec9SManish Kurup 		}
393987f2ec9SManish Kurup 	}
39477b359eeSKishore Padmanabha 
3956af7e459SKishore Padmanabha 	/* Update the decrement ttl computational fields */
3966af7e459SKishore Padmanabha 	if (ULP_BITMAP_ISSET(params->act_bitmap.bits,
39759ae4961SKishore Padmanabha 			     BNXT_ULP_ACT_BIT_DEC_TTL)) {
3986af7e459SKishore Padmanabha 		/*
3996af7e459SKishore Padmanabha 		 * Check that vxlan proto is included and vxlan decap
4006af7e459SKishore Padmanabha 		 * action is not set then decrement tunnel ttl.
4016af7e459SKishore Padmanabha 		 * Similarly add GRE and NVGRE in future.
4026af7e459SKishore Padmanabha 		 */
4036af7e459SKishore Padmanabha 		if ((ULP_BITMAP_ISSET(params->hdr_bitmap.bits,
4046af7e459SKishore Padmanabha 				      BNXT_ULP_HDR_BIT_T_VXLAN) &&
4056af7e459SKishore Padmanabha 		    !ULP_BITMAP_ISSET(params->act_bitmap.bits,
40659ae4961SKishore Padmanabha 				      BNXT_ULP_ACT_BIT_VXLAN_DECAP))) {
4076af7e459SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
4086af7e459SKishore Padmanabha 					    BNXT_ULP_CF_IDX_ACT_T_DEC_TTL, 1);
4096af7e459SKishore Padmanabha 		} else {
4106af7e459SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
4116af7e459SKishore Padmanabha 					    BNXT_ULP_CF_IDX_ACT_DEC_TTL, 1);
4126af7e459SKishore Padmanabha 		}
4136af7e459SKishore Padmanabha 	}
4146af7e459SKishore Padmanabha 
4150c0f5a98SKishore Padmanabha 	/* Merge the hdr_fp_bit into the proto header bit */
4160c0f5a98SKishore Padmanabha 	params->hdr_bitmap.bits |= params->hdr_fp_bit.bits;
4170c0f5a98SKishore Padmanabha 
418a2417601SKishore Padmanabha 	/* Update the comp fld fid */
419a2417601SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_FID, params->fid);
420a2417601SKishore Padmanabha 
421dd0191d5SShuanglin Wang 	/* set the L2 context usage shall change it later */
422dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(params->cf_bitmap, BNXT_ULP_CF_BIT_L2_CNTXT_ID);
423dd0191d5SShuanglin Wang 
4244182be0dSKishore Padmanabha 	/* Update the computed interface parameters */
4254182be0dSKishore Padmanabha 	bnxt_ulp_comp_fld_intf_update(params);
4264182be0dSKishore Padmanabha 
42777b359eeSKishore Padmanabha 	/* TBD: Handle the flow rejection scenarios */
42877b359eeSKishore Padmanabha 	return 0;
42977b359eeSKishore Padmanabha }
43077b359eeSKishore Padmanabha 
43177b359eeSKishore Padmanabha /*
432675e31d8SVenkat Duvvuru  * Function to handle the post processing of the parsing details
433675e31d8SVenkat Duvvuru  */
434bdf4a3c6SKishore Padmanabha void
435675e31d8SVenkat Duvvuru bnxt_ulp_rte_parser_post_process(struct ulp_rte_parser_params *params)
436675e31d8SVenkat Duvvuru {
437675e31d8SVenkat Duvvuru 	ulp_post_process_normal_flow(params);
438675e31d8SVenkat Duvvuru }
439675e31d8SVenkat Duvvuru 
440675e31d8SVenkat Duvvuru /*
44177b359eeSKishore Padmanabha  * Function to compute the flow direction based on the match port details
44277b359eeSKishore Padmanabha  */
44377b359eeSKishore Padmanabha static void
44477b359eeSKishore Padmanabha bnxt_ulp_rte_parser_direction_compute(struct ulp_rte_parser_params *params)
44577b359eeSKishore Padmanabha {
44677b359eeSKishore Padmanabha 	enum bnxt_ulp_intf_type match_port_type;
44777b359eeSKishore Padmanabha 
44877b359eeSKishore Padmanabha 	/* Get the match port type */
44977b359eeSKishore Padmanabha 	match_port_type = ULP_COMP_FLD_IDX_RD(params,
45077b359eeSKishore Padmanabha 					      BNXT_ULP_CF_IDX_MATCH_PORT_TYPE);
45177b359eeSKishore Padmanabha 
45277b359eeSKishore Padmanabha 	/* If ingress flow and matchport is vf rep then dir is egress*/
45377b359eeSKishore Padmanabha 	if ((params->dir_attr & BNXT_ULP_FLOW_ATTR_INGRESS) &&
45477b359eeSKishore Padmanabha 	    match_port_type == BNXT_ULP_INTF_TYPE_VF_REP) {
45577b359eeSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_DIRECTION,
45677b359eeSKishore Padmanabha 				    BNXT_ULP_DIR_EGRESS);
45777b359eeSKishore Padmanabha 	} else {
45877b359eeSKishore Padmanabha 		/* Assign the input direction */
45977b359eeSKishore Padmanabha 		if (params->dir_attr & BNXT_ULP_FLOW_ATTR_INGRESS)
46077b359eeSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_DIRECTION,
46177b359eeSKishore Padmanabha 					    BNXT_ULP_DIR_INGRESS);
462dd0191d5SShuanglin Wang 		else if (params->dir_attr & BNXT_ULP_FLOW_ATTR_EGRESS)
46377b359eeSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_DIRECTION,
46477b359eeSKishore Padmanabha 					    BNXT_ULP_DIR_EGRESS);
465dd0191d5SShuanglin Wang 		else if (match_port_type == BNXT_ULP_INTF_TYPE_VF_REP)
466dd0191d5SShuanglin Wang 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_DIRECTION,
467dd0191d5SShuanglin Wang 					    BNXT_ULP_DIR_EGRESS);
468dd0191d5SShuanglin Wang 		else
469dd0191d5SShuanglin Wang 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_DIRECTION,
470dd0191d5SShuanglin Wang 					    BNXT_ULP_DIR_INGRESS);
47177b359eeSKishore Padmanabha 	}
47277b359eeSKishore Padmanabha }
47377b359eeSKishore Padmanabha 
47453a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item PF Header. */
47553a0d4f7SKishore Padmanabha static int32_t
4763d6ba7cbSKishore Padmanabha ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params,
47777b359eeSKishore Padmanabha 			uint32_t ifindex,
478a8321e09SAndrew Rybchenko 			uint16_t mask,
479a8321e09SAndrew Rybchenko 			enum bnxt_ulp_direction_type item_dir)
48053a0d4f7SKishore Padmanabha {
48177b359eeSKishore Padmanabha 	uint16_t svif;
48277b359eeSKishore Padmanabha 	enum bnxt_ulp_direction_type dir;
4832bbcdee8SKishore Padmanabha 	struct ulp_rte_hdr_field *hdr_field;
48445e8e1d4SVenkat Duvvuru 	enum bnxt_ulp_svif_type svif_type;
48577b359eeSKishore Padmanabha 	enum bnxt_ulp_intf_type port_type;
486a7420bd9SMike Baucom 
4870f772db6SKishore Padmanabha 	if (ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_SVIF_FLAG) !=
488a2be13e1SKishore Padmanabha 	    BNXT_ULP_INVALID_SVIF_VAL) {
489dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
4902bbcdee8SKishore Padmanabha 			    "SVIF already set,multiple source not support'd\n");
49153a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
49253a0d4f7SKishore Padmanabha 	}
49353a0d4f7SKishore Padmanabha 
49477b359eeSKishore Padmanabha 	/* Get port type details */
49577b359eeSKishore Padmanabha 	port_type = ulp_port_db_port_type_get(params->ulp_ctx, ifindex);
49677b359eeSKishore Padmanabha 	if (port_type == BNXT_ULP_INTF_TYPE_INVALID) {
497dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid port type\n");
498dc8ee812SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
499dc8ee812SKishore Padmanabha 	}
50045e8e1d4SVenkat Duvvuru 
50177b359eeSKishore Padmanabha 	/* Update the match port type */
50277b359eeSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_MATCH_PORT_TYPE, port_type);
50377b359eeSKishore Padmanabha 
50477b359eeSKishore Padmanabha 	/* compute the direction */
50577b359eeSKishore Padmanabha 	bnxt_ulp_rte_parser_direction_compute(params);
50677b359eeSKishore Padmanabha 
50777b359eeSKishore Padmanabha 	/* Get the computed direction */
508a8321e09SAndrew Rybchenko 	dir = (item_dir != BNXT_ULP_DIR_INVALID) ? item_dir :
509a8321e09SAndrew Rybchenko 		ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
510a8321e09SAndrew Rybchenko 	if (dir == BNXT_ULP_DIR_INGRESS &&
511a8321e09SAndrew Rybchenko 	    port_type != BNXT_ULP_INTF_TYPE_VF_REP) {
51245e8e1d4SVenkat Duvvuru 		svif_type = BNXT_ULP_PHY_PORT_SVIF;
51345e8e1d4SVenkat Duvvuru 	} else {
514a8321e09SAndrew Rybchenko 		if (port_type == BNXT_ULP_INTF_TYPE_VF_REP &&
515a8321e09SAndrew Rybchenko 		    item_dir != BNXT_ULP_DIR_EGRESS)
51645e8e1d4SVenkat Duvvuru 			svif_type = BNXT_ULP_VF_FUNC_SVIF;
51745e8e1d4SVenkat Duvvuru 		else
51845e8e1d4SVenkat Duvvuru 			svif_type = BNXT_ULP_DRV_FUNC_SVIF;
51945e8e1d4SVenkat Duvvuru 	}
5206d160d77SRandy Schacher 	ulp_port_db_svif_get(params->ulp_ctx, ifindex, svif_type, &svif);
521dc8ee812SKishore Padmanabha 	svif = rte_cpu_to_be_16(svif);
522dd0191d5SShuanglin Wang 	mask = rte_cpu_to_be_16(mask);
5232bbcdee8SKishore Padmanabha 	hdr_field = &params->hdr_field[BNXT_ULP_PROTO_HDR_FIELD_SVIF_IDX];
5242bbcdee8SKishore Padmanabha 	memcpy(hdr_field->spec, &svif, sizeof(svif));
5252bbcdee8SKishore Padmanabha 	memcpy(hdr_field->mask, &mask, sizeof(mask));
5262bbcdee8SKishore Padmanabha 	hdr_field->size = sizeof(svif);
5270f772db6SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_SVIF_FLAG,
528a2be13e1SKishore Padmanabha 			    rte_be_to_cpu_16(svif));
529a7420bd9SMike Baucom 	return BNXT_TF_RC_SUCCESS;
53053a0d4f7SKishore Padmanabha }
53153a0d4f7SKishore Padmanabha 
5322bbcdee8SKishore Padmanabha /* Function to handle the parsing of the RTE port id */
533a7420bd9SMike Baucom int32_t
53477b359eeSKishore Padmanabha ulp_rte_parser_implicit_match_port_process(struct ulp_rte_parser_params *params)
535a7420bd9SMike Baucom {
536a7420bd9SMike Baucom 	uint16_t port_id = 0;
537a7420bd9SMike Baucom 	uint16_t svif_mask = 0xFFFF;
53877b359eeSKishore Padmanabha 	uint32_t ifindex;
53977b359eeSKishore Padmanabha 	int32_t rc = BNXT_TF_RC_ERROR;
540a7420bd9SMike Baucom 
5410f772db6SKishore Padmanabha 	if (ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_SVIF_FLAG) !=
542a2be13e1SKishore Padmanabha 	    BNXT_ULP_INVALID_SVIF_VAL)
54353a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
544a7420bd9SMike Baucom 
5452bbcdee8SKishore Padmanabha 	/* SVIF not set. So get the port id */
5460f772db6SKishore Padmanabha 	port_id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF);
547a7420bd9SMike Baucom 
54877b359eeSKishore Padmanabha 	if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx,
54977b359eeSKishore Padmanabha 					      port_id,
55077b359eeSKishore Padmanabha 					      &ifindex)) {
551dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:Portid is not valid\n");
55277b359eeSKishore Padmanabha 		return rc;
55377b359eeSKishore Padmanabha 	}
55477b359eeSKishore Padmanabha 
5552bbcdee8SKishore Padmanabha 	/* Update the SVIF details */
556a8321e09SAndrew Rybchenko 	rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask,
557a8321e09SAndrew Rybchenko 				     BNXT_ULP_DIR_INVALID);
55877b359eeSKishore Padmanabha 	return rc;
55953a0d4f7SKishore Padmanabha }
56053a0d4f7SKishore Padmanabha 
56114f260c0SKishore Padmanabha /* Function to handle the implicit action port id */
5622bbcdee8SKishore Padmanabha int32_t
56377b359eeSKishore Padmanabha ulp_rte_parser_implicit_act_port_process(struct ulp_rte_parser_params *params)
5642bbcdee8SKishore Padmanabha {
56514f260c0SKishore Padmanabha 	struct rte_flow_action action_item = {0};
56614f260c0SKishore Padmanabha 	struct rte_flow_action_port_id port_id = {0};
5672bbcdee8SKishore Padmanabha 
56814f260c0SKishore Padmanabha 	/* Read the action port set bit */
56914f260c0SKishore Padmanabha 	if (ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_ACT_PORT_IS_SET)) {
57014f260c0SKishore Padmanabha 		/* Already set, so just exit */
5712bbcdee8SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
5723c334fcdSKishore Padmanabha 	}
57314f260c0SKishore Padmanabha 	port_id.id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF);
574640b44aaSAndrew Rybchenko 	action_item.type = RTE_FLOW_ACTION_TYPE_PORT_ID;
57514f260c0SKishore Padmanabha 	action_item.conf = &port_id;
5762bbcdee8SKishore Padmanabha 
57714f260c0SKishore Padmanabha 	/* Update the action port based on incoming port */
578640b44aaSAndrew Rybchenko 	ulp_rte_port_act_handler(&action_item, params);
5799202a567SKishore Padmanabha 
58014f260c0SKishore Padmanabha 	/* Reset the action port set bit */
58114f260c0SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_IS_SET, 0);
5822bbcdee8SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
5832bbcdee8SKishore Padmanabha }
5842bbcdee8SKishore Padmanabha 
585a8321e09SAndrew Rybchenko /* Parse items PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
58653a0d4f7SKishore Padmanabha int32_t
587a8321e09SAndrew Rybchenko ulp_rte_port_hdr_handler(const struct rte_flow_item *item,
5883d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params)
58953a0d4f7SKishore Padmanabha {
590a8321e09SAndrew Rybchenko 	enum bnxt_ulp_direction_type item_dir;
591a8321e09SAndrew Rybchenko 	uint16_t ethdev_id;
59277b359eeSKishore Padmanabha 	uint16_t mask = 0;
59377b359eeSKishore Padmanabha 	uint32_t ifindex;
594d9e70b1dSRandy Schacher 	int32_t rc = BNXT_TF_RC_PARSE_ERR;
59553a0d4f7SKishore Padmanabha 
596a8321e09SAndrew Rybchenko 	if (!item->spec) {
597dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:Port spec is not valid\n");
59877b359eeSKishore Padmanabha 		return rc;
5994a50b6c1SKishore Padmanabha 	}
600a8321e09SAndrew Rybchenko 	if (!item->mask) {
601dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:Port mask is not valid\n");
60277b359eeSKishore Padmanabha 		return rc;
6034a50b6c1SKishore Padmanabha 	}
604a8321e09SAndrew Rybchenko 
605a8321e09SAndrew Rybchenko 	switch (item->type) {
606a8321e09SAndrew Rybchenko 	case RTE_FLOW_ITEM_TYPE_PORT_ID: {
607a8321e09SAndrew Rybchenko 		const struct rte_flow_item_port_id *port_spec = item->spec;
608a8321e09SAndrew Rybchenko 		const struct rte_flow_item_port_id *port_mask = item->mask;
609a8321e09SAndrew Rybchenko 
610a8321e09SAndrew Rybchenko 		item_dir = BNXT_ULP_DIR_INVALID;
611a8321e09SAndrew Rybchenko 		ethdev_id = port_spec->id;
61277b359eeSKishore Padmanabha 		mask = port_mask->id;
613d9e70b1dSRandy Schacher 
614d9e70b1dSRandy Schacher 		if (!port_mask->id) {
615d9e70b1dSRandy Schacher 			ULP_BITMAP_SET(params->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_SVIF_IGNORE);
616d9e70b1dSRandy Schacher 		}
617a8321e09SAndrew Rybchenko 		break;
618a8321e09SAndrew Rybchenko 	}
619a8321e09SAndrew Rybchenko 	case RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR: {
620a8321e09SAndrew Rybchenko 		const struct rte_flow_item_ethdev *ethdev_spec = item->spec;
621a8321e09SAndrew Rybchenko 		const struct rte_flow_item_ethdev *ethdev_mask = item->mask;
622a8321e09SAndrew Rybchenko 
623a8321e09SAndrew Rybchenko 		item_dir = BNXT_ULP_DIR_INGRESS;
624a8321e09SAndrew Rybchenko 		ethdev_id = ethdev_spec->port_id;
625a8321e09SAndrew Rybchenko 		mask = ethdev_mask->port_id;
626a8321e09SAndrew Rybchenko 		break;
627a8321e09SAndrew Rybchenko 	}
628a8321e09SAndrew Rybchenko 	case RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT: {
629a8321e09SAndrew Rybchenko 		const struct rte_flow_item_ethdev *ethdev_spec = item->spec;
630a8321e09SAndrew Rybchenko 		const struct rte_flow_item_ethdev *ethdev_mask = item->mask;
631a8321e09SAndrew Rybchenko 
632a8321e09SAndrew Rybchenko 		item_dir = BNXT_ULP_DIR_EGRESS;
633a8321e09SAndrew Rybchenko 		ethdev_id = ethdev_spec->port_id;
634a8321e09SAndrew Rybchenko 		mask = ethdev_mask->port_id;
635a8321e09SAndrew Rybchenko 		break;
636a8321e09SAndrew Rybchenko 	}
637a8321e09SAndrew Rybchenko 	default:
638dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:Unexpected item\n");
639a8321e09SAndrew Rybchenko 		return rc;
640a8321e09SAndrew Rybchenko 	}
641a7420bd9SMike Baucom 
64277b359eeSKishore Padmanabha 	/* perform the conversion from dpdk port to bnxt ifindex */
64377b359eeSKishore Padmanabha 	if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx,
644a8321e09SAndrew Rybchenko 					      ethdev_id,
64577b359eeSKishore Padmanabha 					      &ifindex)) {
646dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:Portid is not valid\n");
64777b359eeSKishore Padmanabha 		return rc;
64877b359eeSKishore Padmanabha 	}
6493d6ba7cbSKishore Padmanabha 	/* Update the SVIF details */
650a8321e09SAndrew Rybchenko 	return ulp_rte_parser_svif_set(params, ifindex, mask, item_dir);
65153a0d4f7SKishore Padmanabha }
65253a0d4f7SKishore Padmanabha 
6530c0f5a98SKishore Padmanabha /* Function to handle the update of proto header based on field values */
6540c0f5a98SKishore Padmanabha static void
6550c0f5a98SKishore Padmanabha ulp_rte_l2_proto_type_update(struct ulp_rte_parser_params *param,
6566d160d77SRandy Schacher 			     uint16_t type, uint32_t in_flag,
6576d160d77SRandy Schacher 			     uint32_t has_vlan, uint32_t has_vlan_mask)
6580c0f5a98SKishore Padmanabha {
6596d160d77SRandy Schacher #define ULP_RTE_ETHER_TYPE_ROE	0xfc3d
6606d160d77SRandy Schacher 
6610c0f5a98SKishore Padmanabha 	if (type == tfp_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) {
6620c0f5a98SKishore Padmanabha 		if (in_flag) {
6630c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
6640c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_I_IPV4);
6650c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_I_L3, 1);
6660c0f5a98SKishore Padmanabha 		} else {
6670c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
6680c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_O_IPV4);
6690c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_O_L3, 1);
6700c0f5a98SKishore Padmanabha 		}
6710c0f5a98SKishore Padmanabha 	} else if (type == tfp_cpu_to_be_16(RTE_ETHER_TYPE_IPV6)) {
6720c0f5a98SKishore Padmanabha 		if (in_flag) {
6730c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
6740c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_I_IPV6);
6750c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_I_L3, 1);
6760c0f5a98SKishore Padmanabha 		} else {
6770c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
6780c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_O_IPV6);
6790c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_O_L3, 1);
6800c0f5a98SKishore Padmanabha 		}
6816d160d77SRandy Schacher 	} else if (type == tfp_cpu_to_be_16(RTE_ETHER_TYPE_VLAN)) {
6826d160d77SRandy Schacher 		has_vlan_mask = 1;
6836d160d77SRandy Schacher 		has_vlan = 1;
6842d344c36SRandy Schacher 	} else if (type == tfp_cpu_to_be_16(RTE_ETHER_TYPE_ECPRI)) {
6852d344c36SRandy Schacher 		/* Update the hdr_bitmap with eCPRI */
6862d344c36SRandy Schacher 		ULP_BITMAP_SET(param->hdr_fp_bit.bits,
6872d344c36SRandy Schacher 				BNXT_ULP_HDR_BIT_O_ECPRI);
6886d160d77SRandy Schacher 	} else if (type == tfp_cpu_to_be_16(ULP_RTE_ETHER_TYPE_ROE)) {
6896d160d77SRandy Schacher 		/* Update the hdr_bitmap with RoE */
6906d160d77SRandy Schacher 		ULP_BITMAP_SET(param->hdr_fp_bit.bits,
6916d160d77SRandy Schacher 				BNXT_ULP_HDR_BIT_O_ROE);
6926d160d77SRandy Schacher 	}
6936d160d77SRandy Schacher 
6946d160d77SRandy Schacher 	if (has_vlan_mask) {
6956d160d77SRandy Schacher 		if (in_flag) {
6966d160d77SRandy Schacher 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_I_HAS_VTAG,
6976d160d77SRandy Schacher 					    has_vlan);
6986d160d77SRandy Schacher 			ULP_COMP_FLD_IDX_WR(param,
6996d160d77SRandy Schacher 					    BNXT_ULP_CF_IDX_I_VLAN_NO_IGNORE,
7006d160d77SRandy Schacher 					    1);
7016d160d77SRandy Schacher 		} else {
7026d160d77SRandy Schacher 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_O_HAS_VTAG,
7036d160d77SRandy Schacher 					    has_vlan);
7046d160d77SRandy Schacher 			ULP_COMP_FLD_IDX_WR(param,
7056d160d77SRandy Schacher 					    BNXT_ULP_CF_IDX_O_VLAN_NO_IGNORE,
7066d160d77SRandy Schacher 					    1);
7076d160d77SRandy Schacher 		}
7080c0f5a98SKishore Padmanabha 	}
7090c0f5a98SKishore Padmanabha }
7100c0f5a98SKishore Padmanabha 
711b011ad08SKishore Padmanabha /* Internal Function to identify broadcast or multicast packets */
712b011ad08SKishore Padmanabha static int32_t
713b011ad08SKishore Padmanabha ulp_rte_parser_is_bcmc_addr(const struct rte_ether_addr *eth_addr)
714b011ad08SKishore Padmanabha {
715b011ad08SKishore Padmanabha 	if (rte_is_multicast_ether_addr(eth_addr) ||
716b011ad08SKishore Padmanabha 	    rte_is_broadcast_ether_addr(eth_addr)) {
717dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(DEBUG,
718b011ad08SKishore Padmanabha 			    "No support for bcast or mcast addr offload\n");
719b011ad08SKishore Padmanabha 		return 1;
720b011ad08SKishore Padmanabha 	}
721b011ad08SKishore Padmanabha 	return 0;
722b011ad08SKishore Padmanabha }
723b011ad08SKishore Padmanabha 
72453a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item Ethernet Header. */
72553a0d4f7SKishore Padmanabha int32_t
72653a0d4f7SKishore Padmanabha ulp_rte_eth_hdr_handler(const struct rte_flow_item *item,
7273d6ba7cbSKishore Padmanabha 			struct ulp_rte_parser_params *params)
72853a0d4f7SKishore Padmanabha {
7293d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_eth *eth_spec = item->spec;
7303d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_eth *eth_mask = item->mask;
731bdf4a3c6SKishore Padmanabha 	uint32_t idx = 0, dmac_idx = 0;
7323d6ba7cbSKishore Padmanabha 	uint32_t size;
7330c0f5a98SKishore Padmanabha 	uint16_t eth_type = 0;
7340c0f5a98SKishore Padmanabha 	uint32_t inner_flag = 0;
7356d160d77SRandy Schacher 	uint32_t has_vlan = 0, has_vlan_mask = 0;
73653a0d4f7SKishore Padmanabha 
737741172beSKishore Padmanabha 	/* Perform validations */
73853a0d4f7SKishore Padmanabha 	if (eth_spec) {
7396d160d77SRandy Schacher 		/* Avoid multicast and broadcast addr */
7406d160d77SRandy Schacher 		if (!ULP_APP_BC_MC_SUPPORT(params->ulp_ctx) &&
7416d160d77SRandy Schacher 		    ulp_rte_parser_is_bcmc_addr(&eth_spec->hdr.dst_addr))
742b011ad08SKishore Padmanabha 			return BNXT_TF_RC_PARSE_ERR;
743b011ad08SKishore Padmanabha 
7446d160d77SRandy Schacher 		if (!ULP_APP_BC_MC_SUPPORT(params->ulp_ctx) &&
7456d160d77SRandy Schacher 		    ulp_rte_parser_is_bcmc_addr(&eth_spec->hdr.src_addr))
746b011ad08SKishore Padmanabha 			return BNXT_TF_RC_PARSE_ERR;
747b011ad08SKishore Padmanabha 
7488275d5fcSThomas Monjalon 		eth_type = eth_spec->hdr.ether_type;
7496d160d77SRandy Schacher 		has_vlan = eth_spec->has_vlan;
7506d160d77SRandy Schacher 	}
751f6e12015SKishore Padmanabha 
752f6e12015SKishore Padmanabha 	/* If mask is not specified then use the default mask */
753f6e12015SKishore Padmanabha 	if (eth_spec && !eth_mask)
754f6e12015SKishore Padmanabha 		eth_mask = &rte_flow_item_eth_mask;
755f6e12015SKishore Padmanabha 
7566d160d77SRandy Schacher 	if (eth_mask) {
757f6e12015SKishore Padmanabha 		eth_type &= eth_mask->type;
7586d160d77SRandy Schacher 		has_vlan_mask = eth_mask->has_vlan;
75953a0d4f7SKishore Padmanabha 	}
760741172beSKishore Padmanabha 
7610c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
7620c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_ETH_NUM))) {
763dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
764741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
76553a0d4f7SKishore Padmanabha 	}
766741172beSKishore Padmanabha 	/*
767741172beSKishore Padmanabha 	 * Copy the rte_flow_item for eth into hdr_field using ethernet
768741172beSKishore Padmanabha 	 * header fields
769741172beSKishore Padmanabha 	 */
770bdf4a3c6SKishore Padmanabha 	dmac_idx = idx;
7718275d5fcSThomas Monjalon 	size = sizeof(((struct rte_flow_item_eth *)NULL)->hdr.dst_addr.addr_bytes);
772741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
7738275d5fcSThomas Monjalon 			      ulp_deference_struct(eth_spec, hdr.dst_addr.addr_bytes),
7748275d5fcSThomas Monjalon 			      ulp_deference_struct(eth_mask, hdr.dst_addr.addr_bytes),
775741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
776741172beSKishore Padmanabha 
7778275d5fcSThomas Monjalon 	size = sizeof(((struct rte_flow_item_eth *)NULL)->hdr.src_addr.addr_bytes);
778741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
7798275d5fcSThomas Monjalon 			      ulp_deference_struct(eth_spec, hdr.src_addr.addr_bytes),
7808275d5fcSThomas Monjalon 			      ulp_deference_struct(eth_mask, hdr.src_addr.addr_bytes),
781741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
782741172beSKishore Padmanabha 
7838275d5fcSThomas Monjalon 	size = sizeof(((struct rte_flow_item_eth *)NULL)->hdr.ether_type);
784741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
7858275d5fcSThomas Monjalon 			      ulp_deference_struct(eth_spec, hdr.ether_type),
7868275d5fcSThomas Monjalon 			      ulp_deference_struct(eth_mask, hdr.ether_type),
7876d160d77SRandy Schacher 			      (ULP_APP_TOS_PROTO_SUPPORT(params->ulp_ctx)) ?
7886d160d77SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT : ULP_PRSR_ACT_MATCH_IGNORE);
78953a0d4f7SKishore Padmanabha 
7900c0f5a98SKishore Padmanabha 	/* Update the protocol hdr bitmap */
791675e31d8SVenkat Duvvuru 	if (ULP_BITMAP_ISSET(params->hdr_bitmap.bits,
792675e31d8SVenkat Duvvuru 			     BNXT_ULP_HDR_BIT_O_ETH) ||
793675e31d8SVenkat Duvvuru 	    ULP_BITMAP_ISSET(params->hdr_bitmap.bits,
794675e31d8SVenkat Duvvuru 			     BNXT_ULP_HDR_BIT_O_IPV4) ||
795675e31d8SVenkat Duvvuru 	    ULP_BITMAP_ISSET(params->hdr_bitmap.bits,
796675e31d8SVenkat Duvvuru 			     BNXT_ULP_HDR_BIT_O_IPV6) ||
797675e31d8SVenkat Duvvuru 	    ULP_BITMAP_ISSET(params->hdr_bitmap.bits,
798675e31d8SVenkat Duvvuru 			     BNXT_ULP_HDR_BIT_O_UDP) ||
799675e31d8SVenkat Duvvuru 	    ULP_BITMAP_ISSET(params->hdr_bitmap.bits,
800675e31d8SVenkat Duvvuru 			     BNXT_ULP_HDR_BIT_O_TCP)) {
8013d6ba7cbSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_I_ETH);
8020c0f5a98SKishore Padmanabha 		inner_flag = 1;
8030c0f5a98SKishore Padmanabha 	} else {
8043d6ba7cbSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_O_ETH);
805bdf4a3c6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUN_OFF_DMAC_ID,
806bdf4a3c6SKishore Padmanabha 				    dmac_idx);
8070c0f5a98SKishore Padmanabha 	}
8080c0f5a98SKishore Padmanabha 	/* Update the field protocol hdr bitmap */
8096d160d77SRandy Schacher 	ulp_rte_l2_proto_type_update(params, eth_type, inner_flag,
8106d160d77SRandy Schacher 				     has_vlan, has_vlan_mask);
81153a0d4f7SKishore Padmanabha 
81253a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
81353a0d4f7SKishore Padmanabha }
81453a0d4f7SKishore Padmanabha 
81553a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item Vlan Header. */
81653a0d4f7SKishore Padmanabha int32_t
81753a0d4f7SKishore Padmanabha ulp_rte_vlan_hdr_handler(const struct rte_flow_item *item,
8183d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params)
81953a0d4f7SKishore Padmanabha {
8203d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_vlan *vlan_spec = item->spec;
8213d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_vlan *vlan_mask = item->mask;
8222bbcdee8SKishore Padmanabha 	struct ulp_rte_hdr_bitmap	*hdr_bit;
823741172beSKishore Padmanabha 	uint32_t idx = 0;
824741172beSKishore Padmanabha 	uint16_t vlan_tag = 0, priority = 0;
825741172beSKishore Padmanabha 	uint16_t vlan_tag_mask = 0, priority_mask = 0;
8262bbcdee8SKishore Padmanabha 	uint32_t outer_vtag_num;
8272bbcdee8SKishore Padmanabha 	uint32_t inner_vtag_num;
8280c0f5a98SKishore Padmanabha 	uint16_t eth_type = 0;
8290c0f5a98SKishore Padmanabha 	uint32_t inner_flag = 0;
830741172beSKishore Padmanabha 	uint32_t size;
83153a0d4f7SKishore Padmanabha 
83253a0d4f7SKishore Padmanabha 	if (vlan_spec) {
8338275d5fcSThomas Monjalon 		vlan_tag = ntohs(vlan_spec->hdr.vlan_tci);
834d21325eaSKishore Padmanabha 		priority = htons(vlan_tag >> ULP_VLAN_PRIORITY_SHIFT);
835d21325eaSKishore Padmanabha 		vlan_tag &= ULP_VLAN_TAG_MASK;
83653a0d4f7SKishore Padmanabha 		vlan_tag = htons(vlan_tag);
8378275d5fcSThomas Monjalon 		eth_type = vlan_spec->hdr.eth_proto;
83853a0d4f7SKishore Padmanabha 	}
83953a0d4f7SKishore Padmanabha 
840f6e12015SKishore Padmanabha 	/* assign default vlan mask if spec is valid and mask is not */
841f6e12015SKishore Padmanabha 	if (vlan_spec && !vlan_mask)
842f6e12015SKishore Padmanabha 		vlan_mask = &rte_flow_item_vlan_mask;
843f6e12015SKishore Padmanabha 
84453a0d4f7SKishore Padmanabha 	if (vlan_mask) {
845f6e12015SKishore Padmanabha 		vlan_tag_mask = ntohs(vlan_mask->tci);
846741172beSKishore Padmanabha 		priority_mask = htons(vlan_tag_mask >> ULP_VLAN_PRIORITY_SHIFT);
847741172beSKishore Padmanabha 		vlan_tag_mask &= 0xfff;
848d21325eaSKishore Padmanabha 		/*
849d21325eaSKishore Padmanabha 		 * the storage for priority and vlan tag is 2 bytes
850d21325eaSKishore Padmanabha 		 * The mask of priority which is 3 bits if it is all 1's
851d21325eaSKishore Padmanabha 		 * then make the rest bits 13 bits as 1's
852d21325eaSKishore Padmanabha 		 * so that it is matched as exact match.
853d21325eaSKishore Padmanabha 		 */
854741172beSKishore Padmanabha 		if (priority_mask == ULP_VLAN_PRIORITY_MASK)
855741172beSKishore Padmanabha 			priority_mask |= ~ULP_VLAN_PRIORITY_MASK;
856741172beSKishore Padmanabha 		if (vlan_tag_mask == ULP_VLAN_TAG_MASK)
857741172beSKishore Padmanabha 			vlan_tag_mask |= ~ULP_VLAN_TAG_MASK;
858741172beSKishore Padmanabha 		vlan_tag_mask = htons(vlan_tag_mask);
859741172beSKishore Padmanabha 	}
86053a0d4f7SKishore Padmanabha 
8610c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
8620c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_S_VLAN_NUM))) {
863dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
864741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
865741172beSKishore Padmanabha 	}
866741172beSKishore Padmanabha 
867741172beSKishore Padmanabha 	/*
868741172beSKishore Padmanabha 	 * Copy the rte_flow_item for vlan into hdr_field using Vlan
869741172beSKishore Padmanabha 	 * header fields
870741172beSKishore Padmanabha 	 */
8718275d5fcSThomas Monjalon 	size = sizeof(((struct rte_flow_item_vlan *)NULL)->hdr.vlan_tci);
872a8cdfc69SKishore Padmanabha 	/*
873a8cdfc69SKishore Padmanabha 	 * The priority field is ignored since OVS is setting it as
874a8cdfc69SKishore Padmanabha 	 * wild card match and it is not supported. This is a work
875a8cdfc69SKishore Padmanabha 	 * around and shall be addressed in the future.
876a8cdfc69SKishore Padmanabha 	 */
877741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
878741172beSKishore Padmanabha 			      &priority,
8792730e7f9SKishore Padmanabha 			      (vlan_mask) ? &priority_mask : NULL,
880741172beSKishore Padmanabha 			      ULP_PRSR_ACT_MASK_IGNORE);
881a8cdfc69SKishore Padmanabha 
882741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
883741172beSKishore Padmanabha 			      &vlan_tag,
8842730e7f9SKishore Padmanabha 			      (vlan_mask) ? &vlan_tag_mask : NULL,
885741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
886741172beSKishore Padmanabha 
8878275d5fcSThomas Monjalon 	size = sizeof(((struct rte_flow_item_vlan *)NULL)->hdr.eth_proto);
888741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
8898275d5fcSThomas Monjalon 			      ulp_deference_struct(vlan_spec, hdr.eth_proto),
8908275d5fcSThomas Monjalon 			      ulp_deference_struct(vlan_mask, hdr.eth_proto),
891741172beSKishore Padmanabha 			      ULP_PRSR_ACT_MATCH_IGNORE);
89253a0d4f7SKishore Padmanabha 
89353a0d4f7SKishore Padmanabha 	/* Get the outer tag and inner tag counts */
8940f772db6SKishore Padmanabha 	outer_vtag_num = ULP_COMP_FLD_IDX_RD(params,
8950f772db6SKishore Padmanabha 					     BNXT_ULP_CF_IDX_O_VTAG_NUM);
8960f772db6SKishore Padmanabha 	inner_vtag_num = ULP_COMP_FLD_IDX_RD(params,
8970f772db6SKishore Padmanabha 					     BNXT_ULP_CF_IDX_I_VTAG_NUM);
89853a0d4f7SKishore Padmanabha 
89953a0d4f7SKishore Padmanabha 	/* Update the hdr_bitmap of the vlans */
9002bbcdee8SKishore Padmanabha 	hdr_bit = &params->hdr_bitmap;
9012bbcdee8SKishore Padmanabha 	if (ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_O_ETH) &&
90222edb82aSKishore Padmanabha 	    !ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_I_ETH) &&
903a2be13e1SKishore Padmanabha 	    !outer_vtag_num) {
904a2be13e1SKishore Padmanabha 		/* Update the vlan tag num */
90553a0d4f7SKishore Padmanabha 		outer_vtag_num++;
9060f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_VTAG_NUM,
9072bbcdee8SKishore Padmanabha 				    outer_vtag_num);
908d9e70b1dSRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_HAS_VTAG, 1);
90972ee725bSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_ONE_VTAG, 1);
91022edb82aSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits,
91122edb82aSKishore Padmanabha 			       BNXT_ULP_HDR_BIT_OO_VLAN);
9122730e7f9SKishore Padmanabha 		if (vlan_mask && vlan_tag_mask)
9132730e7f9SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
9142730e7f9SKishore Padmanabha 					    BNXT_ULP_CF_IDX_OO_VLAN_FB_VID, 1);
9152730e7f9SKishore Padmanabha 
9162bbcdee8SKishore Padmanabha 	} else if (ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_O_ETH) &&
91722edb82aSKishore Padmanabha 		   !ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_I_ETH) &&
918a2be13e1SKishore Padmanabha 		   outer_vtag_num == 1) {
919a2be13e1SKishore Padmanabha 		/* update the vlan tag num */
92053a0d4f7SKishore Padmanabha 		outer_vtag_num++;
9210f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_VTAG_NUM,
9222bbcdee8SKishore Padmanabha 				    outer_vtag_num);
9230f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_TWO_VTAGS, 1);
92472ee725bSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_ONE_VTAG, 0);
92522edb82aSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits,
92622edb82aSKishore Padmanabha 			       BNXT_ULP_HDR_BIT_OI_VLAN);
9272730e7f9SKishore Padmanabha 		if (vlan_mask && vlan_tag_mask)
9282730e7f9SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
9292730e7f9SKishore Padmanabha 					    BNXT_ULP_CF_IDX_OI_VLAN_FB_VID, 1);
9302730e7f9SKishore Padmanabha 
9312bbcdee8SKishore Padmanabha 	} else if (ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_O_ETH) &&
9322bbcdee8SKishore Padmanabha 		   ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_I_ETH) &&
933a2be13e1SKishore Padmanabha 		   !inner_vtag_num) {
934a2be13e1SKishore Padmanabha 		/* update the vlan tag num */
93553a0d4f7SKishore Padmanabha 		inner_vtag_num++;
9360f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_VTAG_NUM,
9372bbcdee8SKishore Padmanabha 				    inner_vtag_num);
938d9e70b1dSRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_HAS_VTAG, 1);
93972ee725bSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_ONE_VTAG, 1);
94022edb82aSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits,
94122edb82aSKishore Padmanabha 			       BNXT_ULP_HDR_BIT_IO_VLAN);
9422730e7f9SKishore Padmanabha 		if (vlan_mask && vlan_tag_mask)
9432730e7f9SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
9442730e7f9SKishore Padmanabha 					    BNXT_ULP_CF_IDX_IO_VLAN_FB_VID, 1);
9450c0f5a98SKishore Padmanabha 		inner_flag = 1;
9462bbcdee8SKishore Padmanabha 	} else if (ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_O_ETH) &&
9472bbcdee8SKishore Padmanabha 		   ULP_BITMAP_ISSET(hdr_bit->bits, BNXT_ULP_HDR_BIT_I_ETH) &&
948a2be13e1SKishore Padmanabha 		   inner_vtag_num == 1) {
949a2be13e1SKishore Padmanabha 		/* update the vlan tag num */
95053a0d4f7SKishore Padmanabha 		inner_vtag_num++;
9510f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_VTAG_NUM,
9522bbcdee8SKishore Padmanabha 				    inner_vtag_num);
9530f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_TWO_VTAGS, 1);
95472ee725bSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_ONE_VTAG, 0);
95522edb82aSKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits,
95622edb82aSKishore Padmanabha 			       BNXT_ULP_HDR_BIT_II_VLAN);
9572730e7f9SKishore Padmanabha 		if (vlan_mask && vlan_tag_mask)
9582730e7f9SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
9592730e7f9SKishore Padmanabha 					    BNXT_ULP_CF_IDX_II_VLAN_FB_VID, 1);
9600c0f5a98SKishore Padmanabha 		inner_flag = 1;
96153a0d4f7SKishore Padmanabha 	} else {
962dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error Parsing:Vlan hdr found without eth\n");
96353a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
96453a0d4f7SKishore Padmanabha 	}
9650c0f5a98SKishore Padmanabha 	/* Update the field protocol hdr bitmap */
9666d160d77SRandy Schacher 	ulp_rte_l2_proto_type_update(params, eth_type, inner_flag, 1, 1);
96753a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
96853a0d4f7SKishore Padmanabha }
96953a0d4f7SKishore Padmanabha 
9700c0f5a98SKishore Padmanabha /* Function to handle the update of proto header based on field values */
9710c0f5a98SKishore Padmanabha static void
9720c0f5a98SKishore Padmanabha ulp_rte_l3_proto_type_update(struct ulp_rte_parser_params *param,
9730c0f5a98SKishore Padmanabha 			     uint8_t proto, uint32_t in_flag)
9740c0f5a98SKishore Padmanabha {
9750c0f5a98SKishore Padmanabha 	if (proto == IPPROTO_UDP) {
9760c0f5a98SKishore Padmanabha 		if (in_flag) {
9770c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
9780c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_I_UDP);
9790c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_I_L4, 1);
9800c0f5a98SKishore Padmanabha 		} else {
9810c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
9820c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_O_UDP);
9830c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_O_L4, 1);
9840c0f5a98SKishore Padmanabha 		}
9850c0f5a98SKishore Padmanabha 	} else if (proto == IPPROTO_TCP) {
9860c0f5a98SKishore Padmanabha 		if (in_flag) {
9870c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
9880c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_I_TCP);
9890c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_I_L4, 1);
9900c0f5a98SKishore Padmanabha 		} else {
9910c0f5a98SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_fp_bit.bits,
9920c0f5a98SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_O_TCP);
9930c0f5a98SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_O_L4, 1);
9940c0f5a98SKishore Padmanabha 		}
9953fe124d2SKishore Padmanabha 	} else if (proto == IPPROTO_GRE) {
9963fe124d2SKishore Padmanabha 		ULP_BITMAP_SET(param->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_T_GRE);
9973fe124d2SKishore Padmanabha 	} else if (proto == IPPROTO_ICMP) {
998dd0191d5SShuanglin Wang 		if (ULP_BITMAP_ISSET(param->cf_bitmap,
999dd0191d5SShuanglin Wang 				     BNXT_ULP_CF_BIT_IS_TUNNEL))
10003fe124d2SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_bitmap.bits,
10013fe124d2SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_I_ICMP);
10023fe124d2SKishore Padmanabha 		else
10033fe124d2SKishore Padmanabha 			ULP_BITMAP_SET(param->hdr_bitmap.bits,
10043fe124d2SKishore Padmanabha 				       BNXT_ULP_HDR_BIT_O_ICMP);
10053fe124d2SKishore Padmanabha 	}
10066d160d77SRandy Schacher 
10073fe124d2SKishore Padmanabha 	if (in_flag) {
10083fe124d2SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(param,
10093fe124d2SKishore Padmanabha 				    BNXT_ULP_CF_IDX_I_L3_FB_PROTO_ID,
10103fe124d2SKishore Padmanabha 				    1);
10113fe124d2SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(param,
10123fe124d2SKishore Padmanabha 				    BNXT_ULP_CF_IDX_I_L3_PROTO_ID,
10133fe124d2SKishore Padmanabha 				    proto);
10143fe124d2SKishore Padmanabha 	} else {
10153fe124d2SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(param,
10163fe124d2SKishore Padmanabha 				    BNXT_ULP_CF_IDX_O_L3_FB_PROTO_ID,
10173fe124d2SKishore Padmanabha 				    1);
10183fe124d2SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(param,
10193fe124d2SKishore Padmanabha 				    BNXT_ULP_CF_IDX_O_L3_PROTO_ID,
10203fe124d2SKishore Padmanabha 				    proto);
10213fe124d2SKishore Padmanabha 	}
10220c0f5a98SKishore Padmanabha }
10230c0f5a98SKishore Padmanabha 
102453a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item IPV4 Header. */
102553a0d4f7SKishore Padmanabha int32_t
102653a0d4f7SKishore Padmanabha ulp_rte_ipv4_hdr_handler(const struct rte_flow_item *item,
10273d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params)
102853a0d4f7SKishore Padmanabha {
10293d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_ipv4 *ipv4_spec = item->spec;
10303d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_ipv4 *ipv4_mask = item->mask;
10313d6ba7cbSKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1032bdf4a3c6SKishore Padmanabha 	uint32_t idx = 0, dip_idx = 0;
10333d6ba7cbSKishore Padmanabha 	uint32_t size;
10340c0f5a98SKishore Padmanabha 	uint8_t proto = 0;
1035dd0191d5SShuanglin Wang 	uint8_t ttl = 0;
10366d160d77SRandy Schacher 	uint8_t proto_mask = 0;
10370c0f5a98SKishore Padmanabha 	uint32_t inner_flag = 0;
10380c0f5a98SKishore Padmanabha 	uint32_t cnt;
103953a0d4f7SKishore Padmanabha 
10400c0f5a98SKishore Padmanabha 	/* validate there are no 3rd L3 header */
10410c0f5a98SKishore Padmanabha 	cnt = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L3_HDR_CNT);
10420c0f5a98SKishore Padmanabha 	if (cnt == 2) {
1043dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err:Third L3 header not supported\n");
104453a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
104553a0d4f7SKishore Padmanabha 	}
104653a0d4f7SKishore Padmanabha 
10470c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
10480c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_IPV4_NUM))) {
1049dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1050741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
1051741172beSKishore Padmanabha 	}
1052741172beSKishore Padmanabha 
1053f6e12015SKishore Padmanabha 	/* If mask is not specified then use the default mask */
1054f6e12015SKishore Padmanabha 	if (ipv4_spec && !ipv4_mask)
1055f6e12015SKishore Padmanabha 		ipv4_mask = &rte_flow_item_ipv4_mask;
1056f6e12015SKishore Padmanabha 
105753a0d4f7SKishore Padmanabha 	/*
105853a0d4f7SKishore Padmanabha 	 * Copy the rte_flow_item for ipv4 into hdr_field using ipv4
105953a0d4f7SKishore Padmanabha 	 * header fields
106053a0d4f7SKishore Padmanabha 	 */
1061741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.version_ihl);
1062741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1063741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.version_ihl),
1064741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.version_ihl),
1065741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1066741172beSKishore Padmanabha 
1067d3013965SKishore Padmanabha 	/*
1068d3013965SKishore Padmanabha 	 * The tos field is ignored since OVS is setting it as wild card
10696d160d77SRandy Schacher 	 * match and it is not supported. An application can enable tos support.
1070d3013965SKishore Padmanabha 	 */
1071741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.type_of_service);
1072741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1073741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec,
1074741172beSKishore Padmanabha 						   hdr.type_of_service),
1075741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask,
1076741172beSKishore Padmanabha 						   hdr.type_of_service),
10776d160d77SRandy Schacher 			      (ULP_APP_TOS_PROTO_SUPPORT(params->ulp_ctx)) ?
10786d160d77SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT : ULP_PRSR_ACT_MASK_IGNORE);
1079d3013965SKishore Padmanabha 
1080741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.total_length);
1081741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1082741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.total_length),
1083741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.total_length),
1084741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1085741172beSKishore Padmanabha 
1086741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.packet_id);
1087741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1088741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.packet_id),
1089741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.packet_id),
1090741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1091741172beSKishore Padmanabha 
1092741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.fragment_offset);
1093741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1094741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec,
1095741172beSKishore Padmanabha 						   hdr.fragment_offset),
1096741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask,
1097741172beSKishore Padmanabha 						   hdr.fragment_offset),
1098631ac1daSShuanglin Wang 			      ULP_PRSR_ACT_MASK_IGNORE);
1099741172beSKishore Padmanabha 
1100741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.time_to_live);
1101741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1102741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.time_to_live),
1103741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.time_to_live),
1104741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1105dd0191d5SShuanglin Wang 	if (ipv4_spec)
1106dd0191d5SShuanglin Wang 		ttl = ipv4_spec->hdr.time_to_live;
1107dd0191d5SShuanglin Wang 	if (!ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL))
1108dd0191d5SShuanglin Wang 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3_TTL, ttl);
1109741172beSKishore Padmanabha 
1110741172beSKishore Padmanabha 	/* Ignore proto for matching templates */
1111741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.next_proto_id);
1112741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1113741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec,
1114741172beSKishore Padmanabha 						   hdr.next_proto_id),
1115741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask,
1116741172beSKishore Padmanabha 						   hdr.next_proto_id),
11176d160d77SRandy Schacher 			      (ULP_APP_TOS_PROTO_SUPPORT(params->ulp_ctx)) ?
11186d160d77SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT : ULP_PRSR_ACT_MATCH_IGNORE);
11196d160d77SRandy Schacher 
1120741172beSKishore Padmanabha 	if (ipv4_spec)
1121741172beSKishore Padmanabha 		proto = ipv4_spec->hdr.next_proto_id;
1122741172beSKishore Padmanabha 
1123741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.hdr_checksum);
1124741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1125741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.hdr_checksum),
1126741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.hdr_checksum),
1127741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1128741172beSKishore Padmanabha 
1129741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.src_addr);
1130741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1131741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.src_addr),
1132741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.src_addr),
1133741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1134741172beSKishore Padmanabha 
1135bdf4a3c6SKishore Padmanabha 	dip_idx = idx;
1136741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv4 *)NULL)->hdr.dst_addr);
1137741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1138741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_spec, hdr.dst_addr),
1139741172beSKishore Padmanabha 			      ulp_deference_struct(ipv4_mask, hdr.dst_addr),
1140741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
114153a0d4f7SKishore Padmanabha 
114253a0d4f7SKishore Padmanabha 	/* Set the ipv4 header bitmap and computed l3 header bitmaps */
11430c0f5a98SKishore Padmanabha 	if (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV4) ||
114432580839SKishore Padmanabha 	    ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV6) ||
1145dd0191d5SShuanglin Wang 	    ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL)) {
114653a0d4f7SKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_I_IPV4);
11470c0f5a98SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L3, 1);
11480c0f5a98SKishore Padmanabha 		inner_flag = 1;
114953a0d4f7SKishore Padmanabha 	} else {
115053a0d4f7SKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV4);
11510c0f5a98SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3, 1);
1152bdf4a3c6SKishore Padmanabha 		/* Update the tunnel offload dest ip offset */
1153bdf4a3c6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUN_OFF_DIP_ID,
1154bdf4a3c6SKishore Padmanabha 				    dip_idx);
115553a0d4f7SKishore Padmanabha 	}
11560c0f5a98SKishore Padmanabha 
1157ddaf0afaSKishore Padmanabha 	/* Some of the PMD applications may set the protocol field
1158ddaf0afaSKishore Padmanabha 	 * in the IPv4 spec but don't set the mask. So, consider
1159ddaf0afaSKishore Padmanabha 	 * the mask in the proto value calculation.
1160ddaf0afaSKishore Padmanabha 	 */
11616d160d77SRandy Schacher 	if (ipv4_mask) {
1162ddaf0afaSKishore Padmanabha 		proto &= ipv4_mask->hdr.next_proto_id;
11636d160d77SRandy Schacher 		proto_mask = ipv4_mask->hdr.next_proto_id;
11646d160d77SRandy Schacher 	}
1165ddaf0afaSKishore Padmanabha 
11660c0f5a98SKishore Padmanabha 	/* Update the field protocol hdr bitmap */
11676d160d77SRandy Schacher 	if (proto_mask)
11680c0f5a98SKishore Padmanabha 		ulp_rte_l3_proto_type_update(params, proto, inner_flag);
11690c0f5a98SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L3_HDR_CNT, ++cnt);
117053a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
117153a0d4f7SKishore Padmanabha }
117253a0d4f7SKishore Padmanabha 
117353a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item IPV6 Header */
117453a0d4f7SKishore Padmanabha int32_t
117553a0d4f7SKishore Padmanabha ulp_rte_ipv6_hdr_handler(const struct rte_flow_item *item,
11763d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params)
117753a0d4f7SKishore Padmanabha {
11783d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_ipv6	*ipv6_spec = item->spec;
11793d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_ipv6	*ipv6_mask = item->mask;
11803d6ba7cbSKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1181bdf4a3c6SKishore Padmanabha 	uint32_t idx = 0, dip_idx = 0;
11826d160d77SRandy Schacher 	uint32_t size, vtc_flow;
1183741172beSKishore Padmanabha 	uint32_t ver_spec = 0, ver_mask = 0;
1184741172beSKishore Padmanabha 	uint32_t tc_spec = 0, tc_mask = 0;
1185741172beSKishore Padmanabha 	uint32_t lab_spec = 0, lab_mask = 0;
11860c0f5a98SKishore Padmanabha 	uint8_t proto = 0;
11876d160d77SRandy Schacher 	uint8_t proto_mask = 0;
1188dd0191d5SShuanglin Wang 	uint8_t ttl = 0;
11890c0f5a98SKishore Padmanabha 	uint32_t inner_flag = 0;
11900c0f5a98SKishore Padmanabha 	uint32_t cnt;
119153a0d4f7SKishore Padmanabha 
11920c0f5a98SKishore Padmanabha 	/* validate there are no 3rd L3 header */
11930c0f5a98SKishore Padmanabha 	cnt = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L3_HDR_CNT);
11940c0f5a98SKishore Padmanabha 	if (cnt == 2) {
1195dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err:Third L3 header not supported\n");
119653a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
119753a0d4f7SKishore Padmanabha 	}
119853a0d4f7SKishore Padmanabha 
11990c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
12000c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_IPV6_NUM))) {
1201dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1202741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
1203741172beSKishore Padmanabha 	}
1204741172beSKishore Padmanabha 
1205f6e12015SKishore Padmanabha 	/* If mask is not specified then use the default mask */
1206f6e12015SKishore Padmanabha 	if (ipv6_spec && !ipv6_mask)
1207f6e12015SKishore Padmanabha 		ipv6_mask = &rte_flow_item_ipv6_mask;
1208f6e12015SKishore Padmanabha 
120953a0d4f7SKishore Padmanabha 	/*
12108d9978d7SVenkat Duvvuru 	 * Copy the rte_flow_item for ipv6 into hdr_field using ipv6
121153a0d4f7SKishore Padmanabha 	 * header fields
121253a0d4f7SKishore Padmanabha 	 */
121353a0d4f7SKishore Padmanabha 	if (ipv6_spec) {
12146d160d77SRandy Schacher 		vtc_flow = ntohl(ipv6_spec->hdr.vtc_flow);
12156d160d77SRandy Schacher 		ver_spec = htonl(BNXT_ULP_GET_IPV6_VER(vtc_flow));
12166d160d77SRandy Schacher 		tc_spec = htonl(BNXT_ULP_GET_IPV6_TC(vtc_flow));
12176d160d77SRandy Schacher 		lab_spec = htonl(BNXT_ULP_GET_IPV6_FLOWLABEL(vtc_flow));
12180c0f5a98SKishore Padmanabha 		proto = ipv6_spec->hdr.proto;
121953a0d4f7SKishore Padmanabha 	}
12208d9978d7SVenkat Duvvuru 
1221741172beSKishore Padmanabha 	if (ipv6_mask) {
12226d160d77SRandy Schacher 		vtc_flow = ntohl(ipv6_mask->hdr.vtc_flow);
12236d160d77SRandy Schacher 		ver_mask = htonl(BNXT_ULP_GET_IPV6_VER(vtc_flow));
12246d160d77SRandy Schacher 		tc_mask = htonl(BNXT_ULP_GET_IPV6_TC(vtc_flow));
12256d160d77SRandy Schacher 		lab_mask = htonl(BNXT_ULP_GET_IPV6_FLOWLABEL(vtc_flow));
1226741172beSKishore Padmanabha 
1227741172beSKishore Padmanabha 		/* Some of the PMD applications may set the protocol field
1228741172beSKishore Padmanabha 		 * in the IPv6 spec but don't set the mask. So, consider
1229741172beSKishore Padmanabha 		 * the mask in proto value calculation.
1230741172beSKishore Padmanabha 		 */
1231741172beSKishore Padmanabha 		proto &= ipv6_mask->hdr.proto;
12326d160d77SRandy Schacher 		proto_mask = ipv6_mask->hdr.proto;
1233741172beSKishore Padmanabha 	}
1234741172beSKishore Padmanabha 
1235741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv6 *)NULL)->hdr.vtc_flow);
1236741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size, &ver_spec, &ver_mask,
1237741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
12389238ac2aSKishore Padmanabha 	/*
1239ad9eed02SKishore Padmanabha 	 * The TC and flow label field are ignored since OVS is
1240ad9eed02SKishore Padmanabha 	 * setting it for match and it is not supported.
12419238ac2aSKishore Padmanabha 	 * This is a work around and
12429238ac2aSKishore Padmanabha 	 * shall be addressed in the future.
12439238ac2aSKishore Padmanabha 	 */
1244741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size, &tc_spec, &tc_mask,
12456d160d77SRandy Schacher 			      (ULP_APP_TOS_PROTO_SUPPORT(params->ulp_ctx)) ?
12466d160d77SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT : ULP_PRSR_ACT_MASK_IGNORE);
1247741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size, &lab_spec, &lab_mask,
1248741172beSKishore Padmanabha 			      ULP_PRSR_ACT_MASK_IGNORE);
12498d9978d7SVenkat Duvvuru 
1250741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv6 *)NULL)->hdr.payload_len);
1251741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1252741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_spec, hdr.payload_len),
1253741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_mask, hdr.payload_len),
1254741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1255741172beSKishore Padmanabha 
1256741172beSKishore Padmanabha 	/* Ignore proto for template matching */
1257741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv6 *)NULL)->hdr.proto);
1258741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1259741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_spec, hdr.proto),
1260741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_mask, hdr.proto),
12616d160d77SRandy Schacher 			      (ULP_APP_TOS_PROTO_SUPPORT(params->ulp_ctx)) ?
12626d160d77SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT : ULP_PRSR_ACT_MATCH_IGNORE);
1263741172beSKishore Padmanabha 
1264741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv6 *)NULL)->hdr.hop_limits);
1265741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1266741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_spec, hdr.hop_limits),
1267741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_mask, hdr.hop_limits),
1268741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1269dd0191d5SShuanglin Wang 	if (ipv6_spec)
1270dd0191d5SShuanglin Wang 		ttl = ipv6_spec->hdr.hop_limits;
1271dd0191d5SShuanglin Wang 	if (!ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL))
1272dd0191d5SShuanglin Wang 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3_TTL, ttl);
1273741172beSKishore Padmanabha 
1274741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv6 *)NULL)->hdr.src_addr);
1275741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1276741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_spec, hdr.src_addr),
1277741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_mask, hdr.src_addr),
1278741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1279741172beSKishore Padmanabha 
1280bdf4a3c6SKishore Padmanabha 	dip_idx =  idx;
1281741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_ipv6 *)NULL)->hdr.dst_addr);
1282741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1283741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_spec, hdr.dst_addr),
1284741172beSKishore Padmanabha 			      ulp_deference_struct(ipv6_mask, hdr.dst_addr),
1285741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
128653a0d4f7SKishore Padmanabha 
128753a0d4f7SKishore Padmanabha 	/* Set the ipv6 header bitmap and computed l3 header bitmaps */
12880c0f5a98SKishore Padmanabha 	if (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV4) ||
128932580839SKishore Padmanabha 	    ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV6) ||
1290dd0191d5SShuanglin Wang 	    ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL)) {
129153a0d4f7SKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_I_IPV6);
12920f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L3, 1);
12930c0f5a98SKishore Padmanabha 		inner_flag = 1;
129453a0d4f7SKishore Padmanabha 	} else {
129553a0d4f7SKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV6);
12960f772db6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3, 1);
1297bdf4a3c6SKishore Padmanabha 		/* Update the tunnel offload dest ip offset */
1298bdf4a3c6SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUN_OFF_DIP_ID,
1299bdf4a3c6SKishore Padmanabha 				    dip_idx);
130053a0d4f7SKishore Padmanabha 	}
13010c0f5a98SKishore Padmanabha 
13020c0f5a98SKishore Padmanabha 	/* Update the field protocol hdr bitmap */
13036d160d77SRandy Schacher 	if (proto_mask)
13040c0f5a98SKishore Padmanabha 		ulp_rte_l3_proto_type_update(params, proto, inner_flag);
13050c0f5a98SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L3_HDR_CNT, ++cnt);
13060c0f5a98SKishore Padmanabha 
130753a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
130853a0d4f7SKishore Padmanabha }
130953a0d4f7SKishore Padmanabha 
13100c0f5a98SKishore Padmanabha /* Function to handle the update of proto header based on field values */
13110c0f5a98SKishore Padmanabha static void
1312dbd29c42SKishore Padmanabha ulp_rte_l4_proto_type_update(struct ulp_rte_parser_params *params,
1313dbd29c42SKishore Padmanabha 			     uint16_t src_port, uint16_t src_mask,
1314dbd29c42SKishore Padmanabha 			     uint16_t dst_port, uint16_t dst_mask,
1315dbd29c42SKishore Padmanabha 			     enum bnxt_ulp_hdr_bit hdr_bit)
13160c0f5a98SKishore Padmanabha {
131794dbd6cfSKishore Padmanabha 	uint16_t stat_port = 0;
131830d7102dSKishore Padmanabha 	struct bnxt *bp;
13192921498cSMike Baucom 
1320dbd29c42SKishore Padmanabha 	switch (hdr_bit) {
1321dbd29c42SKishore Padmanabha 	case BNXT_ULP_HDR_BIT_I_UDP:
1322dbd29c42SKishore Padmanabha 	case BNXT_ULP_HDR_BIT_I_TCP:
1323dbd29c42SKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits, hdr_bit);
1324dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4, 1);
1325dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4_SRC_PORT,
1326dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(src_port));
1327dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4_DST_PORT,
1328dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(dst_port));
1329dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4_SRC_PORT_MASK,
1330dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(src_mask));
1331dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4_DST_PORT_MASK,
1332dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(dst_mask));
1333dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L3_FB_PROTO_ID,
1334dbd29c42SKishore Padmanabha 				    1);
1335dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4_FB_SRC_PORT,
1336dbd29c42SKishore Padmanabha 				    !!(src_port & src_mask));
1337dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L4_FB_DST_PORT,
1338dbd29c42SKishore Padmanabha 				    !!(dst_port & dst_mask));
1339dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_I_L3_PROTO_ID,
1340dbd29c42SKishore Padmanabha 				    (hdr_bit == BNXT_ULP_HDR_BIT_I_UDP) ?
1341dbd29c42SKishore Padmanabha 				    IPPROTO_UDP : IPPROTO_TCP);
1342dbd29c42SKishore Padmanabha 		break;
1343dbd29c42SKishore Padmanabha 	case BNXT_ULP_HDR_BIT_O_UDP:
1344dbd29c42SKishore Padmanabha 	case BNXT_ULP_HDR_BIT_O_TCP:
1345dbd29c42SKishore Padmanabha 		ULP_BITMAP_SET(params->hdr_bitmap.bits, hdr_bit);
1346dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4, 1);
1347dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_SRC_PORT,
1348dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(src_port));
1349dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT,
1350dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(dst_port));
1351dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_SRC_PORT_MASK,
1352dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(src_mask));
1353dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT_MASK,
1354dbd29c42SKishore Padmanabha 				    (uint64_t)rte_be_to_cpu_16(dst_mask));
1355dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3_FB_PROTO_ID,
1356dbd29c42SKishore Padmanabha 				    1);
1357dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_FB_SRC_PORT,
1358dbd29c42SKishore Padmanabha 				    !!(src_port & src_mask));
1359dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_FB_DST_PORT,
1360dbd29c42SKishore Padmanabha 				    !!(dst_port & dst_mask));
1361dbd29c42SKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3_PROTO_ID,
1362dbd29c42SKishore Padmanabha 				    (hdr_bit == BNXT_ULP_HDR_BIT_O_UDP) ?
1363dbd29c42SKishore Padmanabha 				    IPPROTO_UDP : IPPROTO_TCP);
1364dbd29c42SKishore Padmanabha 		break;
1365dbd29c42SKishore Padmanabha 	default:
1366dbd29c42SKishore Padmanabha 		break;
1367bdf4a3c6SKishore Padmanabha 	}
13683fe124d2SKishore Padmanabha 
136994dbd6cfSKishore Padmanabha 	/* If it is not udp port then there is no need to set tunnel bits */
137094dbd6cfSKishore Padmanabha 	if (hdr_bit != BNXT_ULP_HDR_BIT_O_UDP)
13712921498cSMike Baucom 		return;
137274cab005SRandy Schacher 
137394dbd6cfSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUNNEL_PORT,
137494dbd6cfSKishore Padmanabha 			    tfp_be_to_cpu_16(dst_port));
137594dbd6cfSKishore Padmanabha 
137694dbd6cfSKishore Padmanabha 	/* vxlan static customized port */
137794dbd6cfSKishore Padmanabha 	if (ULP_APP_STATIC_VXLAN_PORT_EN(params->ulp_ctx)) {
137894dbd6cfSKishore Padmanabha 		stat_port = bnxt_ulp_cntxt_vxlan_ip_port_get(params->ulp_ctx);
137994dbd6cfSKishore Padmanabha 		if (!stat_port)
138094dbd6cfSKishore Padmanabha 			stat_port =
138194dbd6cfSKishore Padmanabha 			bnxt_ulp_cntxt_vxlan_port_get(params->ulp_ctx);
138294dbd6cfSKishore Padmanabha 
138394dbd6cfSKishore Padmanabha 		/* if udp and equal to static vxlan port then set tunnel bits*/
138494dbd6cfSKishore Padmanabha 		if (stat_port && dst_port == tfp_cpu_to_be_16(stat_port)) {
138530d7102dSKishore Padmanabha 			bp = bnxt_pmd_get_bp(params->port_id);
138630d7102dSKishore Padmanabha 			if (bp == NULL) {
138730d7102dSKishore Padmanabha 				BNXT_DRV_DBG(ERR, "Invalid bp\n");
138830d7102dSKishore Padmanabha 				return;
138930d7102dSKishore Padmanabha 			}
13902921498cSMike Baucom 			ULP_BITMAP_SET(params->hdr_fp_bit.bits,
13912921498cSMike Baucom 				       BNXT_ULP_HDR_BIT_T_VXLAN);
139294dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->cf_bitmap,
139394dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_IS_TUNNEL);
139430d7102dSKishore Padmanabha 			if (bp->vxlan_ip_upar_in_use &
139530d7102dSKishore Padmanabha 			    HWRM_TUNNEL_DST_PORT_QUERY_OUTPUT_UPAR_IN_USE_UPAR0) {
139630d7102dSKishore Padmanabha 				ULP_COMP_FLD_IDX_WR(params,
139730d7102dSKishore Padmanabha 						    BNXT_ULP_CF_IDX_VXLAN_IP_UPAR_ID,
139830d7102dSKishore Padmanabha 						    ULP_WP_SYM_TUN_HDR_TYPE_UPAR1);
139930d7102dSKishore Padmanabha 			}
140094dbd6cfSKishore Padmanabha 		}
140194dbd6cfSKishore Padmanabha 	} else {
140294dbd6cfSKishore Padmanabha 		/* if dynamic Vxlan is enabled then skip dport checks */
140394dbd6cfSKishore Padmanabha 		if (ULP_APP_DYNAMIC_VXLAN_PORT_EN(params->ulp_ctx))
140494dbd6cfSKishore Padmanabha 			return;
140594dbd6cfSKishore Padmanabha 
140694dbd6cfSKishore Padmanabha 		/* Vxlan and GPE port check */
140794dbd6cfSKishore Padmanabha 		if (dst_port == tfp_cpu_to_be_16(ULP_UDP_PORT_VXLAN_GPE)) {
140894dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->hdr_fp_bit.bits,
140994dbd6cfSKishore Padmanabha 				       BNXT_ULP_HDR_BIT_T_VXLAN_GPE);
141094dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->cf_bitmap,
141194dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_IS_TUNNEL);
141294dbd6cfSKishore Padmanabha 		} else if (dst_port == tfp_cpu_to_be_16(ULP_UDP_PORT_VXLAN)) {
141394dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->hdr_fp_bit.bits,
141494dbd6cfSKishore Padmanabha 				       BNXT_ULP_HDR_BIT_T_VXLAN);
141594dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->cf_bitmap,
141694dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_IS_TUNNEL);
141794dbd6cfSKishore Padmanabha 		}
14182921498cSMike Baucom 	}
14190c0f5a98SKishore Padmanabha }
14200c0f5a98SKishore Padmanabha 
142153a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item UDP Header. */
142253a0d4f7SKishore Padmanabha int32_t
142353a0d4f7SKishore Padmanabha ulp_rte_udp_hdr_handler(const struct rte_flow_item *item,
14243d6ba7cbSKishore Padmanabha 			struct ulp_rte_parser_params *params)
142553a0d4f7SKishore Padmanabha {
14263d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_udp *udp_spec = item->spec;
14273d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_udp *udp_mask = item->mask;
14283d6ba7cbSKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1429741172beSKishore Padmanabha 	uint32_t idx = 0;
14303d6ba7cbSKishore Padmanabha 	uint32_t size;
14313fe124d2SKishore Padmanabha 	uint16_t dport = 0, sport = 0;
1432dbd29c42SKishore Padmanabha 	uint16_t dport_mask = 0, sport_mask = 0;
14330c0f5a98SKishore Padmanabha 	uint32_t cnt;
1434dbd29c42SKishore Padmanabha 	enum bnxt_ulp_hdr_bit out_l4 = BNXT_ULP_HDR_BIT_O_UDP;
143553a0d4f7SKishore Padmanabha 
14360c0f5a98SKishore Padmanabha 	cnt = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L4_HDR_CNT);
14370c0f5a98SKishore Padmanabha 	if (cnt == 2) {
1438dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err:Third L4 header not supported\n");
143953a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
144053a0d4f7SKishore Padmanabha 	}
144153a0d4f7SKishore Padmanabha 
1442741172beSKishore Padmanabha 	if (udp_spec) {
1443741172beSKishore Padmanabha 		sport = udp_spec->hdr.src_port;
1444741172beSKishore Padmanabha 		dport = udp_spec->hdr.dst_port;
1445741172beSKishore Padmanabha 	}
1446f6e12015SKishore Padmanabha 	if (udp_spec && !udp_mask)
1447f6e12015SKishore Padmanabha 		udp_mask = &rte_flow_item_udp_mask;
1448f6e12015SKishore Padmanabha 
1449dbd29c42SKishore Padmanabha 	if (udp_mask) {
1450dbd29c42SKishore Padmanabha 		sport_mask = udp_mask->hdr.src_port;
1451dbd29c42SKishore Padmanabha 		dport_mask = udp_mask->hdr.dst_port;
1452dbd29c42SKishore Padmanabha 	}
1453741172beSKishore Padmanabha 
14540c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
14550c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_UDP_NUM))) {
1456dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1457741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
1458741172beSKishore Padmanabha 	}
1459741172beSKishore Padmanabha 
146053a0d4f7SKishore Padmanabha 	/*
146153a0d4f7SKishore Padmanabha 	 * Copy the rte_flow_item for ipv4 into hdr_field using ipv4
146253a0d4f7SKishore Padmanabha 	 * header fields
146353a0d4f7SKishore Padmanabha 	 */
1464741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_udp *)NULL)->hdr.src_port);
1465741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1466741172beSKishore Padmanabha 			      ulp_deference_struct(udp_spec, hdr.src_port),
1467741172beSKishore Padmanabha 			      ulp_deference_struct(udp_mask, hdr.src_port),
1468741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
14693d6ba7cbSKishore Padmanabha 
1470741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_udp *)NULL)->hdr.dst_port);
1471741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1472741172beSKishore Padmanabha 			      ulp_deference_struct(udp_spec, hdr.dst_port),
1473741172beSKishore Padmanabha 			      ulp_deference_struct(udp_mask, hdr.dst_port),
1474741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1475741172beSKishore Padmanabha 
1476741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_udp *)NULL)->hdr.dgram_len);
1477741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1478741172beSKishore Padmanabha 			      ulp_deference_struct(udp_spec, hdr.dgram_len),
1479741172beSKishore Padmanabha 			      ulp_deference_struct(udp_mask, hdr.dgram_len),
1480741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1481741172beSKishore Padmanabha 
1482741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_udp *)NULL)->hdr.dgram_cksum);
1483741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1484741172beSKishore Padmanabha 			      ulp_deference_struct(udp_spec, hdr.dgram_cksum),
1485741172beSKishore Padmanabha 			      ulp_deference_struct(udp_mask, hdr.dgram_cksum),
1486741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
148753a0d4f7SKishore Padmanabha 
148853a0d4f7SKishore Padmanabha 	/* Set the udp header bitmap and computed l4 header bitmaps */
14890c0f5a98SKishore Padmanabha 	if (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_UDP) ||
14906d160d77SRandy Schacher 	    ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_TCP) ||
1491dd0191d5SShuanglin Wang 	    ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL))
1492dbd29c42SKishore Padmanabha 		out_l4 = BNXT_ULP_HDR_BIT_I_UDP;
14936167c20cSKishore Padmanabha 
1494dbd29c42SKishore Padmanabha 	ulp_rte_l4_proto_type_update(params, sport, sport_mask, dport,
1495dbd29c42SKishore Padmanabha 				     dport_mask, out_l4);
14960c0f5a98SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L4_HDR_CNT, ++cnt);
149753a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
149853a0d4f7SKishore Padmanabha }
149953a0d4f7SKishore Padmanabha 
150053a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item TCP Header. */
150153a0d4f7SKishore Padmanabha int32_t
150253a0d4f7SKishore Padmanabha ulp_rte_tcp_hdr_handler(const struct rte_flow_item *item,
15033d6ba7cbSKishore Padmanabha 			struct ulp_rte_parser_params *params)
150453a0d4f7SKishore Padmanabha {
15053d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_tcp *tcp_spec = item->spec;
15063d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_tcp *tcp_mask = item->mask;
15073d6ba7cbSKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1508741172beSKishore Padmanabha 	uint32_t idx = 0;
15093fe124d2SKishore Padmanabha 	uint16_t dport = 0, sport = 0;
1510dbd29c42SKishore Padmanabha 	uint16_t dport_mask = 0, sport_mask = 0;
15113d6ba7cbSKishore Padmanabha 	uint32_t size;
15120c0f5a98SKishore Padmanabha 	uint32_t cnt;
1513dbd29c42SKishore Padmanabha 	enum bnxt_ulp_hdr_bit out_l4 = BNXT_ULP_HDR_BIT_O_TCP;
151453a0d4f7SKishore Padmanabha 
15150c0f5a98SKishore Padmanabha 	cnt = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L4_HDR_CNT);
15160c0f5a98SKishore Padmanabha 	if (cnt == 2) {
1517dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err:Third L4 header not supported\n");
151853a0d4f7SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
151953a0d4f7SKishore Padmanabha 	}
152053a0d4f7SKishore Padmanabha 
1521741172beSKishore Padmanabha 	if (tcp_spec) {
1522741172beSKishore Padmanabha 		sport = tcp_spec->hdr.src_port;
1523741172beSKishore Padmanabha 		dport = tcp_spec->hdr.dst_port;
1524741172beSKishore Padmanabha 	}
1525f6e12015SKishore Padmanabha 
1526f6e12015SKishore Padmanabha 	if (tcp_spec && !tcp_mask)
1527f6e12015SKishore Padmanabha 		tcp_mask = &rte_flow_item_tcp_mask;
1528f6e12015SKishore Padmanabha 
1529dbd29c42SKishore Padmanabha 	if (tcp_mask) {
1530dbd29c42SKishore Padmanabha 		sport_mask = tcp_mask->hdr.src_port;
1531dbd29c42SKishore Padmanabha 		dport_mask = tcp_mask->hdr.dst_port;
1532dbd29c42SKishore Padmanabha 	}
1533741172beSKishore Padmanabha 
15340c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
15350c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_TCP_NUM))) {
1536dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1537741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
1538741172beSKishore Padmanabha 	}
1539741172beSKishore Padmanabha 
154053a0d4f7SKishore Padmanabha 	/*
154153a0d4f7SKishore Padmanabha 	 * Copy the rte_flow_item for ipv4 into hdr_field using ipv4
154253a0d4f7SKishore Padmanabha 	 * header fields
154353a0d4f7SKishore Padmanabha 	 */
1544741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.src_port);
1545741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1546741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.src_port),
1547741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.src_port),
1548741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
154953a0d4f7SKishore Padmanabha 
1550741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.dst_port);
1551741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1552741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.dst_port),
1553741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.dst_port),
1554741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1555741172beSKishore Padmanabha 
1556741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.sent_seq);
1557741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1558741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.sent_seq),
1559741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.sent_seq),
1560741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1561741172beSKishore Padmanabha 
1562741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.recv_ack);
1563741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1564741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.recv_ack),
1565741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.recv_ack),
1566741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1567741172beSKishore Padmanabha 
1568741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.data_off);
1569741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1570741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.data_off),
1571741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.data_off),
1572741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1573741172beSKishore Padmanabha 
1574741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.tcp_flags);
1575741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1576741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.tcp_flags),
1577741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.tcp_flags),
1578741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1579741172beSKishore Padmanabha 
1580741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.rx_win);
1581741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1582741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.rx_win),
1583741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.rx_win),
1584741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1585741172beSKishore Padmanabha 
1586741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.cksum);
1587741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1588741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.cksum),
1589741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.cksum),
1590741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1591741172beSKishore Padmanabha 
1592741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_tcp *)NULL)->hdr.tcp_urp);
1593741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1594741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_spec, hdr.tcp_urp),
1595741172beSKishore Padmanabha 			      ulp_deference_struct(tcp_mask, hdr.tcp_urp),
1596741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
159753a0d4f7SKishore Padmanabha 
159853a0d4f7SKishore Padmanabha 	/* Set the udp header bitmap and computed l4 header bitmaps */
15990c0f5a98SKishore Padmanabha 	if (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_UDP) ||
16006d160d77SRandy Schacher 	    ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_TCP) ||
1601dd0191d5SShuanglin Wang 	    ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL))
1602dbd29c42SKishore Padmanabha 		out_l4 = BNXT_ULP_HDR_BIT_I_TCP;
1603dbd29c42SKishore Padmanabha 
1604dbd29c42SKishore Padmanabha 	ulp_rte_l4_proto_type_update(params, sport, sport_mask, dport,
1605dbd29c42SKishore Padmanabha 				     dport_mask, out_l4);
16060c0f5a98SKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L4_HDR_CNT, ++cnt);
160753a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
160853a0d4f7SKishore Padmanabha }
160953a0d4f7SKishore Padmanabha 
161053a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item Vxlan Header. */
161153a0d4f7SKishore Padmanabha int32_t
161253a0d4f7SKishore Padmanabha ulp_rte_vxlan_hdr_handler(const struct rte_flow_item *item,
16133d6ba7cbSKishore Padmanabha 			  struct ulp_rte_parser_params *params)
161453a0d4f7SKishore Padmanabha {
16153d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_vxlan *vxlan_spec = item->spec;
16163d6ba7cbSKishore Padmanabha 	const struct rte_flow_item_vxlan *vxlan_mask = item->mask;
16173d6ba7cbSKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
161894dbd6cfSKishore Padmanabha 	struct bnxt_ulp_context *ulp_ctx = params->ulp_ctx;
1619741172beSKishore Padmanabha 	uint32_t idx = 0;
162094dbd6cfSKishore Padmanabha 	uint16_t dport, stat_port;
16213d6ba7cbSKishore Padmanabha 	uint32_t size;
162253a0d4f7SKishore Padmanabha 
16230c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
16240c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_VXLAN_NUM))) {
1625dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1626741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
1627741172beSKishore Padmanabha 	}
1628741172beSKishore Padmanabha 
1629f6e12015SKishore Padmanabha 	if (vxlan_spec && !vxlan_mask)
1630f6e12015SKishore Padmanabha 		vxlan_mask = &rte_flow_item_vxlan_mask;
163194dbd6cfSKishore Padmanabha 
163294dbd6cfSKishore Padmanabha 	/* Update if the outer headers have any partial masks */
163394dbd6cfSKishore Padmanabha 	if (!ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_WC_MATCH))
163494dbd6cfSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_OUTER_EM_ONLY, 1);
163594dbd6cfSKishore Padmanabha 
163653a0d4f7SKishore Padmanabha 	/*
163753a0d4f7SKishore Padmanabha 	 * Copy the rte_flow_item for vxlan into hdr_field using vxlan
163853a0d4f7SKishore Padmanabha 	 * header fields
163953a0d4f7SKishore Padmanabha 	 */
16405ec2a97eSThomas Monjalon 	size = sizeof(((struct rte_flow_item_vxlan *)NULL)->hdr.flags);
1641741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
16425ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_spec, hdr.flags),
16435ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_mask, hdr.flags),
1644741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1645741172beSKishore Padmanabha 
16465ec2a97eSThomas Monjalon 	size = sizeof(((struct rte_flow_item_vxlan *)NULL)->hdr.rsvd0);
1647741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
16485ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_spec, hdr.rsvd0),
16495ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_mask, hdr.rsvd0),
1650741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1651741172beSKishore Padmanabha 
16525ec2a97eSThomas Monjalon 	size = sizeof(((struct rte_flow_item_vxlan *)NULL)->hdr.vni);
1653741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
16545ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_spec, hdr.vni),
16555ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_mask, hdr.vni),
1656741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1657741172beSKishore Padmanabha 
16585ec2a97eSThomas Monjalon 	size = sizeof(((struct rte_flow_item_vxlan *)NULL)->hdr.rsvd1);
1659741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
16605ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_spec, hdr.rsvd1),
16615ec2a97eSThomas Monjalon 			      ulp_deference_struct(vxlan_mask, hdr.rsvd1),
1662741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
166353a0d4f7SKishore Padmanabha 
166453a0d4f7SKishore Padmanabha 	/* Update the hdr_bitmap with vxlan */
16653d6ba7cbSKishore Padmanabha 	ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_VXLAN);
1666dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL);
16676d160d77SRandy Schacher 
166894dbd6cfSKishore Padmanabha 	/* if l4 protocol header updated it then reset it */
166994dbd6cfSKishore Padmanabha 	ULP_BITMAP_RESET(params->hdr_fp_bit.bits, BNXT_ULP_HDR_BIT_T_VXLAN_GPE);
167094dbd6cfSKishore Padmanabha 
16716d160d77SRandy Schacher 	dport = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT);
16726d160d77SRandy Schacher 	if (!dport) {
16736d160d77SRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT,
16746d160d77SRandy Schacher 				    ULP_UDP_PORT_VXLAN);
16756d160d77SRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT_MASK,
16766d160d77SRandy Schacher 				    ULP_UDP_PORT_VXLAN_MASK);
16776d160d77SRandy Schacher 	}
16786d160d77SRandy Schacher 
167994dbd6cfSKishore Padmanabha 	/* vxlan static customized port */
168094dbd6cfSKishore Padmanabha 	if (ULP_APP_STATIC_VXLAN_PORT_EN(ulp_ctx)) {
168194dbd6cfSKishore Padmanabha 		stat_port = bnxt_ulp_cntxt_vxlan_ip_port_get(ulp_ctx);
168294dbd6cfSKishore Padmanabha 		if (!stat_port)
168394dbd6cfSKishore Padmanabha 			stat_port = bnxt_ulp_cntxt_vxlan_port_get(ulp_ctx);
16842921498cSMike Baucom 
168594dbd6cfSKishore Padmanabha 		/* validate that static ports match if not reject */
168694dbd6cfSKishore Padmanabha 		if (dport != 0 && dport != tfp_cpu_to_be_16(stat_port)) {
1687dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR, "ParseErr:vxlan port is not valid\n");
16882921498cSMike Baucom 			return BNXT_TF_RC_PARSE_ERR;
168994dbd6cfSKishore Padmanabha 		} else if (dport == 0) {
169094dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
169194dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_TUNNEL_PORT,
169294dbd6cfSKishore Padmanabha 					    tfp_cpu_to_be_16(stat_port));
169394dbd6cfSKishore Padmanabha 		}
169494dbd6cfSKishore Padmanabha 	} else {
169594dbd6cfSKishore Padmanabha 		/* dynamic vxlan support */
169694dbd6cfSKishore Padmanabha 		if (ULP_APP_DYNAMIC_VXLAN_PORT_EN(params->ulp_ctx)) {
169794dbd6cfSKishore Padmanabha 			if (dport == 0) {
169894dbd6cfSKishore Padmanabha 				BNXT_DRV_DBG(ERR,
169994dbd6cfSKishore Padmanabha 					     "ParseErr:vxlan port is null\n");
170094dbd6cfSKishore Padmanabha 				return BNXT_TF_RC_PARSE_ERR;
170194dbd6cfSKishore Padmanabha 			}
170294dbd6cfSKishore Padmanabha 			/* set the dynamic vxlan port check */
170394dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->cf_bitmap,
170494dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_DYNAMIC_VXLAN_PORT);
170594dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
170694dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_TUNNEL_PORT, dport);
170794dbd6cfSKishore Padmanabha 		} else if (dport != 0 && dport != ULP_UDP_PORT_VXLAN) {
170894dbd6cfSKishore Padmanabha 			/* set the dynamic vxlan port check */
170994dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->cf_bitmap,
171094dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_DYNAMIC_VXLAN_PORT);
171194dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
171294dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_TUNNEL_PORT, dport);
171394dbd6cfSKishore Padmanabha 		} else {
171494dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUNNEL_PORT,
171594dbd6cfSKishore Padmanabha 					    ULP_UDP_PORT_VXLAN);
171694dbd6cfSKishore Padmanabha 		}
17172921498cSMike Baucom 	}
171853a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
171953a0d4f7SKishore Padmanabha }
172053a0d4f7SKishore Padmanabha 
172174cab005SRandy Schacher /* Function to handle the parsing of RTE Flow item Vxlan GPE Header. */
172274cab005SRandy Schacher int32_t
172374cab005SRandy Schacher ulp_rte_vxlan_gpe_hdr_handler(const struct rte_flow_item *item,
172474cab005SRandy Schacher 			      struct ulp_rte_parser_params *params)
172574cab005SRandy Schacher {
172674cab005SRandy Schacher 	const struct rte_flow_item_vxlan_gpe *vxlan_gpe_spec = item->spec;
172774cab005SRandy Schacher 	const struct rte_flow_item_vxlan_gpe *vxlan_gpe_mask = item->mask;
172874cab005SRandy Schacher 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
172974cab005SRandy Schacher 	uint32_t idx = 0;
173074cab005SRandy Schacher 	uint16_t dport;
173174cab005SRandy Schacher 	uint32_t size;
173274cab005SRandy Schacher 
17330c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
17340c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_VXLAN_GPE_NUM))) {
1735dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
173674cab005SRandy Schacher 		return BNXT_TF_RC_ERROR;
173774cab005SRandy Schacher 	}
173874cab005SRandy Schacher 
1739f6e12015SKishore Padmanabha 	if (vxlan_gpe_spec && !vxlan_gpe_mask)
1740f6e12015SKishore Padmanabha 		vxlan_gpe_mask = &rte_flow_item_vxlan_gpe_mask;
174174cab005SRandy Schacher 	/*
174274cab005SRandy Schacher 	 * Copy the rte_flow_item for vxlan gpe into hdr_field using vxlan
174374cab005SRandy Schacher 	 * header fields
174474cab005SRandy Schacher 	 */
174574cab005SRandy Schacher 	size = sizeof(((struct rte_flow_item_vxlan_gpe *)NULL)->flags);
174674cab005SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
174774cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_spec, flags),
174874cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_mask, flags),
174974cab005SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
175074cab005SRandy Schacher 
175174cab005SRandy Schacher 	size = sizeof(((struct rte_flow_item_vxlan_gpe *)NULL)->rsvd0);
175274cab005SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
175374cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_spec, rsvd0),
175474cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_mask, rsvd0),
175574cab005SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
175674cab005SRandy Schacher 
175774cab005SRandy Schacher 	size = sizeof(((struct rte_flow_item_vxlan_gpe *)NULL)->protocol);
175874cab005SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
175974cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_spec, protocol),
176074cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_mask, protocol),
176174cab005SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
176274cab005SRandy Schacher 
176374cab005SRandy Schacher 	size = sizeof(((struct rte_flow_item_vxlan_gpe *)NULL)->vni);
176474cab005SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
176574cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_spec, vni),
176674cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_mask, vni),
176774cab005SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
176874cab005SRandy Schacher 
176974cab005SRandy Schacher 	size = sizeof(((struct rte_flow_item_vxlan_gpe *)NULL)->rsvd1);
177074cab005SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
177174cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_spec, rsvd1),
177274cab005SRandy Schacher 			      ulp_deference_struct(vxlan_gpe_mask, rsvd1),
177374cab005SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
177474cab005SRandy Schacher 
177574cab005SRandy Schacher 	/* Update the hdr_bitmap with vxlan gpe*/
177674cab005SRandy Schacher 	ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_VXLAN_GPE);
1777dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL);
177874cab005SRandy Schacher 
177994dbd6cfSKishore Padmanabha 	/* if l4 protocol header updated it then reset it */
178094dbd6cfSKishore Padmanabha 	ULP_BITMAP_RESET(params->hdr_fp_bit.bits, BNXT_ULP_HDR_BIT_T_VXLAN);
178194dbd6cfSKishore Padmanabha 
178274cab005SRandy Schacher 	dport = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT);
178374cab005SRandy Schacher 	if (!dport) {
178474cab005SRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT,
178574cab005SRandy Schacher 				    ULP_UDP_PORT_VXLAN_GPE);
178674cab005SRandy Schacher 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT_MASK,
178774cab005SRandy Schacher 				    ULP_UDP_PORT_VXLAN_GPE_MASK);
178874cab005SRandy Schacher 	}
178994dbd6cfSKishore Padmanabha 	/* TBD: currently dynamic or static gpe port config is not supported */
179094dbd6cfSKishore Padmanabha 	/* Update the tunnel port */
179194dbd6cfSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUNNEL_PORT, dport);
17922921498cSMike Baucom 
17932921498cSMike Baucom 	/* Verify the vxlan gpe port */
17942921498cSMike Baucom 	if (dport != 0 && dport != ULP_UDP_PORT_VXLAN_GPE) {
1795dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:vxlan gpe port is not valid\n");
17962921498cSMike Baucom 		return BNXT_TF_RC_PARSE_ERR;
17972921498cSMike Baucom 	}
179874cab005SRandy Schacher 	return BNXT_TF_RC_SUCCESS;
179974cab005SRandy Schacher }
180094dbd6cfSKishore Padmanabha 
1801dd0191d5SShuanglin Wang /* Function to handle the parsing of RTE Flow item GENEVE Header. */
1802dd0191d5SShuanglin Wang int32_t
1803dd0191d5SShuanglin Wang ulp_rte_geneve_hdr_handler(const struct rte_flow_item *item,
1804dd0191d5SShuanglin Wang 			      struct ulp_rte_parser_params *params)
1805dd0191d5SShuanglin Wang {
1806dd0191d5SShuanglin Wang 	const struct rte_flow_item_geneve *geneve_spec = item->spec;
1807dd0191d5SShuanglin Wang 	const struct rte_flow_item_geneve *geneve_mask = item->mask;
1808dd0191d5SShuanglin Wang 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1809dd0191d5SShuanglin Wang 	uint32_t idx = 0;
1810dd0191d5SShuanglin Wang 	uint16_t dport;
1811dd0191d5SShuanglin Wang 	uint32_t size;
1812dd0191d5SShuanglin Wang 
18130c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
18140c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_GENEVE_NUM))) {
1815dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1816dd0191d5SShuanglin Wang 		return BNXT_TF_RC_ERROR;
1817dd0191d5SShuanglin Wang 	}
1818dd0191d5SShuanglin Wang 
1819f6e12015SKishore Padmanabha 	if (geneve_spec && !geneve_mask)
1820f6e12015SKishore Padmanabha 		geneve_mask = &rte_flow_item_geneve_mask;
1821f6e12015SKishore Padmanabha 
1822dd0191d5SShuanglin Wang 	/*
1823dd0191d5SShuanglin Wang 	 * Copy the rte_flow_item for geneve into hdr_field using geneve
1824dd0191d5SShuanglin Wang 	 * header fields
1825dd0191d5SShuanglin Wang 	 */
1826dd0191d5SShuanglin Wang 	size = sizeof(((struct rte_flow_item_geneve *)NULL)->ver_opt_len_o_c_rsvd0);
1827dd0191d5SShuanglin Wang 	ulp_rte_prsr_fld_mask(params, &idx, size,
1828dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_spec, ver_opt_len_o_c_rsvd0),
1829dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_mask, ver_opt_len_o_c_rsvd0),
1830dd0191d5SShuanglin Wang 			      ULP_PRSR_ACT_DEFAULT);
1831dd0191d5SShuanglin Wang 
1832dd0191d5SShuanglin Wang 	size = sizeof(((struct rte_flow_item_geneve *)NULL)->protocol);
1833dd0191d5SShuanglin Wang 	ulp_rte_prsr_fld_mask(params, &idx, size,
1834dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_spec, protocol),
1835dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_mask, protocol),
1836dd0191d5SShuanglin Wang 			      ULP_PRSR_ACT_DEFAULT);
1837dd0191d5SShuanglin Wang 
1838dd0191d5SShuanglin Wang 	size = sizeof(((struct rte_flow_item_geneve *)NULL)->vni);
1839dd0191d5SShuanglin Wang 	ulp_rte_prsr_fld_mask(params, &idx, size,
1840dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_spec, vni),
1841dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_mask, vni),
1842dd0191d5SShuanglin Wang 			      ULP_PRSR_ACT_DEFAULT);
1843dd0191d5SShuanglin Wang 
1844dd0191d5SShuanglin Wang 	size = sizeof(((struct rte_flow_item_geneve *)NULL)->rsvd1);
1845dd0191d5SShuanglin Wang 	ulp_rte_prsr_fld_mask(params, &idx, size,
1846dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_spec, rsvd1),
1847dd0191d5SShuanglin Wang 			      ulp_deference_struct(geneve_mask, rsvd1),
1848dd0191d5SShuanglin Wang 			      ULP_PRSR_ACT_DEFAULT);
1849dd0191d5SShuanglin Wang 
1850dd0191d5SShuanglin Wang 	/* Update the hdr_bitmap with geneve */
1851dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_GENEVE);
1852dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL);
1853dd0191d5SShuanglin Wang 
185494dbd6cfSKishore Padmanabha 	/* update the tunnel port */
1855dd0191d5SShuanglin Wang 	dport = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_O_L4_DST_PORT);
185694dbd6cfSKishore Padmanabha 	if  (ULP_APP_DYNAMIC_GENEVE_PORT_EN(params->ulp_ctx)) {
185794dbd6cfSKishore Padmanabha 		if (dport == 0) {
185894dbd6cfSKishore Padmanabha 			BNXT_DRV_DBG(ERR, "ParseErr:geneve port is null\n");
185994dbd6cfSKishore Padmanabha 			return BNXT_TF_RC_PARSE_ERR;
1860dd0191d5SShuanglin Wang 		}
186194dbd6cfSKishore Padmanabha 		/* set the dynamic geneve port check */
186294dbd6cfSKishore Padmanabha 		ULP_BITMAP_SET(params->cf_bitmap,
186394dbd6cfSKishore Padmanabha 			       BNXT_ULP_CF_BIT_DYNAMIC_GENEVE_PORT);
186494dbd6cfSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params,
186594dbd6cfSKishore Padmanabha 				    BNXT_ULP_CF_IDX_TUNNEL_PORT, dport);
186694dbd6cfSKishore Padmanabha 	} else {
186794dbd6cfSKishore Padmanabha 		if (dport == 0) {
186894dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
186994dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_O_L4_DST_PORT,
187094dbd6cfSKishore Padmanabha 					    ULP_UDP_PORT_GENEVE);
187194dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params,
187294dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_O_L4_DST_PORT_MASK,
187394dbd6cfSKishore Padmanabha 					    ULP_UDP_PORT_GENEVE_MASK);
187494dbd6cfSKishore Padmanabha 		} else if (dport != 0 && dport != ULP_UDP_PORT_GENEVE) {
187594dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_TUNNEL_PORT,
187694dbd6cfSKishore Padmanabha 					    dport);
187794dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(params->cf_bitmap,
187894dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_DYNAMIC_GENEVE_PORT);
187994dbd6cfSKishore Padmanabha 		}
188094dbd6cfSKishore Padmanabha 	}
1881dd0191d5SShuanglin Wang 	return BNXT_TF_RC_SUCCESS;
1882dd0191d5SShuanglin Wang }
188374cab005SRandy Schacher 
18847891de8dSVenkat Duvvuru /* Function to handle the parsing of RTE Flow item GRE Header. */
18857891de8dSVenkat Duvvuru int32_t
18867891de8dSVenkat Duvvuru ulp_rte_gre_hdr_handler(const struct rte_flow_item *item,
18877891de8dSVenkat Duvvuru 			struct ulp_rte_parser_params *params)
18887891de8dSVenkat Duvvuru {
18897891de8dSVenkat Duvvuru 	const struct rte_flow_item_gre *gre_spec = item->spec;
18907891de8dSVenkat Duvvuru 	const struct rte_flow_item_gre *gre_mask = item->mask;
18917891de8dSVenkat Duvvuru 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1892741172beSKishore Padmanabha 	uint32_t idx = 0;
18937891de8dSVenkat Duvvuru 	uint32_t size;
18947891de8dSVenkat Duvvuru 
18950c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
18960c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_GRE_NUM))) {
1897dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1898741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
18997891de8dSVenkat Duvvuru 	}
1900741172beSKishore Padmanabha 
1901f6e12015SKishore Padmanabha 	if (gre_spec && !gre_mask)
1902f6e12015SKishore Padmanabha 		gre_mask = &rte_flow_item_gre_mask;
1903f6e12015SKishore Padmanabha 
1904741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_gre *)NULL)->c_rsvd0_ver);
1905741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1906741172beSKishore Padmanabha 			      ulp_deference_struct(gre_spec, c_rsvd0_ver),
1907741172beSKishore Padmanabha 			      ulp_deference_struct(gre_mask, c_rsvd0_ver),
1908741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1909741172beSKishore Padmanabha 
1910741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_gre *)NULL)->protocol);
1911741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1912741172beSKishore Padmanabha 			      ulp_deference_struct(gre_spec, protocol),
1913741172beSKishore Padmanabha 			      ulp_deference_struct(gre_mask, protocol),
1914741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
19157891de8dSVenkat Duvvuru 
19167891de8dSVenkat Duvvuru 	/* Update the hdr_bitmap with GRE */
19177891de8dSVenkat Duvvuru 	ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_GRE);
1918dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL);
19197891de8dSVenkat Duvvuru 	return BNXT_TF_RC_SUCCESS;
19207891de8dSVenkat Duvvuru }
19217891de8dSVenkat Duvvuru 
19227891de8dSVenkat Duvvuru /* Function to handle the parsing of RTE Flow item ANY. */
19237891de8dSVenkat Duvvuru int32_t
19247891de8dSVenkat Duvvuru ulp_rte_item_any_handler(const struct rte_flow_item *item __rte_unused,
19257891de8dSVenkat Duvvuru 			 struct ulp_rte_parser_params *params __rte_unused)
19267891de8dSVenkat Duvvuru {
19277891de8dSVenkat Duvvuru 	return BNXT_TF_RC_SUCCESS;
19287891de8dSVenkat Duvvuru }
19297891de8dSVenkat Duvvuru 
19303fe124d2SKishore Padmanabha /* Function to handle the parsing of RTE Flow item ICMP Header. */
19313fe124d2SKishore Padmanabha int32_t
19323fe124d2SKishore Padmanabha ulp_rte_icmp_hdr_handler(const struct rte_flow_item *item,
19333fe124d2SKishore Padmanabha 			 struct ulp_rte_parser_params *params)
19343fe124d2SKishore Padmanabha {
19353fe124d2SKishore Padmanabha 	const struct rte_flow_item_icmp *icmp_spec = item->spec;
19363fe124d2SKishore Padmanabha 	const struct rte_flow_item_icmp *icmp_mask = item->mask;
19373fe124d2SKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1938741172beSKishore Padmanabha 	uint32_t idx = 0;
19393fe124d2SKishore Padmanabha 	uint32_t size;
19403fe124d2SKishore Padmanabha 
19410c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
19420c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_ICMP_NUM))) {
1943dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
1944741172beSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
19453fe124d2SKishore Padmanabha 	}
1946741172beSKishore Padmanabha 
1947f6e12015SKishore Padmanabha 	if (icmp_spec && !icmp_mask)
1948f6e12015SKishore Padmanabha 		icmp_mask = &rte_flow_item_icmp_mask;
1949f6e12015SKishore Padmanabha 
1950741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp *)NULL)->hdr.icmp_type);
1951741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1952741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, hdr.icmp_type),
1953741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, hdr.icmp_type),
1954741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1955741172beSKishore Padmanabha 
1956741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp *)NULL)->hdr.icmp_code);
1957741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1958741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, hdr.icmp_code),
1959741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, hdr.icmp_code),
1960741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1961741172beSKishore Padmanabha 
1962741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp *)NULL)->hdr.icmp_cksum);
1963741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1964741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, hdr.icmp_cksum),
1965741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, hdr.icmp_cksum),
1966741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1967741172beSKishore Padmanabha 
1968741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp *)NULL)->hdr.icmp_ident);
1969741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1970741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, hdr.icmp_ident),
1971741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, hdr.icmp_ident),
1972741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
1973741172beSKishore Padmanabha 
1974741172beSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp *)NULL)->hdr.icmp_seq_nb);
1975741172beSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
1976741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, hdr.icmp_seq_nb),
1977741172beSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, hdr.icmp_seq_nb),
1978741172beSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
19793fe124d2SKishore Padmanabha 
19803fe124d2SKishore Padmanabha 	/* Update the hdr_bitmap with ICMP */
1981dd0191d5SShuanglin Wang 	if (ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL))
19823fe124d2SKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_I_ICMP);
19833fe124d2SKishore Padmanabha 	else
19843fe124d2SKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_ICMP);
19853fe124d2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
19863fe124d2SKishore Padmanabha }
19873fe124d2SKishore Padmanabha 
1988a4d4308eSKishore Padmanabha /* Function to handle the parsing of RTE Flow item ICMP6 Header. */
1989a4d4308eSKishore Padmanabha int32_t
1990a4d4308eSKishore Padmanabha ulp_rte_icmp6_hdr_handler(const struct rte_flow_item *item,
1991a4d4308eSKishore Padmanabha 			  struct ulp_rte_parser_params *params)
1992a4d4308eSKishore Padmanabha {
1993a4d4308eSKishore Padmanabha 	const struct rte_flow_item_icmp6 *icmp_spec = item->spec;
1994a4d4308eSKishore Padmanabha 	const struct rte_flow_item_icmp6 *icmp_mask = item->mask;
1995a4d4308eSKishore Padmanabha 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
1996a4d4308eSKishore Padmanabha 	uint32_t idx = 0;
1997a4d4308eSKishore Padmanabha 	uint32_t size;
1998a4d4308eSKishore Padmanabha 
19990c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
20000c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_ICMP_NUM))) {
2001dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
2002a4d4308eSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
2003a4d4308eSKishore Padmanabha 	}
2004a4d4308eSKishore Padmanabha 
2005f6e12015SKishore Padmanabha 	if (icmp_spec && !icmp_mask)
2006f6e12015SKishore Padmanabha 		icmp_mask = &rte_flow_item_icmp6_mask;
2007f6e12015SKishore Padmanabha 
2008a4d4308eSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp6 *)NULL)->type);
2009a4d4308eSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
2010a4d4308eSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, type),
2011a4d4308eSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, type),
2012a4d4308eSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
2013a4d4308eSKishore Padmanabha 
2014a4d4308eSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp6 *)NULL)->code);
2015a4d4308eSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
2016a4d4308eSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, code),
2017a4d4308eSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, code),
2018a4d4308eSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
2019a4d4308eSKishore Padmanabha 
2020a4d4308eSKishore Padmanabha 	size = sizeof(((struct rte_flow_item_icmp6 *)NULL)->checksum);
2021a4d4308eSKishore Padmanabha 	ulp_rte_prsr_fld_mask(params, &idx, size,
2022a4d4308eSKishore Padmanabha 			      ulp_deference_struct(icmp_spec, checksum),
2023a4d4308eSKishore Padmanabha 			      ulp_deference_struct(icmp_mask, checksum),
2024a4d4308eSKishore Padmanabha 			      ULP_PRSR_ACT_DEFAULT);
2025a4d4308eSKishore Padmanabha 
2026a4d4308eSKishore Padmanabha 	if (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV4)) {
2027dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error: incorrect icmp version\n");
2028a4d4308eSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
2029a4d4308eSKishore Padmanabha 	}
2030a4d4308eSKishore Padmanabha 
2031a4d4308eSKishore Padmanabha 	/* Update the hdr_bitmap with ICMP */
2032dd0191d5SShuanglin Wang 	if (ULP_BITMAP_ISSET(params->cf_bitmap, BNXT_ULP_CF_BIT_IS_TUNNEL))
2033a4d4308eSKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_I_ICMP);
2034a4d4308eSKishore Padmanabha 	else
2035a4d4308eSKishore Padmanabha 		ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_ICMP);
2036a4d4308eSKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
2037a4d4308eSKishore Padmanabha }
2038a4d4308eSKishore Padmanabha 
20392d344c36SRandy Schacher /* Function to handle the parsing of RTE Flow item ECPRI Header. */
20402d344c36SRandy Schacher int32_t
20412d344c36SRandy Schacher ulp_rte_ecpri_hdr_handler(const struct rte_flow_item *item,
20422d344c36SRandy Schacher 			  struct ulp_rte_parser_params *params)
20432d344c36SRandy Schacher {
20442d344c36SRandy Schacher 	const struct rte_flow_item_ecpri *ecpri_spec = item->spec;
20452d344c36SRandy Schacher 	const struct rte_flow_item_ecpri *ecpri_mask = item->mask;
20462d344c36SRandy Schacher 	struct rte_flow_item_ecpri l_ecpri_spec, l_ecpri_mask;
20472d344c36SRandy Schacher 	struct rte_flow_item_ecpri *p_ecpri_spec = &l_ecpri_spec;
20482d344c36SRandy Schacher 	struct rte_flow_item_ecpri *p_ecpri_mask = &l_ecpri_mask;
20492d344c36SRandy Schacher 	struct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;
20502d344c36SRandy Schacher 	uint32_t idx = 0, cnt;
20512d344c36SRandy Schacher 	uint32_t size;
20522d344c36SRandy Schacher 
20530c036a14SPeter Spreadborough 	if (unlikely(ulp_rte_prsr_fld_size_validate(params, &idx,
20540c036a14SPeter Spreadborough 						    BNXT_ULP_PROTO_HDR_ECPRI_NUM))) {
2055dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error parsing protocol header\n");
20562d344c36SRandy Schacher 		return BNXT_TF_RC_ERROR;
20572d344c36SRandy Schacher 	}
20582d344c36SRandy Schacher 
2059f6e12015SKishore Padmanabha 	if (ecpri_spec && !ecpri_mask)
2060f6e12015SKishore Padmanabha 		ecpri_mask = &rte_flow_item_ecpri_mask;
2061f6e12015SKishore Padmanabha 
20622d344c36SRandy Schacher 	/* Figure out if eCPRI is within L4(UDP), unsupported, for now */
20632d344c36SRandy Schacher 	cnt = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L4_HDR_CNT);
20642d344c36SRandy Schacher 	if (cnt >= 1) {
2065dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err: L4 header stack >= 2 not supported\n");
20662d344c36SRandy Schacher 		return BNXT_TF_RC_ERROR;
20672d344c36SRandy Schacher 	}
20682d344c36SRandy Schacher 
20692d344c36SRandy Schacher 	if (!ecpri_spec || !ecpri_mask)
20702d344c36SRandy Schacher 		goto parser_set_ecpri_hdr_bit;
20712d344c36SRandy Schacher 
20722d344c36SRandy Schacher 	memcpy(p_ecpri_spec, ecpri_spec, sizeof(*ecpri_spec));
20732d344c36SRandy Schacher 	memcpy(p_ecpri_mask, ecpri_mask, sizeof(*ecpri_mask));
20742d344c36SRandy Schacher 
20752d344c36SRandy Schacher 	p_ecpri_spec->hdr.common.u32 = rte_be_to_cpu_32(p_ecpri_spec->hdr.common.u32);
20762d344c36SRandy Schacher 	p_ecpri_mask->hdr.common.u32 = rte_be_to_cpu_32(p_ecpri_mask->hdr.common.u32);
20772d344c36SRandy Schacher 
20782d344c36SRandy Schacher 	/*
20792d344c36SRandy Schacher 	 * Init eCPRI spec+mask to correct defaults, also clear masks of fields
20802d344c36SRandy Schacher 	 * we ignore in the TCAM.
20812d344c36SRandy Schacher 	 */
20822d344c36SRandy Schacher 
20832d344c36SRandy Schacher 	l_ecpri_spec.hdr.common.size = 0;
20842d344c36SRandy Schacher 	l_ecpri_spec.hdr.common.c = 0;
20852d344c36SRandy Schacher 	l_ecpri_spec.hdr.common.res = 0;
20862d344c36SRandy Schacher 	l_ecpri_spec.hdr.common.revision = 1;
20872d344c36SRandy Schacher 	l_ecpri_mask.hdr.common.size = 0;
20882d344c36SRandy Schacher 	l_ecpri_mask.hdr.common.c = 1;
20892d344c36SRandy Schacher 	l_ecpri_mask.hdr.common.res = 0;
20902d344c36SRandy Schacher 	l_ecpri_mask.hdr.common.revision = 0xf;
20912d344c36SRandy Schacher 
20922d344c36SRandy Schacher 	switch (p_ecpri_spec->hdr.common.type) {
20932d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_IQ_DATA:
20942d344c36SRandy Schacher 		l_ecpri_mask.hdr.type0.seq_id = 0;
20952d344c36SRandy Schacher 		break;
20962d344c36SRandy Schacher 
20972d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_BIT_SEQ:
20982d344c36SRandy Schacher 		l_ecpri_mask.hdr.type1.seq_id = 0;
20992d344c36SRandy Schacher 		break;
21002d344c36SRandy Schacher 
21012d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_RTC_CTRL:
21022d344c36SRandy Schacher 		l_ecpri_mask.hdr.type2.seq_id = 0;
21032d344c36SRandy Schacher 		break;
21042d344c36SRandy Schacher 
21052d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_GEN_DATA:
21062d344c36SRandy Schacher 		l_ecpri_mask.hdr.type3.seq_id = 0;
21072d344c36SRandy Schacher 		break;
21082d344c36SRandy Schacher 
21092d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_RM_ACC:
21102d344c36SRandy Schacher 		l_ecpri_mask.hdr.type4.rr = 0;
21112d344c36SRandy Schacher 		l_ecpri_mask.hdr.type4.rw = 0;
21122d344c36SRandy Schacher 		l_ecpri_mask.hdr.type4.rma_id = 0;
21132d344c36SRandy Schacher 		break;
21142d344c36SRandy Schacher 
21152d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_DLY_MSR:
21162d344c36SRandy Schacher 		l_ecpri_spec.hdr.type5.act_type = 0;
21172d344c36SRandy Schacher 		break;
21182d344c36SRandy Schacher 
21192d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_RMT_RST:
21202d344c36SRandy Schacher 		l_ecpri_spec.hdr.type6.rst_op = 0;
21212d344c36SRandy Schacher 		break;
21222d344c36SRandy Schacher 
21232d344c36SRandy Schacher 	case RTE_ECPRI_MSG_TYPE_EVT_IND:
21242d344c36SRandy Schacher 		l_ecpri_spec.hdr.type7.evt_type = 0;
21252d344c36SRandy Schacher 		l_ecpri_spec.hdr.type7.seq = 0;
21262d344c36SRandy Schacher 		l_ecpri_spec.hdr.type7.number = 0;
21272d344c36SRandy Schacher 		break;
21282d344c36SRandy Schacher 
21292d344c36SRandy Schacher 	default:
21302d344c36SRandy Schacher 		break;
21312d344c36SRandy Schacher 	}
21322d344c36SRandy Schacher 
21332d344c36SRandy Schacher 	p_ecpri_spec->hdr.common.u32 = rte_cpu_to_be_32(p_ecpri_spec->hdr.common.u32);
21342d344c36SRandy Schacher 	p_ecpri_mask->hdr.common.u32 = rte_cpu_to_be_32(p_ecpri_mask->hdr.common.u32);
21352d344c36SRandy Schacher 
21362d344c36SRandy Schacher 	/* Type */
21372d344c36SRandy Schacher 	size = sizeof(((struct rte_flow_item_ecpri *)NULL)->hdr.common.u32);
21382d344c36SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
21392d344c36SRandy Schacher 			      ulp_deference_struct(p_ecpri_spec, hdr.common.u32),
21402d344c36SRandy Schacher 			      ulp_deference_struct(p_ecpri_mask, hdr.common.u32),
21412d344c36SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
21422d344c36SRandy Schacher 
21432d344c36SRandy Schacher 	/* PC/RTC/MSR_ID */
21442d344c36SRandy Schacher 	size = sizeof(((struct rte_flow_item_ecpri *)NULL)->hdr.dummy[0]);
21452d344c36SRandy Schacher 	ulp_rte_prsr_fld_mask(params, &idx, size,
21462d344c36SRandy Schacher 			      ulp_deference_struct(p_ecpri_spec, hdr.dummy),
21472d344c36SRandy Schacher 			      ulp_deference_struct(p_ecpri_mask, hdr.dummy),
21482d344c36SRandy Schacher 			      ULP_PRSR_ACT_DEFAULT);
21492d344c36SRandy Schacher 
21502d344c36SRandy Schacher parser_set_ecpri_hdr_bit:
21512d344c36SRandy Schacher 	/* Update the hdr_bitmap with eCPRI */
21522d344c36SRandy Schacher 	ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_ECPRI);
21532d344c36SRandy Schacher 	return BNXT_TF_RC_SUCCESS;
21542d344c36SRandy Schacher }
21552d344c36SRandy Schacher 
215653a0d4f7SKishore Padmanabha /* Function to handle the parsing of RTE Flow item void Header */
215753a0d4f7SKishore Padmanabha int32_t
215853a0d4f7SKishore Padmanabha ulp_rte_void_hdr_handler(const struct rte_flow_item *item __rte_unused,
21593d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params __rte_unused)
216053a0d4f7SKishore Padmanabha {
216153a0d4f7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
216253a0d4f7SKishore Padmanabha }
216311c854e2SKishore Padmanabha 
216411c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action void Header. */
216511c854e2SKishore Padmanabha int32_t
216611c854e2SKishore Padmanabha ulp_rte_void_act_handler(const struct rte_flow_action *action_item __rte_unused,
21673d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params __rte_unused)
216811c854e2SKishore Padmanabha {
216911c854e2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
217011c854e2SKishore Padmanabha }
217111c854e2SKishore Padmanabha 
217211c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action Mark Header. */
217311c854e2SKishore Padmanabha int32_t
217411c854e2SKishore Padmanabha ulp_rte_mark_act_handler(const struct rte_flow_action *action_item,
21753d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *param)
217611c854e2SKishore Padmanabha {
217711c854e2SKishore Padmanabha 	const struct rte_flow_action_mark *mark;
21783d6ba7cbSKishore Padmanabha 	struct ulp_rte_act_bitmap *act = &param->act_bitmap;
21793d6ba7cbSKishore Padmanabha 	uint32_t mark_id;
218011c854e2SKishore Padmanabha 
218111c854e2SKishore Padmanabha 	mark = action_item->conf;
218211c854e2SKishore Padmanabha 	if (mark) {
218311c854e2SKishore Padmanabha 		mark_id = tfp_cpu_to_be_32(mark->id);
21843d6ba7cbSKishore Padmanabha 		memcpy(&param->act_prop.act_details[BNXT_ULP_ACT_PROP_IDX_MARK],
218511c854e2SKishore Padmanabha 		       &mark_id, BNXT_ULP_ACT_PROP_SZ_MARK);
218611c854e2SKishore Padmanabha 
218711c854e2SKishore Padmanabha 		/* Update the hdr_bitmap with vxlan */
218859ae4961SKishore Padmanabha 		ULP_BITMAP_SET(act->bits, BNXT_ULP_ACT_BIT_MARK);
218911c854e2SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
219011c854e2SKishore Padmanabha 	}
2191dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: Mark arg is invalid\n");
219211c854e2SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
219311c854e2SKishore Padmanabha }
219411c854e2SKishore Padmanabha 
219511c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action RSS Header. */
219611c854e2SKishore Padmanabha int32_t
219711c854e2SKishore Padmanabha ulp_rte_rss_act_handler(const struct rte_flow_action *action_item,
21983d6ba7cbSKishore Padmanabha 			struct ulp_rte_parser_params *param)
219911c854e2SKishore Padmanabha {
22001993b267SShahaji Bhosle 	const struct rte_flow_action_rss *rss;
22011993b267SShahaji Bhosle 	struct ulp_rte_act_prop *ap = &param->act_prop;
22026d160d77SRandy Schacher 	uint64_t queue_list[BNXT_ULP_ACT_PROP_SZ_RSS_QUEUE / sizeof(uint64_t)];
22036d160d77SRandy Schacher 	uint32_t idx = 0, id;
220411c854e2SKishore Padmanabha 
22051993b267SShahaji Bhosle 	if (action_item == NULL || action_item->conf == NULL) {
2206dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err: invalid rss configuration\n");
220711c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
220811c854e2SKishore Padmanabha 	}
220911c854e2SKishore Padmanabha 
22101993b267SShahaji Bhosle 	rss = action_item->conf;
22111993b267SShahaji Bhosle 	/* Copy the rss into the specific action properties */
2212dd0191d5SShuanglin Wang 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_FUNC], &rss->func,
2213dd0191d5SShuanglin Wang 	       BNXT_ULP_ACT_PROP_SZ_RSS_FUNC);
22141993b267SShahaji Bhosle 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_TYPES], &rss->types,
22151993b267SShahaji Bhosle 	       BNXT_ULP_ACT_PROP_SZ_RSS_TYPES);
22161993b267SShahaji Bhosle 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_LEVEL], &rss->level,
22171993b267SShahaji Bhosle 	       BNXT_ULP_ACT_PROP_SZ_RSS_LEVEL);
22181993b267SShahaji Bhosle 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_KEY_LEN],
22191993b267SShahaji Bhosle 	       &rss->key_len, BNXT_ULP_ACT_PROP_SZ_RSS_KEY_LEN);
22201993b267SShahaji Bhosle 
22216d160d77SRandy Schacher 	if (rss->key_len != 0 && rss->key_len != BNXT_ULP_ACT_PROP_SZ_RSS_KEY) {
2222dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err: RSS key length must be 40 bytes\n");
22231993b267SShahaji Bhosle 		return BNXT_TF_RC_ERROR;
22241993b267SShahaji Bhosle 	}
22256d160d77SRandy Schacher 
22266d160d77SRandy Schacher 	/* User may specify only key length. In that case, rss->key will be NULL.
22276d160d77SRandy Schacher 	 * So, reject the flow if key_length is valid but rss->key is NULL.
22286d160d77SRandy Schacher 	 * Also, copy the RSS hash key only when rss->key is valid.
22296d160d77SRandy Schacher 	 */
22306d160d77SRandy Schacher 	if (rss->key_len != 0 && rss->key == NULL) {
2231dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
22326d160d77SRandy Schacher 			    "Parse Err: A valid RSS key must be provided with a valid key len.\n");
22336d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
22346d160d77SRandy Schacher 	}
22356d160d77SRandy Schacher 	if (rss->key)
22366d160d77SRandy Schacher 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_KEY], rss->key, rss->key_len);
22376d160d77SRandy Schacher 
22386d160d77SRandy Schacher 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_QUEUE_NUM],
22396d160d77SRandy Schacher 	       &rss->queue_num, BNXT_ULP_ACT_PROP_SZ_RSS_QUEUE_NUM);
22406d160d77SRandy Schacher 
22416d160d77SRandy Schacher 	if (rss->queue_num >= ULP_BYTE_2_BITS(BNXT_ULP_ACT_PROP_SZ_RSS_QUEUE)) {
2242dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err: RSS queue num too big\n");
22436d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
22446d160d77SRandy Schacher 	}
22456d160d77SRandy Schacher 
22466d160d77SRandy Schacher 	/* Queues converted into a bitmap format */
22476d160d77SRandy Schacher 	memset(queue_list, 0, sizeof(queue_list));
22486d160d77SRandy Schacher 	for (idx = 0; idx < rss->queue_num; idx++) {
22496d160d77SRandy Schacher 		id = rss->queue[idx];
22506d160d77SRandy Schacher 		if (id >= ULP_BYTE_2_BITS(BNXT_ULP_ACT_PROP_SZ_RSS_QUEUE)) {
2251dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR, "Parse Err: RSS queue id too big\n");
22526d160d77SRandy Schacher 			return BNXT_TF_RC_ERROR;
22536d160d77SRandy Schacher 		}
22546d160d77SRandy Schacher 		if ((queue_list[id / ULP_INDEX_BITMAP_SIZE] >>
22556d160d77SRandy Schacher 		    ((ULP_INDEX_BITMAP_SIZE - 1) -
22566d160d77SRandy Schacher 		     (id % ULP_INDEX_BITMAP_SIZE)) & 1)) {
2257dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR, "Parse Err: duplicate queue ids\n");
22586d160d77SRandy Schacher 			return BNXT_TF_RC_ERROR;
22596d160d77SRandy Schacher 		}
22606d160d77SRandy Schacher 		queue_list[id / ULP_INDEX_BITMAP_SIZE] |= (1UL <<
22616d160d77SRandy Schacher 		((ULP_INDEX_BITMAP_SIZE - 1) - (id % ULP_INDEX_BITMAP_SIZE)));
22626d160d77SRandy Schacher 	}
22636d160d77SRandy Schacher 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_RSS_QUEUE],
22646d160d77SRandy Schacher 	       (uint8_t *)queue_list, BNXT_ULP_ACT_PROP_SZ_RSS_QUEUE);
22651993b267SShahaji Bhosle 
22661993b267SShahaji Bhosle 	/* set the RSS action header bit */
22671993b267SShahaji Bhosle 	ULP_BITMAP_SET(param->act_bitmap.bits, BNXT_ULP_ACT_BIT_RSS);
22681993b267SShahaji Bhosle 
22691993b267SShahaji Bhosle 	return BNXT_TF_RC_SUCCESS;
22701993b267SShahaji Bhosle }
22711993b267SShahaji Bhosle 
2272f63aa27dSKishore Padmanabha /* Function to handle the parsing of RTE Flow item eth Header. */
2273f63aa27dSKishore Padmanabha static void
2274f63aa27dSKishore Padmanabha ulp_rte_enc_eth_hdr_handler(struct ulp_rte_parser_params *params,
2275f63aa27dSKishore Padmanabha 			    const struct rte_flow_item_eth *eth_spec)
2276f63aa27dSKishore Padmanabha {
2277f63aa27dSKishore Padmanabha 	struct ulp_rte_hdr_field *field;
2278f63aa27dSKishore Padmanabha 	uint32_t size;
2279f63aa27dSKishore Padmanabha 
2280f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_ETH_DMAC];
22818275d5fcSThomas Monjalon 	size = sizeof(eth_spec->hdr.dst_addr.addr_bytes);
22828275d5fcSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, eth_spec->hdr.dst_addr.addr_bytes, size);
2283f63aa27dSKishore Padmanabha 
22848275d5fcSThomas Monjalon 	size = sizeof(eth_spec->hdr.src_addr.addr_bytes);
22858275d5fcSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, eth_spec->hdr.src_addr.addr_bytes, size);
2286f63aa27dSKishore Padmanabha 
22878275d5fcSThomas Monjalon 	size = sizeof(eth_spec->hdr.ether_type);
22888275d5fcSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &eth_spec->hdr.ether_type, size);
2289f63aa27dSKishore Padmanabha 
2290f63aa27dSKishore Padmanabha 	ULP_BITMAP_SET(params->enc_hdr_bitmap.bits, BNXT_ULP_HDR_BIT_O_ETH);
2291f63aa27dSKishore Padmanabha }
2292f63aa27dSKishore Padmanabha 
2293f63aa27dSKishore Padmanabha /* Function to handle the parsing of RTE Flow item vlan Header. */
2294f63aa27dSKishore Padmanabha static void
2295f63aa27dSKishore Padmanabha ulp_rte_enc_vlan_hdr_handler(struct ulp_rte_parser_params *params,
2296f63aa27dSKishore Padmanabha 			     const struct rte_flow_item_vlan *vlan_spec,
2297f63aa27dSKishore Padmanabha 			     uint32_t inner)
2298f63aa27dSKishore Padmanabha {
2299f63aa27dSKishore Padmanabha 	struct ulp_rte_hdr_field *field;
2300f63aa27dSKishore Padmanabha 	uint32_t size;
2301f63aa27dSKishore Padmanabha 
2302f63aa27dSKishore Padmanabha 	if (!inner) {
2303f63aa27dSKishore Padmanabha 		field = &params->enc_field[BNXT_ULP_ENC_FIELD_O_VLAN_TCI];
2304f63aa27dSKishore Padmanabha 		ULP_BITMAP_SET(params->enc_hdr_bitmap.bits,
2305f63aa27dSKishore Padmanabha 			       BNXT_ULP_HDR_BIT_OO_VLAN);
2306f63aa27dSKishore Padmanabha 	} else {
2307f63aa27dSKishore Padmanabha 		field = &params->enc_field[BNXT_ULP_ENC_FIELD_I_VLAN_TCI];
2308f63aa27dSKishore Padmanabha 		ULP_BITMAP_SET(params->enc_hdr_bitmap.bits,
2309f63aa27dSKishore Padmanabha 			       BNXT_ULP_HDR_BIT_OI_VLAN);
2310f63aa27dSKishore Padmanabha 	}
2311f63aa27dSKishore Padmanabha 
23128275d5fcSThomas Monjalon 	size = sizeof(vlan_spec->hdr.vlan_tci);
23138275d5fcSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &vlan_spec->hdr.vlan_tci, size);
2314f63aa27dSKishore Padmanabha 
23158275d5fcSThomas Monjalon 	size = sizeof(vlan_spec->hdr.eth_proto);
23168275d5fcSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &vlan_spec->hdr.eth_proto, size);
2317f63aa27dSKishore Padmanabha }
2318f63aa27dSKishore Padmanabha 
2319f63aa27dSKishore Padmanabha /* Function to handle the parsing of RTE Flow item ipv4 Header. */
2320f63aa27dSKishore Padmanabha static void
2321f63aa27dSKishore Padmanabha ulp_rte_enc_ipv4_hdr_handler(struct ulp_rte_parser_params *params,
2322f63aa27dSKishore Padmanabha 			     const struct rte_flow_item_ipv4 *ip)
2323f63aa27dSKishore Padmanabha {
2324f63aa27dSKishore Padmanabha 	struct ulp_rte_hdr_field *field;
2325f63aa27dSKishore Padmanabha 	uint32_t size;
2326f63aa27dSKishore Padmanabha 	uint8_t val8;
2327f63aa27dSKishore Padmanabha 
2328f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_IPV4_IHL];
2329f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.version_ihl);
2330f63aa27dSKishore Padmanabha 	if (!ip->hdr.version_ihl)
2331f63aa27dSKishore Padmanabha 		val8 = RTE_IPV4_VHL_DEF;
2332f63aa27dSKishore Padmanabha 	else
2333f63aa27dSKishore Padmanabha 		val8 = ip->hdr.version_ihl;
2334f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &val8, size);
2335f63aa27dSKishore Padmanabha 
2336f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.type_of_service);
2337f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.type_of_service, size);
2338f63aa27dSKishore Padmanabha 
2339f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.packet_id);
2340f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.packet_id, size);
2341f63aa27dSKishore Padmanabha 
2342f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.fragment_offset);
2343f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.fragment_offset, size);
2344f63aa27dSKishore Padmanabha 
2345f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.time_to_live);
2346f63aa27dSKishore Padmanabha 	if (!ip->hdr.time_to_live)
2347f63aa27dSKishore Padmanabha 		val8 = BNXT_ULP_DEFAULT_TTL;
2348f63aa27dSKishore Padmanabha 	else
2349f63aa27dSKishore Padmanabha 		val8 = ip->hdr.time_to_live;
2350f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &val8, size);
2351f63aa27dSKishore Padmanabha 
2352f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.next_proto_id);
2353f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.next_proto_id, size);
2354f63aa27dSKishore Padmanabha 
2355f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.src_addr);
2356f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.src_addr, size);
2357f63aa27dSKishore Padmanabha 
2358f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.dst_addr);
2359f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.dst_addr, size);
2360f63aa27dSKishore Padmanabha 
2361f63aa27dSKishore Padmanabha 	ULP_BITMAP_SET(params->enc_hdr_bitmap.bits, BNXT_ULP_HDR_BIT_O_IPV4);
2362f63aa27dSKishore Padmanabha }
2363f63aa27dSKishore Padmanabha 
2364f63aa27dSKishore Padmanabha /* Function to handle the parsing of RTE Flow item ipv6 Header. */
2365f63aa27dSKishore Padmanabha static void
2366f63aa27dSKishore Padmanabha ulp_rte_enc_ipv6_hdr_handler(struct ulp_rte_parser_params *params,
2367f63aa27dSKishore Padmanabha 			     const struct rte_flow_item_ipv6 *ip)
2368f63aa27dSKishore Padmanabha {
2369f63aa27dSKishore Padmanabha 	struct ulp_rte_hdr_field *field;
2370f63aa27dSKishore Padmanabha 	uint32_t size;
2371f63aa27dSKishore Padmanabha 	uint32_t val32;
2372f63aa27dSKishore Padmanabha 	uint8_t val8;
2373f63aa27dSKishore Padmanabha 
2374f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_IPV6_VTC_FLOW];
2375f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.vtc_flow);
2376f63aa27dSKishore Padmanabha 	if (!ip->hdr.vtc_flow)
2377f63aa27dSKishore Padmanabha 		val32 = rte_cpu_to_be_32(BNXT_ULP_IPV6_DFLT_VER);
2378f63aa27dSKishore Padmanabha 	else
2379f63aa27dSKishore Padmanabha 		val32 = ip->hdr.vtc_flow;
2380f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &val32, size);
2381f63aa27dSKishore Padmanabha 
2382f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.proto);
2383f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.proto, size);
2384f63aa27dSKishore Padmanabha 
2385f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.hop_limits);
2386f63aa27dSKishore Padmanabha 	if (!ip->hdr.hop_limits)
2387f63aa27dSKishore Padmanabha 		val8 = BNXT_ULP_DEFAULT_TTL;
2388f63aa27dSKishore Padmanabha 	else
2389f63aa27dSKishore Padmanabha 		val8 = ip->hdr.hop_limits;
2390f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &val8, size);
2391f63aa27dSKishore Padmanabha 
2392f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.src_addr);
2393f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.src_addr, size);
2394f63aa27dSKishore Padmanabha 
2395f63aa27dSKishore Padmanabha 	size = sizeof(ip->hdr.dst_addr);
2396f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &ip->hdr.dst_addr, size);
2397f63aa27dSKishore Padmanabha 
2398f63aa27dSKishore Padmanabha 	ULP_BITMAP_SET(params->enc_hdr_bitmap.bits, BNXT_ULP_HDR_BIT_O_IPV6);
2399f63aa27dSKishore Padmanabha }
2400f63aa27dSKishore Padmanabha 
2401f63aa27dSKishore Padmanabha /* Function to handle the parsing of RTE Flow item UDP Header. */
2402f63aa27dSKishore Padmanabha static void
2403f63aa27dSKishore Padmanabha ulp_rte_enc_udp_hdr_handler(struct ulp_rte_parser_params *params,
2404f63aa27dSKishore Padmanabha 			    const struct rte_flow_item_udp *udp_spec)
2405f63aa27dSKishore Padmanabha {
2406f63aa27dSKishore Padmanabha 	struct ulp_rte_hdr_field *field;
2407f63aa27dSKishore Padmanabha 	uint32_t size;
2408f63aa27dSKishore Padmanabha 	uint8_t type = IPPROTO_UDP;
2409f63aa27dSKishore Padmanabha 
2410f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_UDP_SPORT];
2411f63aa27dSKishore Padmanabha 	size = sizeof(udp_spec->hdr.src_port);
2412f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &udp_spec->hdr.src_port, size);
2413f63aa27dSKishore Padmanabha 
2414f63aa27dSKishore Padmanabha 	size = sizeof(udp_spec->hdr.dst_port);
2415f63aa27dSKishore Padmanabha 	field = ulp_rte_parser_fld_copy(field, &udp_spec->hdr.dst_port, size);
2416f63aa27dSKishore Padmanabha 
2417f63aa27dSKishore Padmanabha 	ULP_BITMAP_SET(params->enc_hdr_bitmap.bits, BNXT_ULP_HDR_BIT_O_UDP);
2418f63aa27dSKishore Padmanabha 
2419dd0191d5SShuanglin Wang 	/* Update the ip header protocol */
2420f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_IPV4_PROTO];
2421f63aa27dSKishore Padmanabha 	ulp_rte_parser_fld_copy(field, &type, sizeof(type));
2422f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_IPV6_PROTO];
2423f63aa27dSKishore Padmanabha 	ulp_rte_parser_fld_copy(field, &type, sizeof(type));
2424f63aa27dSKishore Padmanabha }
2425f63aa27dSKishore Padmanabha 
2426f63aa27dSKishore Padmanabha /* Function to handle the parsing of RTE Flow item vxlan Header. */
2427f63aa27dSKishore Padmanabha static void
2428f63aa27dSKishore Padmanabha ulp_rte_enc_vxlan_hdr_handler(struct ulp_rte_parser_params *params,
2429f63aa27dSKishore Padmanabha 			      struct rte_flow_item_vxlan *vxlan_spec)
2430f63aa27dSKishore Padmanabha {
2431f63aa27dSKishore Padmanabha 	struct ulp_rte_hdr_field *field;
2432f63aa27dSKishore Padmanabha 	uint32_t size;
2433f63aa27dSKishore Padmanabha 
2434f63aa27dSKishore Padmanabha 	field = &params->enc_field[BNXT_ULP_ENC_FIELD_VXLAN_FLAGS];
24355ec2a97eSThomas Monjalon 	size = sizeof(vxlan_spec->hdr.flags);
24365ec2a97eSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &vxlan_spec->hdr.flags, size);
2437f63aa27dSKishore Padmanabha 
24385ec2a97eSThomas Monjalon 	size = sizeof(vxlan_spec->hdr.rsvd0);
24395ec2a97eSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &vxlan_spec->hdr.rsvd0, size);
2440f63aa27dSKishore Padmanabha 
24415ec2a97eSThomas Monjalon 	size = sizeof(vxlan_spec->hdr.vni);
24425ec2a97eSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &vxlan_spec->hdr.vni, size);
2443f63aa27dSKishore Padmanabha 
24445ec2a97eSThomas Monjalon 	size = sizeof(vxlan_spec->hdr.rsvd1);
24455ec2a97eSThomas Monjalon 	field = ulp_rte_parser_fld_copy(field, &vxlan_spec->hdr.rsvd1, size);
2446f63aa27dSKishore Padmanabha 
2447f63aa27dSKishore Padmanabha 	ULP_BITMAP_SET(params->enc_hdr_bitmap.bits, BNXT_ULP_HDR_BIT_T_VXLAN);
2448f63aa27dSKishore Padmanabha }
2449f63aa27dSKishore Padmanabha 
245011c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action vxlan_encap Header. */
245111c854e2SKishore Padmanabha int32_t
245211c854e2SKishore Padmanabha ulp_rte_vxlan_encap_act_handler(const struct rte_flow_action *action_item,
24533d6ba7cbSKishore Padmanabha 				struct ulp_rte_parser_params *params)
245411c854e2SKishore Padmanabha {
245511c854e2SKishore Padmanabha 	const struct rte_flow_action_vxlan_encap *vxlan_encap;
245611c854e2SKishore Padmanabha 	const struct rte_flow_item *item;
245711c854e2SKishore Padmanabha 	const struct rte_flow_item_ipv4 *ipv4_spec;
245811c854e2SKishore Padmanabha 	const struct rte_flow_item_ipv6 *ipv6_spec;
245911c854e2SKishore Padmanabha 	struct rte_flow_item_vxlan vxlan_spec;
246011c854e2SKishore Padmanabha 	uint32_t vlan_num = 0, vlan_size = 0;
246111c854e2SKishore Padmanabha 	uint32_t ip_size = 0, ip_type = 0;
246211c854e2SKishore Padmanabha 	uint32_t vxlan_size = 0;
24633d6ba7cbSKishore Padmanabha 	struct ulp_rte_act_bitmap *act = &params->act_bitmap;
24643d6ba7cbSKishore Padmanabha 	struct ulp_rte_act_prop *ap = &params->act_prop;
246511c854e2SKishore Padmanabha 
246611c854e2SKishore Padmanabha 	vxlan_encap = action_item->conf;
246711c854e2SKishore Padmanabha 	if (!vxlan_encap) {
2468dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Error: Vxlan_encap arg is invalid\n");
246911c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
247011c854e2SKishore Padmanabha 	}
247111c854e2SKishore Padmanabha 
247211c854e2SKishore Padmanabha 	item = vxlan_encap->definition;
247311c854e2SKishore Padmanabha 	if (!item) {
2474dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Error: definition arg is invalid\n");
247511c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
247611c854e2SKishore Padmanabha 	}
247711c854e2SKishore Padmanabha 
247811c854e2SKishore Padmanabha 	if (!ulp_rte_item_skip_void(&item, 0))
247911c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
248011c854e2SKishore Padmanabha 
248111c854e2SKishore Padmanabha 	/* must have ethernet header */
248211c854e2SKishore Padmanabha 	if (item->type != RTE_FLOW_ITEM_TYPE_ETH) {
2483dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Error:vxlan encap does not have eth\n");
248411c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
248511c854e2SKishore Padmanabha 	}
248611c854e2SKishore Padmanabha 
2487f63aa27dSKishore Padmanabha 	/* Parse the ethernet header */
2488f63aa27dSKishore Padmanabha 	if (item->spec)
2489f63aa27dSKishore Padmanabha 		ulp_rte_enc_eth_hdr_handler(params, item->spec);
24904eb53395SKishore Padmanabha 
249111c854e2SKishore Padmanabha 	/* Goto the next item */
249211c854e2SKishore Padmanabha 	if (!ulp_rte_item_skip_void(&item, 1))
249311c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
249411c854e2SKishore Padmanabha 
249511c854e2SKishore Padmanabha 	/* May have vlan header */
249611c854e2SKishore Padmanabha 	if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
249711c854e2SKishore Padmanabha 		vlan_num++;
2498f63aa27dSKishore Padmanabha 		if (item->spec)
2499f63aa27dSKishore Padmanabha 			ulp_rte_enc_vlan_hdr_handler(params, item->spec, 0);
250011c854e2SKishore Padmanabha 
250111c854e2SKishore Padmanabha 		if (!ulp_rte_item_skip_void(&item, 1))
250211c854e2SKishore Padmanabha 			return BNXT_TF_RC_ERROR;
250311c854e2SKishore Padmanabha 	}
250411c854e2SKishore Padmanabha 
250511c854e2SKishore Padmanabha 	/* may have two vlan headers */
250611c854e2SKishore Padmanabha 	if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
250711c854e2SKishore Padmanabha 		vlan_num++;
2508f63aa27dSKishore Padmanabha 		if (item->spec)
2509f63aa27dSKishore Padmanabha 			ulp_rte_enc_vlan_hdr_handler(params, item->spec, 1);
2510f63aa27dSKishore Padmanabha 
251111c854e2SKishore Padmanabha 		if (!ulp_rte_item_skip_void(&item, 1))
251211c854e2SKishore Padmanabha 			return BNXT_TF_RC_ERROR;
251311c854e2SKishore Padmanabha 	}
2514f63aa27dSKishore Padmanabha 
251511c854e2SKishore Padmanabha 	/* Update the vlan count and size of more than one */
251611c854e2SKishore Padmanabha 	if (vlan_num) {
2517a2417601SKishore Padmanabha 		vlan_size = vlan_num * sizeof(struct rte_flow_item_vlan);
251811c854e2SKishore Padmanabha 		vlan_num = tfp_cpu_to_be_32(vlan_num);
251911c854e2SKishore Padmanabha 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_NUM],
252011c854e2SKishore Padmanabha 		       &vlan_num,
252111c854e2SKishore Padmanabha 		       sizeof(uint32_t));
252211c854e2SKishore Padmanabha 		vlan_size = tfp_cpu_to_be_32(vlan_size);
252311c854e2SKishore Padmanabha 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_SZ],
252411c854e2SKishore Padmanabha 		       &vlan_size,
252511c854e2SKishore Padmanabha 		       sizeof(uint32_t));
252611c854e2SKishore Padmanabha 	}
252711c854e2SKishore Padmanabha 
252811c854e2SKishore Padmanabha 	/* L3 must be IPv4, IPv6 */
252911c854e2SKishore Padmanabha 	if (item->type == RTE_FLOW_ITEM_TYPE_IPV4) {
253011c854e2SKishore Padmanabha 		ipv4_spec = item->spec;
253111c854e2SKishore Padmanabha 		ip_size = BNXT_ULP_ENCAP_IPV4_SIZE;
253211c854e2SKishore Padmanabha 
253311c854e2SKishore Padmanabha 		/* Update the ip size details */
253411c854e2SKishore Padmanabha 		ip_size = tfp_cpu_to_be_32(ip_size);
253511c854e2SKishore Padmanabha 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SZ],
253611c854e2SKishore Padmanabha 		       &ip_size, sizeof(uint32_t));
253711c854e2SKishore Padmanabha 
253811c854e2SKishore Padmanabha 		/* update the ip type */
253911c854e2SKishore Padmanabha 		ip_type = rte_cpu_to_be_32(BNXT_ULP_ETH_IPV4);
254011c854e2SKishore Padmanabha 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_L3_TYPE],
254111c854e2SKishore Padmanabha 		       &ip_type, sizeof(uint32_t));
254211c854e2SKishore Padmanabha 
25434c4e86faSKishore Padmanabha 		/* update the computed field to notify it is ipv4 header */
25444c4e86faSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_ENCAP_IPV4_FLAG,
25454c4e86faSKishore Padmanabha 				    1);
2546f63aa27dSKishore Padmanabha 		if (ipv4_spec)
2547f63aa27dSKishore Padmanabha 			ulp_rte_enc_ipv4_hdr_handler(params, ipv4_spec);
25484c4e86faSKishore Padmanabha 
254911c854e2SKishore Padmanabha 		if (!ulp_rte_item_skip_void(&item, 1))
255011c854e2SKishore Padmanabha 			return BNXT_TF_RC_ERROR;
255111c854e2SKishore Padmanabha 	} else if (item->type == RTE_FLOW_ITEM_TYPE_IPV6) {
255211c854e2SKishore Padmanabha 		ipv6_spec = item->spec;
255311c854e2SKishore Padmanabha 		ip_size = BNXT_ULP_ENCAP_IPV6_SIZE;
255411c854e2SKishore Padmanabha 
255511c854e2SKishore Padmanabha 		/* Update the ip size details */
255611c854e2SKishore Padmanabha 		ip_size = tfp_cpu_to_be_32(ip_size);
255711c854e2SKishore Padmanabha 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SZ],
255811c854e2SKishore Padmanabha 		       &ip_size, sizeof(uint32_t));
255911c854e2SKishore Padmanabha 
256011c854e2SKishore Padmanabha 		 /* update the ip type */
256111c854e2SKishore Padmanabha 		ip_type = rte_cpu_to_be_32(BNXT_ULP_ETH_IPV6);
256211c854e2SKishore Padmanabha 		memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_L3_TYPE],
256311c854e2SKishore Padmanabha 		       &ip_type, sizeof(uint32_t));
256411c854e2SKishore Padmanabha 
25654c4e86faSKishore Padmanabha 		/* update the computed field to notify it is ipv6 header */
25664c4e86faSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_ENCAP_IPV6_FLAG,
25674c4e86faSKishore Padmanabha 				    1);
2568f63aa27dSKishore Padmanabha 		if (ipv6_spec)
2569f63aa27dSKishore Padmanabha 			ulp_rte_enc_ipv6_hdr_handler(params, ipv6_spec);
25704c4e86faSKishore Padmanabha 
257111c854e2SKishore Padmanabha 		if (!ulp_rte_item_skip_void(&item, 1))
257211c854e2SKishore Padmanabha 			return BNXT_TF_RC_ERROR;
257311c854e2SKishore Padmanabha 	} else {
2574dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Error: Vxlan Encap expects L3 hdr\n");
257511c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
257611c854e2SKishore Padmanabha 	}
257711c854e2SKishore Padmanabha 
257811c854e2SKishore Padmanabha 	/* L4 is UDP */
257911c854e2SKishore Padmanabha 	if (item->type != RTE_FLOW_ITEM_TYPE_UDP) {
2580dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "vxlan encap does not have udp\n");
258111c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
258211c854e2SKishore Padmanabha 	}
2583f63aa27dSKishore Padmanabha 	if (item->spec)
2584f63aa27dSKishore Padmanabha 		ulp_rte_enc_udp_hdr_handler(params, item->spec);
258511c854e2SKishore Padmanabha 
258611c854e2SKishore Padmanabha 	if (!ulp_rte_item_skip_void(&item, 1))
258711c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
258811c854e2SKishore Padmanabha 
258911c854e2SKishore Padmanabha 	/* Finally VXLAN */
259011c854e2SKishore Padmanabha 	if (item->type != RTE_FLOW_ITEM_TYPE_VXLAN) {
2591dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "vxlan encap does not have vni\n");
259211c854e2SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
259311c854e2SKishore Padmanabha 	}
2594a2417601SKishore Padmanabha 	vxlan_size = sizeof(struct rte_flow_item_vxlan);
259511c854e2SKishore Padmanabha 	/* copy the vxlan details */
259611c854e2SKishore Padmanabha 	memcpy(&vxlan_spec, item->spec, vxlan_size);
25975ec2a97eSThomas Monjalon 	vxlan_spec.hdr.flags = 0x08;
259811c854e2SKishore Padmanabha 	vxlan_size = tfp_cpu_to_be_32(vxlan_size);
259911c854e2SKishore Padmanabha 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_TUN_SZ],
260011c854e2SKishore Padmanabha 	       &vxlan_size, sizeof(uint32_t));
260111c854e2SKishore Padmanabha 
2602f63aa27dSKishore Padmanabha 	ulp_rte_enc_vxlan_hdr_handler(params, &vxlan_spec);
2603f63aa27dSKishore Padmanabha 
260411c854e2SKishore Padmanabha 	/* update the hdr_bitmap with vxlan */
260559ae4961SKishore Padmanabha 	ULP_BITMAP_SET(act->bits, BNXT_ULP_ACT_BIT_VXLAN_ENCAP);
260611c854e2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
260711c854e2SKishore Padmanabha }
260811c854e2SKishore Padmanabha 
260911c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action vxlan_encap Header */
261011c854e2SKishore Padmanabha int32_t
261111c854e2SKishore Padmanabha ulp_rte_vxlan_decap_act_handler(const struct rte_flow_action *action_item
261211c854e2SKishore Padmanabha 				__rte_unused,
26133d6ba7cbSKishore Padmanabha 				struct ulp_rte_parser_params *params)
261411c854e2SKishore Padmanabha {
261511c854e2SKishore Padmanabha 	/* update the hdr_bitmap with vxlan */
26163d6ba7cbSKishore Padmanabha 	ULP_BITMAP_SET(params->act_bitmap.bits,
261759ae4961SKishore Padmanabha 		       BNXT_ULP_ACT_BIT_VXLAN_DECAP);
2618675e31d8SVenkat Duvvuru 	/* Update computational field with tunnel decap info */
2619675e31d8SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L3_TUN_DECAP, 1);
262011c854e2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
262111c854e2SKishore Padmanabha }
262211c854e2SKishore Padmanabha 
262311c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action drop Header. */
262411c854e2SKishore Padmanabha int32_t
262511c854e2SKishore Padmanabha ulp_rte_drop_act_handler(const struct rte_flow_action *action_item __rte_unused,
26263d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *params)
262711c854e2SKishore Padmanabha {
262811c854e2SKishore Padmanabha 	/* Update the hdr_bitmap with drop */
262959ae4961SKishore Padmanabha 	ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_DROP);
263011c854e2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
263111c854e2SKishore Padmanabha }
263211c854e2SKishore Padmanabha 
263311c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action count. */
263411c854e2SKishore Padmanabha int32_t
263511c854e2SKishore Padmanabha ulp_rte_count_act_handler(const struct rte_flow_action *action_item,
26363d6ba7cbSKishore Padmanabha 			  struct ulp_rte_parser_params *params)
263711c854e2SKishore Padmanabha {
263811c854e2SKishore Padmanabha 	const struct rte_flow_action_count *act_count;
26393d6ba7cbSKishore Padmanabha 	struct ulp_rte_act_prop *act_prop = &params->act_prop;
264011c854e2SKishore Padmanabha 
264111c854e2SKishore Padmanabha 	act_count = action_item->conf;
264211c854e2SKishore Padmanabha 	if (act_count) {
264311c854e2SKishore Padmanabha 		memcpy(&act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_COUNT],
264411c854e2SKishore Padmanabha 		       &act_count->id,
264511c854e2SKishore Padmanabha 		       BNXT_ULP_ACT_PROP_SZ_COUNT);
264611c854e2SKishore Padmanabha 	}
264711c854e2SKishore Padmanabha 
264811c854e2SKishore Padmanabha 	/* Update the hdr_bitmap with count */
264959ae4961SKishore Padmanabha 	ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_COUNT);
265011c854e2SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
265111c854e2SKishore Padmanabha }
265211c854e2SKishore Padmanabha 
2653987f2ec9SManish Kurup static bool ulp_rte_parser_is_portb_vfrep(struct ulp_rte_parser_params *param)
2654987f2ec9SManish Kurup {
2655987f2ec9SManish Kurup 	return ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_B_IS_VFREP);
2656987f2ec9SManish Kurup }
2657987f2ec9SManish Kurup 
2658987f2ec9SManish Kurup /*
2659987f2ec9SManish Kurup  * Swaps info related to multi-port:
2660987f2ec9SManish Kurup  * common:
2661987f2ec9SManish Kurup  *    BNXT_ULP_CF_IDX_MP_B_IS_VFREP, BNXT_ULP_CF_IDX_MP_A_IS_VFREP
2662987f2ec9SManish Kurup  *    BNXT_ULP_CF_IDX_MP_PORT_A, BNXT_ULP_CF_IDX_MP_PORT_B
2663987f2ec9SManish Kurup  *
2664987f2ec9SManish Kurup  * ingress:
2665987f2ec9SManish Kurup  *    BNXT_ULP_CF_IDX_MP_VNIC_B, BNXT_ULP_CF_IDX_MP_VNIC_A
2666987f2ec9SManish Kurup  *
2667987f2ec9SManish Kurup  * egress:
2668987f2ec9SManish Kurup  *    BNXT_ULP_CF_IDX_MP_MDATA_B, BNXT_ULP_CF_IDX_MP_MDATA_A
2669987f2ec9SManish Kurup  *    BNXT_ULP_CF_IDX_MP_VPORT_B, BNXT_ULP_CF_IDX_MP_VPORT_A
2670987f2ec9SManish Kurup  *
2671987f2ec9SManish Kurup  * Note: This is done as OVS could give us a non-VFREP port in port B, and we
2672987f2ec9SManish Kurup  * cannot use that to mirror, so we swap out the ports so that a VFREP is now
2673987f2ec9SManish Kurup  * in port B instead.
2674987f2ec9SManish Kurup  */
2675987f2ec9SManish Kurup static int32_t
2676987f2ec9SManish Kurup ulp_rte_parser_normalize_port_info(struct ulp_rte_parser_params *param)
2677987f2ec9SManish Kurup {
2678987f2ec9SManish Kurup 	uint16_t mp_port_a, mp_port_b, mp_mdata_a, mp_mdata_b,
2679987f2ec9SManish Kurup 		 mp_vport_a, mp_vport_b, mp_vnic_a, mp_vnic_b,
2680987f2ec9SManish Kurup 		 mp_is_vfrep_a, mp_is_vfrep_b;
2681987f2ec9SManish Kurup 
2682987f2ec9SManish Kurup 	mp_is_vfrep_a = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_A_IS_VFREP);
2683987f2ec9SManish Kurup 	mp_is_vfrep_b = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_B_IS_VFREP);
2684987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_B_IS_VFREP, mp_is_vfrep_a);
2685987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_A_IS_VFREP, mp_is_vfrep_b);
2686987f2ec9SManish Kurup 
2687987f2ec9SManish Kurup 	mp_port_a = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_PORT_A);
2688987f2ec9SManish Kurup 	mp_port_b = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_PORT_B);
2689987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_PORT_B, mp_port_a);
2690987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_PORT_A, mp_port_b);
2691987f2ec9SManish Kurup 
2692987f2ec9SManish Kurup 	mp_vport_a = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_VPORT_A);
2693987f2ec9SManish Kurup 	mp_vport_b = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_VPORT_B);
2694987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_VPORT_B, mp_vport_a);
2695987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_VPORT_A, mp_vport_b);
2696987f2ec9SManish Kurup 
2697987f2ec9SManish Kurup 	mp_vnic_a = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_VNIC_A);
2698987f2ec9SManish Kurup 	mp_vnic_b = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_VNIC_B);
2699987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_VNIC_B, mp_vnic_a);
2700987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_VNIC_A, mp_vnic_b);
2701987f2ec9SManish Kurup 
2702987f2ec9SManish Kurup 	mp_mdata_a = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_MDATA_A);
2703987f2ec9SManish Kurup 	mp_mdata_b = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_MDATA_B);
2704987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_MDATA_B, mp_mdata_a);
2705987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_MDATA_A, mp_mdata_b);
2706987f2ec9SManish Kurup 
2707987f2ec9SManish Kurup 	return BNXT_TF_RC_SUCCESS;
2708987f2ec9SManish Kurup }
2709987f2ec9SManish Kurup 
2710987f2ec9SManish Kurup 
271177b359eeSKishore Padmanabha /* Function to handle the parsing of action ports. */
271277b359eeSKishore Padmanabha static int32_t
271377b359eeSKishore Padmanabha ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param,
2714987f2ec9SManish Kurup 			    uint32_t ifindex, bool multi_port,
2715640b44aaSAndrew Rybchenko 			    enum bnxt_ulp_direction_type act_dir)
271677b359eeSKishore Padmanabha {
271777b359eeSKishore Padmanabha 	enum bnxt_ulp_direction_type dir;
271877b359eeSKishore Padmanabha 	uint16_t pid_s;
2719987f2ec9SManish Kurup 	uint8_t *p_mdata;
2720987f2ec9SManish Kurup 	uint32_t pid, port_index;
272177b359eeSKishore Padmanabha 	struct ulp_rte_act_prop *act = &param->act_prop;
2722c32827d0SKishore Padmanabha 	enum bnxt_ulp_intf_type port_type;
2723c32827d0SKishore Padmanabha 	uint32_t vnic_type;
272477b359eeSKishore Padmanabha 
272577b359eeSKishore Padmanabha 	/* Get the direction */
2726640b44aaSAndrew Rybchenko 	/* If action implicitly specifies direction, use the specification. */
2727640b44aaSAndrew Rybchenko 	dir = (act_dir == BNXT_ULP_DIR_INVALID) ?
2728640b44aaSAndrew Rybchenko 		ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_DIRECTION) :
2729640b44aaSAndrew Rybchenko 		act_dir;
2730987f2ec9SManish Kurup 
2731987f2ec9SManish Kurup 	port_type = ULP_COMP_FLD_IDX_RD(param,
2732987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_ACT_PORT_TYPE);
2733987f2ec9SManish Kurup 
2734987f2ec9SManish Kurup 	/* Update flag if Port A/B type is VF-REP */
2735987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, multi_port ?
2736987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_MP_B_IS_VFREP :
2737987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_MP_A_IS_VFREP,
2738987f2ec9SManish Kurup 			    (port_type == BNXT_ULP_INTF_TYPE_VF_REP) ? 1 : 0);
2739dd0191d5SShuanglin Wang 
2740dd0191d5SShuanglin Wang 	/* An egress flow where the action port is not another VF endpoint
2741dd0191d5SShuanglin Wang 	 * requires a VPORT.
2742dd0191d5SShuanglin Wang 	 */
2743987f2ec9SManish Kurup 	if (dir == BNXT_ULP_DIR_EGRESS) {
274477b359eeSKishore Padmanabha 		/* For egress direction, fill vport */
274577b359eeSKishore Padmanabha 		if (ulp_port_db_vport_get(param->ulp_ctx, ifindex, &pid_s))
274677b359eeSKishore Padmanabha 			return BNXT_TF_RC_ERROR;
274777b359eeSKishore Padmanabha 
274877b359eeSKishore Padmanabha 		pid = pid_s;
274977b359eeSKishore Padmanabha 		pid = rte_cpu_to_be_32(pid);
2750987f2ec9SManish Kurup 		if (!multi_port)
275177b359eeSKishore Padmanabha 			memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_VPORT],
275277b359eeSKishore Padmanabha 			       &pid, BNXT_ULP_ACT_PROP_SZ_VPORT);
2753987f2ec9SManish Kurup 
2754987f2ec9SManish Kurup 		/* Fill metadata */
2755987f2ec9SManish Kurup 		if (port_type == BNXT_ULP_INTF_TYPE_VF_REP) {
2756987f2ec9SManish Kurup 			port_index  = ULP_COMP_FLD_IDX_RD(param, multi_port ?
2757987f2ec9SManish Kurup 								 BNXT_ULP_CF_IDX_MP_PORT_B :
2758987f2ec9SManish Kurup 								 BNXT_ULP_CF_IDX_MP_PORT_A);
2759987f2ec9SManish Kurup 			if (ulp_port_db_port_meta_data_get(param->ulp_ctx,
2760987f2ec9SManish Kurup 							   port_index, &p_mdata))
2761987f2ec9SManish Kurup 				return BNXT_TF_RC_ERROR;
2762987f2ec9SManish Kurup 			/*
2763987f2ec9SManish Kurup 			 * Update appropriate port (A/B) metadata based on multi-port
2764987f2ec9SManish Kurup 			 * indication
2765987f2ec9SManish Kurup 			 */
2766987f2ec9SManish Kurup 			ULP_COMP_FLD_IDX_WR(param,
2767987f2ec9SManish Kurup 					    multi_port ?
2768987f2ec9SManish Kurup 						BNXT_ULP_CF_IDX_MP_MDATA_B :
2769987f2ec9SManish Kurup 						BNXT_ULP_CF_IDX_MP_MDATA_A,
2770987f2ec9SManish Kurup 					    rte_cpu_to_be_16(*((uint16_t *)p_mdata)));
2771987f2ec9SManish Kurup 		}
2772987f2ec9SManish Kurup 		/*
2773987f2ec9SManish Kurup 		 * Update appropriate port (A/B) VPORT based on multi-port
2774987f2ec9SManish Kurup 		 * indication.
2775987f2ec9SManish Kurup 		 */
2776987f2ec9SManish Kurup 		ULP_COMP_FLD_IDX_WR(param,
2777987f2ec9SManish Kurup 				    multi_port ?
2778987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_MP_VPORT_B :
2779987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_MP_VPORT_A,
2780987f2ec9SManish Kurup 				    pid_s);
2781f6e12015SKishore Padmanabha 
2782f6e12015SKishore Padmanabha 		/* Setup the VF_TO_VF VNIC information */
2783f6e12015SKishore Padmanabha 		if (!multi_port && port_type == BNXT_ULP_INTF_TYPE_VF_REP) {
2784f6e12015SKishore Padmanabha 			if (ulp_port_db_default_vnic_get(param->ulp_ctx,
2785f6e12015SKishore Padmanabha 							 ifindex,
2786f6e12015SKishore Padmanabha 							 BNXT_ULP_VF_FUNC_VNIC,
2787f6e12015SKishore Padmanabha 							 &pid_s))
2788f6e12015SKishore Padmanabha 				return BNXT_TF_RC_ERROR;
2789f6e12015SKishore Padmanabha 			pid = pid_s;
2790f6e12015SKishore Padmanabha 
2791f6e12015SKishore Padmanabha 			/* Allows use of func_opcode with VNIC */
2792f6e12015SKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_VNIC, pid);
2793f6e12015SKishore Padmanabha 		}
279477b359eeSKishore Padmanabha 	} else {
279577b359eeSKishore Padmanabha 		/* For ingress direction, fill vnic */
2796640b44aaSAndrew Rybchenko 		/*
2797640b44aaSAndrew Rybchenko 		 * Action               Destination
2798640b44aaSAndrew Rybchenko 		 * ------------------------------------
2799640b44aaSAndrew Rybchenko 		 * PORT_REPRESENTOR     Driver Function
2800640b44aaSAndrew Rybchenko 		 * ------------------------------------
2801640b44aaSAndrew Rybchenko 		 * REPRESENTED_PORT     VF
2802640b44aaSAndrew Rybchenko 		 * ------------------------------------
2803640b44aaSAndrew Rybchenko 		 * PORT_ID              VF
2804640b44aaSAndrew Rybchenko 		 */
2805640b44aaSAndrew Rybchenko 		if (act_dir != BNXT_ULP_DIR_INGRESS &&
2806640b44aaSAndrew Rybchenko 		    port_type == BNXT_ULP_INTF_TYPE_VF_REP)
2807c32827d0SKishore Padmanabha 			vnic_type = BNXT_ULP_VF_FUNC_VNIC;
2808c32827d0SKishore Padmanabha 		else
2809c32827d0SKishore Padmanabha 			vnic_type = BNXT_ULP_DRV_FUNC_VNIC;
2810c32827d0SKishore Padmanabha 
281177b359eeSKishore Padmanabha 		if (ulp_port_db_default_vnic_get(param->ulp_ctx, ifindex,
2812c32827d0SKishore Padmanabha 						 vnic_type, &pid_s))
281377b359eeSKishore Padmanabha 			return BNXT_TF_RC_ERROR;
281477b359eeSKishore Padmanabha 
281577b359eeSKishore Padmanabha 		pid = pid_s;
2816dd0191d5SShuanglin Wang 
2817dd0191d5SShuanglin Wang 		/* Allows use of func_opcode with VNIC */
2818dd0191d5SShuanglin Wang 		ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_VNIC, pid);
2819dd0191d5SShuanglin Wang 
282077b359eeSKishore Padmanabha 		pid = rte_cpu_to_be_32(pid);
2821987f2ec9SManish Kurup 		if (!multi_port)
282277b359eeSKishore Padmanabha 			memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_VNIC],
282377b359eeSKishore Padmanabha 			       &pid, BNXT_ULP_ACT_PROP_SZ_VNIC);
2824987f2ec9SManish Kurup 		/*
2825987f2ec9SManish Kurup 		 * Update appropriate port (A/B) VNIC based on multi-port
2826987f2ec9SManish Kurup 		 * indication.
2827987f2ec9SManish Kurup 		 */
2828987f2ec9SManish Kurup 		ULP_COMP_FLD_IDX_WR(param,
2829987f2ec9SManish Kurup 				    multi_port ?
2830987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_MP_VNIC_B :
2831987f2ec9SManish Kurup 					BNXT_ULP_CF_IDX_MP_VNIC_A,
2832987f2ec9SManish Kurup 				    pid_s);
283377b359eeSKishore Padmanabha 	}
283477b359eeSKishore Padmanabha 
2835987f2ec9SManish Kurup 	if (multi_port && !ulp_rte_parser_is_portb_vfrep(param))
2836987f2ec9SManish Kurup 		ulp_rte_parser_normalize_port_info(param);
2837987f2ec9SManish Kurup 
283877b359eeSKishore Padmanabha 	/* Update the action port set bit */
283977b359eeSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_ACT_PORT_IS_SET, 1);
284077b359eeSKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
284177b359eeSKishore Padmanabha }
284277b359eeSKishore Padmanabha 
284311c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action PF. */
284411c854e2SKishore Padmanabha int32_t
284511c854e2SKishore Padmanabha ulp_rte_pf_act_handler(const struct rte_flow_action *action_item __rte_unused,
28462bbcdee8SKishore Padmanabha 		       struct ulp_rte_parser_params *params)
284711c854e2SKishore Padmanabha {
284877b359eeSKishore Padmanabha 	uint32_t port_id;
284914f260c0SKishore Padmanabha 	uint32_t ifindex;
285077b359eeSKishore Padmanabha 	enum bnxt_ulp_intf_type intf_type;
285111c854e2SKishore Padmanabha 
285214f260c0SKishore Padmanabha 	/* Get the port id of the current device */
285314f260c0SKishore Padmanabha 	port_id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF);
285411c854e2SKishore Padmanabha 
285514f260c0SKishore Padmanabha 	/* Get the port db ifindex */
285614f260c0SKishore Padmanabha 	if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx, port_id,
285714f260c0SKishore Padmanabha 					      &ifindex)) {
2858dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid port id\n");
285914f260c0SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
286014f260c0SKishore Padmanabha 	}
286111c854e2SKishore Padmanabha 
286214f260c0SKishore Padmanabha 	/* Check the port is PF port */
286377b359eeSKishore Padmanabha 	intf_type = ulp_port_db_port_type_get(params->ulp_ctx, ifindex);
286477b359eeSKishore Padmanabha 	if (intf_type != BNXT_ULP_INTF_TYPE_PF) {
2865dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Port is not a PF port\n");
286614f260c0SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
286714f260c0SKishore Padmanabha 	}
286877b359eeSKishore Padmanabha 	/* Update the action properties */
286977b359eeSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type);
2870987f2ec9SManish Kurup 	return ulp_rte_parser_act_port_set(params, ifindex, false,
2871640b44aaSAndrew Rybchenko 					   BNXT_ULP_DIR_INVALID);
287211c854e2SKishore Padmanabha }
287311c854e2SKishore Padmanabha 
287411c854e2SKishore Padmanabha /* Function to handle the parsing of RTE Flow action VF. */
287511c854e2SKishore Padmanabha int32_t
287611c854e2SKishore Padmanabha ulp_rte_vf_act_handler(const struct rte_flow_action *action_item,
287714f260c0SKishore Padmanabha 		       struct ulp_rte_parser_params *params)
287811c854e2SKishore Padmanabha {
287911c854e2SKishore Padmanabha 	const struct rte_flow_action_vf *vf_action;
288014f260c0SKishore Padmanabha 	enum bnxt_ulp_intf_type intf_type;
28817891de8dSVenkat Duvvuru 	uint32_t ifindex;
28827891de8dSVenkat Duvvuru 	struct bnxt *bp;
288311c854e2SKishore Padmanabha 
288411c854e2SKishore Padmanabha 	vf_action = action_item->conf;
288514f260c0SKishore Padmanabha 	if (!vf_action) {
2886dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr: Invalid Argument\n");
288711c854e2SKishore Padmanabha 		return BNXT_TF_RC_PARSE_ERR;
288811c854e2SKishore Padmanabha 	}
288914f260c0SKishore Padmanabha 
289014f260c0SKishore Padmanabha 	if (vf_action->original) {
2891dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ParseErr:VF Original not supported\n");
289214f260c0SKishore Padmanabha 		return BNXT_TF_RC_PARSE_ERR;
289314f260c0SKishore Padmanabha 	}
289414f260c0SKishore Padmanabha 
2895ad9eed02SKishore Padmanabha 	bp = bnxt_pmd_get_bp(params->port_id);
28967891de8dSVenkat Duvvuru 	if (bp == NULL) {
2897dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid bp\n");
28987891de8dSVenkat Duvvuru 		return BNXT_TF_RC_ERROR;
28997891de8dSVenkat Duvvuru 	}
29007891de8dSVenkat Duvvuru 
29017891de8dSVenkat Duvvuru 	/* vf_action->id is a logical number which in this case is an
29027891de8dSVenkat Duvvuru 	 * offset from the first VF. So, to get the absolute VF id, the
29037891de8dSVenkat Duvvuru 	 * offset must be added to the absolute first vf id of that port.
29047891de8dSVenkat Duvvuru 	 */
29057891de8dSVenkat Duvvuru 	if (ulp_port_db_dev_func_id_to_ulp_index(params->ulp_ctx,
2906741172beSKishore Padmanabha 						 bp->first_vf_id +
2907741172beSKishore Padmanabha 						 vf_action->id,
290814f260c0SKishore Padmanabha 						 &ifindex)) {
2909dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "VF is not valid interface\n");
291014f260c0SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
291114f260c0SKishore Padmanabha 	}
29127891de8dSVenkat Duvvuru 	/* Check the port is VF port */
291314f260c0SKishore Padmanabha 	intf_type = ulp_port_db_port_type_get(params->ulp_ctx, ifindex);
291414f260c0SKishore Padmanabha 	if (intf_type != BNXT_ULP_INTF_TYPE_VF &&
291514f260c0SKishore Padmanabha 	    intf_type != BNXT_ULP_INTF_TYPE_TRUSTED_VF) {
2916dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Port is not a VF port\n");
291714f260c0SKishore Padmanabha 		return BNXT_TF_RC_ERROR;
291814f260c0SKishore Padmanabha 	}
291914f260c0SKishore Padmanabha 
292077b359eeSKishore Padmanabha 	/* Update the action properties */
292177b359eeSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type);
2922987f2ec9SManish Kurup 	return ulp_rte_parser_act_port_set(params, ifindex, false,
2923640b44aaSAndrew Rybchenko 					   BNXT_ULP_DIR_INVALID);
292411c854e2SKishore Padmanabha }
292511c854e2SKishore Padmanabha 
2926640b44aaSAndrew Rybchenko /* Parse actions PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
292711c854e2SKishore Padmanabha int32_t
2928640b44aaSAndrew Rybchenko ulp_rte_port_act_handler(const struct rte_flow_action *act_item,
29293d6ba7cbSKishore Padmanabha 			 struct ulp_rte_parser_params *param)
293011c854e2SKishore Padmanabha {
2931640b44aaSAndrew Rybchenko 	uint32_t ethdev_id;
29323c334fcdSKishore Padmanabha 	uint32_t ifindex;
2933987f2ec9SManish Kurup 	const struct rte_flow_action_port_id *port_id = act_item->conf;
2934987f2ec9SManish Kurup 	uint32_t num_ports;
293577b359eeSKishore Padmanabha 	enum bnxt_ulp_intf_type intf_type;
2936640b44aaSAndrew Rybchenko 	enum bnxt_ulp_direction_type act_dir;
293711c854e2SKishore Padmanabha 
2938640b44aaSAndrew Rybchenko 	if (!act_item->conf) {
2939dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
29403c334fcdSKishore Padmanabha 				"ParseErr: Invalid Argument\n");
29413c334fcdSKishore Padmanabha 		return BNXT_TF_RC_PARSE_ERR;
29423c334fcdSKishore Padmanabha 	}
2943640b44aaSAndrew Rybchenko 	switch (act_item->type) {
2944640b44aaSAndrew Rybchenko 	case RTE_FLOW_ACTION_TYPE_PORT_ID: {
2945640b44aaSAndrew Rybchenko 		const struct rte_flow_action_port_id *port_id = act_item->conf;
2946640b44aaSAndrew Rybchenko 
294711c854e2SKishore Padmanabha 		if (port_id->original) {
2948dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR,
294911c854e2SKishore Padmanabha 				    "ParseErr:Portid Original not supported\n");
295011c854e2SKishore Padmanabha 			return BNXT_TF_RC_PARSE_ERR;
295111c854e2SKishore Padmanabha 		}
2952640b44aaSAndrew Rybchenko 		ethdev_id = port_id->id;
2953640b44aaSAndrew Rybchenko 		act_dir = BNXT_ULP_DIR_INVALID;
2954640b44aaSAndrew Rybchenko 		break;
2955640b44aaSAndrew Rybchenko 	}
2956640b44aaSAndrew Rybchenko 	case RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR: {
2957640b44aaSAndrew Rybchenko 		const struct rte_flow_action_ethdev *ethdev = act_item->conf;
2958640b44aaSAndrew Rybchenko 
2959640b44aaSAndrew Rybchenko 		ethdev_id = ethdev->port_id;
2960640b44aaSAndrew Rybchenko 		act_dir = BNXT_ULP_DIR_INGRESS;
2961640b44aaSAndrew Rybchenko 		break;
2962640b44aaSAndrew Rybchenko 	}
2963640b44aaSAndrew Rybchenko 	case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: {
2964640b44aaSAndrew Rybchenko 		const struct rte_flow_action_ethdev *ethdev = act_item->conf;
2965640b44aaSAndrew Rybchenko 
2966640b44aaSAndrew Rybchenko 		ethdev_id = ethdev->port_id;
2967640b44aaSAndrew Rybchenko 		act_dir = BNXT_ULP_DIR_EGRESS;
2968640b44aaSAndrew Rybchenko 		break;
2969640b44aaSAndrew Rybchenko 	}
2970640b44aaSAndrew Rybchenko 	default:
2971dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Unknown port action\n");
2972640b44aaSAndrew Rybchenko 		return BNXT_TF_RC_ERROR;
2973640b44aaSAndrew Rybchenko 	}
29743c334fcdSKishore Padmanabha 
2975987f2ec9SManish Kurup 	num_ports  = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_MP_NPORTS);
2976987f2ec9SManish Kurup 
2977987f2ec9SManish Kurup 	if (num_ports) {
2978987f2ec9SManish Kurup 		ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_PORT_B,
2979987f2ec9SManish Kurup 				    port_id->id);
2980987f2ec9SManish Kurup 		ULP_BITMAP_SET(param->act_bitmap.bits,
2981987f2ec9SManish Kurup 			       BNXT_ULP_ACT_BIT_MULTIPLE_PORT);
2982987f2ec9SManish Kurup 	} else {
2983987f2ec9SManish Kurup 		ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_PORT_A,
2984987f2ec9SManish Kurup 				    port_id->id);
2985987f2ec9SManish Kurup 	}
2986987f2ec9SManish Kurup 
29873c334fcdSKishore Padmanabha 	/* Get the port db ifindex */
2988640b44aaSAndrew Rybchenko 	if (ulp_port_db_dev_port_to_ulp_index(param->ulp_ctx, ethdev_id,
298977b359eeSKishore Padmanabha 					      &ifindex)) {
2990dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid port id\n");
29913c334fcdSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
29924a50b6c1SKishore Padmanabha 	}
29933c334fcdSKishore Padmanabha 
299477b359eeSKishore Padmanabha 	/* Get the intf type */
299577b359eeSKishore Padmanabha 	intf_type = ulp_port_db_port_type_get(param->ulp_ctx, ifindex);
299677b359eeSKishore Padmanabha 	if (!intf_type) {
2997dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid port type\n");
29983c334fcdSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
299911c854e2SKishore Padmanabha 	}
300011c854e2SKishore Padmanabha 
300177b359eeSKishore Padmanabha 	/* Set the action port */
300277b359eeSKishore Padmanabha 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type);
30036d160d77SRandy Schacher 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_DEV_ACT_PORT_ID,
30046d160d77SRandy Schacher 			    ethdev_id);
3005987f2ec9SManish Kurup 
3006987f2ec9SManish Kurup 	ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_MP_NPORTS, ++num_ports);
3007987f2ec9SManish Kurup 	return ulp_rte_parser_act_port_set(param, ifindex,
3008987f2ec9SManish Kurup 					   ULP_BITMAP_ISSET(param->act_bitmap.bits,
3009987f2ec9SManish Kurup 							    BNXT_ULP_ACT_BIT_MULTIPLE_PORT),
3010987f2ec9SManish Kurup 					   act_dir);
301111c854e2SKishore Padmanabha }
301211c854e2SKishore Padmanabha 
3013e19ab942SKishore Padmanabha /* Function to handle the parsing of RTE Flow action pop vlan. */
3014e19ab942SKishore Padmanabha int32_t
3015e19ab942SKishore Padmanabha ulp_rte_of_pop_vlan_act_handler(const struct rte_flow_action *a __rte_unused,
3016e19ab942SKishore Padmanabha 				struct ulp_rte_parser_params *params)
3017e19ab942SKishore Padmanabha {
3018e19ab942SKishore Padmanabha 	/* Update the act_bitmap with pop */
301959ae4961SKishore Padmanabha 	ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_POP_VLAN);
3020e19ab942SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
3021e19ab942SKishore Padmanabha }
3022e19ab942SKishore Padmanabha 
3023e19ab942SKishore Padmanabha /* Function to handle the parsing of RTE Flow action push vlan. */
3024e19ab942SKishore Padmanabha int32_t
3025e19ab942SKishore Padmanabha ulp_rte_of_push_vlan_act_handler(const struct rte_flow_action *action_item,
3026e19ab942SKishore Padmanabha 				 struct ulp_rte_parser_params *params)
3027e19ab942SKishore Padmanabha {
3028e19ab942SKishore Padmanabha 	const struct rte_flow_action_of_push_vlan *push_vlan;
3029e19ab942SKishore Padmanabha 	uint16_t ethertype;
3030e19ab942SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
3031e19ab942SKishore Padmanabha 
3032e19ab942SKishore Padmanabha 	push_vlan = action_item->conf;
3033e19ab942SKishore Padmanabha 	if (push_vlan) {
3034e19ab942SKishore Padmanabha 		ethertype = push_vlan->ethertype;
3035e19ab942SKishore Padmanabha 		if (tfp_cpu_to_be_16(ethertype) != RTE_ETHER_TYPE_VLAN) {
3036dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR,
3037e19ab942SKishore Padmanabha 				    "Parse Err: Ethertype not supported\n");
3038e19ab942SKishore Padmanabha 			return BNXT_TF_RC_PARSE_ERR;
3039e19ab942SKishore Padmanabha 		}
3040e19ab942SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_PUSH_VLAN],
3041e19ab942SKishore Padmanabha 		       &ethertype, BNXT_ULP_ACT_PROP_SZ_PUSH_VLAN);
3042e19ab942SKishore Padmanabha 		/* Update the hdr_bitmap with push vlan */
3043e19ab942SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
304459ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_PUSH_VLAN);
3045e19ab942SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
3046e19ab942SKishore Padmanabha 	}
3047dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: Push vlan arg is invalid\n");
3048e19ab942SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
3049e19ab942SKishore Padmanabha }
3050e19ab942SKishore Padmanabha 
3051e19ab942SKishore Padmanabha /* Function to handle the parsing of RTE Flow action set vlan id. */
3052e19ab942SKishore Padmanabha int32_t
3053e19ab942SKishore Padmanabha ulp_rte_of_set_vlan_vid_act_handler(const struct rte_flow_action *action_item,
3054e19ab942SKishore Padmanabha 				    struct ulp_rte_parser_params *params)
3055e19ab942SKishore Padmanabha {
3056e19ab942SKishore Padmanabha 	const struct rte_flow_action_of_set_vlan_vid *vlan_vid;
3057e19ab942SKishore Padmanabha 	uint32_t vid;
3058e19ab942SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
3059e19ab942SKishore Padmanabha 
3060e19ab942SKishore Padmanabha 	vlan_vid = action_item->conf;
3061e19ab942SKishore Padmanabha 	if (vlan_vid && vlan_vid->vlan_vid) {
3062e19ab942SKishore Padmanabha 		vid = vlan_vid->vlan_vid;
3063e19ab942SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_VLAN_VID],
3064e19ab942SKishore Padmanabha 		       &vid, BNXT_ULP_ACT_PROP_SZ_SET_VLAN_VID);
3065e19ab942SKishore Padmanabha 		/* Update the hdr_bitmap with vlan vid */
3066e19ab942SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
306759ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SET_VLAN_VID);
3068e19ab942SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
3069e19ab942SKishore Padmanabha 	}
3070dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: Vlan vid arg is invalid\n");
3071e19ab942SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
3072e19ab942SKishore Padmanabha }
3073e19ab942SKishore Padmanabha 
3074e19ab942SKishore Padmanabha /* Function to handle the parsing of RTE Flow action set vlan pcp. */
3075e19ab942SKishore Padmanabha int32_t
3076e19ab942SKishore Padmanabha ulp_rte_of_set_vlan_pcp_act_handler(const struct rte_flow_action *action_item,
3077e19ab942SKishore Padmanabha 				    struct ulp_rte_parser_params *params)
3078e19ab942SKishore Padmanabha {
3079e19ab942SKishore Padmanabha 	const struct rte_flow_action_of_set_vlan_pcp *vlan_pcp;
3080e19ab942SKishore Padmanabha 	uint8_t pcp;
3081e19ab942SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
3082e19ab942SKishore Padmanabha 
3083e19ab942SKishore Padmanabha 	vlan_pcp = action_item->conf;
3084e19ab942SKishore Padmanabha 	if (vlan_pcp) {
3085e19ab942SKishore Padmanabha 		pcp = vlan_pcp->vlan_pcp;
3086e19ab942SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_VLAN_PCP],
3087e19ab942SKishore Padmanabha 		       &pcp, BNXT_ULP_ACT_PROP_SZ_SET_VLAN_PCP);
3088e19ab942SKishore Padmanabha 		/* Update the hdr_bitmap with vlan vid */
3089e19ab942SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
309059ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SET_VLAN_PCP);
3091e19ab942SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
3092e19ab942SKishore Padmanabha 	}
3093dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: Vlan pcp arg is invalid\n");
3094e19ab942SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
3095e19ab942SKishore Padmanabha }
30962951f7f3SKishore Padmanabha 
30972951f7f3SKishore Padmanabha /* Function to handle the parsing of RTE Flow action set ipv4 src.*/
30982951f7f3SKishore Padmanabha int32_t
30992951f7f3SKishore Padmanabha ulp_rte_set_ipv4_src_act_handler(const struct rte_flow_action *action_item,
31002951f7f3SKishore Padmanabha 				 struct ulp_rte_parser_params *params)
31012951f7f3SKishore Padmanabha {
31022951f7f3SKishore Padmanabha 	const struct rte_flow_action_set_ipv4 *set_ipv4;
31032951f7f3SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
31042951f7f3SKishore Padmanabha 
31052951f7f3SKishore Padmanabha 	set_ipv4 = action_item->conf;
31062951f7f3SKishore Padmanabha 	if (set_ipv4) {
31072951f7f3SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_IPV4_SRC],
31082951f7f3SKishore Padmanabha 		       &set_ipv4->ipv4_addr, BNXT_ULP_ACT_PROP_SZ_SET_IPV4_SRC);
31092951f7f3SKishore Padmanabha 		/* Update the hdr_bitmap with set ipv4 src */
31102951f7f3SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
311159ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SET_IPV4_SRC);
31122951f7f3SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
31132951f7f3SKishore Padmanabha 	}
3114dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set ipv4 src arg is invalid\n");
31152951f7f3SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
31162951f7f3SKishore Padmanabha }
31172951f7f3SKishore Padmanabha 
31182951f7f3SKishore Padmanabha /* Function to handle the parsing of RTE Flow action set ipv4 dst.*/
31192951f7f3SKishore Padmanabha int32_t
31202951f7f3SKishore Padmanabha ulp_rte_set_ipv4_dst_act_handler(const struct rte_flow_action *action_item,
31212951f7f3SKishore Padmanabha 				 struct ulp_rte_parser_params *params)
31222951f7f3SKishore Padmanabha {
31232951f7f3SKishore Padmanabha 	const struct rte_flow_action_set_ipv4 *set_ipv4;
31242951f7f3SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
31252951f7f3SKishore Padmanabha 
31262951f7f3SKishore Padmanabha 	set_ipv4 = action_item->conf;
31272951f7f3SKishore Padmanabha 	if (set_ipv4) {
31282951f7f3SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_IPV4_DST],
31292951f7f3SKishore Padmanabha 		       &set_ipv4->ipv4_addr, BNXT_ULP_ACT_PROP_SZ_SET_IPV4_DST);
31302951f7f3SKishore Padmanabha 		/* Update the hdr_bitmap with set ipv4 dst */
31312951f7f3SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
313259ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SET_IPV4_DST);
31332951f7f3SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
31342951f7f3SKishore Padmanabha 	}
3135dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set ipv4 dst arg is invalid\n");
3136dd0191d5SShuanglin Wang 	return BNXT_TF_RC_ERROR;
3137dd0191d5SShuanglin Wang }
3138dd0191d5SShuanglin Wang 
3139dd0191d5SShuanglin Wang /* Function to handle the parsing of RTE Flow action set ipv6 src.*/
3140dd0191d5SShuanglin Wang int32_t
3141dd0191d5SShuanglin Wang ulp_rte_set_ipv6_src_act_handler(const struct rte_flow_action *action_item,
3142dd0191d5SShuanglin Wang 				 struct ulp_rte_parser_params *params)
3143dd0191d5SShuanglin Wang {
3144dd0191d5SShuanglin Wang 	const struct rte_flow_action_set_ipv6 *set_ipv6;
3145dd0191d5SShuanglin Wang 	struct ulp_rte_act_prop *act = &params->act_prop;
3146dd0191d5SShuanglin Wang 
3147dd0191d5SShuanglin Wang 	set_ipv6 = action_item->conf;
3148dd0191d5SShuanglin Wang 	if (set_ipv6) {
3149dd0191d5SShuanglin Wang 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_IPV6_SRC],
3150dd0191d5SShuanglin Wang 		       &set_ipv6->ipv6_addr, BNXT_ULP_ACT_PROP_SZ_SET_IPV6_SRC);
3151dd0191d5SShuanglin Wang 		/* Update the hdr_bitmap with set ipv4 src */
3152dd0191d5SShuanglin Wang 		ULP_BITMAP_SET(params->act_bitmap.bits,
3153dd0191d5SShuanglin Wang 			       BNXT_ULP_ACT_BIT_SET_IPV6_SRC);
3154dd0191d5SShuanglin Wang 		return BNXT_TF_RC_SUCCESS;
3155dd0191d5SShuanglin Wang 	}
3156dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set ipv6 src arg is invalid\n");
3157dd0191d5SShuanglin Wang 	return BNXT_TF_RC_ERROR;
3158dd0191d5SShuanglin Wang }
3159dd0191d5SShuanglin Wang 
3160dd0191d5SShuanglin Wang /* Function to handle the parsing of RTE Flow action set ipv6 dst.*/
3161dd0191d5SShuanglin Wang int32_t
3162dd0191d5SShuanglin Wang ulp_rte_set_ipv6_dst_act_handler(const struct rte_flow_action *action_item,
3163dd0191d5SShuanglin Wang 				 struct ulp_rte_parser_params *params)
3164dd0191d5SShuanglin Wang {
3165dd0191d5SShuanglin Wang 	const struct rte_flow_action_set_ipv6 *set_ipv6;
3166dd0191d5SShuanglin Wang 	struct ulp_rte_act_prop *act = &params->act_prop;
3167dd0191d5SShuanglin Wang 
3168dd0191d5SShuanglin Wang 	set_ipv6 = action_item->conf;
3169dd0191d5SShuanglin Wang 	if (set_ipv6) {
3170dd0191d5SShuanglin Wang 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_IPV6_DST],
3171dd0191d5SShuanglin Wang 		       &set_ipv6->ipv6_addr, BNXT_ULP_ACT_PROP_SZ_SET_IPV6_DST);
3172dd0191d5SShuanglin Wang 		/* Update the hdr_bitmap with set ipv6 dst */
3173dd0191d5SShuanglin Wang 		ULP_BITMAP_SET(params->act_bitmap.bits,
3174dd0191d5SShuanglin Wang 			       BNXT_ULP_ACT_BIT_SET_IPV6_DST);
3175dd0191d5SShuanglin Wang 		return BNXT_TF_RC_SUCCESS;
3176dd0191d5SShuanglin Wang 	}
3177dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set ipv6 dst arg is invalid\n");
31782951f7f3SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
31792951f7f3SKishore Padmanabha }
3180ce023cf9SKishore Padmanabha 
3181ce023cf9SKishore Padmanabha /* Function to handle the parsing of RTE Flow action set tp src.*/
3182ce023cf9SKishore Padmanabha int32_t
3183ce023cf9SKishore Padmanabha ulp_rte_set_tp_src_act_handler(const struct rte_flow_action *action_item,
3184ce023cf9SKishore Padmanabha 			       struct ulp_rte_parser_params *params)
3185ce023cf9SKishore Padmanabha {
3186ce023cf9SKishore Padmanabha 	const struct rte_flow_action_set_tp *set_tp;
3187ce023cf9SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
3188ce023cf9SKishore Padmanabha 
3189ce023cf9SKishore Padmanabha 	set_tp = action_item->conf;
3190ce023cf9SKishore Padmanabha 	if (set_tp) {
3191ce023cf9SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_TP_SRC],
3192ce023cf9SKishore Padmanabha 		       &set_tp->port, BNXT_ULP_ACT_PROP_SZ_SET_TP_SRC);
3193ce023cf9SKishore Padmanabha 		/* Update the hdr_bitmap with set tp src */
3194ce023cf9SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
319559ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SET_TP_SRC);
3196ce023cf9SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
3197ce023cf9SKishore Padmanabha 	}
3198ce023cf9SKishore Padmanabha 
3199dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set tp src arg is invalid\n");
3200ce023cf9SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
3201ce023cf9SKishore Padmanabha }
3202ce023cf9SKishore Padmanabha 
3203ce023cf9SKishore Padmanabha /* Function to handle the parsing of RTE Flow action set tp dst.*/
3204ce023cf9SKishore Padmanabha int32_t
3205ce023cf9SKishore Padmanabha ulp_rte_set_tp_dst_act_handler(const struct rte_flow_action *action_item,
3206ce023cf9SKishore Padmanabha 			       struct ulp_rte_parser_params *params)
3207ce023cf9SKishore Padmanabha {
3208ce023cf9SKishore Padmanabha 	const struct rte_flow_action_set_tp *set_tp;
3209ce023cf9SKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
3210ce023cf9SKishore Padmanabha 
3211ce023cf9SKishore Padmanabha 	set_tp = action_item->conf;
3212ce023cf9SKishore Padmanabha 	if (set_tp) {
3213ce023cf9SKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_TP_DST],
3214ce023cf9SKishore Padmanabha 		       &set_tp->port, BNXT_ULP_ACT_PROP_SZ_SET_TP_DST);
3215ce023cf9SKishore Padmanabha 		/* Update the hdr_bitmap with set tp dst */
3216ce023cf9SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
321759ae4961SKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SET_TP_DST);
3218ce023cf9SKishore Padmanabha 		return BNXT_TF_RC_SUCCESS;
3219ce023cf9SKishore Padmanabha 	}
3220ce023cf9SKishore Padmanabha 
3221dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set tp src arg is invalid\n");
3222ce023cf9SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
3223ce023cf9SKishore Padmanabha }
32246af7e459SKishore Padmanabha 
32256af7e459SKishore Padmanabha /* Function to handle the parsing of RTE Flow action dec ttl.*/
32266af7e459SKishore Padmanabha int32_t
32276af7e459SKishore Padmanabha ulp_rte_dec_ttl_act_handler(const struct rte_flow_action *act __rte_unused,
32286af7e459SKishore Padmanabha 			    struct ulp_rte_parser_params *params)
32296af7e459SKishore Padmanabha {
32306af7e459SKishore Padmanabha 	/* Update the act_bitmap with dec ttl */
323159ae4961SKishore Padmanabha 	ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_DEC_TTL);
32326af7e459SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
32336af7e459SKishore Padmanabha }
3234c97a47ecSVenkat Duvvuru 
3235dd0191d5SShuanglin Wang /* Function to handle the parsing of RTE Flow action set ttl.*/
3236dd0191d5SShuanglin Wang int32_t
3237dd0191d5SShuanglin Wang ulp_rte_set_ttl_act_handler(const struct rte_flow_action *action_item,
3238dd0191d5SShuanglin Wang 			    struct ulp_rte_parser_params *params)
3239dd0191d5SShuanglin Wang {
3240dd0191d5SShuanglin Wang 	const struct rte_flow_action_set_ttl *set_ttl;
3241dd0191d5SShuanglin Wang 	struct ulp_rte_act_prop *act = &params->act_prop;
3242dd0191d5SShuanglin Wang 
3243dd0191d5SShuanglin Wang 	set_ttl = action_item->conf;
3244dd0191d5SShuanglin Wang 	if (set_ttl) {
3245dd0191d5SShuanglin Wang 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_TTL],
3246dd0191d5SShuanglin Wang 		       &set_ttl->ttl_value, BNXT_ULP_ACT_PROP_SZ_SET_TTL);
3247dd0191d5SShuanglin Wang 		/* Update the act_bitmap with dec ttl */
3248dd0191d5SShuanglin Wang 		/* Note: NIC HW not support the set_ttl action, here using dec_ttl to simulate
3249dd0191d5SShuanglin Wang 		 * the set_ttl action. And ensure the ttl field must be one more than the value
3250dd0191d5SShuanglin Wang 		 * of action set_ttl.
3251dd0191d5SShuanglin Wang 		 */
3252dd0191d5SShuanglin Wang 		if (ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_O_L3_TTL) ==
3253dd0191d5SShuanglin Wang 		    (uint32_t)(set_ttl->ttl_value + 1)) {
3254dd0191d5SShuanglin Wang 			ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_DEC_TTL);
3255dd0191d5SShuanglin Wang 			return BNXT_TF_RC_SUCCESS;
3256dd0191d5SShuanglin Wang 		}
3257dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Error: set_ttl value not match with flow ttl field.\n");
3258dd0191d5SShuanglin Wang 		return BNXT_TF_RC_ERROR;
3259dd0191d5SShuanglin Wang 	}
3260dd0191d5SShuanglin Wang 
3261dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set ttl arg is invalid.\n");
3262dd0191d5SShuanglin Wang 	return BNXT_TF_RC_ERROR;
3263dd0191d5SShuanglin Wang }
3264dd0191d5SShuanglin Wang 
3265c97a47ecSVenkat Duvvuru /* Function to handle the parsing of RTE Flow action JUMP */
3266c97a47ecSVenkat Duvvuru int32_t
326783f916bdSKishore Padmanabha ulp_rte_jump_act_handler(const struct rte_flow_action *action_item,
3268c97a47ecSVenkat Duvvuru 			 struct ulp_rte_parser_params *params)
3269c97a47ecSVenkat Duvvuru {
327083f916bdSKishore Padmanabha 	const struct rte_flow_action_jump *jump_act;
327183f916bdSKishore Padmanabha 	struct ulp_rte_act_prop *act = &params->act_prop;
327283f916bdSKishore Padmanabha 	uint32_t group_id;
327383f916bdSKishore Padmanabha 
327483f916bdSKishore Padmanabha 	jump_act = action_item->conf;
327583f916bdSKishore Padmanabha 	if (jump_act) {
327683f916bdSKishore Padmanabha 		group_id = rte_cpu_to_be_32(jump_act->group);
327783f916bdSKishore Padmanabha 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_JUMP],
327883f916bdSKishore Padmanabha 		       &group_id, BNXT_ULP_ACT_PROP_SZ_JUMP);
327959ae4961SKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_JUMP);
328083f916bdSKishore Padmanabha 	}
3281c97a47ecSVenkat Duvvuru 	return BNXT_TF_RC_SUCCESS;
3282c97a47ecSVenkat Duvvuru }
3283ddaf0afaSKishore Padmanabha 
3284ddaf0afaSKishore Padmanabha int32_t
3285ddaf0afaSKishore Padmanabha ulp_rte_sample_act_handler(const struct rte_flow_action *action_item,
3286ddaf0afaSKishore Padmanabha 			   struct ulp_rte_parser_params *params)
3287ddaf0afaSKishore Padmanabha {
3288ddaf0afaSKishore Padmanabha 	const struct rte_flow_action_sample *sample;
3289ddaf0afaSKishore Padmanabha 	int ret;
3290ddaf0afaSKishore Padmanabha 
3291ddaf0afaSKishore Padmanabha 	sample = action_item->conf;
3292ddaf0afaSKishore Padmanabha 
3293ddaf0afaSKishore Padmanabha 	/* if SAMPLE bit is set it means this sample action is nested within the
3294ddaf0afaSKishore Padmanabha 	 * actions of another sample action; this is not allowed
3295ddaf0afaSKishore Padmanabha 	 */
3296ddaf0afaSKishore Padmanabha 	if (ULP_BITMAP_ISSET(params->act_bitmap.bits,
3297ddaf0afaSKishore Padmanabha 			     BNXT_ULP_ACT_BIT_SAMPLE))
3298ddaf0afaSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
3299ddaf0afaSKishore Padmanabha 
3300ddaf0afaSKishore Padmanabha 	/* a sample action is only allowed as a shared action */
3301ddaf0afaSKishore Padmanabha 	if (!ULP_BITMAP_ISSET(params->act_bitmap.bits,
3302ddaf0afaSKishore Padmanabha 			      BNXT_ULP_ACT_BIT_SHARED))
3303ddaf0afaSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
3304ddaf0afaSKishore Padmanabha 
3305ddaf0afaSKishore Padmanabha 	/* only a ratio of 1 i.e. 100% is supported */
3306ddaf0afaSKishore Padmanabha 	if (sample->ratio != 1)
3307ddaf0afaSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
3308ddaf0afaSKishore Padmanabha 
3309ddaf0afaSKishore Padmanabha 	if (!sample->actions)
3310ddaf0afaSKishore Padmanabha 		return BNXT_TF_RC_ERROR;
3311ddaf0afaSKishore Padmanabha 
3312ddaf0afaSKishore Padmanabha 	/* parse the nested actions for a sample action */
3313ddaf0afaSKishore Padmanabha 	ret = bnxt_ulp_rte_parser_act_parse(sample->actions, params);
3314ddaf0afaSKishore Padmanabha 	if (ret == BNXT_TF_RC_SUCCESS)
3315ddaf0afaSKishore Padmanabha 		/* Update the act_bitmap with sample */
3316741172beSKishore Padmanabha 		ULP_BITMAP_SET(params->act_bitmap.bits,
3317741172beSKishore Padmanabha 			       BNXT_ULP_ACT_BIT_SAMPLE);
3318ddaf0afaSKishore Padmanabha 
3319ddaf0afaSKishore Padmanabha 	return ret;
3320ddaf0afaSKishore Padmanabha }
3321bdf4a3c6SKishore Padmanabha 
33226d160d77SRandy Schacher int32_t
33236d160d77SRandy Schacher ulp_rte_action_hdlr_handler(const struct rte_flow_action *action_item,
33246d160d77SRandy Schacher 			   struct ulp_rte_parser_params *params)
33256d160d77SRandy Schacher {
33266d160d77SRandy Schacher 	const struct rte_flow_action_handle *handle;
33276d160d77SRandy Schacher 	struct bnxt_ulp_shared_act_info *act_info;
33286d160d77SRandy Schacher 	uint64_t action_bitmask;
33296d160d77SRandy Schacher 	uint32_t shared_action_type;
33306d160d77SRandy Schacher 	struct ulp_rte_act_prop *act = &params->act_prop;
33316d160d77SRandy Schacher 	uint64_t tmp64;
33326d160d77SRandy Schacher 	enum bnxt_ulp_direction_type dir, handle_dir;
33336d160d77SRandy Schacher 	uint32_t act_info_entries = 0;
33346d160d77SRandy Schacher 	int32_t ret;
33356d160d77SRandy Schacher 
33366d160d77SRandy Schacher 	handle = action_item->conf;
33376d160d77SRandy Schacher 
33386d160d77SRandy Schacher 	/* Have to use the computed direction since the params->dir_attr
33396d160d77SRandy Schacher 	 * can be different (transfer, ingress, egress)
33406d160d77SRandy Schacher 	 */
33416d160d77SRandy Schacher 	dir = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
33426d160d77SRandy Schacher 
33436d160d77SRandy Schacher 	/* direction of shared action must match direction of flow */
33446d160d77SRandy Schacher 	ret = bnxt_get_action_handle_direction(handle, &handle_dir);
33450c036a14SPeter Spreadborough 	if (unlikely(ret || dir != handle_dir)) {
3346dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid shared handle or direction\n");
33476d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
33486d160d77SRandy Schacher 	}
33496d160d77SRandy Schacher 
33500c036a14SPeter Spreadborough 	if (unlikely(bnxt_get_action_handle_type(handle, &shared_action_type))) {
3351dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid shared handle\n");
33526d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
33536d160d77SRandy Schacher 	}
33546d160d77SRandy Schacher 
33556d160d77SRandy Schacher 	act_info = bnxt_ulp_shared_act_info_get(&act_info_entries);
33560c036a14SPeter Spreadborough 	if (unlikely(shared_action_type >= act_info_entries || !act_info)) {
3357dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid shared handle\n");
33586d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
33596d160d77SRandy Schacher 	}
33606d160d77SRandy Schacher 
33616d160d77SRandy Schacher 	action_bitmask = act_info[shared_action_type].act_bitmask;
33626d160d77SRandy Schacher 
33636d160d77SRandy Schacher 	/* shared actions of the same type cannot be repeated */
33640c036a14SPeter Spreadborough 	if (unlikely(params->act_bitmap.bits & action_bitmask)) {
3365dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "indirect actions cannot be repeated\n");
33666d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
33676d160d77SRandy Schacher 	}
33686d160d77SRandy Schacher 
33696d160d77SRandy Schacher 	tmp64 = tfp_cpu_to_be_64((uint64_t)bnxt_get_action_handle_index(handle));
33706d160d77SRandy Schacher 
33716d160d77SRandy Schacher 	memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SHARED_HANDLE],
33726d160d77SRandy Schacher 	       &tmp64, BNXT_ULP_ACT_PROP_SZ_SHARED_HANDLE);
33736d160d77SRandy Schacher 
33746d160d77SRandy Schacher 	ULP_BITMAP_SET(params->act_bitmap.bits, action_bitmask);
33756d160d77SRandy Schacher 
33766d160d77SRandy Schacher 	return BNXT_TF_RC_SUCCESS;
33776d160d77SRandy Schacher }
33786d160d77SRandy Schacher 
3379bdf4a3c6SKishore Padmanabha /* Function to handle the parsing of bnxt vendor Flow action vxlan Header. */
3380bdf4a3c6SKishore Padmanabha int32_t
3381bdf4a3c6SKishore Padmanabha ulp_vendor_vxlan_decap_act_handler(const struct rte_flow_action *action_item,
3382bdf4a3c6SKishore Padmanabha 				   struct ulp_rte_parser_params *params)
3383bdf4a3c6SKishore Padmanabha {
3384bdf4a3c6SKishore Padmanabha 	/* Set the F1 flow header bit */
3385bdf4a3c6SKishore Padmanabha 	ULP_BITMAP_SET(params->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_F1);
3386bdf4a3c6SKishore Padmanabha 	return ulp_rte_vxlan_decap_act_handler(action_item, params);
3387bdf4a3c6SKishore Padmanabha }
3388bdf4a3c6SKishore Padmanabha 
3389bdf4a3c6SKishore Padmanabha /* Function to handle the parsing of bnxt vendor Flow item vxlan Header. */
3390bdf4a3c6SKishore Padmanabha int32_t
3391bdf4a3c6SKishore Padmanabha ulp_rte_vendor_vxlan_decap_hdr_handler(const struct rte_flow_item *item,
3392bdf4a3c6SKishore Padmanabha 				       struct ulp_rte_parser_params *params)
3393bdf4a3c6SKishore Padmanabha {
3394bdf4a3c6SKishore Padmanabha 	RTE_SET_USED(item);
3395bdf4a3c6SKishore Padmanabha 	/* Set the F2 flow header bit */
3396bdf4a3c6SKishore Padmanabha 	ULP_BITMAP_SET(params->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_F2);
3397bdf4a3c6SKishore Padmanabha 	return ulp_rte_vxlan_decap_act_handler(NULL, params);
3398bdf4a3c6SKishore Padmanabha }
33996d160d77SRandy Schacher 
34006d160d77SRandy Schacher /* Function to handle the parsing of RTE Flow action queue. */
34016d160d77SRandy Schacher int32_t
34026d160d77SRandy Schacher ulp_rte_queue_act_handler(const struct rte_flow_action *action_item,
34036d160d77SRandy Schacher 			  struct ulp_rte_parser_params *param)
34046d160d77SRandy Schacher {
34056d160d77SRandy Schacher 	const struct rte_flow_action_queue *q_info;
34066d160d77SRandy Schacher 	struct ulp_rte_act_prop *ap = &param->act_prop;
34076d160d77SRandy Schacher 
34086d160d77SRandy Schacher 	if (action_item == NULL || action_item->conf == NULL) {
3409dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err: invalid queue configuration\n");
34106d160d77SRandy Schacher 		return BNXT_TF_RC_ERROR;
34116d160d77SRandy Schacher 	}
34126d160d77SRandy Schacher 
34136d160d77SRandy Schacher 	q_info = action_item->conf;
34146d160d77SRandy Schacher 	/* Copy the queue into the specific action properties */
34156d160d77SRandy Schacher 	memcpy(&ap->act_details[BNXT_ULP_ACT_PROP_IDX_QUEUE_INDEX],
34166d160d77SRandy Schacher 	       &q_info->index, BNXT_ULP_ACT_PROP_SZ_QUEUE_INDEX);
34176d160d77SRandy Schacher 
34186d160d77SRandy Schacher 	/* set the queue action header bit */
34196d160d77SRandy Schacher 	ULP_BITMAP_SET(param->act_bitmap.bits, BNXT_ULP_ACT_BIT_QUEUE);
34206d160d77SRandy Schacher 
34216d160d77SRandy Schacher 	return BNXT_TF_RC_SUCCESS;
34226d160d77SRandy Schacher }
34236d160d77SRandy Schacher 
34244993c210SRandy Schacher /* Function to handle the parsing of RTE Flow action meter. */
34254993c210SRandy Schacher int32_t
34264993c210SRandy Schacher ulp_rte_meter_act_handler(const struct rte_flow_action *action_item,
34274993c210SRandy Schacher 			  struct ulp_rte_parser_params *params)
34284993c210SRandy Schacher {
34294993c210SRandy Schacher 	const struct rte_flow_action_meter *meter;
34304993c210SRandy Schacher 	struct ulp_rte_act_prop *act_prop = &params->act_prop;
34314993c210SRandy Schacher 	uint32_t tmp_meter_id;
34324993c210SRandy Schacher 
34330c036a14SPeter Spreadborough 	if (unlikely(action_item == NULL || action_item->conf == NULL)) {
3434dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Parse Err: invalid meter configuration\n");
34354993c210SRandy Schacher 		return BNXT_TF_RC_ERROR;
34364993c210SRandy Schacher 	}
34374993c210SRandy Schacher 
34384993c210SRandy Schacher 	meter = action_item->conf;
34394993c210SRandy Schacher 	/* validate the mtr_id and update the reference counter */
34404993c210SRandy Schacher 	tmp_meter_id = tfp_cpu_to_be_32(meter->mtr_id);
34414993c210SRandy Schacher 	memcpy(&act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_METER],
34424993c210SRandy Schacher 	       &tmp_meter_id,
34434993c210SRandy Schacher 	       BNXT_ULP_ACT_PROP_SZ_METER);
34444993c210SRandy Schacher 
34454993c210SRandy Schacher 	/* set the meter action header bit */
34464993c210SRandy Schacher 	ULP_BITMAP_SET(params->act_bitmap.bits, BNXT_ULP_ACT_BIT_METER);
34474993c210SRandy Schacher 
34484993c210SRandy Schacher 	return BNXT_TF_RC_SUCCESS;
34494993c210SRandy Schacher }
34504993c210SRandy Schacher 
34516d160d77SRandy Schacher /* Function to handle the parsing of RTE Flow action set mac src.*/
34526d160d77SRandy Schacher int32_t
34536d160d77SRandy Schacher ulp_rte_set_mac_src_act_handler(const struct rte_flow_action *action_item,
34546d160d77SRandy Schacher 				struct ulp_rte_parser_params *params)
34556d160d77SRandy Schacher {
34566d160d77SRandy Schacher 	const struct rte_flow_action_set_mac *set_mac;
34576d160d77SRandy Schacher 	struct ulp_rte_act_prop *act = &params->act_prop;
34586d160d77SRandy Schacher 
34596d160d77SRandy Schacher 	set_mac = action_item->conf;
34600c036a14SPeter Spreadborough 	if (likely(set_mac)) {
34616d160d77SRandy Schacher 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_MAC_SRC],
34626d160d77SRandy Schacher 		       set_mac->mac_addr, BNXT_ULP_ACT_PROP_SZ_SET_MAC_SRC);
34636d160d77SRandy Schacher 		/* Update the hdr_bitmap with set mac src */
34646d160d77SRandy Schacher 		ULP_BITMAP_SET(params->act_bitmap.bits,
34656d160d77SRandy Schacher 			       BNXT_ULP_ACT_BIT_SET_MAC_SRC);
34666d160d77SRandy Schacher 		return BNXT_TF_RC_SUCCESS;
34676d160d77SRandy Schacher 	}
3468dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set mac src arg is invalid\n");
34696d160d77SRandy Schacher 	return BNXT_TF_RC_ERROR;
34706d160d77SRandy Schacher }
34716d160d77SRandy Schacher 
34726d160d77SRandy Schacher /* Function to handle the parsing of RTE Flow action set mac dst.*/
34736d160d77SRandy Schacher int32_t
34746d160d77SRandy Schacher ulp_rte_set_mac_dst_act_handler(const struct rte_flow_action *action_item,
34756d160d77SRandy Schacher 				struct ulp_rte_parser_params *params)
34766d160d77SRandy Schacher {
34776d160d77SRandy Schacher 	const struct rte_flow_action_set_mac *set_mac;
34786d160d77SRandy Schacher 	struct ulp_rte_act_prop *act = &params->act_prop;
34796d160d77SRandy Schacher 
34806d160d77SRandy Schacher 	set_mac = action_item->conf;
34810c036a14SPeter Spreadborough 	if (likely(set_mac)) {
34826d160d77SRandy Schacher 		memcpy(&act->act_details[BNXT_ULP_ACT_PROP_IDX_SET_MAC_DST],
34836d160d77SRandy Schacher 		       set_mac->mac_addr, BNXT_ULP_ACT_PROP_SZ_SET_MAC_DST);
34846d160d77SRandy Schacher 		/* Update the hdr_bitmap with set ipv4 dst */
34856d160d77SRandy Schacher 		ULP_BITMAP_SET(params->act_bitmap.bits,
34866d160d77SRandy Schacher 			       BNXT_ULP_ACT_BIT_SET_MAC_DST);
34876d160d77SRandy Schacher 		return BNXT_TF_RC_SUCCESS;
34886d160d77SRandy Schacher 	}
3489dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Parse Error: set mac dst arg is invalid\n");
34906d160d77SRandy Schacher 	return BNXT_TF_RC_ERROR;
34916d160d77SRandy Schacher }
3492