svn commit: r353503 - in head/sys/dev: ixgbe ixl

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 14 20:21:03 UTC 2019


Author: glebius
Date: Mon Oct 14 20:21:02 2019
New Revision: 353503
URL: https://svnweb.freebsd.org/changeset/base/353503

Log:
  Convert if_foreach_llmaddr() KPI.
  
  Reviewed by:	erj

Modified:
  head/sys/dev/ixgbe/if_ix.c
  head/sys/dev/ixl/if_iavf.c
  head/sys/dev/ixl/if_ixl.c
  head/sys/dev/ixl/ixl_pf_main.c

Modified: head/sys/dev/ixgbe/if_ix.c
==============================================================================
--- head/sys/dev/ixgbe/if_ix.c	Mon Oct 14 20:18:36 2019	(r353502)
+++ head/sys/dev/ixgbe/if_ix.c	Mon Oct 14 20:21:02 2019	(r353503)
@@ -2333,7 +2333,7 @@ ixgbe_if_promisc_set(if_ctx_t ctx, int flags)
 	if (ifp->if_flags & IFF_ALLMULTI)
 		mcnt = MAX_NUM_MULTICAST_ADDRESSES;
 	else {
-		mcnt = if_multiaddr_count(ifp, MAX_NUM_MULTICAST_ADDRESSES);
+		mcnt = min(if_llmaddr_count(ifp), MAX_NUM_MULTICAST_ADDRESSES);
 	}
 	if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
 		rctl &= (~IXGBE_FCTRL_MPE);
@@ -3207,18 +3207,15 @@ ixgbe_config_delay_values(struct adapter *adapter)
  *
  *   Called whenever multicast address list is updated.
  ************************************************************************/
-static int
-ixgbe_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count)
+static u_int
+ixgbe_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count)
 {
 	struct adapter *adapter = arg;
 	struct ixgbe_mc_addr *mta = adapter->mta;
 
-	if (ifma->ifma_addr->sa_family != AF_LINK)
-		return (0);
 	if (count == MAX_NUM_MULTICAST_ADDRESSES)
 		return (0);
-	bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
-	    mta[count].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
+	bcopy(LLADDR(sdl), mta[count].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
 	mta[count].vmdq = adapter->pool;
 
 	return (1);
@@ -3231,15 +3228,16 @@ ixgbe_if_multi_set(if_ctx_t ctx)
 	struct ixgbe_mc_addr *mta;
 	struct ifnet         *ifp = iflib_get_ifp(ctx);
 	u8                   *update_ptr;
-	int                  mcnt = 0;
 	u32                  fctrl;
+	u_int		     mcnt;
 
 	IOCTL_DEBUGOUT("ixgbe_if_multi_set: begin");
 
 	mta = adapter->mta;
 	bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
 
-	mcnt = if_multi_apply(iflib_get_ifp(ctx), ixgbe_mc_filter_apply, adapter);
+	mcnt = if_foreach_llmaddr(iflib_get_ifp(ctx), ixgbe_mc_filter_apply,
+	    adapter);
 
 	fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
 	fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);

Modified: head/sys/dev/ixl/if_iavf.c
==============================================================================
--- head/sys/dev/ixl/if_iavf.c	Mon Oct 14 20:18:36 2019	(r353502)
+++ head/sys/dev/ixl/if_iavf.c	Mon Oct 14 20:21:02 2019	(r353503)
@@ -1225,18 +1225,13 @@ iavf_if_update_admin_status(if_ctx_t ctx)
 		iavf_enable_adminq_irq(hw);
 }
 
-static int
-iavf_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count __unused)
+static u_int
+iavf_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count __unused)
 {
 	struct iavf_sc *sc = arg;
-	int error = 0;
+	int error;
 
-	if (ifma->ifma_addr->sa_family != AF_LINK)
-		return (0);
-	error = iavf_add_mac_filter(sc,
-	    (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr),
-	    IXL_FILTER_MC);
-
+	error = iavf_add_mac_filter(sc, (u8*)LLADDR(sdl), IXL_FILTER_MC);
 	return (!error);
 }
 
