svn commit: r353821 - head/sys/dev/nfe

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 21 18:07:25 UTC 2019


Author: glebius
Date: Mon Oct 21 18:07:24 2019
New Revision: 353821
URL: https://svnweb.freebsd.org/changeset/base/353821

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/nfe/if_nfe.c

Modified: head/sys/dev/nfe/if_nfe.c
==============================================================================
--- head/sys/dev/nfe/if_nfe.c	Mon Oct 21 18:07:19 2019	(r353820)
+++ head/sys/dev/nfe/if_nfe.c	Mon Oct 21 18:07:24 2019	(r353821)
@@ -2557,75 +2557,67 @@ nfe_encap(struct nfe_softc *sc, struct mbuf **m_head)
 	return (0);
 }
 
+struct nfe_hash_maddr_ctx {
+	uint8_t addr[ETHER_ADDR_LEN];
+	uint8_t mask[ETHER_ADDR_LEN];
+};
 
+static u_int
+nfe_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct nfe_hash_maddr_ctx *ctx = arg;
+	uint8_t *addrp, mcaddr;
+	int j;
+
+	addrp = LLADDR(sdl);
+	for (j = 0; j < ETHER_ADDR_LEN; j++) {
+		mcaddr = addrp[j];
+		ctx->addr[j] &= mcaddr;
+		ctx->mask[j] &= ~mcaddr;
+	}
+
+	return (1);
+}
+
 static void
 nfe_setmulti(struct nfe_softc *sc)
 {
 	if_t ifp = sc->nfe_ifp;
-	int i, mc_count, mcnt;
+	struct nfe_hash_maddr_ctx ctx;
 	uint32_t filter;
-	uint8_t addr[ETHER_ADDR_LEN], mask[ETHER_ADDR_LEN];
 	uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] = {
 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 	};
-	uint8_t *mta;
+	int i;
 
 	NFE_LOCK_ASSERT(sc);
 
 	if ((if_getflags(ifp) & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
-		bzero(addr, ETHER_ADDR_LEN);
-		bzero(mask, ETHER_ADDR_LEN);
+		bzero(ctx.addr, ETHER_ADDR_LEN);
+		bzero(ctx.mask, ETHER_ADDR_LEN);
 		goto done;
 	}
 
-	bcopy(etherbroadcastaddr, addr, ETHER_ADDR_LEN);
-	bcopy(etherbroadcastaddr, mask, ETHER_ADDR_LEN);
+	bcopy(etherbroadcastaddr, ctx.addr, ETHER_ADDR_LEN);
+	bcopy(etherbroadcastaddr, ctx.mask, ETHER_ADDR_LEN);
 
-	mc_count = if_multiaddr_count(ifp, -1);
-	mta = malloc(sizeof(uint8_t) * ETHER_ADDR_LEN * mc_count, M_DEVBUF,
-	    M_NOWAIT);
+	if_foreach_llmaddr(ifp, nfe_hash_maddr, &ctx);
 
-	/* Unable to get memory - process without filtering */
-	if (mta == NULL) {
-		device_printf(sc->nfe_dev, "nfe_setmulti: failed to allocate"
-		    "temp multicast buffer!\n");
-
-		bzero(addr, ETHER_ADDR_LEN);
-		bzero(mask, ETHER_ADDR_LEN);
-		goto done;
-	}
-
-	if_multiaddr_array(ifp, mta, &mcnt, mc_count);
-
-	for (i = 0; i < mcnt; i++) {
-		uint8_t *addrp;
-		int j;
-
-		addrp = mta + (i * ETHER_ADDR_LEN);
-		for (j = 0; j < ETHER_ADDR_LEN; j++) {
-			u_int8_t mcaddr = addrp[j];
-			addr[j] &= mcaddr;
-			mask[j] &= ~mcaddr;
-		}
-	}
-
-	free(mta, M_DEVBUF);
-
 	for (i = 0; i < ETHER_ADDR_LEN; i++) {
-		mask[i] |= addr[i];
+		ctx.mask[i] |= ctx.addr[i];
 	}
 
 done:
-	addr[0] |= 0x01;	/* make sure multicast bit is set */
+	ctx.addr[0] |= 0x01;	/* make sure multicast bit is set */
 
-	NFE_WRITE(sc, NFE_MULTIADDR_HI,
-	    addr[3] << 24 | addr[2] << 16 | addr[1] << 8 | addr[0]);
+	NFE_WRITE(sc, NFE_MULTIADDR_HI, ctx.addr[3] << 24 | ctx.addr[2] << 16 |
+	    ctx.addr[1] << 8 | ctx.addr[0]);
 	NFE_WRITE(sc, NFE_MULTIADDR_LO,
-	    addr[5] <<  8 | addr[4]);
-	NFE_WRITE(sc, NFE_MULTIMASK_HI,
-	    mask[3] << 24 | mask[2] << 16 | mask[1] << 8 | mask[0]);
+	    ctx.addr[5] <<  8 | ctx.addr[4]);
+	NFE_WRITE(sc, NFE_MULTIMASK_HI, ctx.mask[3] << 24 | ctx.mask[2] << 16 |
+	    ctx.mask[1] << 8 | ctx.mask[0]);
 	NFE_WRITE(sc, NFE_MULTIMASK_LO,
-	    mask[5] <<  8 | mask[4]);
+	    ctx.mask[5] <<  8 | ctx.mask[4]);
 
 	filter = NFE_READ(sc, NFE_RXFILTER);
 	filter &= NFE_PFF_RX_PAUSE;


More information about the svn-src-all mailing list