svn commit: r353520 - head/sys/dev/sfxge
Gleb Smirnoff
glebius at FreeBSD.org
Mon Oct 14 20:33:15 UTC 2019
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;
More information about the svn-src-head
mailing list