Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Oct 2019 18:11:49 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r353849 - head/sys/dev/liquidio
Message-ID:  <201910211811.x9LIBn28070755@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Mon Oct 21 18:11:48 2019
New Revision: 353849
URL: https://svnweb.freebsd.org/changeset/base/353849

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/liquidio/lio_ioctl.c

Modified: head/sys/dev/liquidio/lio_ioctl.c
==============================================================================
--- head/sys/dev/liquidio/lio_ioctl.c	Mon Oct 21 18:11:43 2019	(r353848)
+++ head/sys/dev/liquidio/lio_ioctl.c	Mon Oct 21 18:11:48 2019	(r353849)
@@ -491,6 +491,22 @@ lio_get_new_flags(struct ifnet *ifp)
 	return (f);
 }
 
+static u_int
+lio_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	uint64_t *mc = arg;
+
+	if (cnt == LIO_MAX_MULTICAST_ADDR)
+		return (0);
+
+	mc += cnt;
+	*mc = 0;
+	memcpy(((uint8_t *)mc) + 2, LLADDR(sdl), ETHER_ADDR_LEN);
+	/* no need to swap bytes */
+
+	return (1);
+}
+
 /* @param ifp network device */
 static int
 lio_set_mcast_list(struct ifnet *ifp)
@@ -498,9 +514,7 @@ lio_set_mcast_list(struct ifnet *ifp)
 	struct lio		*lio = if_getsoftc(ifp);
 	struct octeon_device	*oct = lio->oct_dev;
 	struct lio_ctrl_pkt	nctrl;
-	struct ifmultiaddr	*ifma;
-	uint64_t		*mc;
-	int	mc_count = 0;
+	int	mc_count;
 	int	ret;
 
 	bzero(&nctrl, sizeof(struct lio_ctrl_pkt));
@@ -514,26 +528,7 @@ lio_set_mcast_list(struct ifnet *ifp)
 	nctrl.cb_fn = lio_ctrl_cmd_completion;
 
 	/* copy all the addresses into the udd */
-	mc = &nctrl.udd[0];
-
-	/* to protect access to if_multiaddrs */
-	if_maddr_rlock(ifp);
-
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		*mc = 0;
-		memcpy(((uint8_t *)mc) + 2,
-		       LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
-		       ETHER_ADDR_LEN);
-		/* no need to swap bytes */
-
-		mc_count++;
-		if (++mc > &nctrl.udd[LIO_MAX_MULTICAST_ADDR])
-			break;
-	}
-
-	if_maddr_runlock(ifp);
+	mc_count = if_foreach_llmaddr(ifp, lio_copy_maddr, &nctrl.udd[0]);
 
 	/*
 	 * Apparently, any activity in this call from the kernel has to



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910211811.x9LIBn28070755>