Author: glebius
Date: Mon Oct 21 18:11:48 2019
New Revision: 353849
URL: https://svnweb.freebsd.org/changeset/base/353849

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/liquidio/lio_ioctl.c

Modified: head/sys/dev/liquidio/lio_ioctl.c
==============================================================================
--- head/sys/dev/liquidio/lio_ioctl.c   Mon Oct 21 18:11:43 2019        
(r353848)
+++ head/sys/dev/liquidio/lio_ioctl.c   Mon Oct 21 18:11:48 2019        
(r353849)
@@ -491,6 +491,22 @@ lio_get_new_flags(struct ifnet *ifp)
        return (f);
 }
 
+static u_int
+lio_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+       uint64_t *mc = arg;
+
+       if (cnt == LIO_MAX_MULTICAST_ADDR)
+               return (0);
+
+       mc += cnt;
+       *mc = 0;
+       memcpy(((uint8_t *)mc) + 2, LLADDR(sdl), ETHER_ADDR_LEN);
+       /* no need to swap bytes */
+
+       return (1);
+}
+
 /* @param ifp network device */
 static int
 lio_set_mcast_list(struct ifnet *ifp)
@@ -498,9 +514,7 @@ lio_set_mcast_list(struct ifnet *ifp)
        struct lio              *lio = if_getsoftc(ifp);
        struct octeon_device    *oct = lio->oct_dev;
        struct lio_ctrl_pkt     nctrl;
-       struct ifmultiaddr      *ifma;
-       uint64_t                *mc;
-       int     mc_count = 0;
+       int     mc_count;
        int     ret;
 
        bzero(&nctrl, sizeof(struct lio_ctrl_pkt));
@@ -514,26 +528,7 @@ lio_set_mcast_list(struct ifnet *ifp)
        nctrl.cb_fn = lio_ctrl_cmd_completion;
 
        /* copy all the addresses into the udd */
-       mc = &nctrl.udd[0];
-
-       /* to protect access to if_multiaddrs */
-       if_maddr_rlock(ifp);
-
-       CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-               if (ifma->ifma_addr->sa_family != AF_LINK)
-                       continue;
-               *mc = 0;
-               memcpy(((uint8_t *)mc) + 2,
-                      LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
-                      ETHER_ADDR_LEN);
-               /* no need to swap bytes */
-
-               mc_count++;
-               if (++mc > &nctrl.udd[LIO_MAX_MULTICAST_ADDR])
-                       break;
-       }
-
-       if_maddr_runlock(ifp);
+       mc_count = if_foreach_llmaddr(ifp, lio_copy_maddr, &nctrl.udd[0]);
 
        /*
         * Apparently, any activity in this call from the kernel has to
_______________________________________________
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