[Intel-wired-lan] [PATCH iwl-next v3 11/13] ice: enable FDIR filters from raw binary patterns for VFs
Ahmed Zaki
ahmed.zaki at intel.com
Mon Jul 15 14:33:43 UTC 2024
On 2024-07-10 11:42 p.m., Paul Menzel wrote:
> Dear Ahmed, dear Junfeng,
>
>
> Thank you for the patch.
>
> Am 10.07.24 um 22:40 schrieb Ahmed Zaki:
>> From: Junfeng Guo <junfeng.guo at intel.com>
>>
>> Enable VFs to create FDIR filters from raw binary patterns.
>> The corresponding processes for raw flow are added in the
>> Parse / Create / Destroy stages.
>>
>> Reviewed-by: Marcin Szycik <marcin.szycik at linux.intel.com>
>> Signed-off-by: Junfeng Guo <junfeng.guo at intel.com>
>> Co-developed-by: Ahmed Zaki <ahmed.zaki at intel.com>
>> Signed-off-by: Ahmed Zaki <ahmed.zaki at intel.com>
>> ---
>> .../net/ethernet/intel/ice/ice_flex_pipe.c | 48 +++
>> .../net/ethernet/intel/ice/ice_flex_pipe.h | 3 +
>> drivers/net/ethernet/intel/ice/ice_flow.c | 106 +++++
>> drivers/net/ethernet/intel/ice/ice_flow.h | 5 +
>> drivers/net/ethernet/intel/ice/ice_vf_lib.h | 8 +
>> .../ethernet/intel/ice/ice_virtchnl_fdir.c | 404 +++++++++++++++++-
>> 6 files changed, 566 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c
>> b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c
>> index a750d7e1edd8..51aa6525565c 100644
>> --- a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c
>> +++ b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c
>> @@ -4146,6 +4146,54 @@ ice_add_prof_id_flow(struct ice_hw *hw, enum
>> ice_block blk, u16 vsi, u64 hdl)
>> return status;
>> }
>> +/**
>> + * ice_flow_assoc_fdir_prof - add a FDIR profile for main/ctrl VSI
>
> a*n* FDIR?
>
>> + * @hw: pointer to the HW struct
>> + * @blk: HW block
>> + * @dest_vsi: dest VSI
>> + * @fdir_vsi: fdir programming VSI
>> + * @hdl: profile handle
>> + *
>> + * Update the hardware tables to enable the FDIR profile indicated by
>> @hdl for
>> + * the VSI specified by @dest_vsi. On success, the flow will be enabled.
>> + *
>> + * Return: 0 on success or negative errno on failure.
>> + */
>> +int
>> +ice_flow_assoc_fdir_prof(struct ice_hw *hw, enum ice_block blk,
>> + u16 dest_vsi, u16 fdir_vsi, u64 hdl)
>> +{
>> + int status = 0;
>> + u16 vsi_num;
>> +
>> + if (blk != ICE_BLK_FD)
>> + return -EINVAL;
>> +
>> + vsi_num = ice_get_hw_vsi_num(hw, dest_vsi);
>> + status = ice_add_prof_id_flow(hw, blk, vsi_num, hdl);
>> + if (status) {
>> + ice_debug(hw, ICE_DBG_FLOW, "HW profile add failed for main
>> VSI flow entry: %d\n",
>
> Maybe: Adding HW profile failed …? (Also below.)
>
>> + status);
>> + return status;
>> + }
>> +
>> + vsi_num = ice_get_hw_vsi_num(hw, fdir_vsi);
>> + status = ice_add_prof_id_flow(hw, blk, vsi_num, hdl);
>> + if (status) {
>> + ice_debug(hw, ICE_DBG_FLOW, "HW profile add failed for ctrl
>> VSI flow entry: %d\n",
>> + status);
>> + goto err;
>> + }
>> +
>> + return 0;
>> +
>> +err:
>> + vsi_num = ice_get_hw_vsi_num(hw, dest_vsi);
>> + ice_rem_prof_id_flow(hw, blk, vsi_num, hdl);
>> +
>> + return status;
>> +}
>> +
>> /**
>> * ice_rem_prof_from_list - remove a profile from list
>> * @hw: pointer to the HW struct
>> diff --git a/drivers/net/ethernet/intel/ice/ice_flex_pipe.h
>> b/drivers/net/ethernet/intel/ice/ice_flex_pipe.h
>> index 7c66652dadd6..90b9b0993122 100644
>> --- a/drivers/net/ethernet/intel/ice/ice_flex_pipe.h
>> +++ b/drivers/net/ethernet/intel/ice/ice_flex_pipe.h
>> @@ -51,6 +51,9 @@ int
>> ice_add_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi,
>> u64 hdl);
>> int
>> ice_rem_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi,
>> u64 hdl);
>> +int
>> +ice_flow_assoc_fdir_prof(struct ice_hw *hw, enum ice_block blk,
>> + u16 dest_vsi, u16 fdir_vsi, u64 hdl);
>> enum ice_ddp_state ice_init_pkg(struct ice_hw *hw, u8 *buff, u32 len);
>> enum ice_ddp_state
>> ice_copy_and_init_pkg(struct ice_hw *hw, const u8 *buf, u32 len);
>> diff --git a/drivers/net/ethernet/intel/ice/ice_flow.c
>> b/drivers/net/ethernet/intel/ice/ice_flow.c
>> index 79106503194b..99d584f46c23 100644
>> --- a/drivers/net/ethernet/intel/ice/ice_flow.c
>> +++ b/drivers/net/ethernet/intel/ice/ice_flow.c
>> @@ -409,6 +409,29 @@ static const u32 ice_ptypes_gtpc_tid[] = {
>> };
>> /* Packet types for GTPU */
>> +static const struct ice_ptype_attributes ice_attr_gtpu_session[] = {
>> + { ICE_MAC_IPV4_GTPU_IPV4_FRAG, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV4_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV4_TCP, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV4_ICMP, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV4_FRAG, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV4_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV4_TCP, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV4_ICMP, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV6_FRAG, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV6_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV6_TCP, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV4_GTPU_IPV6_ICMPV6, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV6_FRAG, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV6_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV6_TCP, ICE_PTYPE_ATTR_GTP_SESSION },
>> + { ICE_MAC_IPV6_GTPU_IPV6_ICMPV6, ICE_PTYPE_ATTR_GTP_SESSION },
>> +};
>> +
>> static const struct ice_ptype_attributes ice_attr_gtpu_eh[] = {
>> { ICE_MAC_IPV4_GTPU_IPV4_FRAG, ICE_PTYPE_ATTR_GTP_PDU_EH },
>> { ICE_MAC_IPV4_GTPU_IPV4_PAY, ICE_PTYPE_ATTR_GTP_PDU_EH },
>> @@ -1523,6 +1546,89 @@ ice_flow_disassoc_prof(struct ice_hw *hw, enum
>> ice_block blk,
>> return status;
>> }
>> +#define FLAG_GTP_EH_PDU_LINK BIT_ULL(13)
>> +#define FLAG_GTP_EH_PDU BIT_ULL(14)
>> +
>> +#define HI_BYTE_IN_WORD GENMASK(15, 8)
>> +#define LO_BYTE_IN_WORD GENMASK(7, 0)
>> +
>> +#define FLAG_GTPU_MSK \
>> + (FLAG_GTP_EH_PDU | FLAG_GTP_EH_PDU_LINK)
>> +#define FLAG_GTPU_UP \
>> + (FLAG_GTP_EH_PDU | FLAG_GTP_EH_PDU_LINK)
>> +#define FLAG_GTPU_DW FLAG_GTP_EH_PDU
>> +/**
>> + * ice_flow_set_parser_prof - Set flow profile based on the parsed
>> profile info
>> + * @hw: pointer to the HW struct
>> + * @dest_vsi: dest VSI
>> + * @fdir_vsi: fdir programming VSI
>> + * @prof: stores parsed profile info from raw flow
>> + * @blk: classification blk
>> + *
>> + * Return: 0 on success or negative errno on failure.
>> + */
>> +int
>> +ice_flow_set_parser_prof(struct ice_hw *hw, u16 dest_vsi, u16 fdir_vsi,
>> + struct ice_parser_profile *prof, enum ice_block blk)
>> +{
>> + u64 id = find_first_bit(prof->ptypes, ICE_FLOW_PTYPE_MAX);
>> + struct ice_flow_prof_params *params __free(kfree);
>> + u8 fv_words = hw->blk[blk].es.fvw;
>> + int status;
>> + int i, idx;
>
> Use size_t as it’s used in arrays?
>
>> +
>> + params = kzalloc(sizeof(*params), GFP_KERNEL);
>> + if (!params)
>> + return -ENOMEM;
>> +
>> + for (i = 0; i < ICE_MAX_FV_WORDS; i++) {
>> + params->es[i].prot_id = ICE_PROT_INVALID;
>> + params->es[i].off = ICE_FV_OFFSET_INVAL;
>> + }
>> +
>> + for (i = 0; i < prof->fv_num; i++) {
>> + if (hw->blk[blk].es.reverse)
>> + idx = fv_words - i - 1;
>> + else
>> + idx = i;
>
> Use ternery operator?
(hw->blk[blk].es.reverse) ? idx = fv_words - i - 1 : idx = i;
better readability with if/else IMO.
>> + params->es[idx].prot_id = prof->fv[i].proto_id;
>> + params->es[idx].off = prof->fv[i].offset;
>> + params->mask[idx] = (((prof->fv[i].msk) << BITS_PER_BYTE) &
>> + HI_BYTE_IN_WORD) |
>> + (((prof->fv[i].msk) >> BITS_PER_BYTE) &
>> + LO_BYTE_IN_WORD);
>> + }
>> +
>> + switch (prof->flags) {
>> + case FLAG_GTPU_DW:
>> + params->attr = ice_attr_gtpu_down;
>> + params->attr_cnt = ARRAY_SIZE(ice_attr_gtpu_down);
>> + break;
>> + case FLAG_GTPU_UP:
>> + params->attr = ice_attr_gtpu_up;
>> + params->attr_cnt = ARRAY_SIZE(ice_attr_gtpu_up);
<..>
>> + vsi_num = ice_get_hw_vsi_num(hw, ctrl_vsi->idx);
>> + ice_rem_prof_id_flow(hw, blk, vsi_num, id);
>> +
>> + vsi_num = ice_get_hw_vsi_num(hw, vf_vsi->idx);
>> + ice_rem_prof_id_flow(hw, blk, vsi_num, id);
>> + }
>> + }
>> +
>> + conf->parser_ena = false;
>> + return 0;
>> +}
>
>
> Kind regards,
>
> Paul
>
All other comments will be fixed in the next version.
Thanks for reviewing the code.
Ahmed
More information about the Intel-wired-lan
mailing list