svn commit: r353862 - head/sys/arm/allwinner

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 21 18:13:15 UTC 2019


Author: glebius
Date: Mon Oct 21 18:13:14 2019
New Revision: 353862
URL: https://svnweb.freebsd.org/changeset/base/353862

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/arm/allwinner/if_awg.c

Modified: head/sys/arm/allwinner/if_awg.c
==============================================================================
--- head/sys/arm/allwinner/if_awg.c	Mon Oct 21 18:12:58 2019	(r353861)
+++ head/sys/arm/allwinner/if_awg.c	Mon Oct 21 18:13:14 2019	(r353862)
@@ -675,12 +675,25 @@ bitrev32(uint32_t x)
 	return (x >> 16) | (x << 16);
 }
 
+static u_int
+awg_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	uint32_t crc, hashreg, hashbit, *hash = arg;
+
+	crc = ether_crc32_le(LLADDR(sdl), ETHER_ADDR_LEN) & 0x7f;
+	crc = bitrev32(~crc) >> 26;
+	hashreg = (crc >> 5);
+	hashbit = (crc & 0x1f);
+	hash[hashreg] |= (1 << hashbit);
+
+	return (1);
+}
+
 static void
 awg_setup_rxfilter(struct awg_softc *sc)
 {
-	uint32_t val, crc, hashreg, hashbit, hash[2], machi, maclo;
-	int mc_count, mcnt, i;
-	uint8_t *eaddr, *mta;
+	uint32_t val, hash[2], machi, maclo;
+	uint8_t *eaddr;
 	if_t ifp;
 
 	AWG_ASSERT_LOCKED(sc);
@@ -689,36 +702,13 @@ awg_setup_rxfilter(struct awg_softc *sc)
 	val = 0;
 	hash[0] = hash[1] = 0;
 
-	mc_count = if_multiaddr_count(ifp, -1);
-
 	if (if_getflags(ifp) & IFF_PROMISC)
 		val |= DIS_ADDR_FILTER;
 	else if (if_getflags(ifp) & IFF_ALLMULTI) {
 		val |= RX_ALL_MULTICAST;
 		hash[0] = hash[1] = ~0;
-	} else if (mc_count > 0) {
+	} else if (if_foreach_llmaddr(ifp, awg_hash_maddr, hash) > 0)
 		val |= HASH_MULTICAST;
-
-		mta = malloc(sizeof(unsigned char) * ETHER_ADDR_LEN * mc_count,
-		    M_DEVBUF, M_NOWAIT);
-		if (mta == NULL) {
-			if_printf(ifp,
-			    "failed to allocate temporary multicast list\n");
-			return;
-		}
-
-		if_multiaddr_array(ifp, mta, &mcnt, mc_count);
-		for (i = 0; i < mcnt; i++) {
-			crc = ether_crc32_le(mta + (i * ETHER_ADDR_LEN),
-			    ETHER_ADDR_LEN) & 0x7f;
-			crc = bitrev32(~crc) >> 26;
-			hashreg = (crc >> 5);
-			hashbit = (crc & 0x1f);
-			hash[hashreg] |= (1 << hashbit);
-		}
-
-		free(mta, M_DEVBUF);
-	}
 
 	/* Write our unicast address */
 	eaddr = IF_LLADDR(ifp);


More information about the svn-src-head mailing list