Author: glebius
Date: Mon Oct 14 20:33:14 2019
New Revision: 353520
URL: https://svnweb.freebsd.org/changeset/base/353520

Log:
  Convert to if_foreach_llmaddr() KPI.
  
  Reviewed by:  philip

Modified:
  head/sys/dev/sfxge/sfxge_port.c

Modified: head/sys/dev/sfxge/sfxge_port.c
==============================================================================
--- head/sys/dev/sfxge/sfxge_port.c     Mon Oct 14 20:32:28 2019        
(r353519)
+++ head/sys/dev/sfxge/sfxge_port.c     Mon Oct 14 20:33:14 2019        
(r353520)
@@ -358,36 +358,35 @@ done:
        SFXGE_PORT_UNLOCK(port);
 }
 
+static u_int
+sfxge_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+       uint8_t *mcast_addr = arg;
+
+       if (cnt == EFX_MAC_MULTICAST_LIST_MAX)
+               return (0);
+
+       memcpy(mcast_addr + (cnt * EFX_MAC_ADDR_LEN), LLADDR(sdl),
+           EFX_MAC_ADDR_LEN);
+
+       return (1);
+}
+
 static int
 sfxge_mac_multicast_list_set(struct sfxge_softc *sc)
 {
        struct ifnet *ifp = sc->ifnet;
        struct sfxge_port *port = &sc->port;
-       uint8_t *mcast_addr = port->mcast_addrs;
-       struct ifmultiaddr *ifma;
-       struct sockaddr_dl *sa;
        int rc = 0;
 
        mtx_assert(&port->lock, MA_OWNED);
 
-       port->mcast_count = 0;
-       if_maddr_rlock(ifp);
-       CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-               if (ifma->ifma_addr->sa_family == AF_LINK) {
-                       if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) {
-                               device_printf(sc->dev,
-                                   "Too many multicast addresses\n");
-                               rc = EINVAL;
-                               break;
-                       }
-
-                       sa = (struct sockaddr_dl *)ifma->ifma_addr;
-                       memcpy(mcast_addr, LLADDR(sa), EFX_MAC_ADDR_LEN);
-                       mcast_addr += EFX_MAC_ADDR_LEN;
-                       ++port->mcast_count;
-               }
+       port->mcast_count = if_foreach_llmaddr(ifp, sfxge_copy_maddr,
+           port->mcast_addrs);
+       if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) {
+               device_printf(sc->dev, "Too many multicast addresses\n");
+               rc = EINVAL;
        }
-       if_maddr_runlock(ifp);
 
        if (rc == 0) {
                rc = efx_mac_multicast_list_set(sc->enp, port->mcast_addrs,
@@ -485,6 +484,7 @@ int
 sfxge_port_start(struct sfxge_softc *sc)
 {
        uint8_t mac_addr[ETHER_ADDR_LEN];
+       struct epoch_tracker et;
        struct ifnet *ifp = sc->ifnet;
        struct sfxge_port *port;
        efx_nic_t *enp;
@@ -518,10 +518,10 @@ sfxge_port_start(struct sfxge_softc *sc)
                goto fail3;
 
        /* Set the unicast address */
-       if_addr_rlock(ifp);
+       NET_EPOCH_ENTER(et);
        bcopy(LLADDR((struct sockaddr_dl *)ifp->if_addr->ifa_addr),
              mac_addr, sizeof(mac_addr));
-       if_addr_runlock(ifp);
+       NET_EPOCH_EXIT(et);
        if ((rc = efx_mac_addr_set(enp, mac_addr)) != 0)
                goto fail4;
 
_______________________________________________
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