From owner-svn-src-all@freebsd.org Mon Oct 21 18:11:16 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 52B2C15DF47; Mon, 21 Oct 2019 18:11:16 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46xl7m0nGFz4ckY; Mon, 21 Oct 2019 18:11:16 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D5E6A27BBC; Mon, 21 Oct 2019 18:11:15 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x9LIBF6T067532; Mon, 21 Oct 2019 18:11:15 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x9LIBFO3067531; Mon, 21 Oct 2019 18:11:15 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201910211811.x9LIBFO3067531@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Mon, 21 Oct 2019 18:11:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r353842 - head/sys/dev/dc X-SVN-Group: head X-SVN-Commit-Author: glebius X-SVN-Commit-Paths: head/sys/dev/dc X-SVN-Commit-Revision: 353842 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Oct 2019 18:11:16 -0000 Author: glebius Date: Mon Oct 21 18:11:15 2019 New Revision: 353842 URL: https://svnweb.freebsd.org/changeset/base/353842 Log: Convert to if_foreach_llmaddr() KPI. Modified: head/sys/dev/dc/if_dc.c Modified: head/sys/dev/dc/if_dc.c ============================================================================== --- head/sys/dev/dc/if_dc.c Mon Oct 21 18:11:11 2019 (r353841) +++ head/sys/dev/dc/if_dc.c Mon Oct 21 18:11:15 2019 (r353842) @@ -962,13 +962,24 @@ dc_mchash_be(const uint8_t *addr) * frames. We also sneak the broadcast address into the hash filter since * we need that too. */ +static u_int +dc_hash_maddr_21143(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct dc_softc *sc = arg; + uint32_t h; + + h = dc_mchash_le(sc, LLADDR(sdl)); + sc->dc_cdata.dc_sbuf[h >> 4] |= htole32(1 << (h & 0xF)); + + return (1); +} + static void dc_setfilt_21143(struct dc_softc *sc) { uint16_t eaddr[(ETHER_ADDR_LEN+1)/2]; struct dc_desc *sframe; uint32_t h, *sp; - struct ifmultiaddr *ifma; struct ifnet *ifp; int i; @@ -998,15 +1009,7 @@ dc_setfilt_21143(struct dc_softc *sc) else DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI); - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - h = dc_mchash_le(sc, - LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - sp[h >> 4] |= htole32(1 << (h & 0xF)); - } - if_maddr_runlock(ifp); + if_foreach_llmaddr(ifp, dc_hash_maddr_21143, sp); if (ifp->if_flags & IFF_BROADCAST) { h = dc_mchash_le(sc, ifp->if_broadcastaddr); @@ -1036,14 +1039,47 @@ dc_setfilt_21143(struct dc_softc *sc) sc->dc_wdog_timer = 5; } +static u_int +dc_hash_maddr_admtek_be(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + uint32_t *hashes = arg; + int h = 0; + + h = dc_mchash_be(LLADDR(sdl)); + if (h < 32) + hashes[0] |= (1 << h); + else + hashes[1] |= (1 << (h - 32)); + + return (1); +} + +struct dc_hash_maddr_admtek_le_ctx { + struct dc_softc *sc; + uint32_t hashes[2]; +}; + +static u_int +dc_hash_maddr_admtek_le(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct dc_hash_maddr_admtek_le_ctx *ctx = arg; + int h = 0; + + h = dc_mchash_le(ctx->sc, LLADDR(sdl)); + if (h < 32) + ctx->hashes[0] |= (1 << h); + else + ctx->hashes[1] |= (1 << (h - 32)); + + return (1); +} + static void dc_setfilt_admtek(struct dc_softc *sc) { uint8_t eaddr[ETHER_ADDR_LEN]; struct ifnet *ifp; - struct ifmultiaddr *ifma; - int h = 0; - uint32_t hashes[2] = { 0, 0 }; + struct dc_hash_maddr_admtek_le_ctx ctx = { sc, { 0, 0 }}; ifp = sc->dc_ifp; @@ -1076,25 +1112,13 @@ dc_setfilt_admtek(struct dc_softc *sc) return; /* Now program new ones. */ - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - if (DC_IS_CENTAUR(sc)) - h = dc_mchash_le(sc, - LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - else - h = dc_mchash_be( - LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - if (h < 32) - hashes[0] |= (1 << h); - else - hashes[1] |= (1 << (h - 32)); - } - if_maddr_runlock(ifp); + if (DC_IS_CENTAUR(sc)) + if_foreach_llmaddr(ifp, dc_hash_maddr_admtek_le, &ctx); + else + if_foreach_llmaddr(ifp, dc_hash_maddr_admtek_be, &ctx.hashes); - CSR_WRITE_4(sc, DC_AL_MAR0, hashes[0]); - CSR_WRITE_4(sc, DC_AL_MAR1, hashes[1]); + CSR_WRITE_4(sc, DC_AL_MAR0, ctx.hashes[0]); + CSR_WRITE_4(sc, DC_AL_MAR1, ctx.hashes[1]); } static void @@ -1102,8 +1126,6 @@ dc_setfilt_asix(struct dc_softc *sc) { uint32_t eaddr[(ETHER_ADDR_LEN+3)/4]; struct ifnet *ifp; - struct ifmultiaddr *ifma; - int h = 0; uint32_t hashes[2] = { 0, 0 }; ifp = sc->dc_ifp; @@ -1149,17 +1171,7 @@ dc_setfilt_asix(struct dc_softc *sc) return; /* now program new ones */ - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - h = dc_mchash_be(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - if (h < 32) - hashes[0] |= (1 << h); - else - hashes[1] |= (1 << (h - 32)); - } - if_maddr_runlock(ifp); + if_foreach_llmaddr(ifp, dc_hash_maddr_admtek_be, hashes); CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR0); CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[0]); @@ -1167,15 +1179,29 @@ dc_setfilt_asix(struct dc_softc *sc) CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[1]); } +static u_int +dc_hash_maddr_uli(void *arg, struct sockaddr_dl *sdl, u_int mcnt) +{ + uint32_t **sp = arg; + uint8_t *ma; + + if (mcnt == DC_ULI_FILTER_NPERF) + return (0); + ma = LLADDR(sdl); + *(*sp)++ = DC_SP_MAC(ma[1] << 8 | ma[0]); + *(*sp)++ = DC_SP_MAC(ma[3] << 8 | ma[2]); + *(*sp)++ = DC_SP_MAC(ma[5] << 8 | ma[4]); + + return (1); +} + static void dc_setfilt_uli(struct dc_softc *sc) { uint8_t eaddr[ETHER_ADDR_LEN]; struct ifnet *ifp; - struct ifmultiaddr *ifma; struct dc_desc *sframe; uint32_t filter, *sp; - uint8_t *ma; int i, mcnt; ifp = sc->dc_ifp; @@ -1209,29 +1235,17 @@ dc_setfilt_uli(struct dc_softc *sc) filter &= ~(DC_NETCFG_RX_PROMISC | DC_NETCFG_RX_ALLMULTI); /* Now build perfect filters. */ - mcnt = 0; - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - if (mcnt >= DC_ULI_FILTER_NPERF) { - filter |= DC_NETCFG_RX_ALLMULTI; - break; + mcnt = if_foreach_llmaddr(ifp, dc_hash_maddr_uli, &sp); + + if (mcnt == DC_ULI_FILTER_NPERF) + filter |= DC_NETCFG_RX_ALLMULTI; + else + for (; mcnt < DC_ULI_FILTER_NPERF; mcnt++) { + *sp++ = DC_SP_MAC(0xFFFF); + *sp++ = DC_SP_MAC(0xFFFF); + *sp++ = DC_SP_MAC(0xFFFF); } - ma = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); - *sp++ = DC_SP_MAC(ma[1] << 8 | ma[0]); - *sp++ = DC_SP_MAC(ma[3] << 8 | ma[2]); - *sp++ = DC_SP_MAC(ma[5] << 8 | ma[4]); - mcnt++; - } - if_maddr_runlock(ifp); - for (; mcnt < DC_ULI_FILTER_NPERF; mcnt++) { - *sp++ = DC_SP_MAC(0xFFFF); - *sp++ = DC_SP_MAC(0xFFFF); - *sp++ = DC_SP_MAC(0xFFFF); - } - if (filter & (DC_NETCFG_TX_ON | DC_NETCFG_RX_ON)) CSR_WRITE_4(sc, DC_NETCFG, filter & ~(DC_NETCFG_TX_ON | DC_NETCFG_RX_ON)); @@ -1258,12 +1272,22 @@ dc_setfilt_uli(struct dc_softc *sc) sc->dc_wdog_timer = 5; } +static u_int +dc_hash_maddr_xircom(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct dc_softc *sc = arg; + uint32_t h; + + h = dc_mchash_le(sc, LLADDR(sdl)); + sc->dc_cdata.dc_sbuf[h >> 4] |= htole32(1 << (h & 0xF)); + return (1); +} + static void dc_setfilt_xircom(struct dc_softc *sc) { uint16_t eaddr[(ETHER_ADDR_LEN+1)/2]; struct ifnet *ifp; - struct ifmultiaddr *ifma; struct dc_desc *sframe; uint32_t h, *sp; int i; @@ -1295,15 +1319,7 @@ dc_setfilt_xircom(struct dc_softc *sc) else DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI); - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - h = dc_mchash_le(sc, - LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - sp[h >> 4] |= htole32(1 << (h & 0xF)); - } - if_maddr_runlock(ifp); + if_foreach_llmaddr(ifp, dc_hash_maddr_xircom, &sp); if (ifp->if_flags & IFF_BROADCAST) { h = dc_mchash_le(sc, ifp->if_broadcastaddr);