@@ -1244,12 +1239,11 @@ static void
 iavf_if_multi_set(if_ctx_t ctx)
 {
 	struct iavf_sc *sc = iflib_get_softc(ctx);
-	int mcnt = 0;
 
 	IOCTL_DEBUGOUT("iavf_if_multi_set: begin");
 
-	mcnt = if_multiaddr_count(iflib_get_ifp(ctx), MAX_MULTICAST_ADDR);
-	if (__predict_false(mcnt == MAX_MULTICAST_ADDR)) {
+	if (__predict_false(if_llmaddr_count(iflib_get_ifp(ctx)) >=
+	    MAX_MULTICAST_ADDR)) {
 		/* Delete MC filters and enable mulitcast promisc instead */
 		iavf_init_multi(sc);
 		sc->promisc_flags |= FLAG_VF_MULTICAST_PROMISC;
@@ -1261,9 +1255,8 @@ iavf_if_multi_set(if_ctx_t ctx)
 	iavf_init_multi(sc);
 
 	/* And (re-)install filters for all mcast addresses */
-	mcnt = if_multi_apply(iflib_get_ifp(ctx), iavf_mc_filter_apply, sc);
-
-	if (mcnt > 0)
+	if (if_foreach_llmaddr(iflib_get_ifp(ctx), iavf_mc_filter_apply, sc) >
+	    0)
 		iavf_send_vc_msg(sc, IAVF_FLAG_AQ_ADD_MAC_FILTER);
 }
 
@@ -1358,8 +1351,8 @@ iavf_if_promisc_set(if_ctx_t ctx, int flags)
 
 	sc->promisc_flags = 0;
 
-	if (flags & IFF_ALLMULTI ||
-		if_multiaddr_count(ifp, MAX_MULTICAST_ADDR) == MAX_MULTICAST_ADDR)
+	if (flags & IFF_ALLMULTI || if_llmaddr_count(ifp) >=
+	    MAX_MULTICAST_ADDR)
 		sc->promisc_flags |= FLAG_VF_MULTICAST_PROMISC;
 	if (flags & IFF_PROMISC)
 		sc->promisc_flags |= FLAG_VF_UNICAST_PROMISC;

Modified: head/sys/dev/ixl/if_ixl.c
==============================================================================
--- head/sys/dev/ixl/if_ixl.c	Mon Oct 14 20:18:36 2019	(r353502)
+++ head/sys/dev/ixl/if_ixl.c	Mon Oct 14 20:21:02 2019	(r353503)
@@ -122,7 +122,7 @@ static void	 ixl_if_vflr_handle(if_ctx_t ctx);
 #endif
 
 /*** Other ***/
-static int	 ixl_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int);
+static u_int	 ixl_mc_filter_apply(void *, struct sockaddr_dl *, u_int);
 static void	 ixl_save_pf_tunables(struct ixl_pf *);
 static int	 ixl_allocate_pci_resources(struct ixl_pf *);
 
@@ -1298,12 +1298,12 @@ ixl_if_multi_set(if_ctx_t ctx)
 	struct ixl_pf *pf = iflib_get_softc(ctx);
 	struct ixl_vsi *vsi = &pf->vsi;
 	struct i40e_hw *hw = vsi->hw;
-	int mcnt = 0, flags;
+	int mcnt, flags;
 	int del_mcnt;
 
 	IOCTL_DEBUGOUT("ixl_if_multi_set: begin");
 
-	mcnt = if_multiaddr_count(iflib_get_ifp(ctx), MAX_MULTICAST_ADDR);
+	mcnt = min(if_llmaddr_count(iflib_get_ifp(ctx)), MAX_MULTICAST_ADDR);
 	/* Delete filters for removed multicast addresses */
 	del_mcnt = ixl_del_multi(vsi);
 	vsi->num_macs -= del_mcnt;
@@ -1315,8 +1315,7 @@ ixl_if_multi_set(if_ctx_t ctx)
 	}
 	/* (re-)install filters for all mcast addresses */
 	/* XXX: This bypasses filter count tracking code! */
-	mcnt = if_multi_apply(iflib_get_ifp(ctx), ixl_mc_filter_apply, vsi);
-	
+	mcnt = if_foreach_llmaddr(iflib_get_ifp(ctx), ixl_mc_filter_apply, vsi);
 	if (mcnt > 0) {
 		vsi->num_macs += mcnt;
 		flags = (IXL_FILTER_ADD | IXL_FILTER_USED | IXL_FILTER_MC);
@@ -1504,8 +1503,8 @@ ixl_if_promisc_set(if_ctx_t ctx, int flags)
 
 	if (flags & IFF_PROMISC)
 		uni = multi = TRUE;
-	else if (flags & IFF_ALLMULTI ||
-		if_multiaddr_count(ifp, MAX_MULTICAST_ADDR) == MAX_MULTICAST_ADDR)
+	else if (flags & IFF_ALLMULTI || if_llmaddr_count(ifp) >=
+	    MAX_MULTICAST_ADDR)
 		multi = TRUE;
 
 	err = i40e_aq_set_vsi_unicast_promiscuous(hw,
@@ -1634,15 +1633,12 @@ ixl_if_priv_ioctl(if_ctx_t ctx, u_long command, caddr_
 	return (error);
 }
 
-static int
-ixl_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count __unused)
+static u_int
+ixl_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count __unused)
 {
 	struct ixl_vsi *vsi = arg;
 
-	if (ifma->ifma_addr->sa_family != AF_LINK)
-		return (0);
-	ixl_add_mc_filter(vsi, 
-	    (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr));
+	ixl_add_mc_filter(vsi, (u8*)LLADDR(sdl));
 	return (1);
 }
 

