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

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/powerpc/ps3/if_glc.c

Modified: head/sys/powerpc/ps3/if_glc.c
==============================================================================
--- head/sys/powerpc/ps3/if_glc.c       Mon Oct 21 18:13:28 2019        
(r353865)
+++ head/sys/powerpc/ps3/if_glc.c       Mon Oct 21 18:13:33 2019        
(r353866)
@@ -504,12 +504,31 @@ glc_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
        return (err);
 }
 
+static u_int
+glc_add_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+       struct glc_softc *sc = arg;
+       uint64_t addr;
+
+       /*
+        * Filter can only hold 32 addresses, so fall back to
+        * the IFF_ALLMULTI case if we have too many. +1 is for
+        * broadcast.
+        */
+       if (cnt + 1 == 32)
+               return (0);
+
+       addr = 0;
+       memcpy(&((uint8_t *)(&addr))[2], LLADDR(sdl), ETHER_ADDR_LEN);
+       lv1_net_add_multicast_address(sc->sc_bus, sc->sc_dev, addr, 0);
+
+       return (1);
+}
+
 static void
 glc_set_multicast(struct glc_softc *sc)
 {
        struct ifnet *ifp = sc->sc_ifp;
-       struct ifmultiaddr *inm;
-       uint64_t addr;
        int naddrs;
 
        /* Clear multicast filter */
@@ -522,30 +541,10 @@ glc_set_multicast(struct glc_softc *sc)
        if ((ifp->if_flags & IFF_ALLMULTI) != 0) {
                lv1_net_add_multicast_address(sc->sc_bus, sc->sc_dev, 0, 1);
        } else {
-               if_maddr_rlock(ifp);
-               naddrs = 1; /* Include broadcast */
-               CK_STAILQ_FOREACH(inm, &ifp->if_multiaddrs, ifma_link) {
-                       if (inm->ifma_addr->sa_family != AF_LINK)
-                               continue;
-                       addr = 0;
-                       memcpy(&((uint8_t *)(&addr))[2],
-                           LLADDR((struct sockaddr_dl *)inm->ifma_addr),
-                           ETHER_ADDR_LEN);
-
-                       lv1_net_add_multicast_address(sc->sc_bus, sc->sc_dev,
-                           addr, 0);
-
-                       /*
-                        * Filter can only hold 32 addresses, so fall back to
-                        * the IFF_ALLMULTI case if we have too many.
-                        */
-                       if (++naddrs >= 32) {
-                               lv1_net_add_multicast_address(sc->sc_bus,
-                                   sc->sc_dev, 0, 1);
-                               break;
-                       }
-               }
-               if_maddr_runlock(ifp);
+               naddrs = if_foreach_llmaddr(ifp, glc_add_maddr, sc);
+               if (naddrs + 1 == 32)
+                       lv1_net_add_multicast_address(sc->sc_bus,
+                           sc->sc_dev, 0, 1);
        }
 }
 
_______________________________________________
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