svn commit: r353520 - head/sys/dev/sfxge

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 14 20:33:15 UTC 2019


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

Log:
  Convert to if_foreach_llmaddr() KPI.
  
  Reviewed by:	philip

Modified:
  head/sys/dev/sfxge/sfxge_port.c

Modified: head/sys/dev/sfxge/sfxge_port.c
==============================================================================
--- head/sys/dev/sfxge/sfxge_port.c	Mon Oct 14 20:32:28 2019	(r353519)
+++ head/sys/dev/sfxge/sfxge_port.c	Mon Oct 14 20:33:14 2019	(r353520)
@@ -358,36 +358,35 @@ done:
 	SFXGE_PORT_UNLOCK(port);
 }
 
+static u_int
+sfxge_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	uint8_t *mcast_addr = arg;
+
+	if (cnt == EFX_MAC_MULTICAST_LIST_MAX)
+		return (0);
+
+	memcpy(mcast_addr + (cnt * EFX_MAC_ADDR_LEN), LLADDR(sdl),
+	    EFX_MAC_ADDR_LEN);
+
+	return (1);
+}
+
 static int
 sfxge_mac_multicast_list_set(struct sfxge_softc *sc)
 {
 	struct ifnet *ifp = sc->ifnet;
 	struct sfxge_port *port = &sc->port;
-	uint8_t *mcast_addr = port->mcast_addrs;
-	struct ifmultiaddr *ifma;
-	struct sockaddr_dl *sa;
 	int rc = 0;
 
 	mtx_assert(&port->lock, MA_OWNED);
 
-	port->mcast_count = 0;
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family == AF_LINK) {
-			if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) {
-				device_printf(sc->dev,
-				    "Too many multicast addresses\n");
-				rc = EINVAL;
-				break;
-			}
-
-			sa = (struct sockaddr_dl *)ifma->ifma_addr;
-			memcpy(mcast_addr, LLADDR(sa), EFX_MAC_ADDR_LEN);
-			mcast_addr += EFX_MAC_ADDR_LEN;
-			++port->mcast_count;
-		}
+	port->mcast_count = if_foreach_llmaddr(ifp, sfxge_copy_maddr,
+	    port->mcast_addrs);
+	if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) {
+		device_printf(sc->dev, "Too many multicast addresses\n");
+		rc = EINVAL;
 	}
-	if_maddr_runlock(ifp);
 
 	if (rc == 0) {
 		rc = efx_mac_multicast_list_set(sc->enp, port->mcast_addrs,
@@ -485,6 +484,7 @@ int
 sfxge_port_start(struct sfxge_softc *sc)
 {
 	uint8_t mac_addr[ETHER_ADDR_LEN];
+	struct epoch_tracker et;
 	struct ifnet *ifp = sc->ifnet;
 	struct sfxge_port *port;
 	efx_nic_t *enp;
@@ -518,10 +518,10 @@ sfxge_port_start(struct sfxge_softc *sc)
 		goto fail3;
 
 	/* Set the unicast address */
-	if_addr_rlock(ifp);
+	NET_EPOCH_ENTER(et);
 	bcopy(LLADDR((struct sockaddr_dl *)ifp->if_addr->ifa_addr),
 	      mac_addr, sizeof(mac_addr));
-	if_addr_runlock(ifp);
+	NET_EPOCH_EXIT(et);
 	if ((rc = efx_mac_addr_set(enp, mac_addr)) != 0)
 		goto fail4;
 


More information about the svn-src-head mailing list