Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Oct 2019 18:11:15 +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: r353842 - head/sys/dev/dc
Message-ID:  <201910211811.x9LIBFO3067531@repo.freebsd.org>

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

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/dc/if_dc.c

Modified: head/sys/dev/dc/if_dc.c
==============================================================================
--- head/sys/dev/dc/if_dc.c	Mon Oct 21 18:11:11 2019	(r353841)
+++ head/sys/dev/dc/if_dc.c	Mon Oct 21 18:11:15 2019	(r353842)
@@ -962,13 +962,24 @@ dc_mchash_be(const uint8_t *addr)
  * frames. We also sneak the broadcast address into the hash filter since
  * we need that too.
  */
+static u_int
+dc_hash_maddr_21143(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct dc_softc *sc = arg;
+	uint32_t h;
+
+	h = dc_mchash_le(sc, LLADDR(sdl));
+	sc->dc_cdata.dc_sbuf[h >> 4] |= htole32(1 << (h & 0xF));
+
+	return (1);
+}
+
 static void
 dc_setfilt_21143(struct dc_softc *sc)
 {
 	uint16_t eaddr[(ETHER_ADDR_LEN+1)/2];
 	struct dc_desc *sframe;
 	uint32_t h, *sp;
-	struct ifmultiaddr *ifma;
 	struct ifnet *ifp;
 	int i;
 
@@ -998,15 +1009,7 @@ dc_setfilt_21143(struct dc_softc *sc)
 	else
 		DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
 
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		h = dc_mchash_le(sc,
-		    LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
-		sp[h >> 4] |= htole32(1 << (h & 0xF));
-	}
-	if_maddr_runlock(ifp);
+	if_foreach_llmaddr(ifp, dc_hash_maddr_21143, sp);
 
 	if (ifp->if_flags & IFF_BROADCAST) {
 		h = dc_mchash_le(sc, ifp->if_broadcastaddr);
@@ -1036,14 +1039,47 @@ dc_setfilt_21143(struct dc_softc *sc)
 	sc->dc_wdog_timer = 5;
 }
 
+static u_int
+dc_hash_maddr_admtek_be(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	uint32_t *hashes = arg;
+	int h = 0;
+
+	h = dc_mchash_be(LLADDR(sdl));
+	if (h < 32)
+		hashes[0] |= (1 << h);
+	else
+		hashes[1] |= (1 << (h - 32));
+
+	return (1);
+}
+
+struct dc_hash_maddr_admtek_le_ctx {
+	struct dc_softc *sc;
+	uint32_t hashes[2];
+};
+
+static u_int
+dc_hash_maddr_admtek_le(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct dc_hash_maddr_admtek_le_ctx *ctx = arg;
+	int h = 0;
+
+	h = dc_mchash_le(ctx->sc, LLADDR(sdl));
+	if (h < 32)
+		ctx->hashes[0] |= (1 << h);
+	else
+		ctx->hashes[1] |= (1 << (h - 32));
+
+	return (1);
+}
+
 static void
 dc_setfilt_admtek(struct dc_softc *sc)
 {
 	uint8_t eaddr[ETHER_ADDR_LEN];
 	struct ifnet *ifp;
-	struct ifmultiaddr *ifma;
-	int h = 0;
-	uint32_t hashes[2] = { 0, 0 };
+	struct dc_hash_maddr_admtek_le_ctx ctx = { sc, { 0, 0 }};
 
 	ifp = sc->dc_ifp;
 
@@ -1076,25 +1112,13 @@ dc_setfilt_admtek(struct dc_softc *sc)
 		return;
 
 	/* Now program new ones. */
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		if (DC_IS_CENTAUR(sc))
-			h = dc_mchash_le(sc,
-			    LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
-		else
-			h = dc_mchash_be(
-			    LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
-		if (h < 32)
-			hashes[0] |= (1 << h);
-		else
-			hashes[1] |= (1 << (h - 32));
-	}
-	if_maddr_runlock(ifp);
+	if (DC_IS_CENTAUR(sc))
+		if_foreach_llmaddr(ifp, dc_hash_maddr_admtek_le, &ctx);
+	else
+		if_foreach_llmaddr(ifp, dc_hash_maddr_admtek_be, &ctx.hashes);
 
-	CSR_WRITE_4(sc, DC_AL_MAR0, hashes[0]);
-	CSR_WRITE_4(sc, DC_AL_MAR1, hashes[1]);
+	CSR_WRITE_4(sc, DC_AL_MAR0, ctx.hashes[0]);
+	CSR_WRITE_4(sc, DC_AL_MAR1, ctx.hashes[1]);
 }
 
 static void
@@ -1102,8 +1126,6 @@ dc_setfilt_asix(struct dc_softc *sc)
 {
 	uint32_t eaddr[(ETHER_ADDR_LEN+3)/4];
 	struct ifnet *ifp;
-	struct ifmultiaddr *ifma;
-	int h = 0;
 	uint32_t hashes[2] = { 0, 0 };
 
 	ifp = sc->dc_ifp;
@@ -1149,17 +1171,7 @@ dc_setfilt_asix(struct dc_softc *sc)
 		return;
 
 	/* now program new ones */
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		h = dc_mchash_be(LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
-		if (h < 32)
-			hashes[0] |= (1 << h);
-		else
-			hashes[1] |= (1 << (h - 32));
-	}
-	if_maddr_runlock(ifp);
+	if_foreach_llmaddr(ifp, dc_hash_maddr_admtek_be, hashes);
 
 	CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR0);
 	CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[0]);
@@ -1167,15 +1179,29 @@ dc_setfilt_asix(struct dc_softc *sc)
 	CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[1]);
 }
 