Modified: head/sys/dev/ixl/ixl_pf_main.c
==============================================================================
--- head/sys/dev/ixl/ixl_pf_main.c	Mon Oct 14 20:18:36 2019	(r353502)
+++ head/sys/dev/ixl/ixl_pf_main.c	Mon Oct 14 20:21:02 2019	(r353503)
@@ -637,6 +637,16 @@ ixl_msix_adminq(void *arg)
 		return (FILTER_HANDLED);
 }
 
+static u_int
+ixl_add_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct ixl_vsi *vsi = arg;
+
+	ixl_add_mc_filter(vsi, (u8*)LLADDR(sdl));
+
+	return (1);
+}
+
 /*********************************************************************
  * 	Filter Routines
  *
@@ -646,25 +656,17 @@ ixl_msix_adminq(void *arg)
 void
 ixl_add_multi(struct ixl_vsi *vsi)
 {
-	struct	ifmultiaddr	*ifma;
 	struct ifnet		*ifp = vsi->ifp;
 	struct i40e_hw		*hw = vsi->hw;
 	int			mcnt = 0, flags;
 
 	IOCTL_DEBUGOUT("ixl_add_multi: begin");
 
-	if_maddr_rlock(ifp);
 	/*
 	** First just get a count, to decide if we
 	** we simply use multicast promiscuous.
 	*/
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		mcnt++;
-	}
-	if_maddr_runlock(ifp);
-
+	mcnt = if_llmaddr_count(ifp);
 	if (__predict_false(mcnt >= MAX_MULTICAST_ADDR)) {
 		/* delete existing MC filters */
 		ixl_del_hw_filters(vsi, mcnt);
@@ -673,16 +675,7 @@ ixl_add_multi(struct ixl_vsi *vsi)
 		return;
 	}
 
-	mcnt = 0;
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		ixl_add_mc_filter(vsi,
-		    (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr));
-		mcnt++;
-	}
-	if_maddr_runlock(ifp);
+	mcnt = if_foreach_llmaddr(ifp, ixl_add_maddr, vsi);
 	if (mcnt > 0) {
 		flags = (IXL_FILTER_ADD | IXL_FILTER_USED | IXL_FILTER_MC);
 		ixl_add_hw_filters(vsi, flags, mcnt);
@@ -691,38 +684,33 @@ ixl_add_multi(struct ixl_vsi *vsi)
 	IOCTL_DEBUGOUT("ixl_add_multi: end");
 }
 
+static u_int
+ixl_match_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct ixl_mac_filter *f = arg;
+
+	if (cmp_etheraddr(f->macaddr, (u8 *)LLADDR(sdl)))
+		return (1);
+	else
+		return (0);
+}
+
 int
 ixl_del_multi(struct ixl_vsi *vsi)
 {
 	struct ifnet		*ifp = vsi->ifp;
-	struct ifmultiaddr	*ifma;
 	struct ixl_mac_filter	*f;
 	int			mcnt = 0;
-	bool		match = FALSE;
 
 	IOCTL_DEBUGOUT("ixl_del_multi: begin");
 
-	/* Search for removed multicast addresses */
-	if_maddr_rlock(ifp);
-	SLIST_FOREACH(f, &vsi->ftl, next) {
-		if ((f->flags & IXL_FILTER_USED) && (f->flags & IXL_FILTER_MC)) {
-			match = FALSE;
-			CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-				if (ifma->ifma_addr->sa_family != AF_LINK)
-					continue;
-				u8 *mc_addr = (u8 *)LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
-				if (cmp_etheraddr(f->macaddr, mc_addr)) {
-					match = TRUE;
-					break;
-				}
-			}
-			if (match == FALSE) {
-				f->flags |= IXL_FILTER_DEL;
-				mcnt++;
-			}
+	SLIST_FOREACH(f, &vsi->ftl, next)
+		if ((f->flags & IXL_FILTER_USED) &&
+		    (f->flags & IXL_FILTER_MC) &&
+		    (if_foreach_llmaddr(ifp, ixl_match_maddr, f) == 0)) {
+			f->flags |= IXL_FILTER_DEL;
+			mcnt++;
 		}
-	}
-	if_maddr_runlock(ifp);
 
 	if (mcnt > 0)
 		ixl_del_hw_filters(vsi, mcnt);


More information about the svn-src-all mailing list