ice: Fix VF-VF direction matching in drop rule in switchdev
authorMarcin Szycik <marcin.szycik@linux.intel.com>
Wed, 25 Oct 2023 14:47:24 +0000 (16:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:59:36 +0000 (11:59 +0100)
[ Upstream commit 68c51db3a16d258e730dd1c04a1de2f7ab038ddf ]

When adding a drop rule on a VF, rule direction is not being set, which
results in it always being set to ingress (ICE_ESWITCH_FLTR_INGRESS
equals 0). Because of this, drop rules added on port representors don't
match any packets.

To fix it, set rule direction in drop action to egress when netdev is a
port representor, otherwise set it to ingress.

Fixes: 0960a27bd479 ("ice: Add direction metadata")
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Signed-off-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/intel/ice/ice_tc_lib.c

index 0e75fc6..dd03cb6 100644 (file)
@@ -670,6 +670,25 @@ static int ice_tc_setup_redirect_action(struct net_device *filter_dev,
        return 0;
 }
 
+static int
+ice_tc_setup_drop_action(struct net_device *filter_dev,
+                        struct ice_tc_flower_fltr *fltr)
+{
+       fltr->action.fltr_act = ICE_DROP_PACKET;
+
+       if (ice_is_port_repr_netdev(filter_dev)) {
+               fltr->direction = ICE_ESWITCH_FLTR_EGRESS;
+       } else if (ice_tc_is_dev_uplink(filter_dev)) {
+               fltr->direction = ICE_ESWITCH_FLTR_INGRESS;
+       } else {
+               NL_SET_ERR_MSG_MOD(fltr->extack,
+                                  "Unsupported netdevice in switchdev mode");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int ice_eswitch_tc_parse_action(struct net_device *filter_dev,
                                       struct ice_tc_flower_fltr *fltr,
                                       struct flow_action_entry *act)
@@ -678,7 +697,10 @@ static int ice_eswitch_tc_parse_action(struct net_device *filter_dev,
 
        switch (act->id) {
        case FLOW_ACTION_DROP:
-               fltr->action.fltr_act = ICE_DROP_PACKET;
+               err = ice_tc_setup_drop_action(filter_dev, fltr);
+               if (err)
+                       return err;
+
                break;
 
        case FLOW_ACTION_REDIRECT: