> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Jakub Slepecki
> Sent: Thursday, November 20, 2025 5:28 PM
> To: [email protected]
> Cc: [email protected]; [email protected]; Kitszel,
> Przemyslaw <[email protected]>; Nguyen, Anthony L
> <[email protected]>; [email protected];
> Slepecki, Jakub <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next 4/8] ice: allow overriding
> lan_en, lb_en in switch
> 
> Currently, lan_en and lb_en are determined based on switching mode,
> destination MAC, and the lookup type, action type and flags of the
> rule in question.  This gives little to no options for the user (such
> as
> ice_fltr.c) to enforce rules to behave in a specific way.
> 
> Such functionality is needed to work with pairs of rules, for example,
> when handling MAC forward to LAN together with MAC,VLAN forward to
> loopback rules pair.  This case could not be easily deduced in a
> context of a single filter without adding a specialized flag.
> 
> Instead of adding a specialized flag to mark special scenario rules,
> we add a slightly more generic flag to the lan_en and lb_en themselves
> for the ice_fltr.c to request specific destination flags later on, for
> example, to override value:
> 
>     struct ice_fltr_info fi;
>     fi.lb_en = ICE_FLTR_INFO_LB_LAN_FORCE_ENABLED;
>     fi.lan_en = ICE_FLTR_INFO_LB_LAN_FORCE_DISABLED;
> 
> Reviewed-by: Michal Swiatkowski <[email protected]>
> Signed-off-by: Jakub Slepecki <[email protected]>
> ---
>  drivers/net/ethernet/intel/ice/ice_switch.c | 21 +++++++++++++-------
> -  drivers/net/ethernet/intel/ice/ice_switch.h |  7 +++++++
>  2 files changed, 20 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c
> b/drivers/net/ethernet/intel/ice/ice_switch.c
> index 04e5d653efce..7b63588948fd 100644
> --- a/drivers/net/ethernet/intel/ice/ice_switch.c
> +++ b/drivers/net/ethernet/intel/ice/ice_switch.c
> @@ -2538,8 +2538,9 @@ int ice_get_initial_sw_cfg(struct ice_hw *hw)
>   */
>  static void ice_fill_sw_info(struct ice_hw *hw, struct ice_fltr_info
> *fi)  {
> -     fi->lb_en = false;
> -     fi->lan_en = false;
> +     bool lan_en = false;
> +     bool lb_en = false;
> +
>       if ((fi->flag & ICE_FLTR_TX) &&
>           (fi->fltr_act == ICE_FWD_TO_VSI ||
>            fi->fltr_act == ICE_FWD_TO_VSI_LIST || @@ -2549,7 +2550,7
> @@ static void ice_fill_sw_info(struct ice_hw *hw, struct
> ice_fltr_info *fi)
>                * packets to the internal switch that will be dropped.
>                */
>               if (fi->lkup_type != ICE_SW_LKUP_VLAN)
> -                     fi->lb_en = true;
> +                     lb_en = true;
> 
>               /* Set lan_en to TRUE if
>                * 1. The switch is a VEB AND
> @@ -2578,14 +2579,18 @@ static void ice_fill_sw_info(struct ice_hw
> *hw, struct ice_fltr_info *fi)
>                            !is_unicast_ether_addr(fi-
> >l_data.mac.mac_addr)) ||
>                           (fi->lkup_type == ICE_SW_LKUP_MAC_VLAN &&
>                            !is_unicast_ether_addr(fi-
> >l_data.mac.mac_addr)))
> -                             fi->lan_en = true;
> +                             lan_en = true;
>               } else {
> -                     fi->lan_en = true;
> +                     lan_en = true;
>               }
>       }
> 
>       if (fi->flag & ICE_FLTR_TX_ONLY)
> -             fi->lan_en = false;
> +             lan_en = false;
> +     if (!(fi->lb_en & ICE_FLTR_INFO_LB_LAN_FORCE_MASK))
> +             fi->lb_en = lb_en;
> +     if (!(fi->lan_en & ICE_FLTR_INFO_LB_LAN_FORCE_MASK))
> +             fi->lan_en = lan_en;
For me it looks strange.
What type the fi->lb_en has? 
fi->lb_en declared as bool, and you assign fi->lan_en from bool.
But you check condition by fi->lan_en & ICE_FLTR_INFO_LB_LAN_FORCE_MASK ?
It rases questions if fi->lan_en a bool why use fi->lan_en & 
ICE_FLTR_INFO_LB_LAN_FORCE_MASK then?
And if fi->lan_en is a bitmask why not use 
FIELD_GET(ICE_FLTR_INFO_LB_LAN_FORCE_MASK, fi->lan_en) and
why not something like:

if (!FIELD_GET(ICE_FLTR_INFO_LB_LAN_FORCE_MASK, fi->lan_en))
    FIELD_MODIFY(ICE_FLTR_INFO_LB_LAN_VALUE_MASK, &fi->lan_en, lan_en);

It could preserve unrelated bits (like FORCE) and make the code resilient to 
future changes in bit positions?

>  }
> 
>  /**
> @@ -2669,9 +2674,9 @@ ice_fill_sw_rule(struct ice_hw *hw, struct
> ice_fltr_info *f_info,
>               return;
>       }
> 
> -     if (f_info->lb_en)
> +     if (f_info->lb_en & ICE_FLTR_INFO_LB_LAN_VALUE_MASK)
>               act |= ICE_SINGLE_ACT_LB_ENABLE;
> -     if (f_info->lan_en)
> +     if (f_info->lan_en & ICE_FLTR_INFO_LB_LAN_VALUE_MASK)
>               act |= ICE_SINGLE_ACT_LAN_ENABLE;
> 
>       switch (f_info->lkup_type) {
> diff --git a/drivers/net/ethernet/intel/ice/ice_switch.h
> b/drivers/net/ethernet/intel/ice/ice_switch.h
> index 671d7a5f359f..a7dc4bfec3a0 100644
> --- a/drivers/net/ethernet/intel/ice/ice_switch.h
> +++ b/drivers/net/ethernet/intel/ice/ice_switch.h
> @@ -72,6 +72,13 @@ enum ice_src_id {
>       ICE_SRC_ID_LPORT,
>  };
> 
> +#define ICE_FLTR_INFO_LB_LAN_VALUE_MASK BIT(0) #define
> +ICE_FLTR_INFO_LB_LAN_FORCE_MASK BIT(1)
> +#define ICE_FLTR_INFO_LB_LAN_FORCE_ENABLED   \
> +     (ICE_FLTR_INFO_LB_LAN_VALUE_MASK |      \
> +      ICE_FLTR_INFO_LB_LAN_FORCE_MASK)
> +#define ICE_FLTR_INFO_LB_LAN_FORCE_DISABLED
> +ICE_FLTR_INFO_LB_LAN_FORCE_MASK
> +
>  struct ice_fltr_info {
>       /* Look up information: how to look up packet */
>       enum ice_sw_lkup_type lkup_type;
> --
> 2.43.0

Reply via email to