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

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/mge/if_mge.c

Modified: head/sys/dev/mge/if_mge.c
==============================================================================
--- head/sys/dev/mge/if_mge.c   Mon Oct 21 18:07:11 2019        (r353818)
+++ head/sys/dev/mge/if_mge.c   Mon Oct 21 18:07:15 2019        (r353819)
@@ -2032,45 +2032,51 @@ mge_crc8(uint8_t *data, int size)
        return(crc);
 }
 
+struct mge_hash_maddr_ctx {
+       uint32_t smt[MGE_MCAST_REG_NUMBER];
+       uint32_t omt[MGE_MCAST_REG_NUMBER];
+};
+
+static u_int
+mge_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+       static const uint8_t special[5] = { 0x01, 0x00, 0x5E, 0x00, 0x00 };
+       struct mge_hash_maddr_ctx *ctx = arg;
+       static const uint8_t v = (MGE_RX_DEFAULT_QUEUE << 1) | 1;
+       uint8_t *mac;
+       int i;
+
+       mac = LLADDR(sdl);
+       if (memcmp(mac, special, sizeof(special)) == 0) {
+               i = mac[5];
+               ctx->smt[i >> 2] |= v << ((i & 0x03) << 3);
+       } else {
+               i = mge_crc8(mac, ETHER_ADDR_LEN);
+               ctx->omt[i >> 2] |= v << ((i & 0x03) << 3);
+       }
+       return (1);
+}
+
 static void
 mge_setup_multicast(struct mge_softc *sc)
 {
-       uint8_t special[5] = { 0x01, 0x00, 0x5E, 0x00, 0x00 };
-       uint8_t v = (MGE_RX_DEFAULT_QUEUE << 1) | 1;
-       uint32_t smt[MGE_MCAST_REG_NUMBER];
-       uint32_t omt[MGE_MCAST_REG_NUMBER];
+       struct mge_hash_maddr_ctx ctx;
        struct ifnet *ifp = sc->ifp;
-       struct ifmultiaddr *ifma;
-       uint8_t *mac;
+       static const uint8_t v = (MGE_RX_DEFAULT_QUEUE << 1) | 1;
        int i;
 
        if (ifp->if_flags & IFF_ALLMULTI) {
                for (i = 0; i < MGE_MCAST_REG_NUMBER; i++)
-                       smt[i] = omt[i] = (v << 24) | (v << 16) | (v << 8) | v;
+                       ctx.smt[i] = ctx.omt[i] =
+                           (v << 24) | (v << 16) | (v << 8) | v;
        } else {
-               memset(smt, 0, sizeof(smt));
-               memset(omt, 0, sizeof(omt));
-
-               if_maddr_rlock(ifp);
-               CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-                       if (ifma->ifma_addr->sa_family != AF_LINK)
-                               continue;
-
-                       mac = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
-                       if (memcmp(mac, special, sizeof(special)) == 0) {
-                               i = mac[5];
-                               smt[i >> 2] |= v << ((i & 0x03) << 3);
-                       } else {
-                               i = mge_crc8(mac, ETHER_ADDR_LEN);
-                               omt[i >> 2] |= v << ((i & 0x03) << 3);
-                       }
-               }
-               if_maddr_runlock(ifp);
+               memset(&ctx, 0, sizeof(ctx));
+               if_foreach_llmaddr(ifp, mge_hash_maddr, &ctx);
        }
 
        for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) {
-               MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), smt[i]);
-               MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), omt[i]);
+               MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), ctx.smt[i]);
+               MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), ctx.omt[i]);
        }
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to