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 = ¶ms->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 = ¶ms->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 = ¶ms->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(ð_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(ð_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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶m->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(¶m->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 = ¶m->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 = ¶ms->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, ð_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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->enc_field[BNXT_ULP_ENC_FIELD_IPV4_PROTO]; 2421f63aa27dSKishore Padmanabha ulp_rte_parser_fld_copy(field, &type, sizeof(type)); 2422f63aa27dSKishore Padmanabha field = ¶ms->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 = ¶ms->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 = ¶ms->act_bitmap; 24643d6ba7cbSKishore Padmanabha struct ulp_rte_act_prop *ap = ¶ms->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 = ¶ms->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 = ¶m->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 = ¶ms->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 ðertype, 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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶m->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 = ¶ms->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 = ¶ms->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 = ¶ms->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