+static u_int
+dc_hash_maddr_uli(void *arg, struct sockaddr_dl *sdl, u_int mcnt)
+{
+	uint32_t **sp = arg;
+	uint8_t *ma;
+
+	if (mcnt == DC_ULI_FILTER_NPERF)
+		return (0);
+	ma = LLADDR(sdl);
+	*(*sp)++ = DC_SP_MAC(ma[1] << 8 | ma[0]);
+	*(*sp)++ = DC_SP_MAC(ma[3] << 8 | ma[2]);
+	*(*sp)++ = DC_SP_MAC(ma[5] << 8 | ma[4]);
+
+	return (1);
+}
+
 static void
 dc_setfilt_uli(struct dc_softc *sc)
 {
 	uint8_t eaddr[ETHER_ADDR_LEN];
 	struct ifnet *ifp;
-	struct ifmultiaddr *ifma;
 	struct dc_desc *sframe;
 	uint32_t filter, *sp;
-	uint8_t *ma;
 	int i, mcnt;
 
 	ifp = sc->dc_ifp;
@@ -1209,29 +1235,17 @@ dc_setfilt_uli(struct dc_softc *sc)
 	filter &= ~(DC_NETCFG_RX_PROMISC | DC_NETCFG_RX_ALLMULTI);
 
 	/* Now build perfect filters. */
-	mcnt = 0;
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		if (mcnt >= DC_ULI_FILTER_NPERF) {
-			filter |= DC_NETCFG_RX_ALLMULTI;
-			break;
+	mcnt = if_foreach_llmaddr(ifp, dc_hash_maddr_uli, &sp);
+
+	if (mcnt == DC_ULI_FILTER_NPERF)
+		filter |= DC_NETCFG_RX_ALLMULTI;
+	else
+		for (; mcnt < DC_ULI_FILTER_NPERF; mcnt++) {
+			*sp++ = DC_SP_MAC(0xFFFF);
+			*sp++ = DC_SP_MAC(0xFFFF);
+			*sp++ = DC_SP_MAC(0xFFFF);
 		}
-		ma = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
-		*sp++ = DC_SP_MAC(ma[1] << 8 | ma[0]);
-		*sp++ = DC_SP_MAC(ma[3] << 8 | ma[2]);
-		*sp++ = DC_SP_MAC(ma[5] << 8 | ma[4]);
-		mcnt++;
-	}
-	if_maddr_runlock(ifp);
 
-	for (; mcnt < DC_ULI_FILTER_NPERF; mcnt++) {
-		*sp++ = DC_SP_MAC(0xFFFF);
-		*sp++ = DC_SP_MAC(0xFFFF);
-		*sp++ = DC_SP_MAC(0xFFFF);
-	}
-
 	if (filter & (DC_NETCFG_TX_ON | DC_NETCFG_RX_ON))
 		CSR_WRITE_4(sc, DC_NETCFG,
 		    filter & ~(DC_NETCFG_TX_ON | DC_NETCFG_RX_ON));
@@ -1258,12 +1272,22 @@ dc_setfilt_uli(struct dc_softc *sc)
 	sc->dc_wdog_timer = 5;
 }
 
+static u_int
+dc_hash_maddr_xircom(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct dc_softc *sc = arg;
+	uint32_t h;
+
+	h = dc_mchash_le(sc, LLADDR(sdl));
+	sc->dc_cdata.dc_sbuf[h >> 4] |= htole32(1 << (h & 0xF));
+	return (1);
+}
+
 static void
 dc_setfilt_xircom(struct dc_softc *sc)
 {
 	uint16_t eaddr[(ETHER_ADDR_LEN+1)/2];
 	struct ifnet *ifp;
-	struct ifmultiaddr *ifma;
 	struct dc_desc *sframe;
 	uint32_t h, *sp;
 	int i;
@@ -1295,15 +1319,7 @@ dc_setfilt_xircom(struct dc_softc *sc)
 	else
 		DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
 
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		h = dc_mchash_le(sc,
-		    LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
-		sp[h >> 4] |= htole32(1 << (h & 0xF));
-	}
-	if_maddr_runlock(ifp);
+	if_foreach_llmaddr(ifp, dc_hash_maddr_xircom, &sp);
 
 	if (ifp->if_flags & IFF_BROADCAST) {
 		h = dc_mchash_le(sc, ifp->if_broadcastaddr);



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