ice: add recipe priority check in search
authorMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Fri, 11 Oct 2024 07:03:28 +0000 (09:03 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 14 Jan 2025 22:37:34 +0000 (14:37 -0800)
The new recipe should be added even if exactly the same recipe already
exists with different priority.

Example use case is when the rule is being added from TC tool context.
It should has the highest priority, but if the recipe already exists
the rule will inherit it priority. It can lead to the situation when
the rule added from TC tool has lower priority than expected.

The solution is to check the recipe priority when trying to find
existing one.

Previous recipe is still useful. Example:
RID 8 -> priority 4
RID 10 -> priority 7

The difference is only in priority rest is let's say eth + mac +
direction.

Adding ARP + MAC_A + RX on RID 8, forward to VF0_VSI
After that IP + MAC_B + RX on RID 10 (from TC tool), forward to PF0

Both will work.

In case of adding ARP + MAC_A + RX on RID 8, forward to VF0_VSI
ARP + MAC_A + RX on RID 10, forward to PF0.

Only second one will match, but this is expected.

Reviewed-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_switch.c

index 0e740342e2947eb4ee3ebae525e932f27454242f..4a91e0aaf0a5e51f981909cf7d39c72f38e9cd19 100644 (file)
@@ -4784,7 +4784,8 @@ ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts,
                         */
                        if (found && recp[i].tun_type == rinfo->tun_type &&
                            recp[i].need_pass_l2 == rinfo->need_pass_l2 &&
-                           recp[i].allow_pass_l2 == rinfo->allow_pass_l2)
+                           recp[i].allow_pass_l2 == rinfo->allow_pass_l2 &&
+                           recp[i].priority == rinfo->priority)
                                return i; /* Return the recipe ID */
                }
        }