git: 38663adb6144 - main - Revert "ixl: fix multicast filters handling"

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Thu, 19 Dec 2024 13:49:49 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=38663adb61440bd659fb457909782b71ba8806fa

commit 38663adb61440bd659fb457909782b71ba8806fa
Author:     Franco Fichtner <franco@opnsense.org>
AuthorDate: 2024-12-11 14:08:40 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-12-19 13:49:30 +0000

    Revert "ixl: fix multicast filters handling"
    
    This reverts commit 89e73359424a338a7900a4854ad7439f5848ebb8.
    
    PR:             281125
    Reviewed by:    Krzysztof Galazka <krzysztof.galazka@intel.com>
    MFC after:      3 days
    Pull Request:   https://github.com/freebsd/freebsd-src/pull/1545
---
 sys/dev/ixl/ixl_pf_main.c | 97 +++++------------------------------------------
 1 file changed, 10 insertions(+), 87 deletions(-)

diff --git a/sys/dev/ixl/ixl_pf_main.c b/sys/dev/ixl/ixl_pf_main.c
index 9755136df848..1752efc02fff 100644
--- a/sys/dev/ixl/ixl_pf_main.c
+++ b/sys/dev/ixl/ixl_pf_main.c
@@ -593,15 +593,6 @@ ixl_add_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
  *	Routines for multicast and vlan filter management.
  *
  *********************************************************************/
-
-/**
- * ixl_add_multi - Add multicast filters to the hardware
- * @vsi: The VSI structure
- *
- * In case number of multicast filters in the IFP exceeds 127 entries,
- * multicast promiscuous mode will be enabled and the filters will be removed
- * from the hardware
- */
 void
 ixl_add_multi(struct ixl_vsi *vsi)
 {
@@ -609,20 +600,14 @@ ixl_add_multi(struct ixl_vsi *vsi)
 	struct i40e_hw		*hw = vsi->hw;
 	int			mcnt = 0;
 	struct ixl_add_maddr_arg cb_arg;
-	enum i40e_status_code	status;
 
 	IOCTL_DEBUGOUT("ixl_add_multi: begin");
 
 	mcnt = if_llmaddr_count(ifp);
 	if (__predict_false(mcnt >= MAX_MULTICAST_ADDR)) {
-		status = i40e_aq_set_vsi_multicast_promiscuous(hw, vsi->seid,
-		    TRUE, NULL);
-		if (status != I40E_SUCCESS)
-			if_printf(ifp, "Failed to enable multicast promiscuous "
-			    "mode, status: %s\n", i40e_stat_str(hw, status));
-		else
-			if_printf(ifp, "Enabled multicast promiscuous mode\n");
-		/* Delete all existing MC filters */
+		i40e_aq_set_vsi_multicast_promiscuous(hw,
+		    vsi->seid, TRUE, NULL);
+		/* delete all existing MC filters */
 		ixl_del_multi(vsi, true);
 		return;
 	}
@@ -648,92 +633,30 @@ ixl_match_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
 		return (0);
 }
 
-/**
- * ixl_dis_multi_promisc - Disable multicast promiscuous mode
- * @vsi: The VSI structure
- * @vsi_mcnt: Number of multicast filters in the VSI
- *
- * Disable multicast promiscuous mode based on number of entries in the IFP
- * and the VSI, then re-add multicast filters.
- *
- */
-static void
-ixl_dis_multi_promisc(struct ixl_vsi *vsi, int vsi_mcnt)
-{
-	struct ifnet		*ifp = vsi->ifp;
-	struct i40e_hw		*hw = vsi->hw;
-	int			ifp_mcnt = 0;
-	enum i40e_status_code	status;
-
-	ifp_mcnt = if_llmaddr_count(ifp);
-	/*
-	 * Equal lists or empty ifp list mean the list has not been changed
-	 * and in such case avoid disabling multicast promiscuous mode as it
-	 * was not previously enabled. Case where multicast promiscuous mode has
-	 * been enabled is when vsi_mcnt == 0 && ifp_mcnt > 0.
-	 */
-	if (ifp_mcnt == vsi_mcnt || ifp_mcnt == 0 ||
-	    ifp_mcnt >= MAX_MULTICAST_ADDR)
-		return;
-
-	status = i40e_aq_set_vsi_multicast_promiscuous(hw, vsi->seid,
-	    FALSE, NULL);
-	if (status != I40E_SUCCESS) {
-		if_printf(ifp, "Failed to disable multicast promiscuous "
-		    "mode, status: %s\n", i40e_stat_str(hw, status));
-
-		return;
-	}
-
-	if_printf(ifp, "Disabled multicast promiscuous mode\n");
-
-	ixl_add_multi(vsi);
-}
-
-/**
- * ixl_del_multi - Delete multicast filters from the hardware
- * @vsi: The VSI structure
- * @all: Bool to determine if all the multicast filters should be removed
- *
- * In case number of multicast filters in the IFP drops to 127 entries,
- * multicast promiscuous mode will be disabled and the filters will be reapplied
- * to the hardware.
- */
 void
 ixl_del_multi(struct ixl_vsi *vsi, bool all)
 {
-	int			to_del_cnt = 0, vsi_mcnt = 0;
+	struct ixl_ftl_head	to_del;
 	if_t			ifp = vsi->ifp;
 	struct ixl_mac_filter	*f, *fn;
-	struct ixl_ftl_head	to_del;
+	int			mcnt = 0;
 
 	IOCTL_DEBUGOUT("ixl_del_multi: begin");
 
 	LIST_INIT(&to_del);
 	/* Search for removed multicast addresses */
 	LIST_FOREACH_SAFE(f, &vsi->ftl, ftle, fn) {
-		if ((f->flags & IXL_FILTER_MC) == 0)
-			continue;
-
-		/* Count all the multicast filters in the VSI for comparison */
-		vsi_mcnt++;
-
-		if (!all && if_foreach_llmaddr(ifp, ixl_match_maddr, f) != 0)
+		if ((f->flags & IXL_FILTER_MC) == 0 ||
+		    (!all && (if_foreach_llmaddr(ifp, ixl_match_maddr, f) == 0)))
 			continue;
 
 		LIST_REMOVE(f, ftle);
 		LIST_INSERT_HEAD(&to_del, f, ftle);
-		to_del_cnt++;
-	}
-
-	if (to_del_cnt > 0) {
-		ixl_del_hw_filters(vsi, &to_del, to_del_cnt);
-		return;
+		mcnt++;
 	}
 
-	ixl_dis_multi_promisc(vsi, vsi_mcnt);
-
-	IOCTL_DEBUGOUT("ixl_del_multi: end");
+	if (mcnt > 0)
+		ixl_del_hw_filters(vsi, &to_del, mcnt);
 }
 
 void