diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2019-10-21 17:59:53 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2019-10-21 17:59:53 +0000 |
commit | f1c5eb0d975c33fd997c9d7568ff82543075d85b (patch) | |
tree | 5da79cf8033dedb0d7741fcfded30a12e608f4f8 /sys/dev/ae | |
parent | d6b5965b7753b5828babbe09618f7dc45639fbe7 (diff) | |
download | src-f1c5eb0d975c33fd997c9d7568ff82543075d85b.tar.gz src-f1c5eb0d975c33fd997c9d7568ff82543075d85b.zip |
Convert to if_foreach_llmaddr() KPI.
Notes
Notes:
svn path=/head/; revision=353804
Diffstat (limited to 'sys/dev/ae')
-rw-r--r-- | sys/dev/ae/if_ae.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/sys/dev/ae/if_ae.c b/sys/dev/ae/if_ae.c index cb9474db8553..557b3a67752b 100644 --- a/sys/dev/ae/if_ae.c +++ b/sys/dev/ae/if_ae.c @@ -2031,12 +2031,21 @@ ae_rxvlan(ae_softc_t *sc) AE_WRITE_4(sc, AE_MAC_REG, val); } +static u_int +ae_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + uint32_t crc, *mchash = arg; + + crc = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN); + mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); + + return (1); +} + static void ae_rxfilter(ae_softc_t *sc) { struct ifnet *ifp; - struct ifmultiaddr *ifma; - uint32_t crc; uint32_t mchash[2]; uint32_t rxcfg; @@ -2072,15 +2081,7 @@ ae_rxfilter(ae_softc_t *sc) * Load multicast tables. */ bzero(mchash, sizeof(mchash)); - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - crc = ether_crc32_be(LLADDR((struct sockaddr_dl *) - ifma->ifma_addr), ETHER_ADDR_LEN); - mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); - } - if_maddr_runlock(ifp); + if_foreach_llmaddr(ifp, ae_hash_maddr, &mchash); AE_WRITE_4(sc, AE_REG_MHT0, mchash[0]); AE_WRITE_4(sc, AE_REG_MHT1, mchash[1]); AE_WRITE_4(sc, AE_MAC_REG, rxcfg); |